我有一个由gpxlogger(1)(作为gpsd的客户端提供)产生的GPS跟踪。 GPS接收器每1秒钟更新一次坐标,gpxlogger的逻辑非常简单,它每n秒钟记录一次位置(latlonele)和从GPS接收到的时间戳(time)(在我的示例中,n = 3)。

写下了几个小时的跟踪记录后,gpxlogger会保存几兆字节长的GPX文件,其中包含数千个点。之后,我尝试在 map 上绘制此轨迹并将其与OpenLayers一起使用。它可以工作,但是数千点使使用 map 成为马虎且缓慢的体验。

我了解到有数千个次优点。可以删除无数个点,而几乎不损失任何东西:当有几个点组成大致的直线,并且我们以相同的恒定速度移动时,我们可以离开第一个点和最后一个点并抛出离开其他任何东西。

我曾考虑过使用gpsbabel来简化/优化轨道,但是,simplification filter仅适用于路线,即仅分析路径的几何形状而没有时间戳(即不检查速度是否大致恒定)。

是否有一些现成的实用程序/库/算法可用于优化轨道?还是我可能错过了gpsbabel的一些明智选择?

最佳答案

是的,如前所述,Douglas-Peucker算法是简化2D连接路径的直接方法。但是,正如您已经指出的那样,您需要将其扩展到3D情况下,以适当简化与每个点关联的固有时间维度的GPS轨迹。对于使用Douglas-Peucker的PHP实现的我自己的Web应用程序,我已经这样做了。

在不了解算法如何工作的情况下,很容易将算法扩展到3D情况。假设您的输入路径由26个标记为A到Z的点组成。该路径的最简单版本有两个点,即A和Z,因此我们从这里开始。想象一下A和Z之间的线段。现在扫描所有剩余的点B到Y,以找到距离线段AZ最远的点。假设最远的点是J。然后,您扫描B和I之间的点以找到线段AJ中最远的点,并扫描点K到Y以找到距离段JZ最远的点,依此类推,直到剩下的点所有这些都在某个期望的距离阈值之内。

这将需要一些简单的向量运算。从逻辑上讲,这与3D中的3D过程相同。如果您发现使用您的语言实现的道格拉斯-皮克算法,则可能已经实现了一些2D矢量数学,并且您需要将其扩展为使用3维。

您可以在此处找到3D C++实现:3D Douglas-Peucker in C++

自unix时代以来,您的x和y坐标可能以纬度/经度为单位,而z(时间)坐标可能以秒为单位。您可以通过确定适当的时空关系来解决这种差异。假设您要在1平方英里的 map 区域上查看一天的事件。将这种关系想象成1英里乘1英里乘1天的立方体,您必须预先缩放时间变量。从度到地表距离的转换是不平凡的,但是在这种情况下,我们将其简化为60英里。那么一英里就是.0167度。一天是86400秒;然后为了使单位相等,我们为您的时间戳记预缩放的因子是.0167/86400,或大约1/5,000,000。

举例来说,如果您想在2天之内查看同一1平方英里 map 区域内的GPS事件,那么时间分辨率就变得十分重要,因此将其进一步缩小两倍至1/10,000,000。玩得开心。

关于optimization - 简化/优化GPS轨迹,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/4480434/

10-13 09:33