我需要在我的应用程序中实现地理邻近搜索,但我对使用正确的公式感到困惑.在Web和StackOverflow中进行一些搜索之后,我发现解决方案是:
选项#3真的不适合我ATM.现在我有点困惑,因为我总是认为大圆距离公式和Haversine公式是同义词,但显然我错了?
Haversine Formula http://i46.tinypic.com/30shbn6.png
以上屏幕截图取自使用MySQL论文的精彩Geo(邻近)搜索,并使用以下功能:
ASIN, SQRT, POWER, SIN, PI, COS
Run Code Online (Sandbox Code Playgroud)
我也看到了相同公式(余弦球面定律)的变化,如下所示:
(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))))
Run Code Online (Sandbox Code Playgroud)
它使用以下功能:
ACOS, COS, RADIANS, SIN
Run Code Online (Sandbox Code Playgroud)
我不是数学专家,但这些公式是一样的吗?我遇到了一些更多的变化,以及公式(例如Cosines的球面定律和Vincenty的 公式 - 这似乎是最准确的),这让我更加困惑......
我需要选择一个好的通用公式来实现PHP/MySQL.谁能解释我上面提到的公式之间的差异?
感谢您对这些问题的见解.
基于理论上的答案,我测试了以下大圆距离公式:
该Vincenty公式是死的慢,但是它是相当准确的(下降到0.5mm) . …
地球表面可以有一个纬度和经度的最大长度(以公里或英里为单位 - 但请注明)是多少?
我不确定我是否足够清楚,让我重新说明一下.众所周知,地球不是一个完美的圆,赤道(或厄瓜多尔)纬度/经度的1.0变化可能意味着一个距离,而两极的相同变化可能意味着另一个完全不同的距离.
我正在尝试缩减数据库返回的结果数(在本例中为MySQL),这样我就可以使用Great Circle公式计算几个点之间的距离.我没有选择所有点然后单独计算它们,而是选择纬度/经度边界内的坐标,例如:
SELECT * FROM poi
WHERE latitude >= 75 AND latitude <= 80
AND longitude >= 75 AND longitude <= 80;
Run Code Online (Sandbox Code Playgroud)
PS:已经很晚了,我觉得我的英语没有像我预期的那样出现,如果有什么你无法理解请说出来,我会根据需要修理/改进它,谢谢.