如何搜索特定范围内的地理对象?例如。我的数据库中存储了几个带有纬度/经度坐标的对象。现在我想检索位于给定点周围特定周界(10 英里或 20 英里)内的所有对象。
我想我必须做的是形成一些查询,例如:
SELECT * FROM objects o where o.lat < (myPositionLat+x) AND o.lon < (myPositionLon+y)
这样对吗?如何确定/设置 x 和 y 的值?
最佳答案
您必须记住,经度之间的距离不是恒定的。纬度是平行的,相距约 111 公里(69 英里),但经度在赤道处最宽,为 111 公里,并在两极逐渐收敛到零。
在北纬或南纬 40° 处,经度之间的距离约为 85 公里(53 英里),而纬度之间的距离大致相同,为 111 公里 (Source)。如果您的地理对象仅限于某个区域,并且可以接受非常粗略的过滤器,您可以使用此信息来确定您的 x
和 y
偏移量。
但是,如果您的对象在全局范围内稀疏,您应该计算 great-circle distance反而。幸运的是,使用 haversine formula 相对容易.您可能想进一步阅读并查看 Calculate distance, bearing and more between Latitude/Longitude points 中的实现。作者:Chris Veness。
如果您只有少量地理对象,您可以简单地计算从您的点到每个地理对象的大圆距离。然后简单地按距离对结果列表进行排序,并按以英里或公里为单位的某个阈值进行过滤。
但是,如果您有很多地理对象,您应该考虑使用带有 spatial indexing 的数据库。能力。 MySQL , PostgreSQL和 SQL Server 2008所有这些都具有地理空间特征(本地或通过扩展),其中包括空间索引和 haversine 公式的实现。
关于sql - 查询地理编码位置(纬度/经度)周围的周长,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2760466/