27

在询问具体代码示例之前,我只想问是否可以进行类似以下伪代码的查询:

从表中选择项目,其中 lat/lon = -在某个 lat/lon 点的 x 英里内-

那可行吗?还是我必须跳过一些箍?任何可以推荐的好方法都会很棒!

4

2 回答 2

59

您应该搜索 Haversine 公式,但一个好的开始可能是:

引用第一个网址:

下面的 SQL 语句将找到距离 37, -122 坐标 25 英里半径范围内最近的 20 个位置。它根据该行的纬度/经度和目标纬度/经度计算距离,然后仅询问距离值小于 25 的行,按距离对整个查询进行排序,并将其限制为 20 个结果。要按公里而不是英里搜索,请将 3959 替换为 6371。

SELECT
    id,
    ( 3959
      * acos( cos( radians(37) )
              * cos(  radians( lat )   )
              * cos(  radians( lng ) - radians(-122) )
            + sin( radians(37) )
              * sin( radians( lat ) )
            )
    )
    AS distance
FROM markers
HAVING distance < 25
ORDER BY distance
LIMIT 0 , 20;
于 2011-01-14T02:05:43.733 回答
7

我强烈建议使用 SpatiaLite 或 PostGIS 进行此类操作。它们内置了您尝试编写代码的那种功能。它们还对 MySQL 中不存在的空间数据有适当的支持。

不完全是 MySQL 中的解决方案,但如果您想在未来继续进行空间请求,这是一个更好的解决方案。

于 2011-01-14T20:11:59.250 回答