为什么要使用经纬度计算地球距离,而不是缓存笛卡尔坐标点?

4
当研究如何解决经典的“获取范围内POI”问题时,我发现最常用的算法是Haversine和Vincenty公式(如果需要真正的精度)。由于高精度不是问题,我选择了前者。然而,这让我想到了一个奇怪的问题:为什么我没有找到将笛卡尔坐标缓存到数据库中而不是使用经纬度的Haversine公式的参考文献?
当然,问题在于性能。Haversine公式需要大量的cos/sin函数调用,但是将经纬度点的投影X、Y和Z存储在数据库中并直接应用点积是否更简单呢?除非我错了,这只需要进行一次arccos调用。

我真正想知道的是,为什么大多数数据库和GPS设备似乎使用纬度/经度存储点,而不是缓存3D x、y、z点并直接应用点积来获取距离(或者为什么不这样做)。对于显示目的,如果没有存储/缓存,将它们转换回纬度/经度很容易且快速。 - Alexandre Gomes
需要注意的是,地球上两点之间的大圆距离(Haversine)并不完全正确。这个方程假设地球是一个完美的球体,但实际上并非如此。尽管如此,大多数情况下误差范围可以忽略不计。http://zh.wikipedia.org/wiki/%E5%8F%82%E8%80%83%E6%A4%AD%E7%90%83 - Abe Miessler
3个回答

3
因为任何给定的笛卡尔投影只会对某些点给出正确的答案 - 一个在球体上给出两个点之间正确距离的投影将扭曲另一个特定圆周上的距离。
哈弗赛因等公式与球体上各点的相对位置无关;它们始终返回正确的距离。

你能给出任何具体的例子吗?据我所知,haversine只是在计算大圆距离公式时解决浮点问题的一种快速修复方法。然而,最后一种方法就像将点投影到笛卡尔坐标系中,并计算它们之间的点积那样简单。那么为什么其中一种方法是“相对的”,而另一种不是呢? - Alexandre Gomes
我认为你和OA在这里所说的“笛卡尔投影”意思是非常不同的。 - AVB
1
是的,我觉得我可能误读了你所想的笛卡尔投影类型(3D vs 2D)。 - Amber

0

计算两个X、Y、Z坐标之间的距离将给出直线距离(如箭头所示)。Haversine公式给出了曲面地球上的最短路径(球面距离)。大多数地理软件应用需要计算地球表面上的距离,因此使用Haversine或类似的球面三角法算法。


0

不,你没有错。不过有两个要点。首先,显然,你的性能收益将取决于你的应用程序的性质。如果你需要在计算中多次使用相同的点,则通过执行您所建议的操作来提高性能。

其次,你使用的公式在这里不是问题。如果你预先计算并存储经纬度的正弦和余弦,并使用Haversine,则将获得完全相同的性能改进。


并不是真的。预计算haversines/sin/cos在这里看起来可能相同,但实际上它几乎不能改善性能,因为haversine公式需要许多增量(例如haversin(lat1-lat2)),而这些增量在你不知道要与之比较的点时无法计算。有了投影x、y、z的缓存,你只需要arccos(x1x2+y1y2+z1*z2)。至于应用程序的性质,我理解您的观点,我的意思是像Google Maps或4Square这样的应用程序,您希望将点与几乎“静态”/很少改变的点列表进行比较。 - Alexandre Gomes
“haversin(lat1-lat2)”是一个相当简单的代数函数,它涉及到“lat1”和“lat2”的正弦和余弦,不需要进行更多的三角计算。只需查看定义即可。 - AVB

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接