我编写了一个简单的Web应用程序(使用WSGI和Python),支持文本查询以查找数据库中的项目。现在,我想扩展它,允许查询“查找所有在{lat,long} 1英里范围内的项目”。
当然,如果考虑效率,这是一项复杂的任务,因此我正在考虑开发一个专门的外部模块,用于对地理坐标进行索引 - 类似于Lucene对文本的处理。
我认为已经存在像这样的通用组件,但迄今为止还没有找到任何东西。如有帮助,将不胜感激。
我编写了一个简单的Web应用程序(使用WSGI和Python),支持文本查询以查找数据库中的项目。现在,我想扩展它,允许查询“查找所有在{lat,long} 1英里范围内的项目”。
当然,如果考虑效率,这是一项复杂的任务,因此我正在考虑开发一个专门的外部模块,用于对地理坐标进行索引 - 类似于Lucene对文本的处理。
我认为已经存在像这样的通用组件,但迄今为止还没有找到任何东西。如有帮助,将不胜感激。
你有没有查看过Mongo DB,他们有一个地理位置索引的功能。 http://www.mongodb.org/display/DOCS/Geospatial+Indexing
如果你打算直接使用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”坐标位于以测试位置为中心的正方形内(速度更快),然后再测试实际大地距离。
希望能有所帮助!