交通态势获取的三种方法(附代码)—以百度地图接口为主

作品简介

本文将给大家分享三种交通态势获取的方法,可返回交通指数、速度、拥堵距离、拥堵趋势、拥堵路段描述等。

交通态势数据一直是城市规划、交通专项规划甚至评估城市整体指数的重要数据。但由于高德地图开放平台已于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进行地图修正,以及路段运行速度、态势的整体获取

(难度较第二种方法更高,本人正在已经全自动流程,目标是达到直接输出城市道路模型以及对应的任意时段的交通态势)

敬请期待@@@

同时也欢迎大家技术交流,行业发展离不开思考和先进思想!

最后,本文附百度地图交通态势的获取方法。

创作时间: