基于 Python 的交通流量数据可视化分析系统
贵州省交通流量可视化分析平台,面向交通管理部门的态势展示与预测分析系统。
目录
- 项目概述
- 技术栈
- 项目结构
- 功能模块
- 数据库设计
- [API 接口文档](#API 接口文档)
- 认证系统
- 预测系统
- 安装部署
- 使用指南
- 环境变量说明
- 错误处理
- 性能优化
- 开发指南
- 常见问题
- 贡献指南
- 术语表
- 路线图
- 参与单位
- 附录
- 更新日志
项目概述
本系统是面向贵州省交通管理部门的交通态势展示与预测分析平台,基于全年交通流量采样数据,实现对全省核心路网的多维度分析和智能预测。
项目演示



























背景与目标
贵州省作为我国西南地区重要的交通枢纽,近年来机动车保有量持续增长,交通管理面临越来越大的压力。本系统旨在:
- 数据驱动决策:为交通管理部门提供科学、客观的数据决策依据
- 公众服务:为市民出行提供数据参考,优化出行体验
- 城市规划:为城市规划提供客观的交通运行评价指标
- 预测预警:提前预判交通态势,辅助应急响应调度
数据规格
| 规格项 | 说明 |
|---|---|
| 数据范围 | 贵州省 9 个地州市 |
| 时间粒度 | 每小时采样一次 |
| 拥堵指数范围 | 0 - 20(越高越拥堵) |
| 数据规模 | 10 万 + 条记录 / 年度 |
| 更新频率 | 批量导入 + 历史查询 |
贵州省 9 市州
| 城市 | 代码 | 面积 (km²) | 常住人口 (万) |
|---|---|---|---|
| 贵阳市 | GY | 8,034 | 598 |
| 遵义市 | ZY | 30,780 | 660 |
| 黔南州 | QN | 26,190 | 350 |
| 黔东南州 | QDN | 30,300 | 376 |
| 黔西南州 | QXN | 16,804 | 300 |
| 安顺市 | AS | 9,253 | 246 |
| 毕节市 | BJ | 26,848 | 689 |
| 铜仁市 | TR | 18,002 | 327 |
| 六盘水市 | LPS | 9,965 | 303 |
核心指标说明
拥堵指数 (Congestion Index)
| 指数范围 | 等级 | 颜色标识 | 含义 |
|---|---|---|---|
| < 2 | 畅通 | 绿色 | 道路通行顺畅,无拥堵 |
| 2 - 5 | 轻度拥堵 | 浅绿色 | 车流开始增多,通行速度下降 |
| 5 - 8 | 中度拥堵 | 橙色 | 车流密集,通行缓慢 |
| 8 - 12 | 严重拥堵 | 红色 | 交通拥堵严重,通行困难 |
| > 12 | 极度拥堵 | 深红色 | 道路基本无法通行 |
道路状态 (Road Status)
| 状态码 | 状态名称 | 说明 |
|---|---|---|
| 1 | 畅通 | 道路通行正常 |
| 2 | 缓行 | 车流缓慢但仍在移动 |
| 3 | 拥堵 | 交通拥堵,排队严重 |
| 4 | 封闭 | 道路临时封闭 |
业务场景
场景一:日常工作监测
交通管理局值班人员通过总览仪表盘,实时掌握全省交通态势。重点关注:
- 当日拥堵指数是否异常
- 是否有道路突破预警阈值
- 与历史同期对比是否有显著变化
场景二:大型活动保障
在数博会、酒博会、国庆等大型活动期间:
- 预设活动场馆周边道路为重点监控区域
- 分析历史类似活动的交通影响
- 预测活动期间交通压力分布
场景三:拥堵成因分析
当某条道路持续拥堵时:
- 通过多维分析模块交叉分析天气、事件、管制因素
- 对比工作日/周末差异
- 定位拥堵根因
场景四:公众出行服务
市民通过留言板反馈出行体验:
- 提交对特定路段的意见建议
- 查看其他市民的反馈和官方回复
- 参考系统提供的预测数据规划出行
场景五:预测预警
基于 AI 模型预测未来 24 小时交通态势:
- 预测拥堵指数和车速
- 识别潜在风险时段
- 获取出行建议
技术栈
后端技术栈
| 技术 | 版本 | 用途 |
|---|---|---|
| Django | 5.x | Web 框架、ORM |
| Django REST Framework | 3.15.x | REST API |
| SimpleUI | 2024.x | Admin 后台主题 |
| MySQL | 8.x | 关系型数据库 |
| scikit-learn | 1.5.x | 机器学习预测 |
| pandas | 2.x | 数据处理 |
| joblib | 1.4.x | 模型序列化 |
前端技术栈
| 技术 | 版本 | 用途 |
|---|---|---|
| Vue | 3.5.x | 渐进式前端框架 |
| Vue Router | 5.x | 页面路由 |
| Pinia | 3.x | 状态管理 |
| ECharts | 6.x | 数据可视化图表 |
| Axios | 1.x | HTTP 请求 |
| Vite | 8.x | 构建工具 |
| Sass | 1.x | CSS 预处理器 |
项目结构
traffic/ # 项目根目录
├── .env.example # 环境变量模板
├── .gitignore # Git 忽略配置
├── README.md # 项目文档(本文件)
├── LICENSE # MIT 开源协议
│
├── backend/ # Django 后端项目
│ ├── config/ # 项目配置
│ │ ├── __init__.py
│ │ ├── settings.py # Django 设置(数据库/认证/CORS)
│ │ ├── urls.py # 根路由
│ │ ├── wsgi.py # WSGI 入口
│ │ └── asgi.py # ASGI 入口
│ ├── traffic/ # 主应用
│ │ ├── __init__.py
│ │ ├── models.py # 数据模型(TrafficRecord/ImportJob/ModelArtifact/Feedback)
│ │ ├── views.py # API 视图(17个端点)
│ │ ├── serializers.py # DRF 序列化器
│ │ ├── services.py # 业务逻辑层
│ │ ├── ml.py # 机器学习预测模块
│ │ ├── urls.py # 应用路由
│ │ ├── admin.py # SimpleUI 后台配置
│ │ ├── apps.py
│ │ ├── tests.py # 单元测试
│ │ ├── cities.json # 贵州省城市数据
│ │ ├── migrations/ # 数据库迁移
│ │ │ ├── 0001_initial.py
│ │ │ └── 0002_feedback.py
│ │ └── management/commands/ # Django 自定义命令
│ │ ├── import_traffic_csv.py # CSV 数据导入命令
│ │ └── train_traffic_models.py # 模型训练命令
│ ├── trained_models/ # 训练好的模型文件(joblib)
│ ├── manage.py # Django 管理脚本
│ └── requirements.txt # Python 依赖
│
├── frontend/ # Vue 前端项目
│ ├── public/
│ │ ├── favicon.svg # 网站图标
│ │ └── index.html # HTML 模板
│ ├── src/
│ │ ├── App.vue # 根组件
│ │ ├── main.js # 入口文件
│ │ ├── style.css # 全局样式
│ │ ├── router/
│ │ │ └── index.js # 路由配置(8个页面)
│ │ ├── stores/ # Pinia 状态管理
│ │ │ ├── traffic.js # 交通数据状态
│ │ │ └── user.js # 用户认证状态
│ │ ├── views/ # 页面视图
│ │ │ ├── DashboardView.vue # 总览页
│ │ │ ├── AnalysisView.vue # 分析页(10种图表)
│ │ │ ├── PredictionView.vue # 预测页
│ │ │ ├── RecordsView.vue # 数据检索页
│ │ │ ├── FeedbackView.vue # 留言板页
│ │ │ ├── PersonalView.vue # 个人中心页
│ │ │ ├── AboutView.vue # 关于页
│ │ │ └── LoginView.vue # 登录注册页
│ │ ├── components/ # 公共组件
│ │ │ ├── BaseChart.vue # ECharts 图表组件
│ │ │ ├── MetricCard.vue # 指标卡片组件
│ │ │ └── RoadDetailModal.vue # 道路详情弹窗
│ │ ├── lib/ # 工具库
│ │ │ ├── api.js # Axios 请求封装
│ │ │ ├── echarts.js # ECharts 主题配置
│ │ │ └── maps.js # 地图初始化
│ │ ├── utils/
│ │ │ └── format.js # 格式化工具函数
│ │ └── assets/
│ │ └── geo/
│ │ └── guizhou.json # 贵州省 GeoJSON 地图
│ ├── package.json # 前端依赖
│ ├── package-lock.json
│ ├── vite.config.js # Vite 构建配置
│ └── .vscode/
│ └── extensions.json # VSCode 推荐插件
│
├── data/ # 原始数据
│ └── 交通流量数据.csv # 贵州省交通流量数据(11MB,10万+条)
│
├── scripts/ # 脚本目录
│ └── init_mysql.sql # MySQL 数据库初始化脚本
│
├── docs/ # 文档目录(可选)
│ └── design_329_traffic.sql # 数据库设计文档(29MB)
│
└── .claude/ # Claude Code 配置
└── settings.local.json
关键文件说明
| 文件/目录 | 说明 |
|---|---|
backend/traffic/models.py |
4张数据表:TrafficRecord、ImportJob、ModelArtifact、Feedback |
backend/traffic/views.py |
17个API端点,涵盖仪表盘、分析、预测、认证 |
backend/traffic/services.py |
业务逻辑:数据聚合、筛选、分页 |
backend/traffic/ml.py |
RandomForest 机器学习预测 |
frontend/src/stores/traffic.js |
Pinia 状态管理,API 数据缓存 |
frontend/src/views/*.vue |
8个页面组件 |
data/交通流量数据.csv |
训练数据和展示数据的源文件 |
运行时目录
traffic/
├── backend/
│ ├── __pycache__/ # Python 编译缓存(自动生成)
│ ├── *.pyc # 编译后的 Python 字节码
│ └── trained_models/ # 运行时模型存储
│ ├── congestion_model.joblib # 拥堵指数预测模型
│ └── speed_model.joblib # 车速预测模型
├── frontend/
│ ├── node_modules/ # npm 安装的依赖
│ ├── dist/ # npm run build 产物(生产环境)
│ └── .vite/ # Vite 缓存
└── .venv/ # Python 虚拟环境
功能模块
1. 总览仪表盘(Dashboard)
入口页面,展示全省交通态势核心指标:
- 核心指标卡片:总记录数、平均拥堵指数、平均车速、异常比例
- 拥堵 TOP 城市/道路:当前最拥堵的城市和道路排名
- 趋势图表:按小时/日/月展示拥堵指数和车速趋势
- 城市分布:各地州市交通状况地图
2. 多维分析(Analysis)
提供丰富的交通数据分析图表:
| 图表类型 | 功能说明 |
|---|---|
| 趋势分析 | 按时间粒度(小时/日/月)展示交通变化趋势 |
| 地图分布 | 贵州省各地州市交通状况热力图 |
| 道路排名 | 按拥堵指数/车速排序的道路列表 |
| 影响因素 | 天气、特殊事件、交通管制对交通的影响 |
| 热力矩阵 | 星期×小时的拥堵指数分布 |
| 道路状态 | 不同道路状态的分布饼图 |
| 工作日/周末 | 工作日与周末交通对比 |
| 散点分析 | 城市交通拥堵与速度相关性 |
| 事件影响 | 节假日/大型活动对交通的影响 |
| 时段风险 | 各时段风险等级分析 |
3. 智能预测(Prediction)
基于历史数据训练的机器学习模型,预测未来 24 小时交通状况:
- 预测模型:RandomForest 回归模型
- 预测指标:拥堵指数、交通速度
- 输出信息:预测值、置信区间、风险等级、建议
4. 数据检索(Records)
交通采样数据明细查询:
- 筛选条件:城市、道路、日期范围、天气、事件、管制
- 分页展示:每页 20 条记录
- 字段展示:采样时间、城市、道路、拥堵指数、车速、道路状态等
5. 公众留言板(Feedback)
收集用户反馈和建议:
- 留言表单:称呼、身份、城市、满意度、内容
- 留言列表:展示已审核的公众留言
- 审核机制:后台审核后才展示
6. 个人中心(Personal)
用户账户管理:
- 个人信息:查看/编辑邮箱、姓名
- 密码修改:修改登录密码
- 偏好设置:收藏常用道路、告警阈值
7. 留言管理(后台)
Django Admin 后台管理公众留言:
- 留言列表:展示所有留言及审核状态
- 审核操作:设置留言是否显示
- 筛选查询:按身份、满意度、时间筛选
数据库设计
TrafficRecord(交通记录)
| 字段 | 类型 | 说明 |
|---|---|---|
| id | AutoField | 主键 |
| city | CharField(64) | 城市 |
| road | CharField(128) | 道路 |
| congestion_index | FloatField | 拥堵指数(0-20) |
| traffic_speed | FloatField | 交通速度 |
| road_status | CharField(128) | 道路状态 |
| status_code | PositiveSmallInteger | 状态码 |
| captured_at | DateTimeField | 获取时间 |
| capture_date | DateField | 采集日期 |
| capture_hour | PositiveSmallInteger | 采集小时(0-23) |
| weekday | PositiveSmallInteger | 星期(0-6) |
| is_weekend | BooleanField | 是否周末 |
| weather | CharField(32) | 天气状况 |
| special_event | CharField(32) | 特殊事件 |
| traffic_control | CharField(32) | 交通管制 |
| row_fingerprint | CharField(40) | 行指纹(唯一) |
| created_at | DateTimeField | 创建时间 |
索引:
(city, captured_at)(road, captured_at)(city, road, captured_at)
ImportJob(导入任务)
| 字段 | 类型 | 说明 |
|---|---|---|
| id | AutoField | 主键 |
| source_file | CharField(255) | 源文件 |
| checksum | CharField(64) | 文件校验码 |
| status | CharField(16) | 状态(running/completed/failed) |
| imported_rows | PositiveInteger | 导入行数 |
| skipped_rows | PositiveInteger | 跳过行数 |
| total_rows | PositiveInteger | 总行数 |
| error_message | TextField | 错误信息 |
| started_at | DateTimeField | 开始时间 |
| completed_at | DateTimeField | 完成时间 |
ModelArtifact(模型产物)
| 字段 | 类型 | 说明 |
|---|---|---|
| id | AutoField | 主键 |
| target | CharField(32) | 目标字段(congestion_index/traffic_speed) |
| model_path | CharField(255) | 模型文件路径 |
| metrics | JSONField | 评估指标(MAE/RMSE/R2) |
| sample_count | PositiveInteger | 训练样本数 |
| trained_at | DateTimeField | 训练时间 |
| feature_columns | JSONField | 特征列 |
Feedback(公众留言)
| 字段 | 类型 | 说明 |
|---|---|---|
| id | AutoField | 主键 |
| visitor_name | CharField(64) | 留言者 |
| visitor_type | CharField(16) | 身份类型 |
| city | CharField(64) | 城市 |
| rating | PositiveSmallInteger | 满意度(1-5) |
| content | TextField(1000) | 反馈内容 |
| is_approved | BooleanField | 是否审核 |
| created_at | DateTimeField | 提交时间 |
数据字典
TrafficRecord 字段详解
| 字段名 | 数据类型 | 取值范围 | 计算方式 | 说明 |
|---|---|---|---|---|
| city | 字符串 | 贵州省9市州 | 原始采集 | 城市名称 |
| road | 字符串 | 各城市道路 | 原始采集 | 道路名称 |
| congestion_index | 浮点数 | 0.0 - 20.0 | 原始采集 | 拥堵指数,越高越拥堵 |
| traffic_speed | 浮点数 | 0.0 - 120.0 (km/h) | 原始采集 | 实时车速 |
| road_status | 字符串 | 畅通/缓行/拥堵/封闭 | 原始采集 | 道路通行状态 |
| status_code | 整数 | 1-4 | 映射 road_status | 状态码:1=畅通 2=缓行 3=拥堵 4=封闭 |
| captured_at | 日期时间 | - | 原始采集 | 数据采样时间 |
| capture_date | 日期 | - | extracted from captured_at | 采集日期(年月日) |
| capture_hour | 整数 | 0-23 | extracted from captured_at | 采集小时 |
| weekday | 整数 | 0-6 | extracted from captured_at | 星期:0=周一,6=周日 |
| is_weekend | 布尔 | True/False | computed from weekday | 是否周末(周六、周日) |
| weather | 字符串 | 晴/阴/雨/雪/雾等 | 原始采集 | 天气状况 |
| special_event | 字符串 | 无/节假日/大型活动/施工等 | 原始采集 | 特殊事件 |
| traffic_control | 字符串 | 无/限号/限行/管制等 | 原始采集 | 交通管制措施 |
| row_fingerprint | 字符串 | SHA1 哈希 | computed | 行数据唯一标识,用于去重 |
枚举值说明
天气状况 (weather):
晴、阴、多云、小雨、中雨、大雨、暴雨、雷阵雨、小雪、中雪、大雪、雾、霾、沙尘
特殊事件 (special_event):
无、节假日(元旦/春节/清明/五一/端午/中秋/国庆)、大型活动(数博会/酒博会/演唱会)、施工、交通事故
交通管制 (traffic_control):
无、限号通行、单双号限行、道路封闭、交通管制、绕行提示
道路状态 (road_status):
畅通、缓行、拥堵、封闭
API 接口文档
基础信息
- Base URL :
/api/v1/ - 认证方式 :Token 认证(
Authorization: Token <token>) - 公共接口:无需认证
- 受保护接口:需要携带有效 Token
接口列表
元数据
| 方法 | 路径 | 说明 | 认证 |
|---|---|---|---|
| GET | /meta/filters |
获取筛选选项(城市/道路/天气等) | 否 |
仪表盘
| 方法 | 路径 | 说明 | 认证 |
|---|---|---|---|
| GET | /dashboard/overview |
核心指标总览 | 否 |
分析模块
| 方法 | 路径 | 说明 | 认证 |
|---|---|---|---|
| GET | /analysis/trend |
趋势分析(小时/日/月) | 否 |
| GET | /analysis/map |
城市分布地图 | 否 |
| GET | /analysis/road-ranking |
道路排名 | 否 |
| GET | /analysis/impact |
影响因素分析 | 否 |
| GET | /analysis/heatmap |
热力矩阵 | 否 |
| GET | /analysis/road-status |
道路状态分布 | 否 |
| GET | /analysis/weekday-weekend |
工作日/周末对比 | 否 |
| GET | /analysis/scatter |
散点图分析 | 否 |
| GET | /analysis/event-impact |
事件影响分析 | 否 |
| GET | /analysis/hourly-risk |
时段风险分析 | 否 |
数据记录
| 方法 | 路径 | 说明 | 认证 |
|---|---|---|---|
| GET | /records |
交通记录列表(分页) | 否 |
预测
| 方法 | 路径 | 说明 | 认证 |
|---|---|---|---|
| POST | /predictions/next-24h |
未来24小时预测 | 否 |
请求体:
json
{
"city": "贵阳市",
"road": "中华路",
"start_time": "2024-01-15T00:00:00",
"weather": "晴",
"special_event": "无",
"traffic_control": "无"
}
留言板
| 方法 | 路径 | 说明 | 认证 |
|---|---|---|---|
| GET | /feedback |
获取已审核留言列表 | 否 |
| POST | /feedback |
提交新留言 | 否 |
认证接口
| 方法 | 路径 | 说明 | 认证 |
|---|---|---|---|
| POST | /auth/login |
用户登录 | 否 |
| POST | /auth/register |
用户注册 | 否 |
| GET | /auth/me |
获取当前用户 | 是 |
| GET/PUT | /auth/profile |
获取/更新用户信息 | 是 |
| POST | /auth/change-password |
修改密码 | 是 |
查询参数
所有分析接口支持以下筛选参数:
| 参数 | 类型 | 说明 | 示例 |
|---|---|---|---|
| city | string | 城市(多个用逗号分隔) | city=贵阳市,遵义市 |
| road | string | 道路 | road=中华路 |
| date_from | ISO datetime | 开始时间 | date_from=2024-01-01 |
| date_to | ISO datetime | 结束时间 | date_to=2024-12-31 |
| weather | string | 天气 | weather=晴 |
| special_event | string | 特殊事件 | special_event=无 |
| traffic_control | string | 交通管制 | traffic_control=无 |
| road_status | string | 道路状态 | road_status=畅通 |
| status_code | int | 状态码 | status_code=1 |
响应格式
成功响应:
json
{
"count": 1000,
"num_pages": 50,
"page": 1,
"page_size": 20,
"results": [...]
}
指标响应:
json
{
"total_records": 100000,
"avg_congestion": 3.5,
"avg_speed": 35.2,
"latest_capture": "2024-12-31T23:00:00",
"abnormal_ratio": 2.5
}
认证系统
Token 认证流程
-
注册 :
POST /api/v1/auth/registerjson{ "username": "testuser", "email": "test@example.com", "password": "password123" } -
登录 :
POST /api/v1/auth/loginjson{ "username": "testuser", "password": "password123" }响应返回
token和user信息 -
请求受保护接口:
Authorization: Token 9f9a8b7c6d5e4f3a2b1c0d9e8f7a6b5c
用户权限
| 功能 | 受保护 |
|---|---|
| 查看总览/分析/预测 | 否 |
| 数据检索 | 否 |
| 提交留言 | 否 |
| 个人中心(编辑资料/改密码) | 是 |
| 后台管理 | 是(Admin) |
用户角色
系统支持两类用户角色:
| 角色 | 权限范围 | 说明 |
|---|---|---|
| 游客 | 浏览功能 | 无需登录,可查看所有公开数据和分析图表 |
| 注册用户 | 浏览 + 互动 | 可提交留言、编辑个人资料、修改密码 |
| 管理员 | 全部功能 | Django Admin 后台管理,数据导入导出,用户管理 |
系统架构
┌─────────────────────────────────────────────────────────────────┐
│ 用户层 (Client) │
│ ┌──────────┐ ┌──────────┐ ┌──────────┐ ┌──────────┐ │
│ │ 市民 │ │ 交管部门 │ │ 研究者 │ │ 媒体 │ │
│ └────┬─────┘ └────┬─────┘ └────┬─────┘ └────┬─────┘ │
└───────┼─────────────┼─────────────┼─────────────┼──────────────┘
│ │ │ │
▼ ▼ ▼ ▼
┌─────────────────────────────────────────────────────────────────┐
│ 前端展示层 (Vue 3 + ECharts) │
│ ┌──────────────────────────────────────────────────────────┐ │
│ │ Dashboard │ Analysis │ Prediction │ Records │ Feedback │ │
│ └──────────────────────────────────────────────────────────┘ │
│ │ │
│ Pinia 状态管理 │
└─────────────────────────┼───────────────────────────────────────┘
│ HTTP / REST API
▼
┌─────────────────────────────────────────────────────────────────┐
│ 后端服务层 (Django 5 + DRF) │
│ ┌──────────────┐ ┌──────────────┐ ┌──────────────┐ │
│ │ API Views │ │ Services │ │ ML Engine │ │
│ └──────────────┘ └──────────────┘ └──────────────┘ │
│ │ │ │ │
│ ┌──────┴─────────────────┴──────────────────┴──────┐ │
│ │ Django ORM + MySQL │ │
│ └───────────────────────────────────────────────────┘ │
└─────────────────────────┬───────────────────────────────────────┘
│
▼
┌─────────────────────────────────────────────────────────────────┐
│ 数据层 (MySQL 8) │
│ ┌──────────┐ ┌──────────┐ ┌──────────┐ ┌──────────┐ │
│ │ Traffic │ │ Import │ │ Model │ │Feedback │ │
│ │ Records │ │ Jobs │ │Artifact │ │ │ │
│ └──────────┘ └──────────┘ └──────────┘ └──────────┘ │
└─────────────────────────────────────────────────────────────────┘
前端页面结构
/ → DashboardView (总览仪表盘)
/analysis → AnalysisView (多维分析)
/prediction → PredictionView (智能预测)
/records → RecordsView (数据检索)
/feedback → FeedbackView (公众留言板)
/personal → PersonalView (个人中心)
/about → AboutView (关于系统)
/login → LoginView (登录注册)
页面功能详情
1. 总览仪表盘 (DashboardView)
| 区域 | 内容 | 数据来源 |
|---|---|---|
| 顶部筛选栏 | 城市/道路/日期范围筛选 | /api/v1/meta/filters |
| 指标卡片区 | 总记录数、平均拥堵指数、平均车速、异常比例 | /api/v1/dashboard/overview |
| 城市地图 | 贵州省热力图,按拥堵指数着色 | /api/v1/analysis/map |
| 趋势图表 | 24小时拥堵指数与车速双轴曲线 | /api/v1/analysis/trend |
| 道路排名 | 拥堵Top10道路柱状图 | /api/v1/analysis/road-ranking |
| 天气影响 | 天气因素对交通的影响 | /api/v1/analysis/impact |
| 信号面板 | 最堵城市、最堵道路、最近采样时间 | /api/v1/dashboard/overview |
2. 多维分析 (AnalysisView)
| 图表类型 | 说明 | API 端点 |
|---|---|---|
| 趋势分析 | 小时/日/月多粒度切换 | /api/v1/analysis/trend |
| 城市分布图 | GeoJSON 地图渲染 | /api/v1/analysis/map |
| 道路排名 | Top拥堵/低速道路 | /api/v1/analysis/road-ranking |
| 影响因素 | 天气/事件/管制三维分析 | /api/v1/analysis/impact |
| 热力矩阵 | 周×时拥堵分布 | /api/v1/analysis/heatmap |
| 道路状态 | 饼图展示状态分布 | /api/v1/analysis/road-status |
| 工作日/周末 | 对比分析曲线 | /api/v1/analysis/weekday-weekend |
| 散点分析 | 城市×拥堵相关性 | /api/v1/analysis/scatter |
| 事件影响 | 节假日/大型活动分析 | /api/v1/analysis/event-impact |
| 时段风险 | 24小时风险热力 | /api/v1/analysis/hourly-risk |
3. 智能预测 (PredictionView)
| 功能 | 说明 |
|---|---|
| 城市道路选择 | 选择预测目标城市和道路 |
| 时间设置 | 设置预测起始时间 |
| 天气事件 | 预设天气状况和特殊事件 |
| 24小时预测 | 输出每小时预测值 |
| 风险评估 | 四级风险等级评定 |
| 出行建议 | 基于预测的建议信息 |
预测系统
模型训练
使用 Django 命令训练模型:
bash
python manage.py train_traffic_models
训练配置:
- 算法:RandomForestRegressor
- 决策树数量:160
- 最大深度:18
- 最小叶节点样本:2
特征工程:
- 类别特征:城市、道路、天气、特殊事件、交通管制(OneHotEncoder)
- 数值特征:月份、星期、小时、是否周末
模型预测
当模型存在时使用模型预测,不存在时使用历史均值回退:
python
if congestion_bundle and speed_bundle:
# 使用模型预测
predicted_congestion = model.predict(sample)
else:
# 使用历史均值
predicted_congestion = historical_mean[hour]
风险等级
| 拥堵指数范围 | 风险等级 | 建议 |
|---|---|---|
| >= 8 | 高风险拥堵 | 建议避开高峰时段并提前规划路线 |
| >= 5 | 拥堵 | 通行压力较大,建议预留额外出行时间 |
| >= 2 | 轻度承压 | 车流开始增多,适合关注实时路况 |
| < 2 | 畅通 | 整体通行顺畅,可按计划出行 |
安装部署
环境要求
- Python 3.10+
- Node.js 18+
- MySQL 8.0+
- Windows/Linux/macOS
1. 克隆项目
bash
git clone <repository-url>
cd traffic
2. 配置虚拟环境
bash
# 创建虚拟环境
python -m venv .venv
# 激活虚拟环境
# Windows:
.venv\Scripts\activate
# Linux/macOS:
source .venv/bin/activate
# 安装 Python 依赖
pip install -r backend/requirements.txt
3. 配置数据库
编辑 backend/.env 文件:
env
DB_NAME=traffic_db
DB_USER=root
DB_PASSWORD=your_password
DB_HOST=127.0.0.1
DB_PORT=3306
SECRET_KEY=your-secret-key
DEBUG=True
ALLOWED_HOSTS=127.0.0.1,localhost
VITE_API_BASE_URL=http://127.0.0.1:8000/api/v1
或直接执行 SQL 初始化:
bash
mysql -uroot -p < scripts/init_mysql.sql
4. 执行数据库迁移
bash
python backend/manage.py migrate
5. 创建管理员账户
bash
python backend/manage.py createsuperuser
6. 导入交通数据(可选)
bash
python backend/manage.py import_traffic_csv data/交通流量数据.csv
支持重复执行,幂等导入(通过行指纹去重)
7. 训练预测模型(可选)
bash
python backend/manage.py train_traffic_models
训练完成后模型保存在
backend/trained_models/目录
8. 启动后端服务
bash
python backend/manage.py runserver 0.0.0.0:8000
9. 启动前端服务
bash
cd frontend
npm install
npm run dev
10. 生产环境构建
bash
cd frontend
npm run build
构建产物在 frontend/dist/ 目录
使用指南
筛选数据
在总览页和分析页,使用顶部筛选栏筛选数据:
- 选择城市(可多选)
- 选择道路(根据城市联动)
- 选择日期范围
- 点击查询按钮
查看道路详情
在道路排名中,点击具体道路可查看:
- 该道路 24 小时拥堵/车速趋势
- 与全市/全局均值对比
提交留言
- 进入留言板页面
- 填写称呼、身份、城市
- 选择满意度星级
- 输入留言内容
- 点击提交
留言需后台审核后才展示
修改个人信息
- 进入个人中心
- 点击"编辑资料"修改邮箱/姓名
- 点击"修改密码"更改密码
后台数据管理
- 登录后台(/admin)
- 交通记录:查看/筛选已导入数据
- 导入任务:查看数据导入历史和状态
- 模型产物:查看已训练模型和评估指标
- 公众反馈:审核留言
环境变量说明
| 变量 | 说明 | 默认值 |
|---|---|---|
DB_NAME |
数据库名 | traffic_db |
DB_USER |
数据库用户 | root |
DB_PASSWORD |
数据库密码 | - |
DB_HOST |
数据库主机 | 127.0.0.1 |
DB_PORT |
数据库端口 | 3306 |
SECRET_KEY |
Django 密钥 | - |
DEBUG |
调试模式 | True |
ALLOWED_HOSTS |
允许的域名 | localhost,127.0.0.1 |
VITE_API_BASE_URL |
API 基础地址 | /api/v1 |
错误处理
状态码说明
| 状态码 | 说明 |
|---|---|
| 200 | 请求成功 |
| 201 | 创建成功(如注册、提交留言) |
| 400 | 请求参数错误 |
| 401 | 未认证或 Token 无效 |
| 403 | 无权限访问 |
| 404 | 资源不存在 |
| 429 | 请求过于频繁(限流) |
| 500 | 服务器内部错误 |
后端异常处理
Django REST Framework 自动处理以下异常:
python
# 认证失败
AuthenticationFailed: 401 + {"detail": "身份验证凭证未提供。"}
# 权限不足
PermissionDenied: 403 + {"detail": "您没有执行此操作的权限。"}
# 未找到
NotFound: 404 + {"detail": "未找到。"}
前端错误提示
| 错误信息 | 原因 | 解决方案 |
|---|---|---|
服务器响应格式错误 |
API 返回非 JSON 或认证问题 | 检查后端日志,确认 Token 有效 |
Network Error |
后端未启动或 CORS 配置 | 确认后端运行中,检查 ALLOWED_HOSTS |
401 |
Token 过期或无效 | 重新登录获取新 Token |
性能优化
后端优化
- 数据库索引 :
city + captured_at、road + captured_at复合索引 - 查询缓存:热门分析结果可考虑 Redis 缓存
- 分页查询:records 接口默认每页 20 条,避免全表扫描
- 模型加载 :
train_models使用joblib高效序列化
前端优化
- ECharts 配置:关闭动画、大数据采样、懒加载
- 路由懒加载 :非首页组件使用
defineAsyncComponent - 状态管理 :使用
storeToRefs保持响应性 - 地图渲染:GeoJSON 简化层级,减少包体积
数据导入优化
- 批量导入使用
bulk_create提升性能 - 通过
row_fingerprint去重避免重复导入 - 大文件导入建议分段执行
开发指南
- 在
services.py添加新的业务逻辑函数 - 在
views.py添加视图函数 - 在
urls.py添加路由 - 在前端
api.js添加请求函数
添加新的图表
- 在
views/AnalysisView.vue添加图表配置 - 在
stores/traffic.js添加状态数据 - 使用
BaseChart.vue组件渲染图表
自定义样式
- 全局样式:
frontend/src/style.css - 组件样式:在各
.vue文件的<style scoped>中编写 - CSS 变量:在
style.css顶部查看可用变量
常见问题
Q: 预测接口返回 historical_mean 而不是 model?
A: 模型未训练。请执行 python manage.py train_traffic_models
Q: 留言提交后不显示?
A: 留言需要后台审核。在 /admin 中找到 Feedback,设置 is_approved = True
Q: 城市/道路筛选下拉为空?
A: 数据未导入或导入任务未完成。请先执行 python manage.py import_traffic_csv
Q: 图表不显示数据?
A: 检查筛选条件是否过严,或数据是否在筛选的时间范围内
Q: 登录失败提示 "服务器响应格式错误"?
A: 检查后端 API 是否正常运行,确保 Token 认证配置正确
Q: 修改密码成功但没有提示?
A: 这是预期行为。修改成功后页面会自动跳转,请注意页面变化
贡献指南
提交问题
- 标题简洁明了,描述问题或功能需求
- 附上复现步骤(日志、截图、步骤说明)
- 标注问题类型:Bug / Feature / Question
开发流程
- Fork 本仓库
- 创建特性分支:
git checkout -b feature/your-feature - 提交更改:
git commit -m 'Add some feature' - 推送到分支:
git push origin feature/your-feature - 创建 Pull Request
代码规范
- Python:遵循 PEP 8,使用 Black 格式化
- JavaScript/Vue:遵循 ESLint 配置
- Git 提交信息:使用中文,格式
[类型] 描述
提交类型:
| 类型 | 说明 |
|---|---|
feat |
新功能 |
fix |
Bug 修复 |
docs |
文档更新 |
style |
代码格式(不影响功能) |
refactor |
重构 |
perf |
性能优化 |
test |
测试相关 |
chore |
构建/工具变更 |
术语表 (Glossary)
| 术语 | 英文 | 说明 |
|---|---|---|
| 拥堵指数 | Congestion Index | 表征道路拥堵程度的指标,数值越高越拥堵,范围 0-20 |
| 交通速度 | Traffic Speed | 车辆平均通行速度,单位 km/h |
| 道路状态 | Road Status | 道路通行状态:畅通、缓行、拥堵、封闭 |
| 批量导入 | Batch Import | 通过 CSV 文件批量导入历史交通数据 |
| 行指纹 | Row Fingerprint | 基于数据内容生成的唯一哈希值,用于数据去重 |
| 模型产物 | Model Artifact | 训练好的机器学习模型文件 |
| Token 认证 | Token Authentication | 基于 Token 的用户身份验证机制 |
| GeoJSON | GeoJSON | 地理信息数据格式,用于地图渲染 |
| ECharts | ECharts | 百度开源的可视化图表库 |
| RandomForest | Random Forest | 随机森林机器学习算法 |
路线图 (Roadmap)
v1.1.0 (计划中)
- 实时数据接入:支持 WebSocket 实时推送
- 移动端适配:响应式布局优化,支持手机端访问
- 数据导出:支持 Excel/CSV 格式导出分析报告
- 消息订阅:邮件/短信订阅拥堵预警
v1.2.0 (计划中)
- 多城市扩展:支持贵州省外其他省份数据接入
- 道路预测:预测特定道路未来拥堵趋势
- API 开放:对外开放 API 供第三方应用调用
- 多语言支持:中英文界面切换
v2.0.0 (远期规划)
- 深度学习模型:引入 LSTM/Transformer 时序预测
- 知识图谱:构建道路网络知识图谱
- 数字孪生:道路通行状态实时数字孪生
- 智能调度:AI 辅助交通信号灯优化建议
参与单位
| 单位类型 | 说明 |
|---|---|
| 主管部门 | 贵州省交通运输局 |
| 数据来源 | 贵州省公安交通管理局 |
| 技术支持 | 贵州省大数据发展管理局 |
| 运维单位 | 贵州省信息中心 |
附录
A. 快速启动命令汇总
bash
# 1. 环境搭建
python -m venv .venv && source .venv/bin/activate # Linux/macOS
.venv\Scripts\activate # Windows
pip install -r backend/requirements.txt
npm install # frontend
# 2. 数据库初始化
python backend/manage.py migrate
python backend/manage.py createsuperuser
# 3. 数据导入
python backend/manage.py import_traffic_csv data/交通流量数据.csv
# 4. 模型训练
python backend/manage.py train_traffic_models
# 5. 启动服务
python backend/manage.py runserver 0.0.0.0:8000 # 后端
cd frontend && npm run dev # 前端
B. 目录结构详解
traffic/
├── backend/
│ ├── config/
│ │ ├── __init__.py
│ │ ├── settings.py # Django 配置(含数据库/认证/CORS)
│ │ ├── urls.py # 根路由(/admin/, /api/v1/)
│ │ ├── wsgi.py # WSGI 入口
│ │ └── asgi.py # ASGI 入口(可选)
│ ├── traffic/ # 主应用
│ │ ├── __init__.py
│ │ ├── models.py # 数据模型(4张表)
│ │ ├── views.py # API 视图(17个端点)
│ │ ├── serializers.py # DRF 序列化器
│ │ ├── services.py # 业务逻辑层(聚合查询)
│ │ ├── urls.py # 应用路由
│ │ ├── admin.py # SimpleUI 后台配置
│ │ ├── apps.py # 应用配置
│ │ └── ml.py # 机器学习预测模块
│ ├── trained_models/ # 模型文件存储
│ │ ├── congestion_model.joblib
│ │ └── speed_model.joblib
│ └── requirements.txt # Python 依赖
├── frontend/
│ ├── public/
│ │ ├── favicon.svg # 网站图标
│ │ └── guizhou.json # GeoJSON 地图数据
│ ├── src/
│ │ ├── App.vue # 根组件(含路由视图)
│ │ ├── main.js # 入口(挂载/路由/Pinia)
│ │ ├── router/index.js # 路由配置(8个页面)
│ │ ├── stores/ # Pinia 状态管理
│ │ │ ├── traffic.js # 交通数据状态
│ │ │ └── user.js # 用户认证状态
│ │ ├── views/ # 页面组件(8个)
│ │ ├── components/ # 公共组件(3个)
│ │ ├── lib/ # 工具库
│ │ │ ├── api.js # Axios 封装
│ │ │ ├── echarts.js # ECharts 主题
│ │ │ └── maps.js # 地图初始化
│ │ ├── utils/format.js # 格式化函数
│ │ └── style.css # 全局样式变量
│ ├── package.json # 前端依赖
│ └── vite.config.js # Vite 构建配置
└── data/ # CSV 数据文件
C. 第三方库依赖
Python 依赖 (backend/requirements.txt):
| 库名 | 版本 | 用途 |
|---|---|---|
| Django | 5.x | Web 框架 |
| djangorestframework | 3.15.x | REST API |
| django-rest-framework-simplejwt | 5.x | JWT 认证(可选) |
| mysqlclient | 2.x | MySQL 驱动 |
| pandas | 2.x | 数据处理 |
| scikit-learn | 1.5.x | 机器学习 |
| joblib | 1.4.x | 模型序列化 |
| python-dotenv | 1.x | 环境变量 |
| django-cors-headers | 4.x | CORS 支持 |
| simpleui | 2024.x | Admin 主题 |
| django-simpleui | 2024.x | Admin 主题 |
JavaScript 依赖 (frontend/package.json):
| 库名 | 版本 | 用途 |
|---|---|---|
| vue | 3.5.x | 框架 |
| vue-router | 5.x | 路由 |
| pinia | 3.x | 状态管理 |
| echarts | 6.x | 图表 |
| axios | 1.x | HTTP |
| @vueuse/core | 11.x | 工具函数 |
| sass | 1.x | CSS 预处理器 |
更新日志
v1.0.0 (2024-12)
新增功能:
- 总览仪表盘:核心指标卡片、拥堵 TOP 排名、24 小时趋势图
- 多维分析:趋势分析、地图分布、道路排名、影响因素、热力矩阵
- 智能预测:基于 RandomForest 的 24 小时交通预测
- 数据检索:多条件筛选、分页展示
- 公众留言板:匿名留言、后台审核
- 个人中心:资料编辑、密码修改
- 用户认证:Token 登录注册
技术特性:
- Django 5 + DRF REST API
- Vue 3 + Pinia 状态管理
- ECharts 可视化图表
- GeoJSON 贵州地图渲染
- RandomForest 机器学习预测
- SimpleUI 后台管理
已知问题:
- 暂无
License
MIT License
联系方式
- 项目主页:https://github.com/your-repo/traffic
- 问题反馈:https://github.com/your-repo/traffic/issues
- 技术支持:support@example.com