在网络编程中,我们会和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格式。
  1. import urllib.request,urllib.parse,urllib.error
  2. import json
  3. import hashlib
  4. MyAK='这里请填入你的AK'
  5. MySK='这里请填入你的SK'
  6. while True:
  7. address = input('输入地点:')
  8. if len(address)<1:
  9. break
  10. #产生sn码
  11. queryStr="/geocoder/v2/?address="+address+'&output=json&ak='+MyAK
  12. encodedStr=urllib.parse.quote(queryStr, safe="/:=&?#+!$,;'@()*[]")
  13. rawStr=encodedStr+MySK
  14. sn=(hashlib.md5(urllib.parse.quote_plus(rawStr).encode("utf8")).hexdigest())
  15. #生成url
  16. url=urllib.parse.quote("http://api.map.baidu.com"+queryStr+"&sn="+sn,safe="/:=&?#+!$,;'@()*[]")
  17. print('Retrieving',url)

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

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

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

  1. #解析数据
  2. try:
  3. js=json.loads(data)
  4. except:
  5. js=None
  6. if not js or 'status'not in js or js['status']!=0:
  7. print('======Failure====')
  8. print(data)
  9. continue
  10. print(json.dumps(js,indent=4,ensure_ascii=False))

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

  1. {
  2. "status": 0,
  3. "result": {
  4. "location": {
  5. "lng": 116.30695597357376,
  6. "lat": 40.05738753357608
  7. },
  8. "precise": 1,
  9. "confidence": 80,
  10. "comprehension": 100,
  11. "level": "商务大厦"
  12. }
  13. }

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

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

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

感谢@廖Sir和@msay两位博主,他们的博文让我受益良多。

使用百度地图API查地理坐标的更多相关文章

  1. H5微信通过百度地图API实现导航方式一

    根据业务需求修改百度API,实现微信中的导航功能.因为源码中SearchInfoWindow_min.js有点小问题(部分小城市公交线路少,查不到路线时没有提示),所以这里在源码的基础上改了一点点.可 ...

  2. 百度地图api简单使用方法

    百度地图API的使用方法   百度地图API 开始学习百度地图API最简单的方式是看一个简单的示例.以下代码创建了一个520x340大小的地图区域并以天安门作为地图的中心: 1. <html&g ...

  3. 百度地图API的使用方法

    百度地图API 开始学习百度地图API最简单的方式是看一个简单的示例.以下代码创建了一个520x340大小的地图区域并以天安门作为地图的中心: 1. <html> 2. <head& ...

  4. 百度地图API开发指南

    简介什么是百度地图API? 百度地图API是一套由JavaScript语言编写的应用程序接口,它能够帮助您在网站中构建功能丰富.交互性强的地图应用.百度地图API包含了构建地图基本功能的各种接口,提供 ...

  5. Android端百度地图API使用详解

    百度地图API简介 百度地图移动版API(Android)是一套基于Android设备的应用程序接口,通过该接口,可以轻松的访问百度服务和数据,构建功能丰富.交互性强的地图应用程序. 百度地图移动版A ...

  6. 百度地图API使用介绍

    百度地图API 开始学习百度地图API最简单的方式是看一个简单的示例.以下代码创建了一个520x340大小的地图区域并以天安门作为地图的中心: 1. <html> 2. <head& ...

  7. 百度地图API 级别自动缩放

    今天做一个基于百度地图API的小项目 查了很长时间apid都没有找到地图呈现出来的时候地图按坐标的多少自动缩放显示的等级比例,特此记录笔记!var points = [point1, point2,p ...

  8. Flex 百度地图API使用

    今天想看一下Flex中关于地图方面的使用,刚开始看了google map api, 感觉用起来挺麻烦,关键是英文不好,文档读起来费劲,还有密钥神马的~ 那我就试验一下百度地图的接口,文档是中文的. 首 ...

  9. Android应用中使用百度地图API并加入标注(一)

    网上一些资料这样的的内容已经过时了,这里是最新的内容,假设哪里不正确,请吐槽... 1)下载百度地图移动版API(Android)开发包       要在Android应用中使用百度地图API,就须要 ...

随机推荐

  1. poi导出excle测试类

    package poiexcel; import java.util.ArrayList; import java.util.List; public class Test { public stat ...

  2. [C++] any number to binary (Bit manipulation)

    any number to binary  (Bit manipulation)

  3. python2中的__new__与__init__,新式类和经典类-乾颐堂

    在python2.x中,从object继承得来的类称为新式类(如class A(object))不从object继承得来的类称为经典类(如class A()) 新式类跟经典类的差别主要是以下几点: 1 ...

  4. array_column()

    array_column($arr,value) 返回输入数组中某个单一列的值. array_column($arr,value,key) 返回输入数组中某个单一列的值,value是值,key是键.

  5. Java中比较容易混淆的知识点

    1.  equals()  和  ==  运算符 - equals是方法, 而==是运算符(当然也可以说是广义上的方法, 或者最终都是调用方法). - equals() 是从Object类中继承来的, ...

  6. 视觉SLAM实战(一):RGB-D SLAM V2

    写在前面 首先打个广告.SLAM研究者交流QQ群:254787961.欢迎各路大神和小白前来交流. 看了前面三篇博文之后,是不是有同学要问:博主你扯了那么多有用没用的东西,能不能再给力一点,拿出一个我 ...

  7. [GO]goexit的使用

    package main import "fmt" func test() { defer fmt.Println("cccccccccccc")//在函数退出 ...

  8. Spring MVC @RequestMapping浅析

    简介:@RequestMappingRequestMapping是一个用来处理请求地址映射的注解,可用于类或方法上.用于类上,表示类中的所有响应请求的方法都是以该地址作为父路径.RequestMapp ...

  9. SpringMVC源码解读 - RequestMapping注解实现解读 - RequestMappingInfo

    使用@RequestMapping注解时,配置的信息最后都设置到了RequestMappingInfo中. RequestMappingInfo封装了PatternsRequestCondition, ...

  10. asp.net WebAPI 问题 iisnode默认不支持PUT和DELETE的解决

    因为iisnode的自动重启服务器方便,一直用的它来作为开发中的node服务器,今天一个delete命令过去,得到一个405(?好像是)错误,让我很郁闷. 用原生的node试一下,是完美支持的,本来打 ...