3

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

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

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

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

4

1 回答 1

2

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

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

但是,如果您的对象在全球范围内是稀疏的,那么您应该计算大圆距离幸运的是,使用haversine 公式相对容易。您可能需要进一步阅读并查看Chris Veness在计算纬度/经度点之间的距离、方位等方面的实现。

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

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

于 2010-05-04T03:51:37.500 回答