使用 MySQL 查找距离内的点

Posted

技术标签:

【中文标题】使用 MySQL 查找距离内的点【英文标题】:Find points within a distance using MySQL 【发布时间】:2014-02-18 15:29:12 【问题描述】:

我对使用 mysql 的空间 sql 查询有疑问; 我有一张带有纬度和经度列的表格; 我会使用我的距离(半径)获得离我的地理位置最近的所有点。 我试过这个查询:

SELECT
    id, (
      6371 * acos (
      cos ( radians(78.3232) )
      * cos( radians( lat ) )
      * cos( radians( lng ) - radians(65.3234) )
      + sin ( radians(78.3232) )
      * sin( radians( lat ) )
    )
) AS distance
FROM markers
HAVING distance < 30
ORDER BY distance
LIMIT 0 , 20;
这个查询是关于表演的好方法吗? 如果我考虑一个包含点的正方形,我该如何更改此查询?最好用正方形?

【问题讨论】:

对我来说已经足够好了see 3K mysql 数据库 【参考方案1】:

我不能谈论 MySQL 中的性能主题,但是当在 SQL Server 中处理相同的问题时,我基于我的distance 构建了一个框,而我可以通过简单地验证 WHERE 子句来快速限制结果LatLong 在边界内。到那时,它就变成了简单的算术比较。在我缩小了当时的结果数量后,我从原来的角度检查了Distance

首先构建一个盒子的重点是减少复杂数学计算所涉及的记录数。

这是我在 SQL Server 中的示例。

DECLARE @Lat DECIMAL(20, 13) = 35.7862
   ,@Long DECIMAL(20, 13) = -80.3095
   ,@Radius DECIMAL(7, 2) = 5
   ,@Distance DECIMAL(10, 2)
   ,@Earth_Radius INT = 6371000;

SET @Distance = @Radius * 1609.344;

DECLARE @NorthLat DECIMAL(20, 13) = @Lat + DEGREES(@distance / @Earth_Radius)
   ,@SouthLat DECIMAL(20, 13) = @Lat - DEGREES(@distance / @Earth_Radius)
   ,@EastLong DECIMAL(20, 13) = @Long + DEGREES(@distance / @Earth_Radius / COS(RADIANS(@Lat)))
   ,@WestLong DECIMAL(20, 13) = @Long - DEGREES(@distance / @Earth_Radius / COS(RADIANS(@Lat)));

SELECT *
    FROM CustomerPosition AS cp
    WHERE (
            cp.Lat >= @SouthLat
            AND cp.Lat <= @NorthLat )
        AND (
              cp.Long >= @WestLong
              AND cp.Long <= @EastLong )

原始选择的结果我将它存储到临时表中,然后对其进行评估以查看哪些实际上是Within 指定的距离。

【讨论】:

【参考方案2】:

您可以使用简单的地图投影和直线距离,例如 equirectangular 投影。在本网站的公式中,您还可以使用没有平方根的更简单的公式:http://www.movable-type.co.uk/scripts/latlong.html。当然你可以使用边界框来过滤查询:How to calculate the bounding box for a given lat/lng location?, https://gis.stackexchange.com/questions/19760/how-do-i-calculate-the-bounding-box-for-given-a-distance-and-latitude-longitude。

【讨论】:

以上是关于使用 MySQL 查找距离内的点的主要内容,如果未能解决你的问题,请参考以下文章

使用 MySQL 从点表中查找最近的点

SQL查找属于圆的坐标

使用经度和纬度查找给定距离内的所有附近客户

在一定距离处查找经纬度四个方向的点

MATLAB点云处理:查找感兴趣区域(ROI)内的点

查找地理点的聚类(距离聚类中心 y 距离内的最小 x 点)的算法