开发者社区 问答 正文

计算地理邻近度的公式?mysql

我需要在我的应用程序中实现地理邻近搜索,但是对于要使用的正确公式我感到非常困惑。在Web和StackOverflow中进行一些搜索后,我发现解决方案是:

使用Haversine公式 使用大圆距离公式 在数据库中使用空间搜索引擎 选项#3确实不是我的ATM选项。现在,我有点困惑了,因为我总是说大圆距离公式和Haversine公式是同义词,但显然我错了吗?

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公里,因为它使用的是地球的椭圆近似而不是球形。

展开
收起
保持可爱mmm 2020-05-17 16:58:59 762 分享 版权
1 条回答
写回答
取消 提交回答
  • 假设机器精度无限,余弦定律和Haversine公式将给出相同的结果。Haversine公式对浮点错误更健壮。但是,当今的机器具有15位有效数字数量级的双精度,并且余弦定律可能对您来说很好。这两个公式都假定球面土,而维森特的迭代解(最准确)假定椭圆形土(实际上,地球甚至不是椭球面-它是一个大地水准面)。一些参考:http : //www.movable-type.co.uk/scripts/gis-faq-5.1.html

    会变得更好:请注意余弦定律中使用的纬度以及Haversine是地心纬度,这与大地纬度不同。对于一个球体,这两个是相同的。

    哪一个计算最快?

    从最快到最慢的顺序是:余弦定律(5次三角函数调用)-> hasersine(涉及sqrt)-> Vicenty(必须在for循环中迭代解决)

    哪一个最准确?

    维森蒂。

    同时考虑速度和准确性时,哪一个最好?

    如果您的问题域使得对于您要计算的距离而言,地球可以认为是平坦的,那么您可以计算出一个公式,该公式为x = kx *经度差,y = ky *纬度差。然后距离= sqrt(dx dx + dy dy)。如果您的问题域可以用距离平方解决,那么您将不必使用sqrt,并且此公式将尽可能快地获得。它具有附加的优势,您可以计算矢量距离-x是向东的距离,y是向北的距离。否则,请尝试3,然后选择最适合您的情况。来源:stack overflow

    2020-05-17 17:01:13
    赞同 展开评论