【问题标题】:How to search (predefined) locations (Latitude/Longitude) within a Rectangular, using Sql?如何使用 Sql 在矩形内搜索(预定义)位置(纬度/经度)?
【发布时间】:2013-03-13 02:46:48
【问题描述】:

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

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

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

googlemaps API 可以为我执行此操作,例如:

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

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

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

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

编辑:

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

【问题讨论】:

  • 加载图像需要几个小时。与此同时,我在 Google 群组中找到了这个帖子:Point in Polygon Function?
  • 这个线程帮不了我..正如我提到的,我可以使用 googlemaps 来做到这一点..但我需要在从数据库中获取位置时这样做。
  • @CanSpice 不是重复的,其实我想在数据库中搜索。

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


【解决方案1】:
DECLARE @Bounds AS Geography = GEOMETRY::STGeomFromText('polygon-wkt-here',0)

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

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

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

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

【讨论】:

  • 让我探索Geography = GEOMETRY::STGeomFromText
【解决方案2】:

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

【讨论】:

  • 如果矩形跨越赤道或本初子午线会怎样?
  • 这也不处理非平面矩形。最好使用 Geometry 类型。
  • @Dan-o 我需要在美国使用它,所以我认为第一个 SQL 对我有用??
  • 美国与平面几何有什么关系? (以及对我上面评论的一个小修正:几何应该是地理)
  • 谢谢,这篇文章帮助我找到了我所寻求的答案!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-02-07
  • 1970-01-01
  • 2023-03-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多