我有一组每秒记录一次的经度/纬度数据,并且想要一个可以删除任何冗余坐标点的算法。
因此,例如,如果驾驶员是直线驾驶,则无需每秒跟踪坐标,但可能只需每半分钟一次。或者如果驾驶员转弯,而不是在转弯处有10个坐标,如果我可以有5并仍然精确地显示转弯。
答案 0 :(得分:0)
如果您收集的是纬度和经度(即没有时间或速度信息)和/或您并不关心准确性(即您可以对实际路线进行一些近似),那么确定“冗余”点应该不是问题。
一种简单的方法是简单地迭代路线的点(按照司机通过它们的顺序),并且对于每个点Xi
计算Xi
和段{{}之间的距离1}}检查此距离是否小于阈值[Xi-1, Xi+1]
,其中T
取决于您的近似值的准确程度。如果距离足够小,您可以得出结论T
是多余的并且您将其消除(或将其标记为消除)。
上述方法有很多变化。一个显而易见的是根据段Xi
的长度和/或点T
在该段上的投影位置来变化[Xi-1, Xi+1]
。你可能想要消除Xi
,只要它是一个细长的菱形,其中Xi
段为长对角线。
答案 1 :(得分:0)
您可能不必删除积分。按原样发送第一个点,然后将每个后续点作为差异从上一个点发送。在数据上设置精度,使lat和long为整数。使用一种编码方案,对于小增量占用较少的位。根据您的精确度,差异可能在很多时候都是(0,0)。然后,当几乎没有变化时,将需要很少的位来表示。更大的变化将需要更多的位。您需要一些示例数据来获取编码方案的统计信息。
答案 2 :(得分:0)
我正在使用一种算法,其中对于路线的(几乎)直线,只存储线的起点和终点,而对于曲线,每个点都存储。
诀窍是跟踪直线的小偏差,并用新点替换直线的当前终点,只要线保持足够直线并开始新线,只要一个之前的观点会偏离这条线。
因此我的算法如下:
在开始时,前两个点被视为直线的开头。所以我存储了线的起点和终点,我正在计算这条线的左右两侧的角度,这将导致一条线,当前端点只允许2米的允许距离。 这意味着如果下一个点位于由这两个角度定义的圆锥内,我可以用新点替换前一个端点,因为前一个点将偏离直线最多2米。 此外,新线再次定义了一个锥体,该锥体必须与前一个锥体相交,因此它越来越窄。只要在该锥体内有一个新点,我确信所有先前的点都有2米的最大偏差。 一旦一个点位于锥体外部,前一个点“关闭”该线,并且开始一个由前一个点和新点组成的新线。
优点是,该算法在记录期间递增地工作。您不需要先存储点,然后再将它们平滑。您需要保留的唯一附加信息是锥体的当前打开角度。