地理索引:基于经纬度高效计算距离的方法

4

我编写了一个简单的Web应用程序(使用WSGI和Python),支持文本查询以查找数据库中的项目。现在,我想扩展它,允许查询“查找所有在{lat,long} 1英里范围内的项目”。

当然,如果考虑效率,这是一项复杂的任务,因此我正在考虑开发一个专门的外部模块,用于对地理坐标进行索引 - 类似于Lucene对文本的处理。

我认为已经存在像这样的通用组件,但迄今为止还没有找到任何东西。如有帮助,将不胜感激。

2个回答

2

谢谢 - 我希望有一个更通用的解决方案(例如,如果应用程序使用关系型数据库进行存储,使用MongoDB可能有点奇怪),但将来会记住这个。 - AnC
1
你使用的数据库是什么?大多数数据库都具有地理空间索引。例如:对于MySQL,可以参考http://dev.mysql.com/doc/refman/5.6/en/gis-introduction.html。 - user781192

1

如果你打算直接使用Python实现,我只能想到一种半蛮力攻击的方法,我已经用类似的目的实现了:

#!/usr/bin/python
from math import *
def distance(p1,p2):  # uses the haversine function and an ellipsoid model
    lat1, long1 = p1; lat2, long2 = p2
    lat1=radians(lat1); long1=radians(long1); lat2=radians(lat2); long2=radians(long2)
    maior=6378.137; menor=6356.7523142
    R=(maior*menor)/sqrt((maior*cos(lat1))**2 + (menor*sin(lat1))**2)
    d_lat = lat2 - lat1; d_long = long2 - long1
    a = sin(d_lat/2)**2 + cos(lat1) * cos(lat2) * sin(d_long/2)**2
    c = 2 * atan2(sqrt(a), sqrt(1-a))
    length = R * c
    x = sin(d_long) * cos(lat2)
    y = cos(lat2) * sin(lat1) - sin(lat2) * cos (lat1) * cos(d_long)
    bearing = 90-(degrees(atan2(y, -x)))
    return length, bearing

对于距离筛选的点,您可以首先找到候选点,其“x”和“y”坐标位于以测试位置为中心的正方形内(速度更快),然后再测试实际大地距离。

希望能有所帮助!


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接