2013-04-01 163 views
42

我希望能夠估計兩個(緯度,經度)點之間的距離。我想低調,因爲這將是A *圖搜索,我希望它是快速。這些點將相距最多800公里。如何快速估算兩個(緯度,經度)點之間的距離?

+1

我們應該推斷這些點位於* sphere *嗎? – phs

+1

請參閱http://stackoverflow.com/questions/27928/how-do-i-calculate-distance-between-two-latitude-longitude-points或http://stackoverflow.com/questions/4913349/haversine-formula-在蟒蛇方向和距離之間的兩個GPS點(蟒蛇) –

+0

是的,在地球上,但速度。 AFAIK複雜的數學不夠快。 – fread2281

回答

89

Haversine Formula in Python (Bearing and Distance between two GPS points)的答案提供了可以解答您的問題的Python實現。

使用下面的實現I 在較舊的筆記本電腦上在不到1秒的時間內執行了100,000次重複操作。我認爲你的目的應該是足夠的。但是,在優化性能之前,您應該分析任何內容。

from math import radians, cos, sin, asin, sqrt 
def haversine(lon1, lat1, lon2, lat2): 
    """ 
    Calculate the great circle distance between two points 
    on the earth (specified in decimal degrees) 
    """ 
    # convert decimal degrees to radians 
    lon1, lat1, lon2, lat2 = map(radians, [lon1, lat1, lon2, lat2]) 
    # haversine formula 
    dlon = lon2 - lon1 
    dlat = lat2 - lat1 
    a = sin(dlat/2)**2 + cos(lat1) * cos(lat2) * sin(dlon/2)**2 
    c = 2 * asin(sqrt(a)) 
    # Radius of earth in kilometers is 6371 
    km = 6371* c 
    return km

要低估haversine(lat1, long1, lat2, long2) * 0.90或任何你想要的因素。我不明白如何將錯誤引入低估是有用的。

+0

1000s,但這是蟒蛇,我需要慷慨低估。 – fread2281

7

速度的一個想法是將long/lat座標轉換爲3D(x,y,z)座標。對點進行預處理後,使用點之間的歐幾里得距離作爲實際距離的快速計算下衝。

3

對於最大速度,您可以創建類似於座標距離的rainbow table。這聽起來像你已經知道你正在使用的領域,所以它似乎預先計算它們可能是可行的。然後,您可以加載最近的組合並使用它。

例如,在美國大陸,經度是55度跨度,緯度是20,這將是1100個整數點。所有可能的組合之間的距離是handshake problem,其通過(n-1)(n)/ 2或大約600k組合來回答。這似乎是非常可行的存儲和檢索。如果您提供有關您的要求的更多信息,我可以更具體。

28

由於距離相對較小,因此可以使用equirectangular距離近似值。這種近似比使用Haversine公式更快。因此,要獲得從參考點(lat1/lon1)到您正在測試的點(lat2/lon2)的距離,請使用下面的公式。重要提示:您需要將所有經/緯度點轉換爲弧度:

R = 6371 // radius of the earth in km 
x = (lon2 - lon1) * cos(0.5*(lat2+lat1)) 
y = lat2 - lat1 
d = R * sqrt(x*x + y*y) 

由於「R」是公里,距離「d」將成爲公里。

參考:http://www.movable-type.co.uk/scripts/latlong.html

0

請使用下面的代碼。

def distance(lat1, lng1, lat2, lng2): 
    #return distance as meter if you want km distance, remove "* 1000" 
    radius = 6371 * 1000 

    dLat = (lat2-lat1) * math.pi/180 
    dLng = (lng2-lng1) * math.pi/180 

    lat1 = lat1 * math.pi/180 
    lat2 = lat2 * math.pi/180 

    val = sin(dLat/2) * sin(dLat/2) + sin(dLng/2) * sin(dLng/2) * cos(lat1) * cos(lat2)  
    ang = 2 * atan2(sqrt(val), sqrt(1-val)) 
    return radius * ang 
+0

在我的情況下,其他代碼對我來說效果不佳。 所以,我只是transtlate在這個答案的功能http://stackoverflow.com/questions/6981916/how-to-calculate-distance-between-two-locations-using-their-longitude-and-latitu – uher

相關問題