应同学论文需求,利用百度地图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=E4805d16520de693a3fe707cdc962045,需要替换的值 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=eAbTumFqzkxRlSuHzqwk6jI6" 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值。
上一张初步的结果图: