1. 程式人生 > >python3調取百度地圖API輸出某地點的經緯度資訊

python3調取百度地圖API輸出某地點的經緯度資訊

 

1. 檢視API介面說明

地址:http://lbsyun.baidu.com/index.php?title=webapi/guide/webservice-geocoding

 

注:callback的功能暫未研究

 

 

2. 申請自己的ak(類似於連通百度地圖伺服器的鑰匙,請勿洩露)

 

注:除錯階段,應用名稱隨意填寫即可

 

3.1 將下面的url輸入到瀏覽器中(更換成自己的ak),驗證返回引數

頁面顯示

showLocation&&showLocation({"status":0,"result":{"location":{"lng":116.3084202915042,"lat":40.05703033345938},"precise":1,"confidence":80,"comprehension":100,"level":"道路"}})


注意:返回的格式不是json格式(json格式是直接大括號開始的)

介紹一個基於Chrome的小外掛——FeHelper,可以自動美化程式碼,如下圖所示



3.2 使用python驗證

注意:需要將示例重點callback引數去掉,才能返回標準的json格式,否則json.loads()函式會報錯
1 import requests
2 import json
3 import pprint
4 
5 url = 'http://api.map.baidu.com/geocoder/v2/?address=北京市海淀區上地十街10號&output=json&ak=piQGckMZTubVw29GiBT1BDwDjwztm***
'#隱藏掉了我的ak最後三位 6 res = requests.get(url) 7 8 json_data = json.loads(res.text) 9 pprint.pprint(json_data)#格式化列印,可讀性更佳

 結果

注意:使用pprint可以格式化列印結果

 

3.3 繼續研究

1 #查詢某城市中的具體地點,兩種寫法均可
2 #url = 'http://api.map.baidu.com/geocoder/v2/?address=北京市海淀區上地十街10號&output=json&ak=piQGckMZTubVw29GiBT1BDwDjwztm47s&callback=showLocation'
3 #url = 'http://api.map.baidu.com/geocoder/v2/?address=海淀區上地十街10號city=北京市&output=json&ak=piQGckMZTubVw29GiBT1BDwDjwztm47s&callback=showLocation' 4 5 #查詢某個城市 6 #url = 'http://api.map.baidu.com/geocoder/v2/?address=北京市&output=json&ak=piQGckMZTubVw29GiBT1BDwDjwztm47s&callback=showLocationllback=showLocation'

 

4. 使用者輸入地點,輸出經緯度(此處遇到了一個大坑!)

在使用requests.get(url)方法時,會將提交的url中的中文進行編碼(即便你的python和網頁的編碼都是utf-8),url中的中文會顯示成如下

http://api.map.baidu.com/geocoder/v2/?address=%E5%8C%97%E4%BA%AC%E5%B8%82&output=json&ak=piQGckMZTubVw29GiBT1BDwDjwztm***

需要使用urllib.parse.unquote()解碼,但是解碼完了雖然輸出的url是正確的,但是再次使用requests.get()時又不對

注意一點是:這個方法不能在params中使用(params是字典格式,整體不支援;單獨針對字典裡的中文字串進行這個操作也沒有用,因為在字典裡是正確的。只是在進行requests.get()時進行了url編碼)

解決方案:

不使用reques.get(url,params)形式,使用format

url = 'http://api.map.baidu.com/geocoder/v2/?address={}&output=json&ak=piQGckMZTubVw29GiBT1BDwDjwztm47s'.format(address)

 5. 根據需求輸出經度、緯度

全部程式碼

 1 # -*- coding:utf-8 -*-
 2 '''百度服務文件參考http://lbsyun.baidu.com/index.php?title=webapi/guide/webservice-geocoding'''
 3 import requests
 4 import json
 5 import pprint
 6 import urllib.parse
 7 
 8 #查詢某城市中的具體地點,兩種寫法均可
 9 #url = 'http://api.map.baidu.com/geocoder/v2/?address=北京市海淀區上地十街10號&output=json&ak=piQGckMZTubVw29GiBT1BDwDjwztm***'
10 #url = 'http://api.map.baidu.com/geocoder/v2/?address=海淀區上地十街10號city=北京市&output=json&ak=piQGckMZTubVw29GiBT1BDwDjwztm***'
11 #查詢某個城市
12 #url = 'http://api.map.baidu.com/geocoder/v2/?address=北京市&output=json&ak=piQGckMZTubVw29GiBT1BDwDjwztm***'
13 
14 address = input('請輸入地址:')
15 '''
16 par = {
17     'address':address,
18     'output':'json',
19     'ak':'piQGckMZTubVw29GiBT1BDwDjwztm***',
20 }
21 url = 'http://api.map.baidu.com/geocoder/v2/'
22 res = requests.get(url,par)
23 print(res.url)#中文進行了再編碼
24 url1 = urllib.parse.unquote(res.url)
25 print(url1)#進行中文解碼後,輸出正確
26 res1 = requests.get(url1)
27 print(res1.url)#中文進行了再編碼
28 '''
29 
30 url2 = 'http://api.map.baidu.com/geocoder/v2/?address={}&output=json&ak=piQGckMZTubVw29GiBT1BDwDjwztm***'.format(address)
31 print(url2)
32 res2 = requests.get(url2)
33 print(res2)
34 json_data = json.loads(res2.text)
35 pprint.pprint(json_data)
36 longitude = json_data['result']['location']['lng']
37 latitude = json_data['result']['location']['lat']
38 print(longitude,latitude)