如何搜索某个周边的地理对象?例如。我有几个Lat / Lon坐标存储在我的数据库中的对象。现在我想要检索位于给定点周围特定边界(10英里或20英里)的所有对象。
我想我要做的是形成一些查询,如:
SELECT * FROM objects o where o.lat < (myPositionLat+x) AND o.lon < (myPositionLon+y)
这是对的吗?如何确定/设置x和y的值?
答案 0 :(得分:1)
你必须记住经度之间的距离不是恒定的。纬度平行并且相距大约111公里(69英里),但经度在111公里的赤道处最宽,并且在极点处逐渐收敛到零。
在北纬或南纬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都具有地理空间特征(本地或通过扩展),其中包括空间索引和半正式公式的实现。