使用MySQL在一定距离内找到点

时间:2014-02-18 15:29:13

标签: mysql sql geolocation geospatial

我对使用MySql的空间sql查询有疑问; 我有一张经纬度的桌子; 我会使用我的距离(半径)得到我的geoPosition最近的所有点。 我试过这个问题:

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;
  • 这个查询是关于表演的好方法吗?
  • 如果我考虑包含这些点的正方形,我该如何更改此查询?最好使用方形?

2 个答案:

答案 0 :(得分:0)

您可以使用简单的地图投影和直线距离,例如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

答案 1 :(得分:0)

我无法谈论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指定的距离。