引言 今天看到一篇阿里云的文章'天下武功,唯快不破',以物流行業(yè)為例,分析了PostgreSQL 與 Greenplum 在地理位置信息處理,最佳路徑算法,機(jī)器學(xué)習(xí)等方面的物流行業(yè)應(yīng)用方法。其中提到了地址轉(zhuǎn)換成坐標(biāo)的問(wèn)題,更專業(yè)些的名詞應(yīng)該是“地理編碼”,即知道一個(gè)地址,如
很多地圖相關(guān)的廠商都提供了相關(guān)的API,我們可以直接利用這些API得到這些信息。比如百度的
借用ESRI文檔中更直觀的一張圖
不過(guò),需要說(shuō)明的一點(diǎn)是,若想使用百度的這套API的前提是,有百度賬號(hào)并申請(qǐng)相應(yīng)的Key。其實(shí),除了百度之外,谷歌、ESRI、微軟的Bing等都有類似的地理編碼服務(wù)。不過(guò)這些服務(wù)大多沒(méi)有專門針對(duì)Python的庫(kù)并且彼此之間的Json結(jié)構(gòu)也不一致。于是乎專治不服的Python大神做了一個(gè)專門的地理編碼工具 地理編碼工具 |
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 |
pip install geocoder
import geocoder
g = geocoder.google('1403 Washington Ave, New Orleans, LA 70130')
g = geocoder.arcgis(u'北京市海淀區(qū)上地十街10號(hào)')
g.latlng
輸出為
[29.9287839, -90.08421849999999]
也可以查看完整的geojson
g.geojson
輸出為
{'bbox': [-90.0855674802915,
29.9274349197085,
-90.0828695197085,
29.9301328802915],
'geometry': {'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'}
直接用Google嘗試查詢中文地址時(shí)失敗
g = geocoder.google(u'北京市海淀區(qū)上地十街10號(hào)')
g.ok
輸出為
False
用百度應(yīng)該沒(méi)問(wèn)題,不過(guò)我沒(méi)有申請(qǐng)相應(yīng)的key。切換到arcgis,能夠成功編碼
g = geocoder.arcgis(u'北京市海淀區(qū)上地十街10號(hào)')
g.latlng
輸出為
[40.050934, 116.30079]
g = geocoder.google([29.9287839, -90.08421849999999], method='reverse')
print g.address
print g.city
print g.state
print g.country
輸出為
1403 Washington Ave, New Orleans, LA 70115, USA
New Orleans
LA
US
換成中國(guó)的地址
g = geocoder.google([40.050934, 116.30079], method='reverse')
print g.address
print g.city
print g.state
print g.country
輸出為
Bai Du Da Sha, Haidian Qu, Beijing Shi, China, 100193
Beijing
Beijing Shi
CN
用arcgis的服務(wù)試試
g = geocoder.arcgis([40.050934, 116.30079], method='reverse')
print g.address
print g.city
print g.state
print g.country
輸出為
None
北京市
北京市
CHN
Google轉(zhuǎn)換成的是英文,但地址比較全。arcgis雖然是中文,但是詳細(xì)的地址居然輸出為了None,這有個(gè)X
用。
geocoder
的功能不止于此,它還可以查IP(包括自己的)。
g = geocoder.ip('199.7.157.0')
print g.latlng
print g.city
g = geocoder.ip('me')
print g.latlng
print g.city
輸出為
[43.6934, -79.4857]
Toronto
[51.05, 13.75]
Dresden
查詢一個(gè)城市的空間包圍盒
g = geocoder.arcgis(u'山東')
g.bbox
輸出為
{'northeast': [38.976997, 121.976998], 'southwest': [33.022997, 116.022998]}
空間信息既可以利用行政區(qū)劃、自然地理區(qū)域等文本信息描述,也可以用坐標(biāo)系統(tǒng)、數(shù)字(郵編等)來(lái)標(biāo)識(shí)。利用地理編碼技術(shù),可以將空間信息的地理定位要素與相應(yīng)的文本信息關(guān)聯(lián)起來(lái)。本文主要介紹了geocoder
地理編碼這一小工具,可以方便快捷地利用地圖等相關(guān)廠商提供的地理編碼服務(wù),將文字描述的位置轉(zhuǎn)換成地圖上的經(jīng)緯度,或者通過(guò)地圖上的某個(gè)位置坐標(biāo)獲得相應(yīng)的位置信息文字描述。
|
來(lái)自: LibraryPKU > 《WebGIS》