压缩算法去除多余的GPS点



我有一组每秒记录的经度/纬度数据,我想要一个可以删除任何多余坐标点的算法。

因此,例如,如果驾驶员在直线上行驶,不需要每秒钟跟踪一次坐标,但可能只需要每半分钟跟踪一次。或者,如果驾驶员正在转弯,而不是转弯时有10个坐标,如果我可以有5个坐标,并且仍然精确地显示转弯。

我使用的是一种算法,其中对于路线的(几乎(直线,只存储该直线的起点和终点,而对于曲线,存储每个点。

诀窍是跟踪与直线的微小偏差,并用新的点替换直线的当前末端,只要直线保持足够直,并且在前一个点与直线的偏差过大时开始新的直线。

因此,我的算法如下:

在开始时,前两点被视为直线的起点。所以我存储了这条线的起点和终点,并计算这条线左右的角度,这将导致一条线,其中当前终点的允许距离为2米。这意味着,如果下一个点位于由这两个角度定义的圆锥体内,我可以用新的点替换前一个端点,因为前一个点将偏离直线最多2米。此外,新线再次定义了一个圆锥体,该圆锥体必须与上一个圆锥体相交,因此它越来越窄。只要一个新的点在这个圆锥体内,我相信所有以前的点都有2米的最大偏差。一旦一个位于圆锥体外部的点进入,上一个点就会"闭合"该线,并开始由上一点和新点组成的新线。

优点是,该算法在录制过程中递增地工作。您不需要先存储点,然后再平滑它们。唯一需要保留的附加信息是圆锥体的当前打开角度。

如果你只收集纬度和经度(即没有时间或速度信息(和/或你不太关心准确性(即你可以近似实际路线(,那么确定"冗余"点应该不是问题。

一种简单的方法是简单地迭代路线上的点(按照驾驶员通过它们的顺序(,并针对每个点Xi计算Xi和路段[Xi-1, Xi+1]之间的距离,检查该距离是否小于阈值T,其中T取决于近似值的准确度。如果距离足够小,则可以得出Xi是多余的,并将其消除(或标记为消除(。

上述方法有很多变化。一个明显的方法是根据线段[Xi-1, Xi+1]的长度和/或点Xi在该线段上的投影位置来改变T。只有当Xi位于一个以线段[Xi-1, Xi+1]为长对角线的细长菱形中时,您才可能想要消除它。

您可能不需要删除点。按原样发送第一个点,但随后将每个后续点作为与前一点的发送。设置数据的精度,使lat和long为整数。对于小的delta,请使用占用较少位的编码方案。根据您的精度,差异可能在很多时候是(0,0(。然后,当变化很小时,将只需要很少的位来表示。较大的更改将占用更多的位。您需要一些示例数据来获得编码方案的统计信息。

最新更新