从 GPS 坐标记录计算圈数

Dan*_*rik 3 algorithm geometry gps gpx

我有一个包含大量点(按时间排序的经度和纬度)的 GPX 文件,我如何计算我的集合包含多少圈?

GPS 是在赛道比赛期间记录的。

圈数是车辆通过赛道起点/终点的次数。

Dav*_*man 5

假设轨道足够小,我们可以假设这些点位于平面上,例如,我们可以忽略地球的曲率。在这种情况下,您可以将所有点转换为平面中的点,例如,P(i) = (x(i), y(i)) 没有 z 坐标。

考虑以下算法: 找到位于轨道中间某处的点 C = (Cx, Cy),例如,所有点的质心。确切的位置并不重要。然后想象一个观察者站在 C 点并且总是旋转以面向车辆。您想计算观察者在车辆行驶时旋转的次数。

为此,您需要能够找到当车辆在点列表中的两个相邻点 P(i) 和 P(i+1) 之间行驶时观察者将旋转的带符号角。这与找到向量 P(i) - C 和 P(i+1) - C 之间的有符号角相同,这可以使用叉积来完成。这特别容易,因为我们有二维点。我们有

P = (x(i) - Cx) * (y(i+1) - Cy) + (x(i+1) - Cx) * (y(i) - Cy)

如果 P 为正,则观察者逆时针旋转,如果为负,则观察者顺时针旋转。观察者旋转的角度是

theta(i, i+1) = arcsin( P / (length(x(i) - C) * length(x(i+1) - C)))

其中 theta(i, i+1) 是正还是负,取决于观察者旋转的方向。

在这里,我们使用相邻点靠得很近,这样观察者就可以在相邻点之间旋转一个小于 pi/2 的小角度。

要找到观察者旋转的总量,只需对从路径开始到结束的所有 theta 求和,确保保留 theta 的符号,以防车辆因某种原因向后移动。假设 theta 以弧度为单位,则电路总数就是 theta 之和除以 2 * pi。

对于真正的极客来说,这只是使用定义计算车辆围绕 C 的路径的绕数