欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

使用百度地图API查地理坐标

程序员文章站 2022-04-14 18:43:16
本文分享了一下我对API的理解以及百度地图API的使用举例。 ......

在网络编程中,我们会和api打交道。那么,什么是api?如何使用api呢?本文分享了一下我对api的理解以及百度地图api的使用。
api是"application programming interface(应用程序编程接口)"的缩写。如果那一大堆的术语和定义让你头晕,不妨试着这样理解:网络服务商(比如百度、微博等)存有大量数据,我们可以查询数据,但是需要按照一定的格式/协议,否则服务商不知道我们的需求无法进行处理,我们拿到数据也看不懂。通过api接口规范,通信双方都能明白对方传送的信息和数据,同时也简化了操作(只要按照规定的格式输入,就可以得到已知格式的输出,我们无需了解具体实现的技术细节,是不是很省心呢?)

下面以百度地图web服务api的调用为例。

(排版时图片放到最后了,请您到文末查看图片。)要使用的是图中所示“正/逆地理编码服务”。在使用服务前,需要登录百度账号(如果没有就注册一个),申请成为百度开发者,然后创建一个你自己的应用,就可以收到一个对应的服务密钥(ak)。在服务配置页面,有两种校验方式,一种是ip白名单方式,一种是sn校验方式。我参考@廖sir的博文
python实现百度地图api获取某地址的经纬度
选择了sn校验方式,这样页面上会有sk。请将ak和sk两个序列码保存好,这就是你个人的验证信息。下一步使用百度地图api时要用到。
要编写的这个python小程序实现的功能是:输入某个地址,得到相应的经纬度坐标信息。分三步实现。1、生成url(用于提交到api进行查询)2、与api交互,查询并返回数据(json格式) 3、利用json解析并输出。

下面分别介绍具体实现。
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格式。
import urllib.request,urllib.parse,urllib.error
import json
import hashlib

myak='这里请填入你的ak'
mysk='这里请填入你的sk'

while true:
    address = input('输入地点:')
    if len(address)<1:
        break

    #产生sn码
    querystr="/geocoder/v2/?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)

2、输入url,利用urllib从api读取数据

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

3、利用json对返回数据进行解析。

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

    if not js or 'status'not in js or js['status']!=0:
        print('======failure====')
        print(data)
        continue
    print(json.dumps(js,indent=4,ensure_ascii=false))

上一段可输出得到json格式的数据。下面即为输入“百度大厦”后程序输出的json格式数据。在这里一开始中文字符"商务大厦"不能正确显示,我从@msay的博文中找到了答案,json.dumps函数默认转换为ascii编码,中文字符就无法转换显示,因此要设置ensure_ascii=false。

{
    "status": 0,
    "result": {
        "location": {
            "lng": 116.30695597357376,
            "lat": 40.05738753357608
        },
        "precise": 1,
        "confidence": 80,
        "comprehension": 100,
        "level": "商务大厦"
    }
}

最后,提取经纬度坐标等信息。

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

总结:按照规范发送url以及对返回json或xml格式数据正确解析,另外注意中文字符的编码问题,就可以上手api。怎么样?你也快来试试吧!

感谢@廖sir和@msay两位博主,他们的博文让我受益良多。使用百度地图API查地理坐标