• [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

    输出的结果:

  • 相关阅读:
    odoo字段
    页签中加按钮 odoo里面
    页签类型按钮上面记录条数获得
    sql语句 这里是取一串数据中的 头 中 尾 几个数据
    python 字典,元组,对象,数组取值方法
    action类型的按钮和object按钮的用法
    数据结构与算法 基于c语言篇
    odoo开发历史订单需求整体思路
    spring框架的ioc和aop
    java注解和反射学习
  • 原文地址:https://www.cnblogs.com/zlc364624/p/12455791.html
Copyright © 2020-2023  润新知