python地理数据处理库geopy

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计算地图上两点经纬度间的距离]

皮皮blog



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]

[geopy documents]

[geopy/geopy]

from: http://blog.csdn.net/pipisorry/article/details/52205266

ref: 


评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值