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

时间:2011-10-16 10:23:22

标签: sql google-maps coordinates

我在架构中有一个坐标数据库:

ID:纬度:经度:名称:降序

我已经设置了我的谷歌地图应用程序,以在屏幕上有效地显示标记。但是我需要添加另一个功能,用户可以从中心点查看半径范围内的所有指针。

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

Select all pointers that fall within a 10 mile radius of X & Y

3 个答案:

答案 0 :(得分:22)

以下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

答案 1 :(得分:2)

您可能需要分两步完成此操作。选择位于20英里广场内的点,其中心位于X,Y。假设您首先计算方形的顶部,左侧和底部,右侧坐标,您可以从数据库中获取方形内的所有点:

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英里。此函数使用地球半径作为默认值。

答案 2 :(得分: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中做到了,所以我不得不使用强制转换来防止数值溢出错误。

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