10

我正在尝试将新的编码折线与现有的折线合并,而不对整个折线进行解码和重新编码。新编码的折线将上传到(linux)服务器,我想将它附加到现有的折线。

问题是,你不能把它们混在一起。下面是一些可供使用的示例数据。我希望在 PHP 或 shell 脚本中找到/创建解决方案,但问题是,我没有足够的技术理解来解释编码的折线算法。

41.386692,-73.475912
41.424822,-73.375027
41.428292,-73.311173
41.426183,-73.254577
41.470168,-73.218532
41.498865,-73.155278
(Yes, 6 points are easy, but it's going to be more like 7,000 coordinate pairs)
  • 编码的前 3 个坐标对:yir{Fnwm_MimFquRuTanK
  • 最后3:s`z{Fbpb~L{qGg`FkrDkjK
  • 全部 6 个:yir{Fnwm_MimFquRuTanKdLw`J{qGg`FkrDkjK

交互式折线编码器实用程序
编码折线算法格式(您可以通过交互式编码器获得此格式)
折线编码器

编辑:

我也有编码两端折线的原始数据。所以我也可以分别保存第一个和最后一个坐标对。

有用的读物​​:

我最终写了一篇博客文章,其中详细介绍了编码折线的工作原理。你可以在这里阅读:什么是编码折线?

4

4 回答 4

9

这显示了编码算法:http ://code.google.com/apis/maps/documentation/utilities/polylinealgorithm.html

解码器可从 Mark McClure 教授处获得,网址为http://facstaff.unca.edu/mcmcclur/GoogleMaps/EncodePolyline/decode.html

编码使用点到点的偏移量(增量)。第一个点的偏移量是从 (0,0) 计算的,因此它等于第一个点的坐标。第二个点被编码为第二个点与第一个点的偏移量,依此类推。

要连接两条线,首先需要找到第一条线的最后一个点,以及第二条线的第一个点。

然后,计算第二行与第一行最后一点的偏移量,并将该偏移量替换为第二行中的第一个坐标。因此,第二行不是从 (0,0) 的偏移开始,而是从第一行末尾的偏移开始。

现在,第一行的最后一点需要重新编码,以表明还有更多内容要遵循。

因为每行中的每个编码点都可以包含可变数量的字符,所以如果不解码整行,就不容易找到任何点(即使是第一个点)。

所以:要完成这项工作,您需要进行一些解码和重新编码。将每一行解码为点数组然后重新编码整个东西可能是最简单的。在 PHP 中编码既快速又简单——再次参见 McClure 的站点。

这与我在 Google Maps Version 2 Group 中给出的答案相矛盾,我错误地假设每个编码点的长度严格为五个字符。


UNCA 在 2013/14 年重组了他们的工作人员网站,现在只能通过archive.org访问 McClure 教授的作品。虽然编码折线的描述仍然可用且相关,但依赖 Javascript 的示例可能不再有效。

于 2012-02-11T20:28:58.160 回答
6

好的,所以我想我想通了。非常感谢Andrew Leach用简单的英语解释了该算法的实际工作原理。

问题:将新的编码折线与现有的编码折线合并

解决方案:保留现有折线中的最后一个坐标对,仅对该对进行编码并保存以供以后使用,在此新编码开始时使用现有折线中的坐标对所有新坐标进行编码。找到最后一个坐标对的字符串,并将其从新的编码折线中删除,并将新的编码折线粘贴到现有折线的背面

要知道的事情:编码所做的是计算偏移量(与 x,y 的距离)并将该值转换为 ASCII。问题是第一个坐标是从 0,0 计算出来的,所以如果你只是把两条编码的折线放在一起,你添加的新折线不会从现有的偏移,而是从 0,0 偏移导致大的跳跃折线。我们需要做的是找出编码折线中的哪些字符是从 0,0 的偏移量并将它们删除。然后您可以将新行附加到旧行,它将正确偏移。

单击下面的链接以查看所有内容并获得好评。另外,如果您发现任何可以提高效率的地方,请告诉我!

PasteBin:PHP实现解决方案

于 2012-02-12T17:50:33.663 回答
1

解码由浏览器执行。您可以发送单独的线段供浏览器解码和连接。折线接受单个“路径”属性。多边形接受路径数组中的多个“路径”属性。折线和多边形之间的唯一区别是“填充”颜色和“填充”不透明度是否存在。如果您将折线声明为没有“填充”属性的多边形,则您将从各个部分构建多段线。

PS - “stackoverflow”编辑器真的很烂。

于 2012-02-12T16:00:29.847 回答
0

我建议您可能不必在服务器上进行连接。而是在浏览器中执行此操作。所有解码都发生在浏览器中。将解码后的数组与 javascript 拼接起来非常容易。您可以使用“拼接”方法,也可以只遍历每个组件数组。

于 2012-02-12T17:30:21.297 回答