【導語】:GeoPy 是一款提供了不一樣地理編碼服務實現的 Python 庫,可以讓開發者使用第三方地理編碼服務和其餘數據源,輕鬆地在全球範圍內定位座標。git
在平常開發工做中,對於地理信息編碼功能,咱們能夠找到許多不一樣的第三方服務,好比 OpenStreetMap Nominatim,Google Geocoding API 等,但在對接不一樣的服務時,須要按照各自的開發文檔作不少定製且冗餘的工做。github
想象一下,若是有一個開源且免費的庫,能夠同時集成多種地理信息編碼服務,是否是很是的簡潔?geopy 就是這麼一款神器。api
geopy 是一款免費開源的庫,在單個包中爲許多不一樣地理編碼服務提供了實現,從而避免了直接對接不一樣地理編碼服務的 API,簡化了代碼的邏輯。網絡
如圖,geopy 至關於一個代理,讓咱們方便地對接第三方地理編碼 API。須要注意的是不一樣的服務有不一樣的使用條款、配額、訂價、地理數據等等,因此在使用過程當中具體地理編碼服務沒法完成某些查詢,或在計算機與地理編碼服務間出現的任何網絡問題,和 geopy 都是無關的。異步
我我的實際試用的體驗很是好,使用簡便。post
https://github.com/geopy/geopyui
(在 GitHub 已有 3100 Star)編碼
使用pip
安裝便可代理
pip install geopy
在geopy.geocoders
中,咱們能夠找到每一個地理定位服務(如谷歌地圖、必應地圖)的類,用於抽象地理編碼服務的 API。每一個地理編碼程序至少定義了一個 geocode
方法,用於從給定位置字符串中解析出經緯度座標和位置細節,而且能夠定義 reverse
方法,將一對給定經緯度座標解析爲一個地址。另外,在初始化每一個地理編碼程序時,須要傳入與其服務交互所需的憑證或設置,例如 API 密鑰或區域設置。rest
若是要解析給定位置的經緯度座標及位置細節,可按以下步驟:
>>> from geopy.geocoders import Nominatim >>> geolocator = Nominatim(user_agent="test_geo") >>> location = geolocator.geocode("上海中心") >>> print(location.address) 上海中心大廈, 501, 銀城中路, 浦東新區, 200010, 中國 >>> print((location.latitude, location.longitude)) (31.23564615, 121.5012662299473) >>> print(location.raw) {'place_id': 130257928, 'licence': 'Data © OpenStreetMap contributors, ODbL 1.0. https://osm.org/copyright', 'osm_type': 'way', 'osm_id': 165792123, 'boundingbox': ['31.235266', '31.2360377', '121.5007425', '121.5017465'], 'lat': '31.23564615', 'lon': '121.5012662299473', 'display_name': '上海中心大廈, 501, 銀城中路, 浦東新區, 200010, 中國', 'class': 'tourism', 'type': 'attraction', 'importance': 0.5597014410814095, 'icon': 'https://nominatim.openstreetmap.org/ui/mapicons//poi_point_of_interest.p.20.png'}
若是要解析給定經緯度座標的具體位置,可按以下步驟:
>>> from geopy.geocoders import Nominatim >>> geolocator = Nominatim(user_agent="test_geo") >>> location = geolocator.reverse("31.23564615, 121.5012662299473") >>> print(location.address) 上海中心大廈, 501, 銀城中路, 浦東新區, 200010, 中國 >>> print((location.latitude, location.longitude)) (31.23564615, 121.5012662299473) >>> print(location.raw) {'place_id': 130257928, 'licence': 'Data © OpenStreetMap contributors, ODbL 1.0. https://osm.org/copyright', 'osm_type': 'way', 'osm_id': 165792123, 'lat': '31.23564615', 'lon': '121.5012662299473', 'display_name': '上海中心大廈, 501, 銀城中路, 浦東新區, 200010, 中國', 'address': {'tourism': '上海中心大廈', 'house_number': '501', 'road': '銀城中路', 'city': '浦東新區', 'postcode': '200010', 'country': '中國', 'country_code': 'cn'}, 'boundingbox': ['31.235266', '31.2360377', '121.5007425', '121.5017465']}
在計算地理距離時,咱們可使用測地距離(geodesic distance)和大圓距離(great-circle distance),在 geopy 中geopy.distance.distance
默認使用測地距離來計算距離。
若是要計算測地距離,可按以下步驟:
>>> from geopy import distance >>> wellington = (-41.32, 174.81) >>> shanghai = (31.23564615, 121.5012662299473) >>> print(distance.distance(wellington, shanghai).miles) 6039.930578215586 >>> print(distance.distance(wellington, shanghai).km) 9720.326036467784
若是要指定計算大圓距離,可按以下步驟:
>>> print(distance.great_circle(wellington, shanghai).miles) 6054.82585437528
geopy 還提供了異步模式、單位換算等模塊,更多細節能夠 查看官方文檔。
開源前哨
平常分享熱門、有趣和實用的開源項目。參與維護 10萬+ Star 的開源技術資源庫,包括:Python、Java、C/C++、Go、JS、CSS、Node.js、PHP、.NET 等。