The introduction
Today, I saw an article by Alicloud called “The world’s martial arts, only fast can’t break”. Taking the logistics industry as an example, I analyzed PostgreSQL and Greenplum’s application methods in geographical location information processing, optimal path algorithm, machine learning and other aspects of the logistics industry. It mentioned the problem of address conversion into coordinates. The more technical term should be “geocoding”, that is to know how an address, such as no. 10 shangdi tenth street, haidian district, Beijing, can obtain the corresponding latitude and longitude location information (40,116), or vice versa.
Geocoding concept
Many map-related vendors provide apis that can be used directly to obtain this information. Take Baidu’s Geocoding API.
Geocoding API is a kind of interface for providing translation service from address to latitude and longitude coordinates or from latitude and longitude coordinates to address. Users can use C#, C++, Java and other development languages to send requests and receive returned data from JSON and XML. The Geocoding API includes address resolution and reverse address resolution capabilities:
Borrow a more intuitive figure from the ESRI documentation
Geocoding:
Address resolution, by structured address in detail to the street to get baidu longitude and latitude information, for example: “27” haidian district of Beijing zhongguancun south street address resolution is the result of the LNG: 116.31985, lat: 39.959836
At the same time, geocoding support scenic spots and historical sites, landmarks name directly resolve return baidu latitude and longitude, for example: “baidu mansion” address resolution is the result of the LNG: 116.30815, lat: 40.056885
Inverse geocoding:
Reverse address resolution, namely by baidu latitude and longitude information is structured address information, for example: “lat: 31.325152, LNG: 120.558957” reverse address resolution is the result of the “jiangsu province suzhou huqiu district garden road no. 318”.
However, it should be noted that if you want to use baidu’s API, you need to have a Baidu account and apply for the corresponding Key. In addition to Baidu, Google, ESRI, Microsoft’s Bing and others have similar geocoding services. However, most of these services do not have python-specific libraries and do not have consistent Json structures with each other. As a result, the Python gods created a special geocoding tool, GeoCoder, to integrate the services of these different vendors.
Geocoding toolgeocoder
Let’s take a look at which companies’ geocoding services are supported:
Provider | Optimal | Usage Policy |
---|---|---|
ArcGIS | World | |
Baidu | China | API key |
Bing | World | API key |
CanadaPost | Canada | API key |
FreeGeoIP | World | |
Geocoder.ca | CA & US | Rate Limit |
GeocodeFarm | World | Policy |
GeoNames | World | Username |
GeoOttawa | Ottawa | |
World | Rate Limit, Policy | |
HERE | World | API key |
IPInfo | World | |
Mapbox | World | API key |
MapQuest | World | API key |
Mapzen | World | API key |
MaxMind | World | |
OpenCage | World | API key |
OpenStreetMap | World | Policy |
Tamu | US | API key |
TomTom | World | API key |
What3Words | World | API key |
Yahoo | World | |
Yandex | Russia | |
TGOS | Taiwan |
The installation
pip install geocoderCopy the code
geocoding
import geocoder g = geocoder.google("1403 Washington Ave, New Orleans, LA 70130") g = geocoder. Arcgis (u" 10 Shangdi 10th Street, Haidian District, Beijing, China ") g = geocoderCopy the code
The output is
[29.9287839, 90.08421849999999]Copy the code
You can also view the full GeoJSON
g.geojsonCopy the code
The output is
{'coordinates': [-90.0855674802915, 29.9274349197085, -90.0828695197085, 29.9301328802915], 'coordinates': {'coordinates': [-90.08421849999999, 29.9287839], 'type': 'Point'}, 'properties': {'accuracy': u'ROOFTOP', 'address': u'1403 Washington Ave, New Orleans, LA 70130, USA', 'bbox': [-90.0855674802915, 29.9274349197085, -90.0828695197085, 29.9301328802915], 'City ': U 'New Orleans', 'confidence': 9, 'country': u'US', 'county': u'Orleans Parish', 'encoding': 'utf-8', 'housenumber': u'1403', 'lat': 29.9287839, 'LNG ': -90.08421849999999,' Location ': '1403 Washington Ave, New Orleans, LA 70130', 'Neighborhood ': u'Garden District', 'ok': True, 'place': u'ChIJGyFHWc2lIIYRYSoneaXAUiw', 'postal': u'70130', 'provider': 'google', 'quality': u'street_address', 'state': u'LA', 'status': 'OK', 'status_code': 200, 'street': u'Washington Ave'}, 'type': 'Feature'}Copy the code
Failed to query the Chinese address directly using Google
G = geocoder. Google (u" 10, Shangdi 10th Street, Haidian District, Beijing ")Copy the code
The output is
FalseCopy the code
It should be ok to use Baidu, but I have not applied for the corresponding key. Switch to ArcGIS, coding can be successful
G = geocoder. Arcgis (u" 10, Shangdi 10th Street, Haidian District, Beijing ")Copy the code
The output is
[40.050934, 116.30079]Copy the code
Inverse geocoding
G = geocoder. Google ([29.9287839, 90.08421849999999]. method='reverse') print g.address print g.city print g.state print g.countryCopy the code
The output is
1403 Washington Ave, New Orleans, LA 70115, USA
New Orleans
LA
USCopy the code
Change it to a Chinese address
G = geocoder. Google ([40.050934, 116.30079], method='reverse') print g.dress print g.city print g.state print g.tryCopy the code
The output is
Bai Du Da Sha, Haidian Qu, Beijing Shi, China, 100193
Beijing
Beijing Shi
CNCopy the code
Try using arcGIS’s service
G = geocoder. Arcgis ([40.050934, 116.30079], method='reverse') print g.state print g.ountryCopy the code
The output is
None Beijing Beijing CHNCopy the code
Google is translated into English, but the address is more complete. Although Arcgis is In Chinese, the detailed address is output as None, which has an X.
other
Geocoder does more than that. It can also look up IP (including its own).
G = geocoder. IP ('199.7.157.0') print g = geocoder. IP ('me') print g = geocoderCopy the code
The output is
[43.6934, -79.4857] Toronto [51.05, 13.75] TorontoCopy the code
Query the spatial bounding box of a city
G = geocoder. Arcgis (u" shandong ") g.boboxCopy the code
The output is
{'northeast': [38.976997, 121.976998], 'southwest': [33.022997, 116.022998]}Copy the code
summary
Spatial information can be described by text information, such as administrative divisions and physical geographical regions, as well as identified by coordinate system and numbers (postcodes, etc.). Geocoding technology can be used to associate geo-location elements of spatial information with corresponding text information. This paper mainly introduces the small tool Geocoder, which can easily and quickly use the geocoding services provided by map and other relevant manufacturers to convert the location of text description into longitude and latitude on the map, or obtain the corresponding text description of location information through the coordinates of a location on the map.
The original post was published on November 18, 2016
Author: Space-time Drei
This article is from the Python Chinese Community, a cloud community partner. For more information, please follow the wechat official account of Python Chinese Community