地理索引:基于纬度/经度有效地计算邻近度

时间:2010-03-17 07:48:41

标签: geolocation

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

当然,如果效率是一个问题,这是一个复杂的工作,所以我想到一个专门的外部模块,它为地理坐标做索引 - 有点像Lucene的文本。

我假设这样的通用组件已经存在,但到目前为止还没有找到任何东西。任何帮助将不胜感激。

2 个答案:

答案 0 :(得分:2)

你有没有检查过mongo db,他们有一个地理索引功能。 http://www.mongodb.org/display/DOCS/Geospatial+Indexing

答案 1 :(得分: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”坐标位于以测试位置为中心的正方形内的候选点(更快),然后测试实际的测地距离。

希望它有所帮助!