5

我有一个矩形位置的北、东、南和西值,如何仅搜索该矩形位置范围内的那些位置(纬度/经度)?

在此处输入图像描述

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

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

googlemapsAPI 可以为我做到这一点,例如:

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

或者

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

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

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

编辑:

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

4

2 回答 2

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

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

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

边界框可能不是纬度/经度对齐的(例如,它的北/南/东/西线可能不遵循纬度/长轴)。如果您在纬度/经度地图投影上绘制平面矩形,就会发生这种情况。点越靠近边界框的边缘,离赤道越远,失真会越明显。

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

于 2013-03-23T07:34:52.980 回答
1

SQL 查询

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

如果穿越本初子午线或赤道,您将需要修改查询

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
于 2013-03-23T09:22:18.603 回答