8

我有以下可用:

  • 最后报告的 lat,lon w/timestamp
  • 目标纬度,经度
  • 预计目标时间
  • 标题

如何随时间插入估计的位置?

我知道这足以计算剩余行程所需的平均速度。给定一个直线距离,这是非常微不足道的。我知道这与矢量有关,但我有点生疏,认为最好咨询一些专家。

我需要这个更新率的原因是有限的,所以为了显示流畅的动画,我需要猜测更新之间的当前位置。

目标平台是一个谷歌地图应用程序,所以我有一些基本功能,比如两个坐标之间距离的地理校正功能。语言并不重要,因为我知道很多,并且可以根据需要移植或改编任何示例。然而,一般的解决方案将是首选。


这只是两个独立的向量计算吗?

lat估计= lat start + (Δ lat * P)
lon估计= lon start + (Δ lon * P)

在哪里:
   t估计= 报告的估计目标时间
   t elapsed = 自上次估计以来的时间
   P = t elapsed / t估计
   Δ lat =报告的 lat - lat目标
   Δ lon =报告的 lon - lon目标
4

2 回答 2

15

您想使用Slerp或球面线性插值。

将您的纬度和经度转换为单位 3 向量:

p=(x,y,z)=(cos(lon)*cos(lat), sin(lon)*cos(lat), sin(lat))

然后,“Slerp”为您提供沿单位球体表面的等速插值:

theta= angle between 3-vectors p0 and p1 (e.g., cos(theta)= p0.p1)
Slerp(p0,p1,t)= ( p0*sin((1-t)*theta) + p1*sin(t*theta) ) / sin(theta)

请注意,如果 theta 非常接近 0 或 180 度,则此公式在数值上可能不稳定。在小角度情况下,可以回退到线性插值;在 180 度的情况下,您的路径确实是模棱两可的。

于 2009-11-16T10:45:37.853 回答
9
Lat_to_Travel  = CurLat - TargetLat
Long_to_Travel = CurLong - TargetLong
Time_to_Travel = ETA - now

如果距离相对较小,则可以假设这三个维度上的线性进展(*)。然后,您需要确定要显示的中间位置的数量,比如 10 个,并相应地计算每个中间点

NbOfIntermediates       = 10  // for example    
Lat_at_Intermediate(n)  = CurLat + (1/NbOfIntermediates * Lat_to_travel)
Long_at_Intermediate(n) = CurLong + (1/NbOfIntermediates * Long_to_travel)
Time_at_Intermediate(n) = now + (1/NbOfIntermediates * Time_to_travel)

所有这一切中最复杂的是保持单位正常。

(*)关于是否可以假设线性进展的一些考虑......
显然,物理元素的现实细节(海流,风,能见度......)在这个问题上可能比地理更重要 -空间数学。
假设车辆以恒定速度直线行驶,[通常]可以假设纬度维度的线性[从技术上讲,地球不完全是一个球体,这并不完全正确,但该死的接近]。然而,在包含相对较大纬度变化的较长距离上,沿经度维度的角度进展不是线性的。原因是当我们远离赤道时,以线性英里(或公里......)表示的经度度数会减少。对于不同纬度的位置,下表应该大致了解这种影响:

一个度数的纬度长度近似示例
           (经度)在
           海里

0 60 吉隆坡、波哥大、内罗毕
20 56.5 墨西哥城、麦加、孟买、里约热内卢
45 42.5 日内瓦、波士顿、西雅图、北京、惠灵顿(新西兰)
60 30 奥斯陆,斯德哥尔摩,安克雷奇 AK,圣彼得堡 俄罗斯         

请参阅这个方便的在线计算器来计算特定纬度的值。
了解这一点的另一种方法是查看在佛罗里达州杰克逊维尔或加利福尼亚州圣地亚哥的纬度向东(或向西)行驶,需要 52 英里才能覆盖一个经度;在蒙特利尔或西雅图的纬度,只需40英里。

于 2009-11-15T22:20:32.940 回答