Python应用指南:高德拥堵延时指数
随着城市化进程的加快,交通拥堵问题日益严重,成为影响城市居民生活质量的重要因素之一。为了科学评估和管理交通拥堵,各种交通拥堵指数应运而生。其中,高德地图提供的“拥堵延时指数”因其数据丰富、实时性强和应用广泛而备受关注。本篇文章我们将视角聚焦于高德拥堵延时指数的定义、计算方法、应用场景以及其在城市交通管理中的重要作用。
高德地图交通大数据链接:上海 城市实时交通详情
1. 高德拥堵延时指数的定义
高德拥堵延时指数(Traffic Congestion Delay Index, TCDI)是一种衡量城市交通拥堵程度的综合指标。它通过比较实际行车时间和自由流状态下的行车时间来量化交通拥堵的程度。具体来说,拥堵延时指数反映了在拥堵状态下,车辆通过某路段所需的时间相对于自由流状态下所需时间的增加比例。
2. 高德拥堵延时指数的计算方法
高德拥堵延时指数的计算公式如下:
拥堵延时指数:实际旅行时间与自由流(畅通)状态下旅行时间的比值
- 实际行驶时间(Actual Travel Time, TaTa):在实际交通条件下,车辆通过某路段所需的时间。
- 自由流行驶时间(Free Flow Travel Time, TfTf):在无交通干扰的情况下,车辆通过该路段所需的时间。
例如,假设某路段的自由流行驶时间为10分钟,实际行驶时间为20分钟,则拥堵延时指数为:
拥堵延时指数=20/10=2.0
这意味着在拥堵状态下,车辆通过该路段所需的时间是自由流状态下所需时间的2倍。
3. 高德拥堵延时指数的分级标准
为了更直观地理解和应用拥堵延时指数,高德地图将其分为几个等级:
- 1.0 - 1.4:畅通
- 1.5 - 1.9:缓行
- 2.0 - 3.9:拥堵
- 4.0 以上:严重拥堵
其他指标释义可参考高德发布的2023年度中国主要城市交通分析报告附录A名词解释部分:
2023年度中国主要城市交通分析报告
先讲一下方法思路,一共三个步骤;
方法思路
- 通过高德驾车路径规划查询路段的通行时间、速度等指标(允许计算多条道路)
- 每5分钟记录一次数据
- 输出csv的结果表
高德驾车路径规划的个人开发者账号的日配额5000次/日, 高德的拥堵延时指数则是每5分钟自动刷新,我们可以通过驾车规划来计算路段的拥堵延时指数,理论上我们可以实现对一条或者多条道路的全天监测,这取决于我们账号的额度,基于这个思路,我们就阔以通过python脚本来实现自动化的流程;
我们来基于图示来猜测一下计算逻辑,就是计算通过计算该段路的实际旅行时间与自由流(畅通)状态下旅行时间的比值,来得到的数值,那我们只要把驾车路径调整成需要观测道路的行驶路径,即可监测该条路的拥堵延时指数和平均速度这些指标;
完整代码#运行环境Python 3.11
import requests
import json
import math
import time
import csv
import os
import pandas as pd
import matplotlib.pyplot as plt
import geopandas as gpd
from shapely.geometry import Point, LineString# 设置中文支持
plt.rcParams['font.sans-serif'] = ['SimHei'] # 用来正常显示中文标签
plt.rcParams['axes.unicode_minus'] = False # 用来正常显示负号# 常量定义
pi = 3.14159265358979324
ee = 0.00669342162296594323
a = 6378245.0def out_of_china(lng, lat):"""判断是否在国内,不在国内不做偏移:param lng: 经度:param lat: 纬度:return: 是否在国内"""return not (73.66 < lng < 135.05 and 3.86 < lat < 53.55)def transformlat(lng, lat):ret = -100.0 + 2.0 * lng + 3.0 * lat + 0.2 * lat * lat + 0.1 * lng * lat + 0.2 * math.sqrt(math.fabs(lng))ret += (20.0 * math.sin(6.0 * lng * pi) + 20.0 * math.sin(2.0 * lng * pi)) * 2.0 / 3.0ret += (20.0 * math.sin(lat * pi) + 40.0 * math.sin(lat / 3.0 * pi)) * 2.0 / 3.0ret += (160.0 * math.sin(lat / 12.0 * pi) + 320 * math.sin(lat * pi / 30.0)) * 2.0 / 3.0return retdef transformlng(lng, lat):ret = 300.0 + lng + 2.0 * lat + 0.1 * lng * lng + 0.1 * lng * lat + 0.1 * math.sqrt(math.fabs(lng))ret += (20.0 * math.sin(6.0 * lng * pi) + 20.0 * math.sin(2.0 * lng * pi)) * 2.0 / 3.0ret += (20.0 * math.sin(lng * pi) + 40.0 * math.sin(lng / 3.0 * pi)) * 2.0 / 3.0ret += (150.0 * math.sin(lng / 12.0 * pi) + 300.0 * math.sin(lng / 30.0 * pi)) * 2.0 / 3.0return retdef gcj02towgs84(lng, lat):"""GCJ02(火星坐标系)转GPS84:param lng:火星坐标系的经度:param lat:火星坐标系纬度:return:"""if out_of_china(lng, lat):return lng, latdlat = transformlat(lng - 105.0, lat - 35.0)dlng = transformlng(lng - 105.0, lat - 35.0)radlat = lat / 180.0 * pimagic = math.sin(radlat)magic = 1 - ee * magic * magicsqrtmagic = math.sqrt(magic)dlat = (dlat * 180.0) / ((a * (1 - ee)) / (magic * sqrtmagic) * pi)dlng = (dlng * 180.0) / (a / sqrtmagic * math.cos(radlat) * pi)mglat = lat + dlatmglng = lng + dlngreturn [lng * 2 - mglng, lat * 2 - mglat]def coordinates(c):lng, lat = c.split(',')lng, lat = float(lng), float(lat)wlng, wlat = gcj02towgs84(lng, lat)return wlng, wlatdef driving_planning(api_key, routes):results = []all_route_coordinates = []for i, (from_location, to_location) in enumerate(routes):url = 'https://restapi.amap.com/v3/direction/driving'parameters = {'key': api_key,'origin': from_location,'destination': to_location,'strategy': '11','output': 'json'}response = requests.get(url, params=parameters)data = json.loads(response.text)if data['status'] == '1':route = data['route']paths = route['paths']if paths:path = paths[0]distance = int(path['distance']) / 1000 # 转换为公里duration = int(path['duration']) / 60 # 转换为分钟steps = path['steps']route_coordinates = []for step in steps:polyline = step['polyline']# 转换坐标coordinates_list = [coordinates(c) for c in polyline.split(';')]route_coordinates.extend(coordinates_list)# 计算平均速度(km/h)average_speed = distance / (duration / 60)results.append({'route': f"路线 {i + 1}",'总出行距离': distance,'总出行时间': duration,'平均速度': average_speed})print(f"路线 {i + 1}:")print(f" 总出行距离: {distance:.2f}公里")print(f" 总出行时间: {duration:.2f}分钟")print(f" 平均速度: {average_speed:.2f}公里/小时")all_route_coordinates.append(route_coordinates)else:print(f"未找到路径 {i + 1}")else:print(f"路线规划失败 {i + 1}: {data['info']}")return results, all_route_coordinatesdef export_to_csv(results, filename):file_exists = os.path.exists(filename)with open(filename, mode='a', newline='', encoding='ANSI') as file:writer = csv.writer(file)if not file_exists:writer.writerow(['时间', '路线', '总出行距离(公里)', '总出行时间(分钟)', '平均速度(公里/小时)'])current_time = time.strftime('%Y-%m-%d %H:%M:%S', time.localtime())for result in results:writer.writerow([current_time, result['route'], f"{result['总出行距离']:.2f}", f"{result['总出行时间']:.2f}", f"{result['平均速度']:.2f}"])def plot_routes(all_route_coordinates):fig, ax = plt.subplots(figsize=(10, 10))for i, route_coordinates in enumerate(all_route_coordinates):route_line = LineString(route_coordinates)gdf = gpd.GeoDataFrame(index=[0], geometry=[route_line])gdf.plot(ax=ax, color=f'C{i}', label=f"路线 {i + 1}")ax.set_xlabel('经度')ax.set_ylabel('纬度')ax.legend()plt.title('路线规划图')plt.show()def main():api_key = '你的key' # 替换为你的高德地图API密钥# 定义多个起终点对routes = [('121.535949,31.213957', '121.572702,31.215328'), # 示例起终点('121.564392,31.204669', '121.557429,31.231008'), # 示例起终点# 可以继续添加更多的起终点对]first_run = True # 标志变量,用于判断是否是第一次运行while True:results, all_route_coordinates = driving_planning(api_key, routes)export_to_csv(results, '拥堵延时指数.csv')print("数据已导出到CSV文件")if first_run:plot_routes(all_route_coordinates)first_run = False # 第一次运行后设置标志为Falsetime.sleep(300) # 每五分钟运行一次if __name__ == '__main__':main()
这里我们以上海的花木路和芳甸路作为研究对象;
结果输出为csv的形式,便于我们后续的计算与分析;
这里主观界定凌晨的2:00-4:00点路段的通行时间均值作为自由流(畅通)状态下旅行时间,基于此来计算的拥堵延时指数,同时我们把监测时间延长到24小时,那么我们就可以看到整条道路的早晚高峰分布情况,平均道路运行速度等直观的路况数据;
文章仅用于分享个人学习成果与个人存档之用,分享知识,如有侵权,请联系作者进行删除。所有信息均基于作者的个人理解和经验,不代表任何官方立场或权威解读。
相关文章:
Python应用指南:高德拥堵延时指数
随着城市化进程的加快,交通拥堵问题日益严重,成为影响城市居民生活质量的重要因素之一。为了科学评估和管理交通拥堵,各种交通拥堵指数应运而生。其中,高德地图提供的“拥堵延时指数”因其数据丰富、实时性强和应用广泛而备受关注…...
ISO 21434标准:汽车网络安全管理的利与弊
ISO 21434标准在提升汽车网络安全性方面起到了重要作用,但任何标准都不是完美无缺的,ISO 21434标准也存在一些不足之处。以下是对其不足之处的分析: 一、标准的灵活性与适应性 缺乏具体技术细节:ISO 21434标准更多地提供了网络安…...
无插件H5播放器EasyPlayer.js视频流媒体播放器如何开启electron硬解码Hevc(H265)
在数字化时代,流媒体播放器技术正经历着前所未有的变革。随着人工智能、大数据、云计算等技术的融合,流媒体播放器的核心技术不断演进,为用户提供了更加丰富和个性化的观看体验。 EasyPlayer.js H5播放器,是一款能够同时支持HTTP、…...
excel版数独游戏(已完成)
前段时间一个朋友帮那小孩解数独游戏,让我帮解,我看他用电子表格做,只能显示,不能显示重复,也没有协助解题功能,于是我说帮你做个电子表格版的“解题助手”吧,不能直接解题,但该有的…...
接口上传视频和oss直传视频到阿里云组件
接口视频上传 <template><div class"component-upload-video"><el-uploadclass"avatar-uploader":action"uploadImgUrl":on-progress"uploadVideoProcess":on-success"handleUploadSuccess":limit"lim…...
Arcgis 地图制作
地图如下,不同历史时期:...
【每日一题1121】python校招笔试题、面试题
1、Python字符串不是通过NUL或者’\0’来结束的 C语言中字符串使用’\0’作为结束符,以防止越界。但是在python中,字符串值只包含所定义的东西。 2、执行以下程序,输出结果为() class Base(object):count 0def __in…...
Spring Boot + Vue 基于 RSA 的用户身份认证加密机制实现
Spring Boot Vue 基于 RSA 的用户身份认证加密机制实现 什么是RSA?安全需求介绍前后端交互流程前端使用 RSA 加密密码安装 jsencrypt库实现敏感信息加密 服务器端生成RSA的公私钥文件Windows环境 生成rsa的公私钥文件Linux环境 生成rsa的公私钥文件 后端代码实现返…...
Docker搭建有UI的私有镜像仓库
Docker搭建有UI的私有镜像仓库 一、使用这个docker-compose.yml文件: version: 3services:registry-ui:image: joxit/docker-registry-ui:2.5.7-debianrestart: alwaysports:- 81:80environment:- SINGLE_REGISTRYtrue- REGISTRY_TITLEAtt Docker Registry UI- DE…...
Qt打开文件对话框选择文件之后弹出两次
项目场景: 在 Qt 中,使用 ui 自动生成的 UI 文件会为每个控件自动生成一些默认的槽函数。如果您手动创建的槽函数名称与这些自动生成的槽函数名称相同,就会导致信号被多次连接,从而引发多次弹出文件对话框的问题。 原因分析&…...
【JAVA】正则表达式中的正向肯定预查
在Java中,正向肯定预查(Positive Lookahead)是一种正则表达式的高级特性,用于在匹配某个模式之前检查某个条件是否满足。正向肯定预查不会消耗字符,也就是说,它不会将匹配的字符从剩余的字符串中移除&#…...
django从入门到实战(一)——路由的编写规则与使用
Django 路由的编写规则与使用 在 Django 中,路由(URLconf)是将 URL 映射到视图函数的机制。它允许我们定义网站的 URL 结构,并将请求分发到相应的处理函数。以下是关于 Django 路由的定义规则及使用的详细介绍。 1. Django 的路…...
vue框架开发的前端项目,build和package的区别
在使用 Vue 框架开发前端项目时,build 和 package 是两个常见的操作,它们有不同的目的和作用。下面是它们的区别: 1. Build(构建) build 是将前端源代码(如 Vue 组件、JavaScript 文件、CSS 样式等&#…...
视频智能分析软件LiteAIServer摄像机实时接入分析平台噪声监测算法介绍
在视频监控领域,噪声问题一直是一个令人头疼的难题。无论是低光环境、摄像机传感器的高灵敏度,还是编码压缩过程中的失真,都可能导致视频中出现噪声,从而影响监控画面的清晰度和准确性。这些噪声不仅降低了视频的可读性࿰…...
鸿蒙UI开发与部分布局
UI开发 1. 布局概述 1.1 开发流程 1.先确定开发流程 -> 2.分析页面元素构成 ->3.选用合适的布局容器组件 1.3 布局元素组成:盒模型 2.1 布局分类 2.1 线性布局 线性布局是开发中最常用、最基础的布局,通过线性容器Row和Column构建 2.1.1 线性布…...
redis的map底层数据结构 分别什么时候使用哈希表(Hash Table)和压缩列表(ZipList)
在Redis中,Hash数据类型的底层数据结构可以是压缩列表(ZipList)或者哈希表(HashTable)。这两种结构的使用取决于特定的条件: 1. **使用ZipList的条件**: - 当Hash中的数据项(即f…...
css水平居中+垂直居中
display:“flex”,position: “absolute”,top:“50%”,left:“50%”,transform: ‘translate(-50%, -50%)’...
设计模式之 组合模式
组合模式(Composite Pattern)是一种结构型设计模式,它通过将对象组合成树形结构来表示“部分-整体”层次。组合模式允许客户端统一处理单个对象和对象集合。换句话说,组合模式让客户端可以像处理单个对象一样处理对象的集合&#…...
LCR 001 两数相除
一.题目: . - 力扣(LeetCode) 二.原始解法-超时: class Solution: def divide(self, a: int, b: int) -> int: # 1)分析: # 除法计算,不能使用除法符号,可以理解为实现除法 # 除法…...
数据库、数据仓库、数据湖、数据中台、湖仓一体的概念和区别
数据库、数据仓库、数据湖、数据中台和湖仓一体是数据管理和分析领域的不同概念,各自有不同的特点和应用场景。以下是它们的主要区别: 1. 数据库(Database) 定义:结构化的数据存储系统,用于高效地存储、检…...
vue 的生命周期函数
Vue 生命周期函数(生命周期钩子)是 Vue 实例从创建到销毁过程中,不同阶段所触发的特定函数。理解这些生命周期函数对于开发 Vue 应用至关重要,因为它们让你在不同的生命周期阶段执行代码,比如数据初始化、DOM 渲染完成…...
单片机UART协议相关知识
概念 UART(Universal Asynchronous Receiver/Transmitter,通用异步收发传输器) 是一种 异步 串行 全双工 通信协议,用于设备一对一进行数据传输,只需要两根线(TX,RX)。 异步&…...
【操作系统不挂科】<CPU调度(13)>选择题(带答案与解析)
前言 大家好吖,欢迎来到 YY 滴 操作系统不挂科 系列 ,热烈欢迎! 本章主要内容面向接触过C的老铁 本博客主要内容,收纳了一部门基本的操作系统题目,供yy应对期中考试复习。大家可以参考 本章为选择题题库,试…...
OpenCV笔记:图像去噪对比
图像去噪对比 1. 均值滤波(Mean Filtering) 方法:用像素周围的像素平均值替换每个像素值。适用场景:适用于去除随机噪声,如在不强调图像细节的场景中,如果图像细节较多时,可能会导致图像模糊。…...
A-B数对(二分查找)
#include<bits/stdc.h> using namespace std;using ll long long;int main(){ios::sync_with_stdio(0);cin.tie(0);cout.tie(0);int n,c;cin>>n>>c;int nu[200000];for(int i0;i<n;i){cin>>nu[i]; // 输入数组元素}sort(nu,nun);ll cnt0; // 统计满…...
Vue 的各个生命周期
详解 Vue 的各个生命周期 文章目录 详解 Vue 的各个生命周期Vue 组件的生命周期1.1 创建阶段示例: 1.2 挂载阶段示例: 1.3 更新阶段示例: 1.4 销毁阶段示例: 生命周期总结生命周期钩子对比表参考链接 Vue 组件的生命周期 在 Vue …...
实现简易计算器 网格布局 QT环境 纯代码C++实现
问题:通过代码完成一个10以内加减法计算器。不需要自适应,界面固定360*350。 ""按钮90*140,其它按钮90*70。 参考样式 #define DEFULT_BUTTON_STYLE "\ QPushButton{\color:#000000;\border:1px solid #AAAAAA;\border-radi…...
后端开发详细学习框架与路线
🚀 作者 :“码上有前” 🚀 文章简介 :后端开发 🚀 欢迎小伙伴们 点赞👍、收藏⭐、留言💬 为帮助你合理安排时间,以下是结合上述学习内容的阶段划分与时间分配建议。时间安排灵活&a…...
2.langchain中的prompt模板 (FewShotPromptTemplate)
本教程将介绍如何使用 LangChain 库中的 PromptTemplate 和 FewShotPromptTemplate 来构建和运行提示(prompt),并通过示例数据展示其应用。 安装依赖 首先,确保你已经安装了 langchain 和相关依赖: pip install lan…...
FairGuard游戏加固实机演示
此前,FairGuard对市面上部分游戏遭遇破解的案例进行了详细分析,破解者会采用静态分析与动态调试相结合的手段,逆向分析出代码逻辑并对其进行篡改,实现作弊功能,甚至是对游戏资源文件进行篡改,从而制售外挂。…...
如何seo网站推广/seo推广培训中心
笔者最近对爱机进行了升级,CPU为P4赛扬1.7GHz,主板为美达845D。由于本人对《魔兽争霸》相当着迷,为了追求更好的游戏效果和更快的游戏速度,于是对爱机进行了超频。 由于此款主板支持线性超频,在不加电压的情况下&#…...
网站建设要学哪些软件有哪些内容/百度小说风云榜总榜
共享锁 共享锁指的就是对于多个不同的事务,对同一个资源共享同一个锁。相当于对于同一把门,它拥有多个钥匙一样。就像这样,你家有一个大门,大门的钥匙有好几把,你有一把,你女朋友有一把,你们都可…...
服装网站的建设策划/推广关键词外包
目录 前言篇 内存参数篇 jstack-栈信息 jmat-堆信息 jstat-GC信息 前言篇 实测:分别调整JVM堆大小,启动idea,jstat -GC 查看堆信息如下: 64bit-16G 电脑 S0C(kb) S1C(kb) EC(kb) OC(kb) MC(kb) 年轻代 老年代 堆大小 年轻代占比 老年代占比 年轻代Eden占比 年轻代S…...
菏泽公司网站建设/天眼查询个人信息
声明: 本博客欢迎转发,但请保留原作者信息! 博客地址:http://blog.csdn.net/halcyonbaby 内容系本人学习、研究和总结。如有雷同,实属荣幸!安装执行create-stack-user.sh脚本时,当前文件夹不要是devstack安…...
安阳网站建设哪家好/策划是做什么的
在程序员的世界中,一切重复性的工作,都应该通过程序自动执行。 「自动化测试」就是一个最好的例子。 随着互联网应用开发周期越来越短,迭代速度越来越快,只会点点点,不懂开发的手工测试,已经无法满足如今的…...
浙江网站建设价格/中国万网域名注册服务内容
在Maven中依赖的域有: compile、provided、runtime、system、test、import。 依赖范围(Scope)编译classpath测试classpath运行时classpath传递性说明compileYYYYspring-coretest-Y--junitprovidedYY--servlet-apiruntime-YYYjdbc驱动systemYY--本地jar包compile&am…...