首页 > 解决方案 > 在给定短距离(最大 10 公里)的情况下,以最佳性能计算两个 lat,lng 点之间的距离

问题描述

给定两个 lat, lng 点,我知道它们之间的距离最大为 10KM,我是否必须使用半正弦公式来计算点之间的距离,或者是否有更简单的方法(假设地球是平的)可以让我几乎结果相同但性能更好?

标签: mysqllatitude-longitude

解决方案


你只是在“计算”几个项目的距离吗?还是你“在10公里范围内搜索所有?有很大的不同。

后者实际上是一个如何将 2D 问题硬塞进 1D 索引机制的算法问题。

计划 A:没有相关索引——必须检查所有行。

计划 B: INDEX(lat), INDEX(lng)并使用“边界框”: WHERE lat BETWEEN... AND lng BETWEEN...-- 优化器将选择一个或另一个索引。

计划 C:如果你有数百万行,就这么说;有一种更快(但更复杂)的方法。

我没有回答你的问题,因为它是算法中最不重要的部分。但我现在就回答。

Haversine 需要的时间大约是平地加毕达哥拉斯的两倍。 但这只是为了计算;获取行在处理中要重要得多

对于这么小的距离,不需要Haversine。我认为它在越过日期变更线或极点时甚至可以“正确”工作。我怀疑平地在那些边缘情况下会遇到麻烦。

对于平坦的地球,请务必将经度差除以COS(RADIANS(deg))。(1 度经度在赫尔辛基(纬度 60 度)是赤道的一半。)


推荐阅读