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

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)
  • 前三个坐标对编码:yir{Fnwm_MimFquRuTanK
  • 后三个坐标对编码:s`z{Fbpb~L{qGg`FkrDkjK
  • 全部六个坐标对编码:yir{Fnwm_MimFquRuTanKdLw`J{qGg`FkrDkjK

交互式折线编码器实用工具
编码折线算法格式(可通过交互编码器获得)
折线编码器

编辑:

我还有原始数据,在两端编码了折线。因此,我也可以将第一个和最后一个坐标对单独保存。

有用阅读材料:

我最终写了一篇关于编码折线如何工作的博客文章。您可以在这里阅读: 什么是编码折线?

4个回答

9
这里展示了编码算法:http://code.google.com/apis/maps/documentation/utilities/polylinealgorithm.html 可以从Mark McClure教授的这里获取解码器
编码使用点之间的偏移量。第一个点的偏移量从(0,0)计算,因此它等于第一个点的坐标。第二个点编码为从第一个点到第二个点的偏移量,以此类推。
要连接两条线,首先需要找到第一条线的最后一个点和第二条线的第一个点。
然后,计算第2条线与Line1的最后一个点的偏移量,并将该偏移量代替第2条线中的第一个坐标。因此,第2条线不是从(0,0)开始的偏移量,而是从第一条线的末端开始的偏移量。
现在,第一行的最后一个点需要重新编码以显示还有更多内容。
因为每个行中的每个编码点都可以由可变数量的字符组成,所以很难找到任何点(即使是第一个点)而无需解码整个线路。
因此:要完成工作,您需要进行一些解码和重新编码。在PHP中进行编码很快而容易--再次参见McClure的网站。 这与我在Google Maps Version 2 Group中给出的答案相矛盾,我错误地假设每个编码点的长度严格为五个字符。
UNCA在2013/14年重新组织了其员工网站,现在只能通过archive.org访问McClure教授的工作。尽管编码折线的描述仍然可用且相关,但依赖于Javascript的示例可能不再起作用。

Andrew,谢谢你的信息!这确实帮助我理解了它的工作原理。由于我们将要处理的坐标对数量很多,重新编码整个折线将花费太长时间和太多资源。由于我也在生成附加的折线,所以我有坐标对。如果我只编码从0,0开始的第一对坐标和现有折线上的最后一个点,然后进行替换,这样行得通吗? - Dan Mandle
很好的回答,安德鲁。丹,对于7K点,我只需解码、追加和重新编码。正如你所说,这只需要几秒钟。如果你在谈论数百万个点或者需要实时处理,我会选择安德鲁的方法,或者直接向客户端发送两个单独的编码折线。这只会增加几个字节的数据量。 - Chris Broadfoot
我也意识到,在第一个字符串中找到最后一个字符的编码形式(以便只替换正确的字符)也不是特别容易,因为表示该点的字符数并不固定。要可靠地做到这一点,您需要将倒数第三个点进行编码,以便您可以匹配“倒数第二个”点;之后的字符必须是您需要替换的最后一个点。该过程变得更加复杂,因此速度更慢,并且不太通用 - 只需有一个单独的例程来编码一组线点。 - Andrew Leach
我已经提交了我的答案。请查看并告诉我您的想法。 - Dan Mandle
请把那个评论放在我的答案上,而不是继续在这个答案上。 - Dan Mandle
显示剩余5条评论

6

好的,我想我弄清楚了。非常感谢Andrew Leach用通俗易懂的语言解释算法是如何工作的。

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

解决方案:保留现有折线的最后一个坐标对,仅对该对进行编码并将其保存以备后用,使用现有折线开头的坐标对对所有新坐标进行编码。找到最后一个坐标对的字符串,从新编码的折线中删除它,并将新编码的折线附加到现有折线的末尾。

需要知道的事情:编码的作用是计算偏移量(距离x、y的距离)并将该值转换为ASCII码。问题在于第一个坐标是从0,0计算的,因此如果您只是将两个编码的折线放在一起,那么您添加新折线的位置不会偏移现有折线,而是偏移0,0,导致折线大幅跳动。我们需要做的是找出编码的折线中哪些字符是从0,0偏移的,然后将它们删除。然后,您可以将新线附加到旧线上,它将被正确偏移。

单击下面的链接查看所有内容,并带有良好的注释。此外,请告诉我是否在任何地方可以提高效率!

PasteBin:解决方案的PHP实现


你的解决方案让我感到头晕。你能否在JavaScript中创建一个片段或小工具来展示你的问题? - ahsan ayub
@ahsanayub,您可以遵循上面链接的详细记录的PHP代码。 - Dan Mandle

1

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

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


Berry,感谢您的回复,但那并没有回答问题。 - Dan Mandle

0

我建议您不必在服务器上进行连接操作,而是应该在浏览器中完成。所有解码都在浏览器中进行。使用JavaScript轻松地将解码后的数组拼接在一起非常容易。您可以使用“splice”方法或者只需遍历每个组件数组。


贝瑞,这是我们最初所做的,但最终用户下载所有配对数据太耗时间了,这就是为什么我们不得不切换到编码折线。 - Dan Mandle

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接