[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 : [email protected] 
  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

输出的结果:

猜你喜欢

转载自www.cnblogs.com/zlc364624/p/12455791.html