百度地圖Web API Python模組
目錄
描述
本篇內容基於模組baidumap==1.2.4
百度地圖Web API給了開發者們很大的自由發揮空間,百度地圖官方提供了C, Java以及Android的開發SDK,但沒有提供Python的開發包,本人雖然技術很有限,但是興趣使然,就開發了第一個Python模組,用來簡化百度地圖API的呼叫流程
具體功能有區域檢索, 圓形查詢, 地點資訊, ip定位和路徑規劃等所有百度地圖API功能, 只要用工廠函式生產對應控制代碼即可
快速開始
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 BaiduMapObject
import 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.DEBUG
config. logger = logger
# 代理模式示例
print('---\nAgent Mode:\n')
raw_handler = get_handle(ak_key)
# 建立一個BaiduMapObject,並給它賦予一個初始值(可以用key=value)
# 的模式賦予多個數據
thu_main = BaiduMapObject(address='北京市清華大學紫荊園餐廳')
# 呼叫代理函式,從address(地址)獲取資訊
# 代理控制代碼raw_handler
# 這裡內部使用的是全球地理逆編碼API
thu_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來獲取一個控制代碼的名稱
樣例
行政區劃區域檢索
這個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,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.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定位 | 文件 |