
一、基本原理
處理地理資料時,經常需要用到兩個地理位置間的距離,比如 A 點經緯度(30.553949,114.357399),B點經緯度(129.1344,25.5465),求 AB 兩點之間的距離,
已知地球上任意兩點(lng1,lat1),(lng2, lat2)的經緯度坐標,求兩點間的距離可以利用 haversine 公式:
-
首先先將經緯度坐標的角度化成弧度(rlng1,rlat1),(rlng2,rlat2)
-
利用如下公式:

-
其中 a 表示兩點維度的差值,即 a = rlat1 - rlat2, b表示兩點經度的差值,即 b = rlng1 - rlng2;其中 r 表示地球的半徑
網址:https://map.baidu.com/search/%E5%85%A8%E5%9B%BD/
利用百度地圖測距可知,清華大學與北京大學距離大約為1.8km,如下所示:


二、獲取地點的經緯度
主要利用高德地圖地理編碼 / 逆地理編碼 API 來獲取北京大學和清華大學的經緯度,Python實作如下:
# -*- coding: UTF-8 -*-
"""
@Author :葉庭云
@CSDN :https://yetingyun.blog.csdn.net/
"""
import requests
import json
from pprint import pprint
url = 'https://restapi.amap.com/v3/geocode/geo' # 輸入API問號前固定不變的部分
params = {'key': '換成您的key', # 注冊高德地圖,創建應用獲得的key
'address': '清華大學'} # 將兩個引數放入字典
res = requests.get(url, params)
# pprint(json.loads(res.text))
results = json.loads(res.text)
# 列印結果
print(results["geocodes"][0]["formatted_address"] + ":" + results["geocodes"][0]["location"])
結果如下:

- 北京市海淀區北京大學經緯度:116.308264,39.995304
- 北京市海淀區清華大學經緯度:116.326759,40.003304
三、手寫 haversine 公式計算
Python代碼如下:
from math import sin, asin, cos, radians, fabs, sqrt
EARTH_RADIUS = 6371 # 地球平均半徑大約6371km
def hav(theta):
s = sin(theta / 2)
return s * s
def get_distance_hav(lat0, lng0, lat1, lng1):
# 用haversine公式計算球面兩點間的距離
# 經緯度轉換成弧度
lat0 = radians(lat0)
lat1 = radians(lat1)
lng0 = radians(lng0)
lng1 = radians(lng1)
dlng = fabs(lng0 - lng1)
dlat = fabs(lat0 - lat1)
h = hav(dlat) + cos(lat0) * cos(lat1) * hav(dlng)
distance = 2 * EARTH_RADIUS * asin(sqrt(h)) # km
return distance
result = get_distance_hav(39.995304, 116.308264, 40.003304, 116.326759)
print("距離:{:.2f}km".format(result))
結果如下:

四、利用 geopy 庫
geopy是一個關于地理編碼的 Python 庫,主要有以下幾個功能:
- 地理編碼:將字串轉換為地理位置
- 逆地理編碼:用于將地理坐標轉換為具體地址
- 計算兩個點的距離:經緯度距離和球面距離
pip install安裝上即可
pip install geopy -i http://pypi.douban.com/simple --trusted-host pypi.douban.com
Python代碼如下:
from geopy.distance import geodesic
distance = geodesic((39.995304, 116.308264), (40.003304, 116.326759)).km
print("距離:{:.3f}km".format(distance))
對比結果如下:

手寫 haversine 公式計算距離為:1.809km,而直接呼叫 geopy 庫的 geodesic 方法計算距離為:1.812km,二者計算結果相差很小,
更多有關 geopy 的使用可以學習官方檔案: https://www.osgeo.cn/geopy/
五、利用 haversine 庫
pypi地址:https://pypi.org/project/haversine/
Calculate the distance (in various units) between two points on Earth using their latitude and longitude.
用經緯度計算地球上兩點之間的距離(以不同單位表示),pip install安裝即可:

Python代碼如下:
import haversine
print(tuple(haversine.Unit)) # 查看所有可用的單位
from haversine import haversine, Unit
# 兩點的經緯度
point1 = (39.995304, 116.308264)
point2 = (40.003304, 116.326759)
result1 = haversine(point1, point2, unit=Unit.KILOMETERS) # km
result2 = haversine(point1, point2, unit=Unit.METERS) # m
# 列印計算結果
print("距離:{:.3f}km".format(result1))
print("距離:{:.3f}m".format(result2))
結果如下:

利用 haversine 庫計算距離的結果與手寫 haversine 計算的結果一致!
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/319868.html
標籤:其他
