将多个编码折线合并为一个编码折线

时间:2012-02-11 16:34:16

标签: google-maps google-maps-api-3 google-polyline

我正在尝试将新的编码折线与现有折线合并,而不对整个折线进行解码和重新编码。新的编码折线将上传到(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

Interactive Polyline Encoder Utility
编码折线算法格式(您可以通过交互式编码器实现此目的)
Polyline Encoder

编辑:

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

有用的阅读:

我最后写了一篇博文,其中详细介绍了编码折线的工作原理。您可以在此处阅读:What is an Encoded Polyline?

4 个答案:

答案 0 :(得分: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群组中给出的答案相矛盾,我错误地假设每个编码点的长度严格为五个字符。


UNCA在2013/14年度重组了他们的员工网站,现在只能通过archive.org访问McClure教授的工作。虽然description of encoded polylines仍然可用且相关,但依赖Javascript的示例可能不再有效。

答案 1 :(得分:6)

好的,所以我想我明白了。非常感谢Andrew Leach解释算法如何以简单的英语实际运作。

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

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

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

点击下面的链接查看所有内容,并附上好评。另外,如果您发现效率可以提高,请告诉我们!

PasteBin: PHP implementation of solution

答案 2 :(得分:0)

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

P.S。 - “stackoverflow”编辑器真的很糟糕。

答案 3 :(得分:0)

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