为了让大家开始,这里是简单的算法,不使用任何速度或方位信息。
弧长s 可以通过标准公式从我们将开始的路段的两个(长、纬)对(起点和终点航路点)计算出来。
假设我们已将值对转换为标准球坐标 phi 和 theta(此处为数组,因此在位置 0 和 1 使用 phi[0] 和 phi[1]),弧长为:
from math import sin, cos, arccos, sqrt
s = arccos(
sin(phi[0]) * sin(phi[1]) * cos(theta[0] - theta[1]) +
cos(phi[0]) * cos(phi[1])
)
但是,由于我们有一个庞大的可怕函数,我们需要使用链式法则来计算一阶错误,我们会得到以下 delta_s 的怪物:
delta_s = (1.0 / abs(sin(s))) * (
delta_phi[0] * abs(
sin(phi[0]) * cos(phi[1]) -
cos(phi[0]) * sin(phi[1]) * cos(theta[0] - theta[1])
) +
delta_phi[1] * abs(
sin(phi[1]) * cos(phi[0]) -
cos(phi[1]) * sin(phi[0]) * cos(theta[0] - theta[1])
) +
(delta_theta[0] + delta_theta[1]) * abs(
sin(phi[0]) * sin(phi[1]) * sin(theta[0] - theta[1])
)
)
我们按顺序对每一对连续点执行此操作,将ss 相加,将误差按正常求积:
accumulator = 0.0
for error in errors:
accumulator += error * error
journey_error = sqrt(accumulator)
因此,我们知道垃圾距离估计的不确定性。 (如果我们在末尾添加几个点,我们甚至可以保留 accumulator 以加快计算速度——就像我们在实践中使用实时数据一样。)
但是,这会给我们带来巨大的错误,并且只会让我们对我们实际走了多远有一个非常模糊的概念。这不可能是实际 GPS 设备估计距离的方式,因为它永远不会足够准确,除非它一直都有惊人的信号:
我们需要的是一些更细微的路径近似,它只会使路径偏离所示类型的不准确点,而不是完全转移它并大量增加距离估计——在提出我希望找到的问题时找出所有现有实现(可能)是如何做到的!