1. 程式人生 > >百度地圖Web API Python模組

百度地圖Web API Python模組

目錄

描述

本篇內容基於模組baidumap==1.2.4

百度地圖Web API給了開發者們很大的自由發揮空間,百度地圖官方提供了C, Java以及Android的開發SDK,但沒有提供Python的開發包,本人雖然技術很有限,但是興趣使然,就開發了第一個Python模組,用來簡化百度地圖API的呼叫流程

具體功能有區域檢索, 圓形查詢, 地點資訊, ip定位和路徑規劃等所有百度地圖API功能, 只要用工廠函式生產對應控制代碼即可

作者: [email protected]

快速開始

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 BaiduMapObjectHandle

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物件可以被listdict初始化, 你也可以通過宣告**kwargs來替換掉一些引數

__str__()

JsonLike 可以像字典那樣被轉換為字串

is_list()

JsonLike物件可能是 dict-likelist-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定位 文件