[Python]调用百度地图API对地点进行搜索,利用 JSON 返回纬度/行政区域编号
Posted 雾霾王者
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了[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码的计算方式:
代码如下:
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
输出的结果:
以上是关于[Python]调用百度地图API对地点进行搜索,利用 JSON 返回纬度/行政区域编号的主要内容,如果未能解决你的问题,请参考以下文章