百度地图Web API Python模块
目录
- 百度地图Web API Python模块
- 描述
- 快速开始
- 调用方法
- 工厂模式
- 代理模式
- 对象
- JsonLike
__init__(json=dict(), **kwargs)
__str__()
is_list()
get_property(p_key, p_default=None)
get_properties(p_keys, p_defaults=None)
set_property(p_key, p_value)
keys()
from_json(json, **kwargs)
to_json()
- Location(JsonLike)
__str__()
- BaiduMapObject(JsonLike)
from_uid(handle, detail=False)
from_address(handle, detail=False)
from_location(handle, detail=False)
- JsonLike
- 错误&异常
- BaiduMapApiException
- HandleNotExistsError
- NetError
- OtherError
- 运行原理
- core
- collector
- controller
- status
- util
- dict_tool & list_tool
- url
- core
- 日志
- config
- 附录
- 部分句柄表
描述
本篇内容基于模块baidumap==1.2.4
百度地图Web API给了开发者们很大的自由发挥空间,百度地图官方提供了C, Java以及Android的开发SDK,但没有提供Python的开发包,本人虽然技术很有限,但是兴趣使然,就开发了第一个Python模块,用来简化百度地图API的调用流程
具体功能有区域检索, 圆形查找, 地点信息, ip定位和路径规划等所有百度地图API功能, 只要用工厂函数生产对应句柄即可
详细的内容参见百度地图开放平台
Github地址: https://github.com/cpak00/baidumap
作者: cpak00@github
邮箱: cymcpak00@gmail.com
快速开始
pip install baidumap
使用pip快速安装,Linux系统请使用pip3
我是Python3的忠实用户,而这个模块牵涉到字符编码的问题,所以Python2应该是无法使用的
下面是一端测试代码,涵盖了这个模块的基本功能
test.py
# -*- coding: utf-8 -*-
# 先导入百度地图开发包
from baidumap import config
from baidumap.api.handle import get_handle
from baidumap.object import BaiduMapObjectimport logging# 获取原始句柄
ak_key = 'ZAMW5**********************'
raw_handler = get_handle(ak_key)# 获取日志记录器
FORMAT = "%(asctime)s %(thread)d %(message)s"
logging.basicConfig(format=FORMAT, datefmt="[%Y-%m-%d %H:%M:%S]")
logger = logging.getLogger()
logger.setLevel(logging.DEBUG)if __name__ == '__main__':# 日志记录配置(不是必要的)config.mode = config.value.DEBUGconfig.logger = logger# 代理模式示例print('---\nAgent Mode:\n')raw_handler = get_handle(ak_key)# 创建一个BaiduMapObject,并给它赋予一个初始值(可以用key=value)# 的模式赋予多个数据thu_main = BaiduMapObject(address='北京市清华大学紫荆园餐厅')# 调用代理函数,从address(地址)获取信息# 代理句柄raw_handler# 这里内部使用的是全球地理逆编码APIthu_main.from_address(raw_handler)# 获取信息后,使用get_property函数获取对象内的参数# 详细获取数据只需要访问百度地图开放平台就可以完全查阅到# get_property可以递归获取参数,无需考虑字典的嵌套print('from address find location: %s' %thu_main.get_property('location')['location'])# get_properties可以同时获取多个参数并组合在一起print('from address find location: %s' % thu_main.get_properties(['lat', 'lng'], p_defaults={'lat': '-1','lng': '-1'}))# 从location(坐标)获取信息thu_main.from_location(raw_handler)print('\nfrom location find uid: %s' % thu_main.get_property('uid'))print('and its name: %s' % thu_main.get_property('name'))find_location = thu_main.get_properties(['uid', 'name'], p_defaults={'uid': '','name': ''})print('--\nfrom location find uid and name: %s' % find_location)# 从uid(唯一编码)获取建筑物(或区域)的详细信息for index in find_location:thu_main.from_json(find_location[index])thu_main.from_uid(raw_handler, detail=True)print('-\nfrom uid find info:\n%s' % thu_main)# 工厂模式示例print('---\nFactory Mode:\n')# 使用工厂函数生产出一个句柄# 句柄的第二个参数是句柄名称# 名称实际上就是API的URL的Path(路径)iplocer = get_handle(ak_key, 'location/ip')# 设置句柄参数iplocer.set_params()# 调用run()会返回一个包含信息的BaiduMapObject对象print(iplocer.run(collect_keys=['address', 'content']).get_property('address')['address'])print('---\n')# 句柄在生产的时候就可以赋予参数# is_list属性必须在生产的赋予# is_list在请求存在页码的时候需要为真placeser = get_handle(ak_key,'place/v2/search',is_list=True,query='ATM机',tag='银行',region='北京', )# run同样有可选参数,分别是每页包含数据条数,最大页数和最大结果数print(placeser.run(page_size=20, max_page_num=1, max_result_num=15).get_property('address'))# 一个复杂的例子# 从地址获取坐标thu_main = BaiduMapObject(address='北京市清华大学紫荆宿舍')thu_main.from_address(raw_handler)thu_location = thu_main.get_property('location')['location']print('---\n\n起始坐标: %s' % (thu_location))# 获取一个句柄用于搜索circleser = get_handle(ak_key,'place/v2/search',is_list=True,query='火车站',scope=2,filter='sort_name:distance|sort_rule:1')circleser.set_params(radius=10000, location=thu_location)nearest_station = circleser.run(max_result_num=5)['results'][0]station_location = nearest_station.get_property('location')['location']print('万米内最近的火车站: %s' % (nearest_station.get_property('name')['name']))# 获取一个用于规划路径的句柄router = get_handle(ak_key, 'direction/v2/transit', is_list=True)router.set_params(origin=thu_location, destination=station_location)result = router.run()station = result.get_properties(['on_station', 'off_station'])print('提取出全部的on_station, off_station属性(地铁站名)')print(station)
调用方法
工厂模式
从工厂函数获取句柄 get_handle
from baidumap.api.handle import get_handle
使用从 百度地图开放平台Web API文档获取的API对应的URL来获取一个句柄的名称
样例
百度地图Web API
行政区划区域检索
http://api.map.baidu.com/place/v2/search?query=ATM机&tag=银行®ion=北京&output=json&ak=您的ak //GET请求
这个API的URL是 http://api.map.baidu.com/place/v2/search
(结尾有没有/很__重要__)
所以这个句柄的名字就是 place/v2/search
(只要移除掉万维网前缀即可)
# ak_key是百度地图开放平台的密钥
# 你需要从以下网址申请('http://lbsyun.baidu.com/index.php?title=%E9%A6%96%E9%A1%B5')
ak_key = '********************'# 你可以设置从工厂函数生产句柄的时候设置参数
# (前两个不是参数,分别是ak和句柄名称)
# 把is_list设置为真的时候说明这是一个用于获取列表数据的句柄
place_search = get_handle(ak_key, 'place/v2/search', is_list=True)# 然后设置API所需要的参数
place_search.set_params(query='ATM机', region='北京')# 使用run()来获取结果# 你可以限制max_page_num(=-1 默认不限制), page_size(=10, 上下限由百度规定), max_result_num(=-1 默认不限制) and 请求间隔interval(=0 秒 (过于频繁的请求会被百度拒绝 并且 baidumap.api 会抛出 baidumap.api.exceptions.BaiduMapApiException异常))# place_search.run([max_page_num=-1[, max_result_num=-1[, page_size=10[, interval=0]]]])
atm_in_beijing = place_search.run(max_page_num=3, page_size=20, max_result_num=55, interval=0.5)# 获取结果
print(atm_in_beijing)
# 获取结果中的参数(自动深度搜索,无需关注字典的嵌套问题)
# 结果会返回一个字典
print(atm_in_beijing.get_property('address'))
代理模式
你也可以使用 代理模式
首先import BaiduMapObject和Handle
from baidumap.object import BaiduMapObject
from baidumap.api.handle import Handle
然后使用key=value的键值对(可以是多个)来构建对象
thu_main = BaiduMapObject(address='北京市清华大学紫荆宿舍')
然后你需要创建一个包含ak_key的原始句柄
raw_handle = Handle(ak_key)
最后你只需要调用代理函数代理上面获得的原始句柄就可以让BaiduMapObject获取数据
# 调用地理解码
# 会在对象里填充坐标等信息
thu_main.from_address(handle)# 地理编码调用
# 会填充根据坐标发现的周边建筑的uid和address等信息
# 这样做会返回一个list-like的百度地图对象
thu_main.from_location(handle)# 创建一个带uid的百度地图对象
thu_main = BaiduMapObject(uid=thu_main.get_property('uid')[0].uid)# 详细信息获取
# 从uid填充详细信息
thu_main.from_uid(handle, detail=True)
对象
JsonLike
__init__(json=dict(), **kwargs)
JsonLike对象可以被list或dict初始化, 你也可以通过声明**kwargs来替换掉一些参数
__str__()
JsonLike 可以像字典那样被转换为字符串
is_list()
JsonLike对象可能是 dict-like或list-like,取决于初始化它的对象
get_property(p_key, p_default=None)
如果你想获取JsonLike的参数, 推荐这个函数, 返回字典.
如果只有一个结果, 返回像这样的结果:{key: value}
如果有多对结果, 会返回一个包含位置信息的list-like的字典
get_properties(p_keys, p_defaults=None)
你可以将多个参数信息包含在一个list-like的字典
set_property(p_key, p_value)
你不能用键值对的方式来设置<JsonLike>
如果你用这种方式设置值, 如果p_key不在JsonLike中, 你不会得到任何结果
keys()
返回JsonLike所有的键
from_json(json, **kwargs)
从json数据重构JsonLike,可能是字典 or 列表, 可以使用kwargs 替换部分参数
to_json()
以字典形式返回JsonLike
Location(JsonLike)
__str__()
位置对象会被转换成经度,纬度的格式
BaiduMapObject(JsonLike)
from_uid(handle, detail=False)
用uid搜索BaiduMapObject
需要一个带ak密钥的原始句柄
from_address(handle, detail=False)
用地址搜索BaiduMapObject
需要一个带ak密钥的原始句柄
from_location(handle, detail=False)
用坐标搜索BaiduMapObject
需要一个带ak密钥的原始句柄
错误&异常
BaiduMapApiException
基类异常
位置:baidumap.api.exception
HandleNotExistsError
继承BaiduMapApiException
无效的句柄
位置:baidumao.api.exception
NetError
继承BaiduMapApiException
网络错误
位置:baidumao.api.exception
OtherError
继承BaiduMapApiException
无法识别的错误
位置:baidumao.api.exception
运行原理
core
package baidumap.core
collector
controller
status
util
package baidumap.util
dict_tool & list_tool
一些安全操作数组和字典的函数
url
class Url
管理URL地址和参数
使用模块*reque
sts* 来获取GET请求
日志
config
baidumap.config.mode
value | description |
---|---|
config.value.DEBUG | 运行细节记录 |
config.value.INFO | 重要运行语句 |
config.value.WARNING | 不安全的运行 |
config.value.ERROR | 错误记录 |
config.value.NONE | 不记录 |
baidumap.config.filename
value | description |
---|---|
None | 直接打印在控制台 |
Logger | 使用logging模块代理日志 |
附录
部分句柄名称表
句柄名称 | 作用 | 参数&返回值 |
---|---|---|
place/v2/search | 地点检索V2 | 文档 |
place/v2/detail | 地点详情v2 | 文档 |
place_abroad/v1/search | 国际化地点检索V1 | 文档 |
geocoder/v2/ | 地理编码V2 | 文档 |
direction/v2/transit | 路线规划V2 | 文档 |
routematrix/v2/driving(walking, riding) | 批量算路V2驾车(步行,骑行) | 文档 |
location/ip | ip定位 | 文档 |
百度地图Web API Python模块相关推荐
- 百度地图web API定位不准,定位偏移问题处理
百度地图浏览器API 获取GPS定位是根据调用浏览器核心获取GPS,部分手机型号定位不准,主要是因为部分手机采用的是GOOGLE GPS坐标格式.部分手机用的是原生坐标格式 这两种格式百度地图无法 ...
- 百度地图web 关键字输入智能提示 省市区限制
百度地图web api 输入关键字提示仅仅给了一个很简单的demo,而且并未提供任何条件限制的api,今天遇到了个比较难受的问题是,网站本身是省市级3级区域选择,然后后面输入详细地址后要在百度地图上显 ...
- python如何爬虫获取图形上点的坐标_python调用百度地图WEB服务API获取地点对应坐标值...
本篇博客介绍如何使用Python调用百度地图WEB服务API获取地点对应坐标值,现有一系列结构化地址数据(如:北京市海淀区上地十街十号),目的是获取对应坐标值. 百度地图开发者平台路线规划使用说明网址 ...
- python调用百度地图实现导航_python调用百度地图WEB服务API获取地点对应坐标值
本篇博客介绍如何使用Python调用百度地图WEB服务API获取地点对应坐标值,现有一系列结构化地址数据(如:北京市海淀区上地十街十号),目的是获取对应坐标值. 百度地图开发者平台路线规划使用说明网址 ...
- 【完全开源】百度地图Web service API C#.NET版,带地图显示控件、导航控件、POI查找控件...
目录 概述 功能 如何使用 参考帮助 概述 源代码主要包含三个项目,BMap.NET.BMap.NET.WindowsForm以及BMap.NET.WinformDemo. BMap.NET 对百度地 ...
- 使用Python调用百度地图的API在地图上添加标记
写在前面 近期博主工作太忙,快一个月没更新博客.今天跑了大半天的腿,被一堆破事儿弄的无比憋屈,写篇博客调节一下心情. 博主的目的是在地图上做一些标记,然后保存为html网页文件,这样方便我的软件调用, ...
- 使用百度地图Web服务API查询地点的经纬度信息
使用百度地图Web服务API查询地点的经纬度信息 API地理编码服务 数据 结果 API地理编码服务 地理编码服务(又名Geocoder)是一类Web API接口服务: 地理编码服务提供将结构化地址数 ...
- 百度地图WEB服务-地点检索API
百度地图WEB服务-地点检索API 行政区划区域检索 圆形区域检索 矩形区域检索 地点检索服务(又名Place API)是百度地图开放平台提供的Web API接口服务: 该服务提供多种场景的地点(PO ...
- 百度地图WEB服务-逆地理编码使用心得
百度地图WEB服务-逆地理编码使用心得 逆地理编码接口 Postman接口请求测试 POI信息召回 Postman接口请求测试 上一篇博文写了我开发项目中最长用的正地理编码接口的博文,这次想总结一下逆 ...
最新文章
- [处理器、单片机]ARM
- javase-NIO
- 一次“失败”的阿里面试之旅
- C#(WinForm)上传图片保存到数据库和从数据库读取图片显示到窗体
- AD库转换为KiCAD库的方法
- cookie、localStorage和sessionStorage三者的异同
- Android辅助服务监听dialog,Android开发中对话框辅助类——DialogHelper
- Nacos配置管理基础应用
- 【C/C++】__stdcall、__cdcel和__fastcall定义与区别
- 从零到上亿用户,我是如何一步步优化MySQL数据库的?(建议收藏)
- 微信PC端多开的秘密
- C++下实现全连接神经网络
- awb入门(1).图像的色彩
- 常见元素 – a元素
- 华为服务器如何开机自动启动不了,华为手机开不了机怎么办 开机后一直停留在开机画面的解决方法(3)...
- loadrunner--浏览器不支持或禁止了网页脚本,导致您无法正常登录
- Linux入门---基本指令(下)
- 拉普拉斯算子——matlab
- SPEA 功率半导体测试仪- DOT800T简介
- 什么是僵死进程(Zombies)
热门文章
- ios 程序发布成ipa 文件 通过 web 下载和安装。install App via OTA
- 【Unity3d】Resource文件夹优缺点
- CRM 项目实战-笔记
- PYTHON开发毕业设计做什么好鸭?
- java布道师_我和 Spring 技术布道师的一天
- iOS 聊天表情键盘
- 怎么用ai做出适量插画_平面插画图文教程,如何用AI制作矢量人像插画
- 计算机系表白祖国母亲,青春向祖国告白——“给祖国母亲的一封告白信”活动纪实...
- 热心肠行为?苹果“偷偷“给应用买广告
- 计算机等级二级等保要求