日韩黑丝制服一区视频播放|日韩欧美人妻丝袜视频在线观看|九九影院一级蜜桃|亚洲中文在线导航|青草草视频在线观看|婷婷五月色伊人网站|日本一区二区在线|国产AV一二三四区毛片|正在播放久草视频|亚洲色图精品一区

分享

怎樣用Python實(shí)現(xiàn)地理編碼

 LibraryPKU 2017-11-20
 時(shí)空Drei,德國(guó)德累斯頓工業(yè)大學(xué)在讀博士生,個(gè)人的擅長(zhǎng)領(lǐng)域?yàn)椋豪肞ython進(jìn)行空間數(shù)據(jù)(遙感GIS)處理分析,掌握常用的機(jī)器學(xué)習(xí)工具。個(gè)人公眾號(hào):stdrei,分享時(shí)空數(shù)據(jù)分析與德國(guó)留學(xué)筆記。
?

引言

今天看到一篇阿里云的文章'天下武功,唯快不破',以物流行業(yè)為例,分析了PostgreSQL 與 Greenplum 在地理位置信息處理,最佳路徑算法,機(jī)器學(xué)習(xí)等方面的物流行業(yè)應(yīng)用方法。其中提到了地址轉(zhuǎn)換成坐標(biāo)的問(wèn)題,更專業(yè)些的名詞應(yīng)該是“地理編碼”,即知道一個(gè)地址,如北京市海淀區(qū)上地十街10號(hào),怎么樣可以獲取到對(duì)應(yīng)的經(jīng)緯度位置信息(40,116),或者反過(guò)來(lái)。


地理編碼概念

很多地圖相關(guān)的廠商都提供了相關(guān)的API,我們可以直接利用這些API得到這些信息。比如百度的Geocoding API。

Geocoding API是一類接口,用于提供從地址到經(jīng)緯度坐標(biāo)或者從經(jīng)緯度坐標(biāo)到地址的轉(zhuǎn)換服務(wù),用戶可以使用C# 、C++、Java等開(kāi)發(fā)語(yǔ)言發(fā)送請(qǐng)求且接收J(rèn)SON、XML的返回?cái)?shù)據(jù)。Geocoding API包括地址解析和逆地址解析功能:

借用ESRI文檔中更直觀的一張圖

地理編碼

即地址解析,由詳細(xì)到街道的結(jié)構(gòu)化地址得到百度經(jīng)緯度信息,例如:“北京市海淀區(qū)中關(guān)村南大街27號(hào)”地址解析的結(jié)果是lng:116.31985,lat:39.959836

同時(shí),地理編碼也支持名勝古跡、標(biāo)志性建筑名稱直接解析返回百度經(jīng)緯度,例如:“百度大廈”地址解析的結(jié)果是lng:116.30815,lat:40.056885

逆地理編碼

即逆地址解析,由百度經(jīng)緯度信息得到結(jié)構(gòu)化地址信息,例如:“l(fā)at:31.325152,lng:120.558957”逆地址解析的結(jié)果是“江蘇省蘇州市虎丘區(qū)塔園路318號(hào)”。

不過(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è)專門的地理編碼工具geocoder,將這些不同廠商的服務(wù)整合統(tǒng)一起來(lái)。

地理編碼工具geocoder

首先看一下它都支持哪些公司的地理編碼服務(wù):

ProviderOptimalUsage Policy
ArcGISWorld
BaiduChinaAPI key
BingWorldAPI key
CanadaPostCanadaAPI key
FreeGeoIPWorld
Geocoder.caCA & USRate Limit
GeocodeFarmWorldPolicy
GeoNamesWorldUsername
GeoOttawaOttawa
GoogleWorldRate Limit, Policy
HEREWorldAPI key
IPInfoWorld
MapboxWorldAPI key
MapQuestWorldAPI key
MapzenWorldAPI key
MaxMindWorld
OpenCageWorldAPI key
OpenStreetMapWorldPolicy
TamuUSAPI key
TomTomWorldAPI key
What3WordsWorldAPI key
YahooWorld
YandexRussia
TGOSTaiwan
安裝
  1. pip install geocoder

地理編碼
  1. import geocoder

  2. g = geocoder.google('1403 Washington Ave, New Orleans, LA 70130')

  3. g = geocoder.arcgis(u'北京市海淀區(qū)上地十街10號(hào)')

  4. g.latlng

輸出為

  1. [29.9287839, -90.08421849999999]

也可以查看完整的geojson

  1. g.geojson

輸出為

  1. {'bbox': [-90.0855674802915,

  2.  29.9274349197085,

  3.  -90.0828695197085,

  4.  29.9301328802915],

  5. 'geometry': {'coordinates': [-90.08421849999999, 29.9287839],

  6.  'type': 'Point'},

  7. 'properties': {'accuracy': u'ROOFTOP',

  8.  'address': u'1403 Washington Ave, New Orleans, LA 70130, USA',

  9.  'bbox': [-90.0855674802915,

  10.   29.9274349197085,

  11.   -90.0828695197085,

  12.   29.9301328802915],

  13.  'city': u'New Orleans',

  14.  'confidence': 9,

  15.  'country': u'US',

  16.  'county': u'Orleans Parish',

  17.  'encoding': 'utf-8',

  18.  'housenumber': u'1403',

  19.  'lat': 29.9287839,

  20.  'lng': -90.08421849999999,

  21.  'location': '1403 Washington Ave, New Orleans, LA 70130',

  22.  'neighborhood': u'Garden District',

  23.  'ok': True,

  24.  'place': u'ChIJGyFHWc2lIIYRYSoneaXAUiw',

  25.  'postal': u'70130',

  26.  'provider': 'google',

  27.  'quality': u'street_address',

  28.  'state': u'LA',

  29.  'status': 'OK',

  30.  'status_code': 200,

  31.  'street': u'Washington Ave'},

  32. 'type': 'Feature'}

直接用Google嘗試查詢中文地址時(shí)失敗

  1. g = geocoder.google(u'北京市海淀區(qū)上地十街10號(hào)')

  2. g.ok

輸出為

  1. False

用百度應(yīng)該沒(méi)問(wèn)題,不過(guò)我沒(méi)有申請(qǐng)相應(yīng)的key。切換到arcgis,能夠成功編碼

  1. g = geocoder.arcgis(u'北京市海淀區(qū)上地十街10號(hào)')

  2. g.latlng

輸出為

  1. [40.050934, 116.30079]

逆地理編碼
  1. g = geocoder.google([29.9287839, -90.08421849999999], method='reverse')


  2. print g.address

  3. print g.city

  4. print g.state

  5. print g.country

輸出為

  1. 1403 Washington Ave, New Orleans, LA 70115, USA

  2. New Orleans

  3. LA

  4. US

換成中國(guó)的地址

  1. g = geocoder.google([40.050934, 116.30079], method='reverse')

  2. print g.address

  3. print g.city

  4. print g.state

  5. print g.country

輸出為

  1. Bai Du Da Sha, Haidian Qu, Beijing Shi, China, 100193

  2. Beijing

  3. Beijing Shi

  4. CN

用arcgis的服務(wù)試試

  1. g = geocoder.arcgis([40.050934, 116.30079], method='reverse')

  2. print g.address

  3. print g.city

  4. print g.state

  5. print g.country

輸出為

  1. None

  2. 北京市

  3. 北京市

  4. CHN

Google轉(zhuǎn)換成的是英文,但地址比較全。arcgis雖然是中文,但是詳細(xì)的地址居然輸出為了None,這有個(gè)X用。

其他

geocoder 的功能不止于此,它還可以查IP(包括自己的)。

  1. g = geocoder.ip('199.7.157.0')

  2. print g.latlng

  3. print g.city

  4. g = geocoder.ip('me')

  5. print g.latlng

  6. print g.city

輸出為

  1. [43.6934, -79.4857]

  2. Toronto

  3. [51.05, 13.75]

  4. Dresden

查詢一個(gè)城市的空間包圍盒

  1. g = geocoder.arcgis(u'山東')

  2. g.bbox

輸出為

  1. {'northeast': [38.976997, 121.976998], 'southwest': [33.022997, 116.022998]}

小結(jié)

空間信息既可以利用行政區(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)的位置信息文字描述。  

    本站是提供個(gè)人知識(shí)管理的網(wǎng)絡(luò)存儲(chǔ)空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點(diǎn)。請(qǐng)注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購(gòu)買等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊一鍵舉報(bào)。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評(píng)論

    發(fā)表

    請(qǐng)遵守用戶 評(píng)論公約

    類似文章 更多