如何使用Sql搜索矩形内的(预定义)位置(纬度/经度)?

时间:2013-03-23 06:21:48

标签: c# sql-server google-maps google-maps-api-3

我有一个矩形位置的北,东,南和西值,我怎么才能搜索那个矩形位置范围内的那些位置(纬度/经度)?

enter image description here

请注意,我需要搜索数据库中的位置(纬度/经度)。我需要找到数据库中位于给定矩形范围内的位置,我将在地图上为它们绘制标记。

我不是在谈论Google search,搜索API已经支持传递矩形边界来过滤搜索。

googlemaps API可以为我这样做:

var request = {
    bounds: myMapObject.getBounds(), // Search only within the Bound of the Map
    query: someTextToFind
};

OR

var isWithInMapsBounds = myMapObject.getBounds().contains(myLocation);

但我需要在从数据库获取位置时这样做,我的意思是在服务器端

有人可以指导我正确的方向,如何实现这一功能?

修改

我想在数据库中搜索;所以我需要一个SQL解决方案。

2 个答案:

答案 0 :(得分:2)

DECLARE @Bounds AS Geography = GEOMETRY::STGeomFromText('polygon-wkt-here',0)

SELECT columns-list
FROM   table
WHERE  1 = @Bounds.STIntersects(table.point-column)

快速记录那些在黑暗中的人,为什么你不能只将你的点位置与你的边界框的北/南/东/西坐标进行比较:

边界框可能不是纬度/长度对齐的(例如,其北/南/东/西线可能不跟随纬度/长轴)。 如果在Lat / Long地图投影上绘制平面矩形,则会发生这种情况。失真越接近边界框的边缘,越远离赤道。

使用Geography数据类型的第二个原因是它提供了一种统一的方法来为 ANY 多边形执行这些操作,而不仅仅是矩形。所以现在你可以比较你的盒子里是否有一个点,或者找到一个邮政编码中的所有地址,所有地址都是相同的代码。

答案 1 :(得分:0)

SQL查询

SELECT *  FROM mytable WHERE lat >= bottomlat  AND lat <= toplat AND lng >= leftlng AND lng <= rightlng

如果要穿过Prime Meridian或Equator,您需要修改查询

SELECT * FROM mytable WHERE lat >=bottomlat AND lat <= toplat  AND   lng >= leftLng AND lng < 0 
UNION
SELECT * FROM mytable WHERE lat >=bottomlat AND lat <= toplat  AND  lng >= 0 AND lng  <= rightLng