因爲專業須要,常常接觸一些地理處理的工具包,文檔都是英文的,本身看的同時將其翻譯一下,一方面本身學習的同時有個記錄,要是能同時給一塊兒的學習的童鞋們一些幫助,想一想也是極好的。如下的文檔內容主要翻譯自官方文檔,水平有限,錯誤的地方但願你們指出。html
處理地理數據常常會涉及到地理編碼的問題。地理編碼指的是將地理信息轉化成座標關係的過程。分爲正向和反向的編碼。正向的是指將地址信息轉換爲座標點,好比:武漢市武漢大學-->(114.3594147, 30.5401222);反向地理編碼就是將地理座標轉換爲具體的地址,是一個與前面相反的過程。node
基於python的地理編碼庫geopy 是用於地理編碼的經常使用工具,使用它 可獲取多種地圖服務的座標。目前Python2和Python3下都支持。Python開發者能夠使用geopy很容易的獲取全球的某個街道地址,城市, 國家和地塊的地理座標,它是經過第三方的地理編碼器和數據源來解析的。python
geopy能夠使用的地理定位服務以下:git
OpenStreetMapNominatim,ESRIArcGIS, GoogleGeocodingAPI(V3), BaiduMaps, BingMapsAPI,Yahoo!PlaceFinder, Yandex, IGNFrance, GeoNames, NaviData,OpenMapQuest, What3Words, OpenCage, SmartyStreets, geocoder.us, and GeocodeFarm等. 這些豐富的地理編碼器在geopy.geocoders模塊下面,它提供各個地理定位服務的API類。每一個地理編碼器至少定義了一個geocode方法, 用於將字符串轉換爲地理位置;也定義了一個reverse方法,用於將地理座標轉換爲具體地址。每一個地理編碼器須要接受認證和設置才能使用它的服務,例 如:在初始化時,須要一個API key或者locale。web
geopy經過了CPython 2.7, CPython 3.2, CPython 3.4, PyPy, and PyPy3下的測試。api
安裝:工具
能夠經過pip或者easy_install方式安裝:學習
pip install geopy
easy_install geopy
或者經過從PyPI下載wheel或源文件安裝測試
下面將經過實例演示一下geopy的使用ui
地理編碼
>>> from geopy.geocoders import Nominatim>>> geolocator = Nominatim()>>> location = geolocator.geocode("175 5th Avenue NYC")>>> print(location.address) Flatiron Building, 175, 5th Avenue, Flatiron, New York, NYC, New York, ...>>> print((location.latitude, location.longitude)) (40.7410861, -73.9896297241625)>>> print(location.raw) {'place_id': '9167009604', 'type': 'attraction', ...}
反地理編碼
>>> from geopy.geocoders import Nominatim>>> geolocator = Nominatim()>>> location = geolocator.reverse("52.509669, 13.376294")>>> print(location.address) Potsdamer Platz, Mitte, Berlin, 10117, Deutschland, European Union>>> print((location.latitude, location.longitude)) (52.5094982, 13.3765983)>>> print(location.raw) {'place_id': '654513', 'osm_type': 'node', ...}
計算距離
geopy能使用經緯度距離公式(Vincenty distance) 或球面距離(great-circle distance)公式在兩點間計算測地距離。在geopy中用的經緯度距離是默認的方式,類爲geopy.distance.distance,計算距離爲其屬性(e.g., miles, meters, etc)。
給出計算經緯度距離的例子以下:
>>> from geopy.distance import vincenty>>> newport_ri = (41.49008, -71.312796)>>> cleveland_oh = (41.499498, -81.695391)>>> print(vincenty(newport_ri, cleveland_oh).miles)538.3904451566326
使用球面距離:
>>> from geopy.distance import great_circle >>> newport_ri = (41.49008, -71.312796) >>> cleveland_oh = (41.499498, -81.695391) >>> print(great_circle(newport_ri, cleveland_oh).miles) 537.1485284062816