利用百度地图API制作城中心交通时空圈

应同学论文需求,利用百度地图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值。

上一张初步的结果图:



你可能感兴趣的:(python,百度地图)