使用 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
子句来快速限制结果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
指定的距离。
【讨论】:
【参考方案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 查找距离内的点的主要内容,如果未能解决你的问题,请参考以下文章