码迷,mamicode.com
首页 > 编程语言 > 详细

[Python]调用百度地图API对地点进行搜索,利用 JSON 返回纬度/行政区域编号

时间:2020-03-10 15:36:06      阅读:85      评论:0      收藏:0      [点我收藏+]

标签:span   baidu   safe   自己   ddr   nic   har   一个   ack   

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 返回纬度/行政区域编号

标签:span   baidu   safe   自己   ddr   nic   har   一个   ack   

原文地址:https://www.cnblogs.com/zlc364624/p/12455791.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!