3100 Star!集成多種地理信息編碼服務的神器

【導語】: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 等。

相關文章
相關標籤/搜索