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

Dan*_*dle 9 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)
Run Code Online (Sandbox Code Playgroud)
  • 编码的前3个坐标对: yir{Fnwm_MimFquRuTanK
  • 最后3: s`z{Fbpb~L{qGg`FkrDkjK
  • 全部6: yir{Fnwm_MimFquRuTanKdLw`J{qGg`FkrDkjK

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

编辑:

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

有用的阅读:

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

And*_*ach 9

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

可以从Dr. 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教授的工作.虽然编码折线描述仍然可用且相关,但依赖于Javascript的示例可能不再有效.


Dan*_*dle 6

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

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

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

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

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

PasteBin:PHP实现解决方案