[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码的计算方式:

  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

输出的结果:

 

以上是关于[Python]调用百度地图API对地点进行搜索,利用 JSON 返回纬度/行政区域编号的主要内容,如果未能解决你的问题,请参考以下文章

Python调用百度地图API(路线规划POI检索)——第一部分

如何找到一个地点的经纬度

JS调用百度地图API标记地点

手机百度地图如何查看准确的经纬度?

如何调用百度地图API

爬虫——python——百度地图经纬度查询——经纬度查看地点地名——利用百度API获取地名经纬度——爬取所有的中国地址