我对使用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;
答案 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
子句中的快速限制结果只需验证Lat
和Long
是否在边界内。那时它变得简单算术比较。在我缩小了当时的结果数量后,我从原始点开始检查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
指定的距离。