我有一个矩形位置的北,东,南和西值,我怎么才能搜索那个矩形位置范围内的那些位置(纬度/经度)?
请注意,我需要搜索数据库中的位置(纬度/经度)。我需要找到数据库中位于给定矩形范围内的位置,我将在地图上为它们绘制标记。
我不是在谈论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解决方案。
答案 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