一、兩個坐標之間距離計算
參考鏈接:
python實現
案例1、2,因為都是用LBS 球面距離公式(haversine公式)結果完全相同, 且與 geopy相差不大。
geopy是一個關於地理編碼的python庫。主要有以下幾個功能:(需要聯網)
- 地理編碼:將字符串轉換為地理位置
- 逆地理編碼:用於將地理坐標轉換為具體地址
- 計算兩個點的距離:經緯度距離和球面距離
代碼:
from math import radians, cos, sin, asin, sqrt
#公式計算兩點間距離(m)
def geodistance(lng1,lat1,lng2,lat2):
#lng1,lat1,lng2,lat2 = (120.12802999999997,30.28708,115.86572000000001,28.7427)
lng1, lat1, lng2, lat2 = map(radians, [float(lng1), float(lat1), float(lng2), float(lat2)]) # 經緯度轉換成弧度
dlon=lng2-lng1
dlat=lat2-lat1
a=sin(dlat/2)**2 + cos(lat1) * cos(lat2) * sin(dlon/2)**2
distance=2*asin(sqrt(a))*6371*1000 # 地球平均半徑,6371km
distance=round(distance/1000,3)
return distance
# 返回 446.721 千米
#調用geopy包中的方法
from geopy.distance import geodesic
print(geodesic((30.28708,120.12802999999997), (28.7427,115.86572000000001)).m) #計算兩個坐標直線距離
print(geodesic((30.28708,120.12802999999997), (28.7427,115.86572000000001)).km) #計算兩個坐標直線距離
# 返回 447.2497993542003 千米
# 南昌:華東交通大學(120.12802999999997,30.28708)
# 杭州:浙江工商大學(115.86572000000001,28.7427)
# 用百度地圖測量結果:447.02km

二、中文位置 轉 經緯度坐標
1. 地理編碼/逆地理編碼 ★★★ (日6000次)
(地理編碼/逆地理編碼 API 是通過 HTTP/HTTPS 協議訪問遠程服務的接口,提供結構化地址與經緯度之間的相互轉化的能力。) - Python程序參考
高德接口:https://lbs.amap.com/api/webservice/guide/api/georegeo
2. 搜索POI ★★★★★ (日2000次)
(搜索服務API是一類簡單的HTTP接口,提供多種查詢POI信息的能力,其中包括關鍵字搜索、周邊搜索、多邊形搜索、ID查詢四種篩選機制。)
高德接口:https://lbs.amap.com/api/webservice/guide/api/search
3. 調用geopy包
結果偏差,可能使用的google api;且只能按照 省市區(縣),無法到 鄉鎮。且速度慢。
import requests #使用高德API-地理/逆地理編碼:https://lbs.amap.com/api/webservice/guide/api/georegeo def geocodeG(address): key = '07ac12a00f830764ebfdee2fd0bc96fd' par = {'address': address, 'key': key} base = 'http://restapi.amap.com/v3/geocode/geo' response = requests.get(base, par) answer = response.json() return answer['geocodes'][0]['location'] address='原陽縣酒樓' #非結構化的位置,返回結果不准(結構化的數據效果很好) print(geocodeG(address))
輸出:113.912220,35.386060
#使用高德API-搜索POI:https://lbs.amap.com/api/webservice/guide/api/search def geocodeG2(address): key = '07ac12a00f830764ebfdee2fd0bc96fd' par = {'keywords': keywords, 'key': key,'offset':1} base = 'https://restapi.amap.com/v3/place/text' response = requests.get(base, par) answer = response.json() return answer['pois'][0]['location'] address='原陽縣酒樓' #模糊匹配、關鍵詞搜索 效果很好 print(geocodeG2(address))
輸出:113.961655,35.057336
from geopy.geocoders import Nominatim # 結果的經緯度,與高德有1-2公里偏差; 且只能按照 省市區(縣),無法到 鄉鎮; 且速度慢 def geocodeN(address): gps=Nominatim(user_agent="my-application") location=gps.geocode(address) return location.longitude,location.latitude address = "四川樂山市峨眉山市" print(geocodeN(address)) address = "四川樂山市峨眉山市高橋鎮" print(geocodeN(address))
輸出:
(103.48222, 29.60173)
Traceback (most recent call last):
