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=piQGckMZTubVw29GiBT1BDwDjwztm***'
3 url = 'http://api.map.baidu.com/geocoder/v2/?address=海淀區上地十街10號city=北京市&output=json&ak=piQGckMZTubVw29GiBT1BDwDjwztm***'
4 #查詢某個城市或者某個省
5 url = 'http://api.map.baidu.com/geocoder/v2/?address=北京市&output=json&ak=piQGckMZTubVw29GiBT1BDwDjwztm***'

 

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=piQGckMZTubVw29GiBT1BDwDjwztm***'.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)

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM