我需要在我的应用程序中实现地理位置搜索,但是我对使用正确的公式非常困惑。在网上和StackOverflow上进行了一些搜索后,我发现解决方案如下:
我不是数学专家,但这些公式是否相同?我遇到了一些更多的变化和公式(例如球面余弦定理和Vincenty's formulae - 这似乎是最准确的),这让我更加困惑...
我需要选择一个好的通用公式来在PHP / MySQL中实现。有人可以解释一下我上面提到的公式之间的区别吗?
- 哪个计算速度最快? - 哪一个提供最准确的结果? - 从速度/结果准确性方面来看,哪一个是最好的?
感谢您对这些问题的洞察力。
正如您所看到的,Haversine公式和球面余弦定理之间几乎没有明显的区别,但与Vincenty公式相比,两者的距离偏差高达22公里,因为它使用的是地球的椭圆近似而不是球形近似。
- 使用Haversine公式
使用大圆距离公式- 在数据库中使用空间搜索引擎
上面的截图来自于精彩的使用MySQL进行地理(接近度)搜索论文,并使用以下函数:
ASIN, SQRT, POWER, SIN, PI, COS
我也看到了从球面余弦定理(相同的公式)衍生出来的变体,比如这个:
(3956 * ACOS(COS(RADIANS(o_lat)) * COS(RADIANS(d_lat)) * COS(RADIANS(d_lon) - RADIANS(o_lon)) + SIN(RADIANS(o_lat)) * SIN(RADIANS(d_lat))))
使用以下函数:
ACOS, COS, RADIANS, SIN
我不是数学专家,但这些公式是否相同?我遇到了一些更多的变化和公式(例如球面余弦定理和Vincenty's formulae - 这似乎是最准确的),这让我更加困惑...
我需要选择一个好的通用公式来在PHP / MySQL中实现。有人可以解释一下我上面提到的公式之间的区别吗?
- 哪个计算速度最快? - 哪一个提供最准确的结果? - 从速度/结果准确性方面来看,哪一个是最好的?
感谢您对这些问题的洞察力。
根据theonlytheory的回答,我测试了以下大圆距离公式:
- Vincenty公式
- Haversine公式
- 球面余弦定理
Vincenty公式非常慢,但精度很高(可达0.5毫米)。
Haversine公式比Vincenty公式快得多,我能够在约6秒内运行100万次计算,这对我的需求来说是可以接受的。
球面余弦定理公式的速度几乎是Haversine公式的两倍,并且精度差异可以被忽略,适用于大多数情况。
以下是一些测试位置:
- 谷歌总部 (
37.422045
,-122.084347
) - 加利福尼亚州旧金山市 (
37.77493
,-122.419416
) - 法国艾菲尔铁塔 (
48.8582
,2.294407
) - 悉尼歌剧院 (
-33.856553
,151.214696
)
谷歌总部 - 加利福尼亚州旧金山:
- Vincenty公式:
49,087.066米
- Haversine公式:
49,103.006米
- 球面余弦定理:
49,103.006米
Google总部 - 巴黎铁塔,法国:
- Vincenty公式:
8,989,724.399米
- Haversine公式:
8,967,042.917米
- 球面余弦定理:
8,967,042.917米
Google总部 - 悉尼歌剧院:
- Vincenty公式:
11,939,773.640米
- Haversine公式:
11,952,717.240米
- 余弦定理球面距离公式:
11,952,717.240米
正如您所看到的,Haversine公式和球面余弦定理之间几乎没有明显的区别,但与Vincenty公式相比,两者的距离偏差高达22公里,因为它使用的是地球的椭圆近似而不是球形近似。
AB=sqrt(pow(($Xb-$Xa),2)+pow(($Yb-$Ya),2)));
,我从来没有完全理解它的作用...希望能帮到你 ;) - Strae[-180, 180]
,orig.lat - dest.lat
是否有误?如果orig.lat = -170
且dest.lat = 170
会发生什么?距离是340度吗?不,实际上只是20。如果您正在使用实际地球(地图集)坐标,您该如何解决这个问题? - Rudie