我需要在我的应用程序中实现地理邻近搜索,但是对于要使用的正确公式我非常困惑。在Web和StackOverflow中进行一些搜索后,我发现解决方案是:
- 使用Haversine公式
使用大圆距离公式- 在数据库中使用空间搜索引擎
选项#3真的不是我的ATM选项。现在,我有点困惑了,因为我总是说大圆距离公式和Haversine公式是同义词,但显然我错了吗?
上面的屏幕截图来自MySQL出色的Geo(邻近)搜索文件,并使用以下功能:
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的 公式-似乎是最准确的),这让我更加困惑...
我需要选择一个良好的通用公式以在PHP / MySQL中实现。谁能解释我上面提到的公式之间的区别?
- 哪一个计算最快?
- 哪一个提供最准确的结果?
- 就结果的速度/准确性而言,哪一个最好?
感谢您对这些问题的见解。
基于唯一的理论答案,我测试了以下大圆距离公式:
- 文森特公式
- Haversine公式
- 余弦球定律
该Vincenty公式是死的慢,但是它是相当准确的(下降到0.5mm) 。
该haversine公式是远远比Vincenty公式更快,我能够在大约6秒,这是我的需要非常接受试验1次亿次运算。
该余弦公式的球面法发现是几乎快一倍的haversine公式和精度差是neglectfulness对于大多数使用情况。
以下是一些测试位置:
- Google总部(
37.422045
,-122.084347
) - 加利福尼亚州旧金山(
37.77493
,-122.419416
) - 法国埃菲尔铁塔(
48.8582
,2.294407
) - 悉尼歌剧院(
-33.856553
,151.214696
)
Google总部-加利福尼亚州旧金山:
- 文森特公式:
49 087.066 meters
- Haversine公式:
49 103.006 meters
- 余弦球定律:
49 103.006 meters
Google总部-法国艾菲尔铁塔:
- 文森特公式:
8 989 724.399 meters
- Haversine公式:
8 967 042.917 meters
- 余弦球定律:
8 967 042.917 meters
Google总部-悉尼歌剧院:
- 文森特公式:
11 939 773.640 meters
- Haversine公式:
11 952 717.240 meters
- 余弦球定律:
11 952 717.240 meters
如您所见,Haversine公式与余弦球定律之间没有明显的区别,但是与Vincenty公式相比,两者的距离偏移都高达22公里,因为它使用的是地球的椭圆近似而不是球形。
AB=sqrt(pow(($Xb-$Xa),2)+pow(($Yb-$Ya),2)));
,我从来不完全知道它的作用..希望能为您提供帮助;)