如何運用Python計算地圖上兩點的實際距離

作者:xxw9485
時間:2017/6/20
參考資料:參考資料1參考資料2

之前遇到過這樣的問題:手裏有一批患者的具體居住地點以及對應的經緯度,我想分析下患者的具體分佈情況,不同患者之間的距離關係,這時就需要根據某兩點的經緯度來求該兩點的實際距離了。下面就是計算公式和代碼:

公式

球面上任意兩點的距離計算公式可以參考維基百科上的下述文章。
Great-circle distance
Haversine formula
下面採用的是維基百科推薦的Haversine公式,原因:

  • Great-circle distance公式用到了大量餘弦函數,而兩點間距離很短時(比如地球表面上相距幾百米的兩點),餘弦函數會得出0.999…的結果,會導致較大的舍入誤差。
  • 而Haversine公式採用了正弦函數,即使距離很小,也能保持足夠的有效數字。
    image
    其中:
    image
  • R爲地球半徑,可取平均值 6371km;
  • φ1, φ2 表示兩點的緯度;
  • Δλ 表示兩點經度的差值。

程序代碼:

# 輸入
# 計算地圖上兩點經緯度間的距離
from math import radians, cos, sin, asin, sqrt  
# Haversine(lon1, lat1, lon2, lat2)的參數代表:經度1,緯度1,經度2,緯度2(十進制度數)    
def Haversine(lon1, lat1, lon2, lat2): 
    # 將十進制度數轉化爲弧度  
    lon1, lat1, lon2, lat2 = map(radians, [lon1, lat1, lon2, lat2])  
    # Haversine公式  
    dlon = lon2 - lon1   
    dlat = lat2 - lat1   
    a = sin(dlat/2)**2 + cos(lat1) * cos(lat2) * sin(dlon/2)**2  
    c = 2 * asin(sqrt(a))   
    r = 6371 # 地球平均半徑,單位爲公里  
    d = c * r
    print("該兩點間距離={0:0.3f} km".format(d))

# 廣州市人民政府 113.270714,23.13552
# 深圳市人民政府 114.064803,22.549054
Haversine(113.270714,23.13552,114.064803,22.549054)

# 輸出
該兩點間距離=104.280 km
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章