首页 > 数据库 > mysql教程 > 如何使用 MySQL 查找给定经纬度半径内的点?

如何使用 MySQL 查找给定经纬度半径内的点?

Susan Sarandon
发布: 2025-01-06 12:44:41
原创
436 人浏览过

How Can I Use MySQL to Find Points Within a Given Radius of Latitude and Longitude?

使用 MySQL 空间扩展检索圆内的点

要执行基于经纬度的空间查询,需要使用地理空间函数扩展 MySQL。然而,值得注意的是,MySQL 缺乏专门为涉及这些坐标的距离计算而设计的内置空间函数。

相反,地球表面上的邻近圆需要使用大圆距离公式,可以使用半正矢或其他适当的算法来实现。 MySQL 5.6 提供了一个未记录的 st_distance(p1, p2) 函数,用于计算平面形状内的笛卡尔距离,但由于笛卡尔距离引入的扭曲,这不适合基于纬度和经度的计算。

对于实际应用,考虑一个查询来查找给定纬度/经度十法定英里内的所有标志point:

SELECT id, coordinates, name, r,
        units * DEGREES(ACOS(LEAST(1.0, COS(RADIANS(latpoint))
                  * COS(RADIANS(latitude))
                  * COS(RADIANS(longpoint) - RADIANS(longitude))
                  + SIN(RADIANS(latpoint))
                  * SIN(RADIANS(latitude))))) AS distance
   FROM flags
   JOIN (
        SELECT 42.81  AS latpoint,  -70.81 AS longpoint, 
               10.0 AS r, 69.0 AS units
        ) AS p ON (1=1)
  WHERE MbrContains(GeomFromText (
        CONCAT('LINESTRING(',
              latpoint-(r/units),' ',
              longpoint-(r /(units* COS(RADIANS(latpoint)))),
              ',', 
              latpoint+(r/units) ,' ',
              longpoint+(r /(units * COS(RADIANS(latpoint)))),
              ')')),  coordinates)
登录后复制

在此查询中:

  • latpoint 和 longpoint 表示用户位置的纬度和经度。
  • r 是以英里为单位的搜索半径.
  • 单位表示地球表面每纬度的距离单位(例如,69英里为英里,111.045 公里为公里)。
  • MbrContains 排除基于边界矩形的搜索区域之外的点。
  • 大圆距离公式计算点之间的距离。

要将结果限制为圆内的点并按邻近程度排序,请将查询括在另一个查询中查询:

SELECT id, coordinates, name
   FROM (
         /* the above query, pasted in here */
        ) AS d
  WHERE d.distance <= d.r
  ORDER BY d.distance ASC
登录后复制

以上是如何使用 MySQL 查找给定经纬度半径内的点?的详细内容。更多信息请关注PHP中文网其他相关文章!

来源:php.cn
本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
作者最新文章
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板