文章目录

  • 一、交通可达性是什么?
  • 二、计算步骤
  • 1.引入库
  • 2.调用百度API进行两点之间的路径查询
  • 3.输入待计算的文件和保存结果文件路径
  • 4.读取文件并进行时间和距离计算
  • 5.代码总览
  • 总结



一、交通可达性是什么?

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

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

该篇文章主要介绍如何借用百度API计算两点之间的真实出行时间和距离。

python在交通行业能有哪些应用 python交通分配_gis

python在交通行业能有哪些应用 python交通分配_api_02

二、计算步骤

python在交通行业能有哪些应用 python交通分配_gis_03

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 交通网络模型,工作量较大。

python在交通行业能有哪些应用 python交通分配_gis_04