基于百度地图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.输入待计算的文件和保存结果文件路径

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

记录编号起点经度起点纬度终点经度终点纬度
1113.837522.8075113.827522.8175
2113.837522.5655113.887522.4626
3113.837522.1658113.873222.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

  • 15
    点赞
  • 97
    收藏
    觉得还不错? 一键收藏
  • 5
    评论
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值