在我的代码中,我必须在lat/long值对之间进行大量的距离计算.
代码如下所示:
double result = Math.Acos(Math.Sin(lat2rad) * Math.Sin(lat1rad) + Math.Cos(lat2rad) * Math.Cos(lat1rad) * Math.Cos(lon2rad - lon1rad));
(lat2rad例如纬度转换为弧度).
我已将此功能确定为我的应用程序的性能瓶颈.有没有办法改善这个?
(因为坐标不同,我不能使用查找表).我也看过这个问题,建议像网格一样的查找方案,这可能是一种可能性.
谢谢你的时间!;-)
如果你的目标是排名(比较)距离,那么近似(sin
和cos
表查找)可以大大减少你需要的计算量(实现快速拒绝).
如果近似距离(待排名或比较)之间的差异低于某个阈值,您的目标是仅进行实际的三角计算.
例如,使用具有1000个样本的查找表(即sin
,cos
每个采样2*pi/1000
),查找不确定性最多为0.006284.使用参数的不确定性计算ACos
,累积不确定度,也是阈值不确定性,最多为0.018731.
因此,如果为两个坐标集对(距离)评估Math.Sin(lat2rad) * Math.Sin(lat1rad)
+ Math.Cos(lat2rad) * Math.Cos(lat1rad) * Math.Cos(lon2rad - lon1rad)
使用sin
和cos
查找表产生一定的排名(一个距离看起来比基于近似的另一个更大),并且差异的模数大于上面的阈值,那么近似值是有效.否则继续进行实际的三角计算.