之前遇到過這樣的問題:手裏有一批患者的具體居住地點以及對應的經緯度,我想分析下患者的具體分佈情況,不同患者之間的距離關係,這時就需要根據某兩點的經緯度來求該兩點的實際距離了。下面就是計算公式和代碼:
公式
球面上任意兩點的距離計算公式可以參考維基百科上的下述文章。
Great-circle distance
Haversine formula
下面採用的是維基百科推薦的Haversine公式,原因:
- Great-circle distance公式用到了大量餘弦函數,而兩點間距離很短時(比如地球表面上相距幾百米的兩點),餘弦函數會得出0.999…的結果,會導致較大的舍入誤差。
- 而Haversine公式採用了正弦函數,即使距離很小,也能保持足夠的有效數字。
其中:
- 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