选择在中心点半径范围内的坐标?

16

我有一个包含以下结构的坐标数据库:

ID:纬度:经度:名称:描述

我已经设置好我的Google Maps应用程序,可以在屏幕上有效地显示标记。但是我需要添加另一个功能,使用户可以查看所有距离中心点半径内的指针。

我该如何编写这种类型的SQL语句:

Select all pointers that fall within a 10 mile radius of X & Y
3个回答

32

以下SQL应该可以正常工作:

SELECT * FROM Table1 a 
WHERE (
          acos(sin(a.Latitude * 0.0175) * sin(YOUR_LATITUDE_X * 0.0175) 
               + cos(a.Latitude * 0.0175) * cos(YOUR_LATITUDE_X * 0.0175) *    
                 cos((YOUR_LONGITUDE_Y * 0.0175) - (a.Longitude * 0.0175))
              ) * 3959 <= YOUR_RADIUS_INMILES
      )

这是基于余弦定理的球面法,想要更详细的信息,请查看这篇文章-http://www.movable-type.co.uk/scripts/latlong.html


纬度是Y,经度是X。这在这种情况下意味着什么? - CompanyDroneFromSector7G
3
这个很好用!如果要使用公里而不是英里,请将3959替换为6371,并输入您的半径(以公里为单位)。 - SAR622
哈哈,不错啊,伙计 :D - Seloka

2

您可能需要分两步完成此操作。首先选择位于以X,Y为中心的20英里正方形内的点。假设您首先计算了正方形的上部、左部和下部、右部坐标,您可以通过以下命令从数据库获取所有在正方形内的点:

select * from coordinates where longitude < right and longitude > left and 
latitude < top and latitude > bottom;

第二步是查看这组点是否在10英里半径圆内。此时我会倾向于使用Google地图来计算这些点与正方形中心之间的距离,使用google.maps.geometry.spherical.computeDistanceBetween(from:LatLng, to:LatLng, radius?:number)函数。检查答案是否小于10英里。该函数默认使用地球半径。请保留HTML标签。

这个方法是可行的(除非你在极地附近,比如北极或南极,此时你的正方形看起来更像梯形或甚至三角形)。 - ypercubeᵀᴹ

0

这个 SQL 会给出更准确的答案:

SELECT *
 FROM Table1 a
 WHERE 1 = 1
 AND 2 * 3961 * asin(sqrt( power((sin(radians((X - cast(a.latitude as decimal(10,8))) / 2))) , 2) + cast(cos(radians(cast(a.latitude as decimal(18,8)))) * cos(radians(X)) * power((sin(radians((Y - cast(a.long as decimal(18,8))) / 2))) , 2) as decimal(18,10) ))) <= Radius_In_Miles

X = 质心的纬度 Y = 质心的经度

我是在Redshift中完成的,所以我必须使用cast来防止数值溢出错误。

参考:http://daynebatten.com/2015/09/latitude-longitude-distance-sql/


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接