2010-03-17 77 views
4

我的简单网络应用程序(WSGI,Python)支持文本查询来查找数据库中的项目。 现在我想扩展它以允许查询“查找距离{lat,long} 1英里内的所有项目”。地理索引:根据纬度/经度高效计算邻近度

当然,如果效率是一个问题,那么这是一项复杂的工作,所以我正在考虑为地理坐标建立索引的专用外部模块 - 有点像Lucene对于文本。

我假设这样的通用组件已经存在,但迄今尚未找到任何东西。任何帮助将不胜感激。

回答

2

你有没有签出mongo数据库,他们有一个地理索引功能。 http://www.mongodb.org/display/DOCS/Geospatial+Indexing

+0

谢谢 - 我希望有一个更通用的解决方案(例如,如果应用程序使用RDBMS存储,那么使用MongoDB会有点奇怪),但是将来会记住这一点。 – AnC 2011-06-03 10:48:27

+1

什么是您的数据库?大多数数据库都具有地理空间索引。例如:对于MySQL http://dev.mysql.com/doc/refman/5.6/en/gis-introduction.html – user781192 2011-07-14 09:09:21

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”坐标位于以您的测试位置为中心的正方形内(更快),然后测试实际测地距离。

希望它有帮助!