Gre*_*Cat 5 optimization gps simplify gpx
我有一个GPS轨道gpxlogger(1)(由gpsd作为客户端提供).GPS接收器更新其坐标每隔1秒,gpxlogger的逻辑是非常简单的,它记位置(lat,lon,ele)和时间戳(time)从GPS接收到的每Ñ秒(n = 3时在我的情况).
写下几个小时的音轨后,gpxlogger会保存几兆字节的GPX文件,其中包含数千个点.之后,我尝试在地图上绘制此曲目并将其与OpenLayers一起使用.它可以工作,但是数千个点使得使用地图变得漫长而缓慢.
据我所知,有几千个不理想的点.有无数的点可以被删除而不会丢失几乎任何东西:当有几个点构成大致直线并且我们在它们之间以相同的恒定速度移动时,我们可以离开第一个和最后一个点然后抛出别的什么.
我想过使用gpsbabel进行这样的轨道简化/优化工作,但是,唉,它的简化过滤器仅适用于路径,即仅分析路径的几何形状,没有时间戳(即不检查速度是否大致恒定).
是否有一些现成的实用程序/库/算法可用于优化轨道?或者可能是我错过了gpsbabel的一些聪明选择?
Mat*_*tag 11
是的,如前所述,Douglas-Peucker算法是简化2D连接路径的简单方法.但正如您所指出的,您需要将其扩展到3D情况,以正确简化具有与每个点相关联的固有时间维度的GPS轨迹.我已经使用Douglas-Peucker的PHP实现为我自己的Web应用程序这样做了.
通过稍微了解算法的工作原理,很容易将算法扩展到3D案例.假设您的输入路径由标记为A到Z的26个点组成.此路径的最简单版本有两个点,A和Z,所以我们从那里开始.想象一下A和Z之间的线段.现在扫描所有剩余的点B到Y,找到离线段AZ最远的点.说距离最远的点是J.然后,扫描B和I之间的点,找到线段AJ的最远点,扫描点K到Y找到距离段JZ最远的点,依此类推,直到剩下的点为止.都位于某个所需的距离阈值内.
这将需要一些简单的向量运算.从逻辑上讲,它与3D中的过程相同.如果您发现使用您的语言实现了Douglas-Peucker算法,则可能会实现一些2D矢量数学,并且您需要将这些算法扩展为使用3维.
你可以在这里找到一个3D C++实现:3D Douglas-Peucker,C++
您的x和y坐标可能是纬度/经度,z(时间)坐标可能是自unix时期以来的秒数.您可以通过决定适当的时空关系来解决这种差异; 假设您想在1平方英里的地图区域内查看一天的活动.想象这个关系是1英里乘1英里乘1天的立方体,你必须预先计算时间变量.从度数到表面距离的转换是非常重要的,但是对于这种情况,我们简化并说一度是60英里; 然后一英里是.0167度.一天是86400秒; 然后,为了使单位等效,我们的时间戳的预分频因子是.0167/86400,或大约1/5,000,000.
例如,如果您想要在2天内在相同的1平方英里地图区域内查看GPS活动,则时间分辨率变为重要的一半,因此将其进一步缩小两倍,达到1/10,000,000.玩得开心.