329-基于Python的交通流量数据可视化分析系统

基于 Python 的交通流量数据可视化分析系统

贵州省交通流量可视化分析平台,面向交通管理部门的态势展示与预测分析系统。

目录


项目概述

本系统是面向贵州省交通管理部门的交通态势展示与预测分析平台,基于全年交通流量采样数据,实现对全省核心路网的多维度分析和智能预测。

项目演示



























背景与目标

贵州省作为我国西南地区重要的交通枢纽,近年来机动车保有量持续增长,交通管理面临越来越大的压力。本系统旨在:

  • 数据驱动决策:为交通管理部门提供科学、客观的数据决策依据
  • 公众服务:为市民出行提供数据参考,优化出行体验
  • 城市规划:为城市规划提供客观的交通运行评价指标
  • 预测预警:提前预判交通态势,辅助应急响应调度

数据规格

规格项 说明
数据范围 贵州省 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 认证流程

  1. 注册POST /api/v1/auth/register

    json 复制代码
    {
      "username": "testuser",
      "email": "test@example.com",
      "password": "password123"
    }
  2. 登录POST /api/v1/auth/login

    json 复制代码
    {
      "username": "testuser",
      "password": "password123"
    }

    响应返回 tokenuser 信息

  3. 请求受保护接口

    复制代码
    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/ 目录


使用指南

筛选数据

在总览页和分析页,使用顶部筛选栏筛选数据:

  1. 选择城市(可多选)
  2. 选择道路(根据城市联动)
  3. 选择日期范围
  4. 点击查询按钮

查看道路详情

在道路排名中,点击具体道路可查看:

  • 该道路 24 小时拥堵/车速趋势
  • 与全市/全局均值对比

提交留言

  1. 进入留言板页面
  2. 填写称呼、身份、城市
  3. 选择满意度星级
  4. 输入留言内容
  5. 点击提交

留言需后台审核后才展示

修改个人信息

  1. 进入个人中心
  2. 点击"编辑资料"修改邮箱/姓名
  3. 点击"修改密码"更改密码

后台数据管理

  1. 登录后台(/admin)
  2. 交通记录:查看/筛选已导入数据
  3. 导入任务:查看数据导入历史和状态
  4. 模型产物:查看已训练模型和评估指标
  5. 公众反馈:审核留言

环境变量说明

变量 说明 默认值
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_atroad + captured_at 复合索引
  • 查询缓存:热门分析结果可考虑 Redis 缓存
  • 分页查询:records 接口默认每页 20 条,避免全表扫描
  • 模型加载train_models 使用 joblib 高效序列化

前端优化

  • ECharts 配置:关闭动画、大数据采样、懒加载
  • 路由懒加载 :非首页组件使用 defineAsyncComponent
  • 状态管理 :使用 storeToRefs 保持响应性
  • 地图渲染:GeoJSON 简化层级,减少包体积

数据导入优化

  • 批量导入使用 bulk_create 提升性能
  • 通过 row_fingerprint 去重避免重复导入
  • 大文件导入建议分段执行

开发指南

  1. services.py 添加新的业务逻辑函数
  2. views.py 添加视图函数
  3. urls.py 添加路由
  4. 在前端 api.js 添加请求函数

添加新的图表

  1. views/AnalysisView.vue 添加图表配置
  2. stores/traffic.js 添加状态数据
  3. 使用 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

开发流程

  1. Fork 本仓库
  2. 创建特性分支:git checkout -b feature/your-feature
  3. 提交更改:git commit -m 'Add some feature'
  4. 推送到分支:git push origin feature/your-feature
  5. 创建 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

联系方式

相关推荐
yong99902 小时前
带挂载的四轴飞行器模型预测控制(MPC) MATLAB实现
开发语言·matlab
报错小能手2 小时前
ios开发方向——对于实习开发的app(Robopocket)讲解
开发语言·学习·ios·swift
wjs20242 小时前
Swift 方法
开发语言
计算机安禾2 小时前
【数据结构与算法】第18篇:数组的压缩存储:对称矩阵、三角矩阵与稀疏矩阵
c语言·开发语言·数据结构·c++·线性代数·算法·矩阵
华科易迅2 小时前
MybatisPlus乐观锁
java·开发语言·mybatis
阿提哈德2 小时前
患者病历归档流程流程图绘制指南
安全·信息可视化·架构·流程图·能源
Ujimatsu2 小时前
数据分析相关面试题-SQL部分
数据库·sql·数据分析
Omics Pro2 小时前
端到端单细胞空间组学数据分析
大数据·数据库·人工智能·算法·数据挖掘·数据分析·aigc
迈巴赫车主2 小时前
错位排序算法
开发语言·数据结构·算法·排序算法