为什么用lat / lon计算地理距离而不是缓存笛卡尔点?

时间:2010-06-26 17:29:46

标签: sql math geolocation query-optimization gis

在研究如何进行经典的“获取POI范围”问题时,我发现最常用的算法是Haversine,如果你需要真正的准确性,那么Vincenty的公式。我去了第一个,因为高精度不是问题。然而,它让我想到了一些让我感到奇怪的事情,为什么我没有发现在数据库上缓存Cartesean坐标而不是使用带有lat / lon的hasrsine公式?

这里的问题当然是表现。 hasrsine公式需要大量的cos / sin函数调用,但是将数据库中的lat / lon点的投影X,Y和Z存储并直接应用点积不是更简单吗?除非我弄错了,否则这需要一个arccos电话。

3 个答案:

答案 0 :(得分:3)

因为任何给定的笛卡尔投影都只能给出某些点的正确答案 - 在球体周围的一个特定圆上的两个点之间给出正确距离的投影将扭曲沿另一个特定圆的距离。

像Haversine这样的公式独立于球体上各点的相对位置;无论如何,他们都会返回正确的距离。

答案 1 :(得分:0)

不,你没错。但有两件事。首先,显然,您的性能优势将取决于您的应用程序的性质。如果您需要在计算中多次使用相同的点,则可以通过执行建议来提高性能。

其次,你使用的公式不是问题。如果您预先计算并存储lat / lon的sincos并使用hasrsine,您将获得完全相同的性能改进。

答案 2 :(得分:0)

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