2010-05-03 73 views
3

如何在特定的边界中搜索地理对象?例如。我有几个对象,其纬度/经度坐标存储在我的数据库中。现在我想要检索位于特定周边(10英里或20英里)周围的所有物体。查询围绕地理编码位置(纬度/经度)的边界

我想我必须做的是要形成像一些查询:

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

这是正确的?我如何确定/设置x和y的值?

回答

1

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

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

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

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

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