本文将给大家分享三种交通态势获取的方法,可返回交通指数、速度、拥堵距离、拥堵趋势、拥堵路段描述等。
交通态势数据一直是城市规划、交通专项规划甚至评估城市整体指数的重要数据。但由于高德地图开放平台已于2019年关闭该功能改为付费使用,目前仅有百度地图开放平台有交通态势接口可免费使用。
一、百度地图接口(该接口缺陷在于无法返回拥堵路段json数据,但可通过:https://lbsyun.baidu.com/faq/api?title=webapi/place-suggestion-api百度地图地点输入提示接口获取对应拥堵路段json数据)
百度地图交通态势说明接口地址:https://lbsyun.baidu.com/faq/api?title=webapi/traffic
以下为道路实时路况查询获取数据格式及python代码:
生成结果1:拥堵路段描述文本
生成结果2:畅通、缓行路段描述
#导入模块
import pandas as pd
import requests
import os
import time
import datetime
from time import strftime,asctime,ctime,gmtime,mktime
import json
import csv
def fers(road_name):
city = ''
ak = ''
url = 'http://api.map.baidu.com/traffic/v1/road?road_name={}&city={}&ak={}'.format(str(road_name),city,ak)
re=requests.get(url)
decodejson=json.loads(re.text)
road_traffic_s=decodejson['road_traffic'][0]
v=road_traffic_s['congestion_sections']
curr_time=datetime.datetime.now()
time_str = datetime.datetime.strftime(curr_time,'%Y-%m-%d %H:%M:%S')
ty=pd.DataFrame(v)
ty['名称']=pd.DataFrame([road_traffic_s['road_name']]*len(v))
ty['时间']=pd.DataFrame([time_str]*len(v))
return ty
def es(road_name):
city = ''
ak = ''
url = 'http://api.map.baidu.com/traffic/v1/road?road_name={}&city={}&ak={}'.format(str(road_name),city,ak)
re=requests.get(url)
res=re.json()
decodejson = json.loads(re.text)
description=decodejson['description']
evaluation=decodejson['evaluation']
road_traffic=decodejson['road_traffic'][0]
road_data=pd.DataFrame([evaluation])
road_data['road_name']=road_traffic['road_name']
curr_time=datetime.datetime.now()
time_str = datetime.datetime.strftime(curr_time,'%Y-%m-%d %H:%M:%S')
road_data['时间']=pd.DataFrame([time_str])
road_data['路况描述']=description
if not os.path.exists('result_s1.csv'):
road_data.to_csv('result_s1.csv',encoding='gbk',mode='a',index=False,index_label=False)
else:
road_data.to_csv('result_s1.csv', encoding='gbk', mode='a', index=False, index_label=False,header=False)
def get_page(road_name):
city = ''
s=fers(road_name)
if not os.path.exists('result.csv'):
s.to_csv('result.csv',encoding='gbk',mode='a',index=False,index_label=False)
else:
s.to_csv('result.csv', encoding='gbk', mode='a', index=False, index_label=False,header=False)
while True:
if __name__ == '__main__':
road_name = []
for i in road_name:
city = ''
ak = ''
url = 'http://api.map.baidu.com/traffic/v1/road?road_name={}&city={}&ak={}'.format(str(i),city,ak)
re=requests.get(url)
decodejson = json.loads(re.text)
road_traffics=decodejson['road_traffic']
if len(road_traffics[0])>=2:
get_page(i)
es(i)
else:
es(i)
time.sleep(300)
具体使用方法可参考我的b站视频,觉得有用的老爷可请我喝杯咖啡或一键三连!!!感谢大家。
方法二:利用地图截获工具结合gis分析(比较吃能力和技术)
该方法的具体步骤如下:
1、地图截获器获取地图
import time
from selenium import webdriver
from selenium.webdriver.chrome.service import Service
opt = webdriver.FirefoxOptions()
opt.add_argument('-headless')
fire = webdriver.Firefox(options=opt)
#设置窗口尺寸
fire.set_window_size(4012,4119)
c=0
while True:
fire.get('file:D:/work/06开发软件\交通态势\交通态势\地图截获/交通态势图-高德.html')
time.sleep(10)
#时间戳
timemark = time.strftime('%Y_%m_%d_%H_%M_%S')
fire.save_screenshot('D:\work/06开发软件\交通态势\交通态势\地图截获/ts-save/traffic{0}.png'.format(timemark))
time.sleep(280) #设置时间间隔,单位为秒
2、观察地图rgb通道,选择容易区分的通道进行分析
3、随意取一个地图放到arcgis中,进行以下操作:
(1)新建一个线要素一个面要素分别存储矢量化后的数据和错误信息
(2)调整矢量化参数,建议容差为0.3,最大线宽选择100
(3)生成要素后删除水印
(4)将生成的线要素进行:增密 操作(因为最后需要将拥堵状态赋值给线,如果线比较长则无法系统现实情况)
(5)将增密后的线要素进行:在折点处分割线 操作,为的是将线分割以为后续赋值。
(6)最后进行:要素折点转点 为的是给每条线定义一个中点作为戳记。
4、使用python对所有图片的蓝色通道进行提取并格式化名称。对应代码如下:
import os
from PIL import Image
root = 'C://Users//administer//Desktop//交通态势//地图截获//ts-save//'
out = 'C://Users//administer//Desktop//交通态势//ts-daochu//'
pngs = os.listdir(root)
for png in pngs:
if png[-4:] == '.png':
image = Image.open(root + png)
short_name = "t" + png[5:-7].replace('_', '')+'.png'
r,g,b,a = image.split()
b.save(out + short_name)
else:
pass
5、右键栅格图片的图层,在符号系统中选择唯一值,按住ctrl选出有效数据部分(也就是b通道的98,25,67,28,173)这几个数值并且存成一个组显示,其他的全部分为另一个组显示。
6、使用:重分类 操作。按照以下范围分类,为的是将不同的状态编码赋值给路段。其他的值也都选为0.(注意:要将映射表存储下来)
7、将处理后的图片拖进arcgis中,进行:散度 操作。为的是让颜色扩散后能让大部分的点都处于有效颜色范围内。(仅对1234,这四个分类扩张即可)(散度的距离每次增加1像素就行,在散度需要选择内容里输入1,2,3,4)
8、使用模型构建器构建模型,以自动分析全天数据
9、最后进行多值提取至点(他可以选中所有的栅格图片)。
数据格式为时间戳、交通态势、路段长度、路段拥堵状态、路段编码。
方法三:
通过本公众号附带的基于高德地图的路径规划软件,对区域选取od对进行路径规划、结合返回的json进行地图修正,以及路段运行速度、态势的整体获取
(难度较第二种方法更高,本人正在已经全自动流程,目标是达到直接输出城市道路模型以及对应的任意时段的交通态势)
敬请期待@@@
同时也欢迎大家技术交流,行业发展离不开思考和先进思想!
最后,本文附百度地图交通态势的获取方法。