【问题标题】:Querying within longitude and latitude in MySQLMySQL中经纬度范围内的查询
【发布时间】:2011-06-08 21:48:19
【问题描述】:

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

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

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

【问题讨论】:

    标签: mysql geolocation geospatial geo


    【解决方案1】:

    您应该搜索 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;
    

    【讨论】:

    • 感谢您的建议。我刚刚在这里发布了一个新问题:stackoverflow.com/questions/4697624/…
    • 这不会为我返回任何计算出的距离,只返回NULL
    • 不返回确切点的结果。这些结果将距离返回为 NULL,不适用于有子句。
    • 37 = lng 和 -12=lat,正如传统论文所建议的那样?:)
    • @DavidYell 不明白为什么它在您的情况下返回 NULL。我在三年前和今天都使用过它,它确实非常有效。
    【解决方案2】:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-12-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-09-04
      相关资源
      最近更新 更多