[Python]調用百度地圖API對地點進行搜索,利用 JSON 返回緯度/行政區域編號


1.創建百度API應用

  類似爬蟲程序,在百度地圖API進行注冊

       

 

 

    在此處點擊控制台,在應用管理------我的應用處 創建自己的應用。  

       

  創建應用如圖所示,在請求校驗方式處選擇sn校驗方式

 

 

   

 

 

 

  記住自己的AK值

  

 

 

   點開設置,記住自己的SK值

  

 

 

 2.實現

1、sn碼及url的生成
url= http://api.map.baidu.com/geocoder/v2/?address=“輸入的地點名”&output=json&ak='你的AK碼'&sn='你的sn碼'。
需要注意的是:

  • 由於url中有中文字符串,需要使用函數urllib.parse.quote(inputstr, safe="/:=&?#+!$,;'@()*[]")轉換一下編碼。
  • 在url里output可以選擇輸出為json格式或xml格式,默認是xml格式。 

2、sn碼的計算方式:

  python實現百度地圖API獲取某地址的經緯度

代碼如下:

  1 #!/usr/bin/env python
  2 # -*- coding: utf-8 -*-
  3 # @File  : BaiduAPI.py
  4 # @Author: 趙路倉
  5 # @Date  : 2020/3/10
  6 # @Desc  :
  7 # @Contact : 398333404@qq.com 
  8 
  9 import urllib.request, urllib.parse, urllib.error
 10 import json
 11 import hashlib
 12 
 13 
 14 MyAK = '你的AK'
 15 MySK = '你的SK'
 16 lat = 0
 17 lng = 0
 18 dictjson = {}  # 聲明一個字典
 19 
 20 def JingWei(address):
 21     global lat, lng
 22     # 產生sn碼
 23     queryStr = "/geocoding/v3/?address=" + address + '&output=json&ak=' + MyAK
 24     encodedStr = urllib.parse.quote(queryStr, safe="/:=&?#+!$,;'@()*[]")
 25     rawStr = encodedStr + MySK
 26     sn = (hashlib.md5(urllib.parse.quote_plus(rawStr).encode("utf8")).hexdigest())
 27 
 28     # 生成url
 29     url = urllib.parse.quote("http://api.map.baidu.com" + queryStr + "&sn=" + sn, safe="/:=&?#+!$,;'@()*[]")
 30     print('Retrieving', url)
 31 
 32     # 從API讀取數據
 33     uh = urllib.request.urlopen(url)
 34     data = uh.read().decode()
 35     print('Retrieved', len(data), 'characters')
 36 
 37     # 解析數據
 38     try:
 39         js = json.loads(data)
 40     except:
 41         js = None
 42 
 43     if not js or 'status' not in js or js['status'] != 0:
 44         print('======Failure====')
 45         print(data)
 46 
 47     print(json.dumps(js, indent=4, ensure_ascii=False))
 48 
 49     # 獲取經緯度坐標和地址類型
 50     lat = js["result"]["location"]["lat"]
 51     lng = js["result"]["location"]["lng"]
 52     print('緯度', lat, '經度', lng)
 53     level = js["result"]["level"]
 54     print('地址類型', level)
 55 
 56 
 57 # 基於百度地圖API下的經緯度信息來解析地理位置信息
 58 def getlocation(lat, lng):
 59     print(lat,"ss",lng)
 60     url = '/reverse_geocoding/v3/?ak='+MyAK+'&output=json&coordtype=wgs84ll&location='+str(lat)+','+str(lng)
 61     encodedStr = urllib.parse.quote(url, safe="/:=&?#+!$,;'@()*[]")
 62     rawStr = encodedStr + MySK
 63     sn = (hashlib.md5(urllib.parse.quote_plus(rawStr).encode("utf8")).hexdigest())
 64     # 生成url
 65     url = urllib.parse.quote("http://api.map.baidu.com" + url + "&sn=" + sn, safe="/:=&?#+!$,;'@()*[]")
 66     print('Retrieving', url)
 67     req = urllib.request.urlopen(url)  # json格式的返回數據
 68     res = req.read().decode("utf-8")  # 將其他編碼的字符串解碼成unicode
 69     print(json.loads(res))
 70     return json.loads(res)
 71 
 72 
 73 def jsonFormat(lat, lng):
 74     str = getlocation(lat, lng)
 75     global dictjson
 76     dictjson={}
 77     # get()獲取json里面的數據
 78     jsonResult = str.get('result')
 79     address = jsonResult.get('addressComponent')
 80     # 國家
 81     country = address.get('country')
 82     # 國家編號(0:中國)
 83     country_code = address.get('country_code')
 84     #
 85     province = address.get('province')
 86     # 城市
 87     city = address.get('city')
 88     # 城市等級
 89     city_level = address.get('city_level')
 90     # 縣級
 91     district = address.get('district')
 92     # 區划代碼
 93     adcode=address.get('adcode')
 94     # 街道
 95     street=address.get('street')
 96     # 街道編號
 97     street_number=address.get('street_number')
 98     # 把獲取到的值,添加到字典里(添加)
 99     # dictjson['country']=country
100     # dictjson['country_code'] = country_code
101     dictjson['province'] = province+city+district+street+street_number
102     dictjson['adcode'] = adcode
103     # dictjson['city_level'] = city_level
104     # dictjson['district']=district
105     return dictjson
106 
107 
108 
109 if __name__ == "__main__":
110     JingWei("浙江大學")
111     print(jsonFormat(lat,lng))
112     print(dictjson.get('province')+"    行政區划代碼"+dictjson.get('adcode'))
113     JingWei("深圳大學")
114     print(jsonFormat(lat, lng))
115     print(dictjson.get('province')+"    行政區划代碼"+dictjson.get('adcode'))

 

在 jsonFormat(lat, lng) 函數部分可以根據自己的需要進行添加字典。

 1 address = jsonResult.get('addressComponent')
 2     # 國家
 3     country = address.get('country')
 4     # 國家編號(0:中國)
 5     country_code = address.get('country_code')
 6     #
 7     province = address.get('province')
 8     # 城市
 9     city = address.get('city')
10     # 城市等級
11     city_level = address.get('city_level')
12     # 縣級
13     district = address.get('district')
14     # 區划代碼
15     adcode=address.get('adcode')
16     # 街道
17     street=address.get('street')
18     # 街道編號
19     street_number=address.get('street_number')
20     # 把獲取到的值,添加到字典里(添加)
21     # dictjson['country']=country
22     # dictjson['country_code'] = country_code
23     dictjson['province'] = province+city+district+street+street_number
24     dictjson['adcode'] = adcode
25     # dictjson['city_level'] = city_level
26     # dictjson['district']=district

輸出的結果:

 


免責聲明!

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



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