參考: https://blog.csdn.net/Next_Second/article/details/78618081
pip install geopy
import json
from geopy import GoogleV3
from geopy.geocoders import Nominatim
from geopy import distance
class Geopy(object):
def location_geocode(self):
'''
地理編碼 根據地址查詢坐標及詳細信息
OpenStreetMap 平台上提供的 Nominatim 地理編碼器,不需要申請 API ,限流,限額,不能大規模頻繁訪問
我的情況:白嫖限速、限次數 非常很
:return:
'''
geolocator = Nominatim(user_agent="Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/75.0.3770.90 Safari/537.36") # 放ua
location = geolocator.geocode("珠穆朗瑪峰") # 根據查相關信息
location = geolocator.geocode("北京市海澱區西二旗北路")
print(location, location.address, location.latitude, location.longitude, location.altitude, location.point, location.raw)
def location_reverse(self):
"""
逆地理編碼 根據坐標查地點
:return:
"""
geolocator = Nominatim(user_agent="Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/75.0.3770.90 Safari/537.36") # 放ua
# location = geolocator.reverse("39.90733345 116.391244079988") # reverse 方法接收經緯度字符串作為輸入,緯度在前,經度在後
location = geolocator.reverse("31.239853 121.499740") # reverse 方法接收經緯度字符串作為輸入,緯度在前,經度在後
print(location, location.address, location.latitude, location.longitude, location.altitude, location.point, location.raw)
print(json.dumps(location.raw, indent=4, ensure_ascii=False, encoding='utf8'))
def location_distance(self):
"""
兩個經緯度坐標計算距離: 大圓算法將地球簡化為一個圓球,其計算的距離是球面上過兩點的大圓距離
有點: 大圓距離計算速度快 缺點: 一定的誤差(0.5%以內)
:return:
"""
dist = distance.distance((39.90733345,116.391244079988), (31.239853,121.499740)) # 緯度在前、經度在後
dist = distance.geodesic((45.768189, 126.6212835), (39.907359, 116.3912630)) # 等同上
print(dist.km) # 距離: km: 千米, m: 米, miles: 英裡
def location_great_circle(self):
"""
計算球面距離: 大地線使用目前國際通用的方法,用旋轉橢球面表示地球,其計算的是兩點在橢球面上的最短距離。
優點:精確度高 缺點: 大地線的劣勢在於計算速度太慢
:return:
"""
gc = distance.great_circle((45.768189, 126.6212835), (39.907359, 116.3912630)) # 同樣返回distance對象
print(gc.km) # 距離: km: 千米, m: 米, miles: 英裡
# print(f'{(dist.km - gc.km) / dist.km:%}')
# 哈爾濱到北京的大圓與大地線距離之間有0.13%的差異
def run(self):
# self.location_geocode() # 根據地點查坐標
# self.location_reverse() # 根據坐標查地點
self.location_distance()
self.location_great_circle()
if __name__ == '__main__':
gy = Geopy()
gy.run()