我的简单网络应用程序(WSGI,Python)支持文本查询来查找数据库中的项目。 现在我想扩展它以允许查询“查找距离{lat,long} 1英里内的所有项目”。地理索引:根据纬度/经度高效计算邻近度
当然,如果效率是一个问题,那么这是一项复杂的工作,所以我正在考虑为地理坐标建立索引的专用外部模块 - 有点像Lucene对于文本。
我假设这样的通用组件已经存在,但迄今尚未找到任何东西。任何帮助将不胜感激。
我的简单网络应用程序(WSGI,Python)支持文本查询来查找数据库中的项目。 现在我想扩展它以允许查询“查找距离{lat,long} 1英里内的所有项目”。地理索引:根据纬度/经度高效计算邻近度
当然,如果效率是一个问题,那么这是一项复杂的工作,所以我正在考虑为地理坐标建立索引的专用外部模块 - 有点像Lucene对于文本。
我假设这样的通用组件已经存在,但迄今尚未找到任何东西。任何帮助将不胜感激。
你有没有签出mongo数据库,他们有一个地理索引功能。 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”坐标位于以您的测试位置为中心的正方形内(更快),然后测试实际测地距离。
希望它有帮助!
谢谢 - 我希望有一个更通用的解决方案(例如,如果应用程序使用RDBMS存储,那么使用MongoDB会有点奇怪),但是将来会记住这一点。 – AnC 2011-06-03 10:48:27
什么是您的数据库?大多数数据库都具有地理空间索引。例如:对于MySQL http://dev.mysql.com/doc/refman/5.6/en/gis-introduction.html – user781192 2011-07-14 09:09:21