我的数据库中有位置。位置具有纬度和经度属性(取自谷歌地图,例如:48.809591)。 是否有任何查询可以帮助我检索其他位置范围内的位置?
实施例: 我有位置A纬度= 48.809591,经度= 2.124009,想要检索我的数据库中距离位置5英里的所有位置对象
我的第一个想法是检索square.latitude< square中的位置。 A.latitude + 5英里和location.latitude> A.latitude - 5英里和location.longitude< A.longitude + 5英里和location.longitude> A.longitude - 5英里,然后在http://www.movable-type.co.uk/scripts/latlong.html
之类的帮助下从返回的数组中删除不相关的位置有什么想法吗?
答案 0 :(得分:2)
如果您使用MySQL作为DBMS 1 ,您可能有兴趣查看以下演示文稿:
作者描述了如何使用MySQL中的Haversine Formula按邻近度排序空间数据,并将结果限制为定义的半径。更重要的是,他还介绍了如何使用纬度和经度列上的传统索引来避免对此类查询进行全表扫描。
1 即使你不是,这仍然是有趣和适用的 2 还有pdf version的演示文稿。
答案 1 :(得分:0)
我想,您想要的计算称为大圆距:
答案 2 :(得分:0)
你需要一个距离函数。
对于SQL Server,它看起来像这样(注意距离以千米为单位),
CREATE FUNCTION distance
(
@startLatitude float,
@startLongitude float,
@endLatitude float,
@endLongitude float
)
RETURNS float
AS
BEGIN
DECLARE @distance float;
set @distance =
6371 * 2 * atn2(sqrt(power(sin(pi() / 180 * (@endLatitude - @startLatitude) / 2), 2) +
power(cos(@startLatitude * pi() / 180), 2) *
power(sin(pi() / 180 * (@endLongitude - @startLongitude) / 2), 2)),
sqrt(1 - power(sin(pi() / 180 * (@endLatitude - @startLatitude) / 2), 2) +
power(cos(@startLatitude * pi() / 180), 2) *
power(sin(pi() / 180 * (@endLongitude - @startLongitude) / 2), 2)));
RETURN @distance
END