2010-03-17 80 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」座標位於以您的測試位置爲中心的正方形內(更快),然後測試實際測地距離。

希望它有幫助!