詳解用Python調(diào)用百度地圖正/逆地理編碼API
一、背景
- (正)地理編碼指的是:將地理位置名稱轉(zhuǎn)換成經(jīng)緯度;
- 逆地理編碼指的是:將經(jīng)緯度轉(zhuǎn)換成地理位置信息,如地名、所在的省份或城市等
百度地圖提供了相應(yīng)的API,可以方便調(diào)用。相應(yīng)的說明文檔如下:
具體API的參數(shù)可以查看相應(yīng)的“服務(wù)文檔”:
不過首次使用時需要申請,具體在控制臺。申請AK的方式可參見其他文章。
二、源碼
廢話不多說,直接放源碼。這里提供了Python調(diào)用這兩個API的方法。
#!/usr/bin/env python # -*- coding:utf-8 -*- # @Author: Wild Orange # @Email: jixuanfan_seu@163.com # @Date: 2020-06-21 16:06:14 # @Last Modified time: 2020-07-01 19:35:28 import requests AK='[這里填寫自己申請的AK值]' def Pos2Coord(name): ''' @func: 通過百度地圖API將地理名稱轉(zhuǎn)換成經(jīng)緯度 @note: 官方文檔 http://lbsyun.baidu.com/index.php?title=webapi/guide/webservice-geocoding @output: lng: 經(jīng)度 lat: 緯度 conf: 打點絕對精度(即坐標點的誤差范圍) comp: 描述地址理解程度。分值范圍0-100,分值越大,服務(wù)對地址理解程度越高 level: 能精確理解的地址類型 ''' url = 'http://api.map.baidu.com/geocoding/v3/?address=%s&output=json&ak=%s'%(name,AK) res = requests.get(url) if res.status_code==200: val=res.json() if val['status']==0: retVal={'lng':val['result']['location']['lng'],'lat':val['result']['location']['lat'],\ 'conf':val['result']['confidence'],'comp':val['result']['comprehension'],'level':val['result']['level']} else: retVal=None return retVal else: print('無法獲取%s經(jīng)緯度'%name) def Coord2Pos(lng,lat,town='true'): ''' @func: 通過百度地圖API將經(jīng)緯度轉(zhuǎn)換成地理名稱 @input: lng: 經(jīng)度 lat: 緯度 town: 是否獲取鄉(xiāng)鎮(zhèn)級地理位置信息,默認獲取??蛇x參數(shù)(true/false) @output: address:解析后的地理位置名稱 province:省份名稱 city:城市名 district:縣級行政區(qū)劃名 town: 鄉(xiāng)鎮(zhèn)級行政區(qū)劃 adcode: 縣級行政區(qū)劃編碼 town_code: 鎮(zhèn)級行政區(qū)劃編碼 ''' url='http://api.map.baidu.com/reverse_geocoding/v3/?output=json&ak=%s&location=%s,%s&extensions_town=%s'%(AK,lat,lng,town) res=requests.get(url) if res.status_code==200: val=res.json() if val['status']==0: val=val['result'] retVal={'address':val['formatted_address'],'province':val['addressComponent']['province'],\ 'city':val['addressComponent']['city'],'district':val['addressComponent']['district'],\ 'town':val['addressComponent']['town'],'adcode':val['addressComponent']['adcode'], 'town_code':val['addressComponent']['town_code']} else: retVal=None return retVal else: print('無法獲取(%s,%s)的地理信息!'%(lat,lng))
注意:
函數(shù)只返回一些較為常用的地理位置信息。之前提到的官網(wǎng)中的說明文檔是最全的,如果確實有需要,可以修改程序代碼。
三、使用方法
(1)正地理編碼
比如獲取學校的經(jīng)緯度:
val=Pos2Coord('江蘇省南京市江寧區(qū)秣陵街道東南大學九龍湖校區(qū)') print(val)
輸出結(jié)果:
{'lng': 118.81871976794395, 'lat': 31.88198449339288, 'conf': 80, 'comp': 57, 'level': '餐飲'}
可以看出,結(jié)果存在一定偏差。竟然把學校標記成了餐館。。。我們可以具體到百度拾取坐標系統(tǒng)中看一下。結(jié)果定位到了學校西南角。
(2)逆地理編碼
反過來,我們也可以根據(jù)經(jīng)緯度查詢地理位置信息。
val=Coord2Pos(118.81871976794395,31.88198449339288) print(val)
輸出結(jié)果:
{'address': '江蘇省南京市江寧區(qū)蘇源大道', 'province': '江蘇省', 'city': '南京市', 'district': '江寧區(qū)', 'town': '秣陵街道', 'adcode': '320115', 'town_code': '320115011'}
解析出的地理位置信息是準確的,可以精確到鄉(xiāng)鎮(zhèn)級行政區(qū)劃。
(3)一個有意思的例子
之前也看到了,在正地理編碼中,如果提供的地理位置信息不精確,則返回的經(jīng)緯度很可能存在較大偏差。有這樣的需求:根據(jù)企業(yè)名稱,獲取其地理位置(經(jīng)緯度),以及所在的省份、地級市、縣級市等信息。
一種直接的思路是:直接將企業(yè)名稱作為地理位置傳給正地理編碼API,獲取其經(jīng)緯度;再依據(jù)經(jīng)緯度,利用逆地理編碼,獲取其所在的省份、地級市、縣級市。
隨便舉個栗子,比如“金華銀行股份有限公司”。
val=Pos2Coord('金華銀行股份有限公司') print(val)
結(jié)果:
{'lng': 119.65923457293306, 'lat': 29.10738796331567, 'conf': 70, 'comp': 100, 'level': '金融'}
我們看看定位到哪里了:
emm… 定位到一個廣場的旁邊。不過大致的位置還是準確的,畢竟還是在金華市內(nèi)。如果精度要求不高,這個結(jié)果還是可以接受的。
那如果精度要求比較高呢?我們就需要獲取非常準確的企業(yè)位置信息。百度企業(yè)信用提供了企業(yè)基本信息的查詢。
可以看到,企業(yè)的地址為:浙江省金華市丹溪路1388號。
我們把這個地址代入API:
Pos2Coord('浙江省金華市丹溪路1388號')
得到結(jié)果:
{'lng': 119.65161604390546, 'lat': 29.083163015462144, 'conf': 80, 'comp': 100, 'level': '門址'}
再看看定位到了哪里:
emm…好像看不出來。。我對這里也不熟。。直接到百度地圖中看一下:
放到最大后,可以看到,坐標恰好落在“金華銀行”上面。Perfect!
人工獲取企業(yè)具體的地理位置似乎太麻煩了。有沒有簡單方法呢?可以查看我之前寫的一篇文章:用Python爬蟲獲取百度企業(yè)信用中企業(yè)基本信息
最后通過逆地理編碼獲取省份、地級市、縣級市信息。
Coord2Pos(119.65161604390546,29.083163015462144)
輸出結(jié)果:
{'address': '浙江省金華市婺城區(qū)雙龍南街680號', 'province': '浙江省', 'city': '金華市', 'district': '婺城區(qū)', 'town': '西關(guān)街道', 'adcode': '330702', 'town_code': '330702007'}
到此這篇關(guān)于詳解用Python調(diào)用百度地圖正/逆地理編碼API的文章就介紹到這了,更多相關(guān)Python調(diào)用百度地圖正/逆地理編碼 內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
使用python+requests+pytest實現(xiàn)接口自動化
這篇文章主要介紹了使用python+requests+pytest實現(xiàn)接口自動化,在當前互聯(lián)網(wǎng)產(chǎn)品迭代頻繁的背景下,回歸測試的時間越來越少,但接口自動化測試因其實現(xiàn)簡單、維護成本低,容易提高覆蓋率等特點,越來越受重視,需要的朋友可以參考下2023-08-08Python實現(xiàn)對數(shù)坐標系繪制與自定義映射
這篇文章主要為大家學習介紹了如何利用Python實現(xiàn)對數(shù)坐標系繪制與坐標自定義映射,文中的示例代碼講解詳細,感興趣的小伙伴可以了解一下2023-08-08Python?flask?框架使用flask-login?模塊的詳細過程
Flask-Login?是一個?Flask?模塊,可以為?Flask?應(yīng)用程序提供用戶登錄功能,這篇文章主要介紹了Python?flask?框架使用?flask-login?模塊,需要的朋友可以參考下2023-01-01Python Pandas pandas.read_sql函數(shù)實例用法
在本篇文章里小編給大家整理的是一篇關(guān)于Python Pandas pandas.read_sql函數(shù)詳解內(nèi)容,有需要的朋友們可以學習下。2021-06-06python基于socket模擬實現(xiàn)ssh遠程執(zhí)行命令
這篇文章主要介紹了python基于socket模擬實現(xiàn)ssh遠程執(zhí)行命令,幫助大家更好的理解和學習python,感興趣的朋友可以了解下2020-12-12