由於專業需要,經常接觸一些地理處理的工具包,文檔都是英文的,自己看的同時將其翻譯一下,一方面自己學習的同時有個記錄,要是能同時給一起的學習的童鞋們一些幫助,想想也是極好的。以下的文檔內容主要翻譯自官方文檔,水平有限,錯誤的地方希望大家指出。
處理地理數據經常會涉及到地理編碼的問題。地理編碼指的是將地理信息轉化成坐標關系的過程。分為正向和反向的編碼。正向的是指將地址信息轉換為坐標點,比如:武漢市武漢大學-->(114.3594147, 30.5401222);反向地理編碼就是將地理坐標轉換為具體的地址,是一個與前面相反的過程。
基於python的地理編碼庫geopy 是用於地理編碼的常用工具,使用它可獲取多種地圖服務的坐標。目前Python2和Python3下都支持。Python開發者可以使用geopy很容易的獲取全球的某個街道地址,城市,國家和地塊的地理坐標,它是通過第三方的地理編碼器和數據源來解析的。
geopy可以使用的地理定位服務如下:
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。
geopy通過了CPython 2.7, CPython 3.2, CPython 3.4, PyPy, and PyPy3下的測試。
安裝:
可以通過pip或者easy_install方式安裝:
pip install geopy
easy_install geopy
或者通過從PyPI下載wheel或源文件安裝
下面將通過實例演示一下geopy的使用
地理編碼
>>> 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
