由于专业需要,经常接触一些地理处理的工具包,文档都是英文的,自己看的同时将其翻译一下,一方面自己学习的同时有个记录,要是能同时给一起的学习的童鞋们一些帮助,想想也是极好的。以下的文档内容主要翻译自官方文档,水平有限,错误的地方希望大家指出。
处理地理数据经常会涉及到地理编码的问题。地理编码指的是将地理信息转化成坐标关系的过程。分为正向和反向的编码。正向的是指将地址信息转换为坐标点,比如:武汉市武汉大学-->(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': '', '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': '', '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