http://blog.csdn.net/pipisorry/article/details/52205266
python地理位置处理
python地理编码地址以及用来处理经纬度的库
GeoDjango – 世界级地理图形 web 框架。
GeoIP – MaxMind GeoIP Legacy 数据库的Python API。
geojson – GeoJSON 的 Python 绑定及工具。
geopy – Python 地址编码工具箱。
pygeoip – 纯 Python GeoIP API。
django-countries – 一个 Django应用程序,提供用于表格的国家选择功能,国旗图标静态文件以及模型中的国家字段。
其它:
shapely,是geos的python封装,而geos是jts的c++移植版本。
python地理数据处理相关代码
Python 地址编码工具箱geopy
geopy is a Python 2 and 3 client for several popular geocoding web services.
geopy makes it easy for Python developers to locate the coordinates of addresses, cities, countries, and landmarks across the globe using third-party geocoders and other data sources.
geopy includes geocoder classes for the OpenStreetMap Nominatim, ESRI ArcGIS, Google Geocoding API (V3), Baidu Maps, Bing Maps API, Mapzen Search, Yandex, IGN France, GeoNames, NaviData, OpenMapQuest, What3Words, OpenCage, SmartyStreets, geocoder.us, and GeocodeFarm geocoder services. The various geocoder classes are located in geopy.geocoders.
安装
pip install geopy
基本使用
Note: 函数参数都是纬度latitude在前,经度longitude在后。
查询地名转换为具体地址和经纬度Geocoding
To geolocate a query to an address and coordinates:
>>> 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', ...}
To find the address corresponding to a set of coordinates:
>>> 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', ...}
计算两地距离Measuring Distance
通过经纬度计算两地距离的两种方法。Geopy can calculate geodesic distance between two points using the Vincenty distance or great-circle distance formulas, with a default of Vincenty available as the class geopy.distance.distance, and the computed distance available as attributes (e.g., miles, meters,kilometers,etc.).
输入数据类型可以是tuple, list, array...,元素类型可以是float, str...
Vincenty distance
>>> 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
Vincenty distance (vincenty) uses a more accurate ellipsoidal modelof the earth. This is the default distance formula, and is thus aliased asdistance.distance. There are multiple popular ellipsoidal models, andwhich one will be the most accurate depends on where your points are locatedon the earth. The default is the WGS-84 ellipsoid, which is the most globallyaccurate. geopy includes a few othermodels in the distance.ELLIPSOIDS dictionary:
model major (km) minor (km) flattening
ELLIPSOIDS = {'WGS-84': (6378.137, 6356.7523142, 1 / 298.257223563),
'GRS-80': (6378.137, 6356.7523141, 1 / 298.257222101),
'Airy (1830)': (6377.563396, 6356.256909, 1 / 299.3249646),
'Intl 1924': (6378.388, 6356.911946, 1 / 297.0),
'Clarke (1880)': (6378.249145, 6356.51486955, 1 / 293.465),
'GRS-67': (6378.1600, 6356.774719, 1 / 298.25),
}
You can change the ellipsoid model used by the Vincenty formula like so:
>>> distance.vincenty(ne, cl, ellipsoid='GRS-80').miles
The above model name will automatically be retrieved from theELLIPSOIDS dictionary. Alternatively, you can specify the model valuesdirectly:
>>> distance.vincenty(ne, cl, ellipsoid=(6377., 6356., 1 / 297.)).miles
[class geopy.distance.vincenty(*args, **kwargs)]
[https://en.wikipedia.org/wiki/Vincenty’s_formulae]
great-circle distance
>>> 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
[class geopy.distance.great_circle(*args, **kwargs)]
[https://en.wikipedia.org/wiki/Great-circle_distance]
两种经纬度距离度量方法的区别
Vincenty's formulae are two related iterative methods used in geodesy to calculate the distance between two points on the surface of a spheroid, developed by Thaddeus Vincenty (1975a) They are based on the assumption that the figure of the Earth is an oblate spheroid(扁球形体), and hence are more accurate than methods such as great-circle distance which assume a spherical(球状的) Earth.
[What's the difference between vincenty and great circle distance calculations?]
计算出错
TypeError: __new__() takes from 1 to 4 positional arguments but 5 were given
可能是某个坐标的维度不对,如[[ ]]二维就不对,应该是[]或者()。
ValueError: Vincenty formula failed to converge!
vincenty算法可以不收敛,可能是因为中间有一些三角函数的计算是通过迭代计算出来的,超过最大迭代次数就当作不收敛了。the basic iterative technique for the inverse method is just Vincenty (regular + his antipodal method); so it may fail to converge in some cases.
Examples where the solution of the inverse problem fails to converge:
lat1 lon1 lat2 lon2 0.7 0 -0.3 179.7 2.2 0 -1.8 179.6 2.3 0 -2.0 179.6
[Talk:Geodesics on an ellipsoid]
def c(): from geopy import distance xs = [[0.7, 0], [2.2, 0], [2.3, 0], [12, 45]] ys = [[-0.3, 179.7], [-1.8, 179.6], [-2.0, 179.6], [25, 65]] for x, y in zip(xs, ys): try: d = distance.vincenty(x, y) print(d) except: print('error')
[Python - Vincenty's inverse formula not converging (Finding distance between points on Earth)]
设置很大的迭代次数也不会收敛:
d = distance.vincenty(x, y, iterations = 1000000)
解决:
It may be preferable to use :class:`.great_circle`, which is marginally less accurate, but always produces a result.
[https://github.com/geopy/geopy/pull/144/files]
from: http://blog.csdn.net/pipisorry/article/details/52205266
ref: