【问题标题】:Querying a perimeter around a Geocode-Location (Lat/Lon)查询地理编码位置(纬度/经度)周围的周长
【发布时间】:2010-05-03 18:59:56
【问题描述】:

我怎样才能在某个范围内搜索地理对象?例如。我的数据库中存储了几个具有纬度/经度坐标的对象。现在我想检索位于给定点周围特定周长(10 英里或 20 英里)内的所有对象。

我想我要做的就是形成一些查询,例如:

SELECT * FROM objects o where o.lat < (myPositionLat+x) AND o.lon < (myPositionLon+y)

这是对的吗?如何确定/设置 x 和 y 的值?

【问题讨论】:

    标签: sql google-maps distance geocode


    【解决方案1】:

    您必须记住,经度之间的距离不是恒定的。纬度是平行的,相距约 111 公里(69 英里),但经度在赤道处最宽,为 111 公里,并在两极逐渐收敛到零。

    在北纬 40° 或南纬 40° 处,经度之间的距离约为 85 公里(53 英里),而纬度之间的距离大致相同,为 111 公里 (Source)。如果您的地理对象仅限于某个区域,并且可以接受非常粗略的过滤器,则可以使用此信息来确定您的 x 和 y 偏移量。

    但是,如果您的对象在全球范围内是稀疏的,则您应该计算 great-circle distance。幸运的是,使用haversine formula 相对容易。您可能需要进一步阅读并查看 Chris Veness 在Calculate distance, bearing and more between Latitude/Longitude points 上的实现。

    如果您只有几个地理对象,您可以简单地计算从您的点到每个地理对象的大圆距离。然后只需按距离对结果列表进行排序,并按以英里或公里为单位的某个阈值进行过滤。

    但是,如果您将拥有许多地理对象,则应考虑使用具有spatial indexing 功能的数据库。 MySQL、PostgreSQL 和 SQL Server 2008 都具有地理空间特征(本地或通过扩展),其中包括空间索引和半正弦公式的实现。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-07-14
      • 1970-01-01
      • 1970-01-01
      • 2012-08-24
      • 2014-04-08
      • 2021-01-01
      • 1970-01-01
      相关资源
      最近更新 更多