[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获取某地址的经纬度

代码如下:

 
#!/usr/bin/env python
# -*- coding: utf-8 -*-
# @File  : BaiduAPI.py
# @Author: 赵路仓
# @Date  : 2020/3/10
# @Desc  :
# @Contact : 398333404@qq.com 

import urllib.request, urllib.parse, urllib.error
import json
import hashlib


MyAK = '你的AK'
MySK = '你的SK'
lat = 0
lng = 0
dictjson = {}  # 声明一个字典

def JingWei(address):
    global lat, lng
    # 产生sn码
    queryStr = "/geocoding/v3/?address=" + address + '&output=json&ak=' + MyAK
    encodedStr = urllib.parse.quote(queryStr, safe="/:=&?#+!$,;'@()*[]")
    rawStr = encodedStr + MySK
    sn = (hashlib.md5(urllib.parse.quote_plus(rawStr).encode("utf8")).hexdigest())

    # 生成url
    url = urllib.parse.quote("http://api.map.baidu.com" + queryStr + "&sn=" + sn, safe="/:=&?#+!$,;'@()*[]")
    print('Retrieving', url)

    # 从API读取数据
    uh = urllib.request.urlopen(url)
    data = uh.read().decode()
    print('Retrieved', len(data), 'characters')

    # 解析数据
    try:
        js = json.loads(data)
    except:
        js = None

    if not js or 'status' not in js or js['status'] != 0:
        print('======Failure====')
        print(data)

    print(json.dumps(js, indent=4, ensure_ascii=False))

    # 获取经纬度坐标和地址类型
    lat = js["result"]["location"]["lat"]
    lng = js["result"]["location"]["lng"]
    print('纬度', lat, '经度', lng)
    level = js["result"]["level"]
    print('地址类型', level)


# 基于百度地图API下的经纬度信息来解析地理位置信息
def getlocation(lat, lng):
    print(lat,"ss",lng)
    url = '/reverse_geocoding/v3/?ak='+MyAK+'&output=json&coordtype=wgs84ll&location='+str(lat)+','+str(lng)
    encodedStr = urllib.parse.quote(url, safe="/:=&?#+!$,;'@()*[]")
    rawStr = encodedStr + MySK
    sn = (hashlib.md5(urllib.parse.quote_plus(rawStr).encode("utf8")).hexdigest())
    # 生成url
    url = urllib.parse.quote("http://api.map.baidu.com" + url + "&sn=" + sn, safe="/:=&?#+!$,;'@()*[]")
    print('Retrieving', url)
    req = urllib.request.urlopen(url)  # json格式的返回数据
    res = req.read().decode("utf-8")  # 将其他编码的字符串解码成unicode
    print(json.loads(res))
    return json.loads(res)


def jsonFormat(lat, lng):
    str = getlocation(lat, lng)
    global dictjson
    dictjson={}
    # get()获取json里面的数据
    jsonResult = str.get('result')
    address = jsonResult.get('addressComponent')
    # 国家
    country = address.get('country')
    # 国家编号(0:中国)
    country_code = address.get('country_code')
    # 省
    province = address.get('province')
    # 城市
    city = address.get('city')
    # 城市等级
    city_level = address.get('city_level')
    # 县级
    district = address.get('district')
    # 区划代码
    adcode=address.get('adcode')
    # 街道
    street=address.get('street')
    # 街道编号
    street_number=address.get('street_number')
    # 把获取到的值,添加到字典里(添加)
    # dictjson['country']=country
    # dictjson['country_code'] = country_code
    dictjson['province'] = province+city+district+street+street_number
    dictjson['adcode'] = adcode
    # dictjson['city_level'] = city_level
    # dictjson['district']=district
    return dictjson



if __name__ == "__main__":
    JingWei("浙江大学")
    print(jsonFormat(lat,lng))
    print(dictjson.get('province')+"    行政区划代码"+dictjson.get('adcode'))
    JingWei("深圳大学")
    print(jsonFormat(lat, lng))
    print(dictjson.get('province')+"    行政区划代码"+dictjson.get('adcode'))

在 jsonFormat(lat, lng) 函数部分可以根据自己的需要进行添加字典。

address = jsonResult.get('addressComponent')
    # 国家
    country = address.get('country')
    # 国家编号(0:中国)
    country_code = address.get('country_code')
    # 省
    province = address.get('province')
    # 城市
    city = address.get('city')
    # 城市等级
    city_level = address.get('city_level')
    # 县级
    district = address.get('district')
    # 区划代码
    adcode=address.get('adcode')
    # 街道
    street=address.get('street')
    # 街道编号
    street_number=address.get('street_number')
    # 把获取到的值,添加到字典里(添加)
    # dictjson['country']=country
    # dictjson['country_code'] = country_code
    dictjson['province'] = province+city+district+street+street_number
    dictjson['adcode'] = adcode
    # dictjson['city_level'] = city_level
    # dictjson['district']=district
 

输出的结果:

 

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值