文章目录
- 一、交通可达性是什么?
- 二、计算步骤
- 1.引入库
- 2.调用百度API进行两点之间的路径查询
- 3.输入待计算的文件和保存结果文件路径
- 4.读取文件并进行时间和距离计算
- 5.代码总览
- 总结
一、交通可达性是什么?
交通可达性最重要的考虑因素是交通成本,即交通距离与交通时间。
可以使用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 交通网络模型,工作量较大。