基于百度地图API的交通可达性分析python


一、交通可达性是什么?

交通可达性最重要的考虑因素是交通成本,即交通距离与交通时间
可以使用API 的路径规划服务功能,选择公交路线,获取两个位置之间的交通时间和交通距离,其使用规则是通过http/https 形式发起检索请求,将两个位置的坐标传递给百度地图服务器,服务器通过计算后将路径规划结果返回。从返回的参数中选择distance 和duration 分别表示总交通网络距离和总交通出行时间。

案例说明:
比如我们要计算上海迪士尼乐园的公交可达性,可以先将上海划分为500m*500m的网格,然后将网格的经纬度作为起点,将迪士尼乐园的经纬度作为终点,通过百度地图API计算起终点的时间和距离,再借用GIS分析工具,将结果可视化在地图上,即可生成如下可达性地图。

该篇文章主要介绍如何借用百度API计算两点之间的真实出行时间和距离。
在这里插入图片描述

在这里插入图片描述

二、计算步骤

在这里插入图片描述

1.引入库

代码如下(示例):

import requests
import json
import time

2.调用百度API进行两点之间的路径查询

若查询数据量较大,服务器有时会掉线,因此做了等待后重新尝试连接的功能。
代码如下(示例):

def getjson(ocoo,dcoo):
    # 先纬度后经度
    url='http://api.map.baidu.com/direction/v2/driving?origin='+ocoo+'&destination='+dcoo+'&coord_type=wgs84&departure_time=1595548800&tactics_incity=4&ak=XXX'
    while True:
        try:
            response=requests.get(url=url,timeout=5)
            break
        except requests.exceptions.ConnectionError:
            print ('ConnectionError -- please wait 3 sec')
            time.sleep(3)
        except requests.exceptions.ChunkedEncodingError:
            print ('ChunkedEncodingError -- please wait 3 sec')
            time.sleep(3)
        except:
            print ('Unknow error')
            time.sleep(3)
    html=response.text
    decodejson=json.loads(html)
    return decodejson

3.输入待计算的文件和保存结果文件路径

将待查询的两点的位置属性保存到文本文件,文件格式为

记录编号 起点经度 起点纬度 终点经度 终点纬度
1 113.8375 22.8075 113.8275 22.8175
2 113.8375 22.5655 113.8875 22.4626
3 113.8375 22.1658 113.8732 22.1235
# 输入查询文件的路径
file_object=open(r'D:\\input\\fromsz_base202011.csv','r')
# 输出结果文件的保存路径
file_object2=open(r'D:\\fromsz_base_dis202011.txt','w')

4.读取文件并进行时间和距离计算

try:
    for line in file_object:
        count=count+1
        spline=line.split(',')
        idn=spline[0]
        coor=spline[5].strip()+','+spline[4].strip()
        door=spline[7].strip()+','+spline[6].strip()
        #print coor
        decodejson=getjson(coor,door)
        if decodejson.get('status')==0:#表示运行成功
            result=decodejson.get('result')
            routes=result.get('routes')
            #获得需要的时间和距离
            if len(routes)>0:     
                time2=routes[0].get('duration')
                distance=routes[0].get('distance')
                file_object2.write(str(idn)+','+str(time2)+','+str(distance) +'\\n')
                if count%10==0:
                    finishtime=time.asctime( time.localtime(time.time()))
                    finishtime1=time.time()
                    print (count)
                    print ('duration:',(finishtime1-starttime1)/60.0,'mins')
        else:
            print (str(coor)+','+ str(decodejson.get('status'))+decodejson.get('message'))

5.代码总览

# -*- coding: utf-8 -*-
# @Author: Xie 
# @Date:   2021-04-15 11:49:25
# @Last Modified by:   Xie 
# @Last Modified time: 2021-04-15 11:58:10


import requests
import json
import time
starttime=time.asctime(time.localtime(time.time()))   
starttime1=time.time();
# 调用百度API进行两点之间的路径查询
def getjson(ocoo,dcoo):
    # 先纬度后经度
    url='http://api.map.baidu.com/direction/v2/driving?origin='+ocoo+'&destination='+dcoo+'&coord_type=wgs84&departure_time=1595548800&tactics_incity=4&ak=XXX'
    while True:
        try:
            response=requests.get(url=url,timeout=5)
            break
        except requests.exceptions.ConnectionError:
            print ('ConnectionError -- please wait 3 sec')
            time.sleep(3)
        except requests.exceptions.ChunkedEncodingError:
            print ('ChunkedEncodingError -- please wait 3 sec')
            time.sleep(3)
        except:
            print ('Unknow error')
            time.sleep(3)
    html=response.text
    decodejson=json.loads(html)
    return decodejson
# 输入查询文件的路径
file_object=open(r'D:\\input\\fromsz_base202011.csv','r')
# 输入结果文件的保存路径
file_object2=open(r'D:\\fromsz_base_dis202011.txt','w')
count=0
try:
    for line in file_object:
        count=count+1
        spline=line.split(',')
        idn=spline[0]
        coor=spline[5].strip()+','+spline[4].strip()
        door=spline[7].strip()+','+spline[6].strip()
        #print coor
        decodejson=getjson(coor,door)
        if decodejson.get('status')==0:#表示运行成功
            result=decodejson.get('result')
            routes=result.get('routes')
            #获得需要的时间和距离
            if len(routes)>0:     
                time2=routes[0].get('duration')
                distance=routes[0].get('distance')
                file_object2.write(str(idn)+','+str(time2)+','+str(distance) +'\\n')
                if count%10==0:
                    finishtime=time.asctime( time.localtime(time.time()))
                    finishtime1=time.time()
                    print (count)
                    print ('duration:',(finishtime1-starttime1)/60.0,'mins')
        else:
            print (str(coor)+','+ str(decodejson.get('status'))+decodejson.get('message'))
finally:
        file_object.close()
        file_object2.close()
        print ('finish')

总结

以上就是利用地图API进行可达性计算的方法,操作简单,用户友好,结果准确。
而传统的GIS可达性计算,需要构建完善的GIS 交通网络模型,工作量较大。
在这里插入图片描述

注:API个人key有查询额度限制,企业key额度较高,若有大量查询需求,可私信提供企业key。
若有可达性分析需求,也可私信帮忙!

参考文献:
[1]《大型公共服务设施公共交通可达性评价方法》
[2]百度API文档:http://lbsyun.baidu.com/index.php?title=webapi/direction-api-v2

© 版权声明
THE END
喜欢就支持一下吧
点赞0 分享
评论 抢沙发
头像
欢迎您留下宝贵的见解!
提交
头像

昵称

取消
昵称表情代码图片