应同学论文需求,利用百度地图API制作北京到达城中心高峰时段和平峰时段交通时空圈,使用给出的北京500*500格网数据中心经纬度,获取各地到达城中心所需要的时间。
arcgis的属性表可直接以excel导入导出,所以使用excel作为数据输入和存储的方式。
百度路径分析API可获得即时的路径规划其中包含所需时间,详见API文档 :http://lbsyun.baidu.com/index.php?title=webapi/direction-api
思路:通过python excel操作模块读取起始点经纬度,合成请求路径,获取返回的json,从中读取所耗时间字段,并写入excel。
请求url分析:http://api.map.baidu.com/direction/v1?mode=driving&origin=上地五街&destination=北京大学&origin_region=北京&destination_region=北京&output=json&ak=你的密匙,需要替换的值 mode(模式) origin(起始点) ak(密匙)
源码如下:
import xlwt
import requests
import urllib
import math
import re
import json
#通过request获取返回时间
def get_time(coordinate,mode):
api_addr="http://api.map.baidu.com/direction/v1?mode="+mode+"&origin="+coordinate+"&destination=39.905556,116.424722&origin_region=%E5%8C%97%E4%BA%AC&destination_region=%E5%8C%97%E4%BA%AC&output=json&coord_type=wgs84&ak=你的密匙"
req=requests.get(api_addr)
content=req.content
sjson=json.loads(content)
if sjson.has_key("result"):
#print sjson["status"]
if sjson["status"]==0:
if mode=="transit":
if sjson["result"].has_key("routes"):
if sjson["result"]["routes"][0].has_key("scheme"):
time=sjson["result"]["routes"][0]["scheme"][0]["duration"]
else:
time=sjson["result"]["routes"][0]["duration"]
else:
time=0
else:
if sjson["result"].has_key("routes"):
if sjson["result"]["routes"]==None:
time=0
else:
time=sjson["result"]["routes"][0]["duration"]
else:
time=0
else:
time=0
else:
time=0
print coordinate,time
return time
def run():
#mode是模式driving(驾车)、walking(步行)、transit(公交)、riding(骑行)
mode="driving"
#data 是输入的表格
data=xlrd.open_workbook('data0428.xlsx')
rtable=data.sheets()[0]
nrows=rtable.nrows
values=rtable.col_values(0)
workbook=xlwt.Workbook()
#新建输出表格
wtable=workbook.add_sheet('driving_zxd_p',cell_overwrite_ok=True)
row=0
for i in range(nrows):
s1=str(rtable.row_values(i)[2])+","+str(rtable.row_values(i)[1])
time=get_time(s1,mode)
wtable.write(row,0,rtable.row_values(i)[0])
wtable.write(row,1,rtable.row_values(i)[1])
wtable.write(row,2,rtable.row_values(i)[2])
wtable.write(row,3,time)
row=row+1
#保存输出表格
workbook.save('driving_zxd_p.xls')
if __name__=='__main__':
run()
遇到的问题:
1.在测试过程中发现request的返回会有各种不同情况,所以添加了判断条件,在获取不到耗时的时候取0。另外公交和其他模式返回的json结构不太一样,需要单独做判断。2.api中可以设定经纬度的坐标系,由此省去坐标转换的过程
3.分析0值可能存在的情况和处理:公交由于两点之间太近,步行效率大于公交,无公交路线规划,直接用0值。骑行时起始点落在环线或高速上,禁止骑行所以无法路径规划,使用邻近值替换0值。
上一张初步的结果图: