mysql - 在给定短距离(最大 10 公里)的情况下,以最佳性能计算两个 lat,lng 点之间的距离
问题描述
给定两个 lat, lng 点,我知道它们之间的距离最大为 10KM,我是否必须使用半正弦公式来计算点之间的距离,或者是否有更简单的方法(假设地球是平的)可以让我几乎结果相同但性能更好?
解决方案
你只是在“计算”几个项目的距离吗?还是你“在10公里范围内搜索所有?有很大的不同。
后者实际上是一个如何将 2D 问题硬塞进 1D 索引机制的算法问题。
计划 A:没有相关索引——必须检查所有行。
计划 B: INDEX(lat), INDEX(lng)
并使用“边界框”: WHERE lat BETWEEN... AND lng BETWEEN...
-- 优化器将选择一个或另一个索引。
计划 C:如果你有数百万行,就这么说;有一种更快(但更复杂)的方法。
我没有回答你的问题,因为它是算法中最不重要的部分。但我现在就回答。
Haversine 需要的时间大约是平地加毕达哥拉斯的两倍。 但这只是为了计算;获取行在处理中要重要得多。
对于这么小的距离,不需要Haversine。我认为它在越过日期变更线或极点时甚至可以“正确”工作。我怀疑平地在那些边缘情况下会遇到麻烦。
对于平坦的地球,请务必将经度差除以COS(RADIANS(deg))
。(1 度经度在赫尔辛基(纬度 60 度)是赤道的一半。)
推荐阅读
- python - 如何在可能有多种选择的 SQLAlchemy 中实现表单字段
- go - 使用 uintptr 作为弱参考是否安全
- c# - 找不到 IEnumerable<> 的任何方法来进行空检查
- reactjs - 将我的应用程序 react-native 组件导入到单个文件中,例如使用 vue?
- c - 声明与“__interwork __vfp”不兼容
- reactjs - 为什么将 Electron 与 SPA 框架一起使用?
- linux - 如何在linux中将文件的每一列除以单独文件中的一行?
- three.js - 三.js obj/mtl模型突然显示黑色
- python - 在 Anaconda Python 中安装 Keras 和 TensorFlow 时遇到问题
- apache-spark - 检查 YARN 集群上是否启用了 External Shuffle Service