Mar*_*ouf 8 language-agnostic math interpolation estimation geospatial
我有以下可用的:
如何随时间插入估计的位置?
我知道这足以计算出行程剩余时间所需的平均速度.给定一个直线距离,这是非常微不足道的.我知道它与矢量有关,但我有点生疏,并认为最好咨询一些专家.
我需要这个更新速率的原因是有限的,所以为了显示平滑的动画,我需要猜测更新之间的当前位置.
目标平台是Google地图应用程序,因此我可以使用一些基本功能,例如两个坐标之间距离的地理校正功能.语言并不重要,因为我知道许多语言,如果需要,可以移植或调整任何示例.然而,一般的解决方案是优选的
这只是两个独立的矢量计算吗?
latestimate = latstart + (?lat * P) lonestimate = lonstart + (?lon * P) Where: testimated = the reported estimated time to target telapsed = time since last time estimate P = telapsed / testimated ?lat = latreported - lattarget ?lon = lonreported - lontarget
com*_*orm 14
您想使用Slerp或球形线性插值.
将纬度和经度转换为单位3向量:
p=(x,y,z)=(cos(lon)*cos(lat), sin(lon)*cos(lat), sin(lat))
Run Code Online (Sandbox Code Playgroud)
然后,"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)
Run Code Online (Sandbox Code Playgroud)
请注意,如果theta非常接近0或180度,则此公式可能在数值上不稳定.在小角度情况下,您可以回退到线性插值; 在180度的情况下,你的道路真的很模糊.
Lat_to_Travel = CurLat - TargetLat
Long_to_Travel = CurLong - TargetLong
Time_to_Travel = ETA - now
Run Code Online (Sandbox Code Playgroud)
如果距离相对较小,则可以假定这三个维度的线性进展(*).然后,您需要确定要显示的多个中间位置,例如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)
Run Code Online (Sandbox Code Playgroud)
所有这一切中最复杂的是保持单位正常.
(*)关于是否可以假设线性进展的一些考虑因素......
显然,物理要素(海流,风,能见度......)的实际情况在这个问题上可能比地质问题更重要.空间数学.
假设车辆以恒定的速度,在一条直线,这是[ 通常 ] 确定,假设在纬度维线性 [以及技术上地球不是完全是一个球体,这不是真正的完全但该死的接近.然而,在包括纬度相对较大变化的较长距离上,沿经度维度的角度进展不是线性的.这样做的原因是,当我们离开赤道时,以线性英里(或公里......)表示的经度会减小.对于不同纬度的位置,下表应该大致了解这种效应:
Latitude Length of a Degree Approximate examples (of longitude) in nautical miles 0 60 Kuala Lumpur, Bogota, Nairobi 20 56.5 Mexico city, Mecca, Mumbai, Rio de Janeiro 45 42.5 Geneva, Boston, Seattle, Beijing, Wellington (NZ) 60 30 Oslo, Stockholm, Anchorage AK, St Petersburg Russia
看到这个方便的在线计算器来计算特定纬度的这个.
获得一个想法的另一种方法是看到在佛罗里达州杰克逊维尔或加利福尼亚州圣地亚哥的东西(或西)旅行,需要52英里来覆盖一定程度的经度; 在蒙特利尔或西雅图的纬度,只需40英里.