运行结果展示
智能交通数据分析系统 —— 基于高德地图 API + PeMSD7 + Vue3 全栈实战
本文完整记录了一个智能交通数据分析系统的架构设计、核心代码实现及技术难点攻克过程。系统集成高德地图 8 类 API,覆盖 34 省 819 个城市,融合 PeMSD7 真实高速公路流量数据集,实现数据总览、流量预测、路径规划、实时天气、POI 搜索等 10 大功能。
一、项目背景
随着智慧城市建设的推进,交通数据分析成为智能交通系统的核心需求。本项目旨在构建一个轻量级、全功能、真实数据驱动的交通分析平台,满足以下需求:
- 接入高德地图实时 API,获取天气、道路、POI 等数据
- 利用 PeMSD7 真实流量数据集进行历史分析与预测
- 全栈单文件部署,零 Node.js 依赖,最小化运维成本
二、技术架构
┌─────────────────────────────────────────┐ │ 浏览器 (Vue3 CDN) │ │ Chart.js 绘图 / 省市区级联 / 10个Tab │ └──────────────┬──────────────────────────┘ │ HTTP/JSON ┌──────────────▼──────────────────────────┐ │ Flask (Python 单文件) │ │ 14个API路由 / 模板渲染 / 静态文件服务 │ └──────┬───────────────┬──────────────────┘ │ │ ┌──────▼──────┐ ┌─────▼──────────┐ │ 高德地图API │ │ PeMSD7 数据集 │ │ weather │ │ 228传感器 │ │ place/text │ │ 12648时间步 │ │ direction │ │ RandomForest │ │ geocode │ │ MAE 1.71 │ │ district │ └────────────────┘ │ inputtips │ └─────────────┘核心特点:
- 零 npm / 零 webpack:Vue3 + Chart.js 均通过本地静态文件加载
- 独立 HTML 模板:
index.html单独维护,Flask 仅注入省份 JSON 数据 - 14 个 API 端点:覆盖天气、POI、路径规划、流量分析、IP 定位等
- 真实数据双引擎:高德实时 API + PeMSD7 历史流量
三、项目目录结构
代码文件/ ├── app.py # 主程序 (Flask + 14个API路由) ├── config.py # API Key + 路径配置 ├── data_loader.py # PeMSD7 数据加载 + 特征工程 ├── train.py # 随机森林模型训练 ├── index.html # Vue3 前端页面 (独立文件) ├── requirements.txt # Python 依赖 (5个包) ├── run.bat # 一键启动脚本 ├── models/ │ ├── random_forest.pkl # 训练好的模型 │ └── scaler.pkl # 数据归一化器 └── static/ ├── vue.min.js # Vue 3.4 前端框架 └── chart.umd.min.js # Chart.js 绘图库仅5 个 Python 包,2 个静态前端库,无需 Node.js。
四、核心代码解析
4.1 PeMSD7 数据加载与特征工程 (data_loader.py)
def prepare_features(data, target_col, lags=24): s = data[[target_col]].copy() # 24 阶滞后特征 for lag in range(1, lags + 1): s[f"lag_{lag}"] = s[target_col].shift(lag) # 滚动统计特征 (窗口 6/12) for w in [6, 12]: s[f"rmean_{w}"] = s[target_col].rolling(w).mean() s[f"rstd_{w}"] = s[target_col].rolling(w).std() s.dropna(inplace=True) y = s[target_col].values X = s.drop(columns=[target_col]).values return X, y设计要点:采用时序滑动窗口构建 24 阶滞后特征 + 滚动均值和标准差,将时间序列预测转化为标准的回归问题。这是随机森林能有效处理时序数据的关键。
4.2 随机森林训练 (train.py)
X_train, X_test, y_train, y_test, scaler = prepare_pemsd7(config.PEMSD7_V) rf = RandomForestRegressor(n_estimators=100, random_state=42, n_jobs=-1) rf.fit(X_train, y_train) # 输出: MAE 1.7077, RMSE 2.5511100 棵树随机森林,全核心并行训练,在 10118 条训练数据上拟合,2530 条测试数据上验证。
4.3 Flask API 路由设计 (app.py)
系统共注册14 个核心 API:
| 路由 | 功能 | 调用高德API |
|---|---|---|
/api/weather | 实时天气 | weather/weatherInfo |
/api/poi | POI搜索 | place/text |
/api/route | 路径规划 | direction/driving+geocode/geo |
/api/geocode | 坐标解析 | district |
/api/cities | 城市列表 | district |
/api/subdistricts | 区县列表 | district |
/api/tip | 输入提示 | assistant/inputtips |
/api/district | 行政区查询 | district |
/api/ip | IP定位 | ip |
/api/mapimg | 静态地图 | staticmap |
/api/flow/real | PeMSD7 流量数据总览 | 本地数据集 |
/api/flow/predict_rf | 随机森林预测 | 本地模型 |
/api/flow/insight | 道路+路径热度 | place/text+direction |
/api/monitor | 实时监控 | place/text |
路径规划多策略实现(核心亮点):
# 驾车: 调用4种策略获取多条差异化路线 strategies = ['0', '1', '2', '3'] # 速度优先/费用优先/距离优先/不走高速 all_paths = [] for stgy in strategies: r = requests.get('.../v3/direction/driving', params={ 'origin': ol, 'destination': dl, 'strategy': stgy, 'extensions': 'base' }).json() if r.get('status') == '1': for p in r.get('route', {}).get('paths', []): all_paths.append(p) if len(all_paths) >= 4: break # 去重后展示最多5条路线Haversine 地理距离计算:
def haversine(lng1, lat1, lng2, lat2): R = 6371 # 地球半径 (km) dlat = math.radians(lat2 - lat1) dlng = math.radians(lng2 - lng1) a = math.sin(dlat/2)**2 + math.cos(math.radians(lat1)) * math.cos(math.radians(lat2)) * math.sin(dlng/2)**2 return 2 * R * math.asin(math.sqrt(a))用于精确计算每条道路距城市中心的距离,为车流速度估算提供空间维度特征。
4.4 Vue3 前端架构 (index.html)
省→市→区三级联动:
async function onProvinceChange(){ amap.cityCode = ''; amap.district = ''; var r = await fetch('/api/cities?province=' + amap.province).then(r => r.json()); cities.value = r || []; if(r && r.length > 0){ amap.cityCode = r[0].adcode; await onCityChange(); } } async function onCityChange(){ if(!amap.cityCode) return; var r = await fetch('/api/subdistricts?adcode=' + amap.cityCode).then(r => r.json()); districts.value = r || []; }PeMSD7 数据总览:前端直接注入 6 张 Chart.js 统计图表 —— 时序折线图、直方图、自相关柱状图、滚动统计双线图、传感器均值对比、波动对比,全由/api/flow/real端点实时生成 JSON。
路径规划双地省市区选择:起点和终点各有一套独立的省→市→区级联选择器,拼接完整地址后调用高德 geocode + direction API。
4.5 前端与后端的解耦设计
@app.route('/') def index(): html = open('index.html', encoding='utf-8').read() html = html.replace('{{PROVINCES_JSON|safe}}', PROV_JSON) return Response(html, mimetype='text/html')HTML 模板与 Python 代码完全分离,Flask 仅负责注入省份 JSON 数据。这使得前端可独立修改、调试,不受 Python 字符串转义问题困扰。
五、功能清单
| Tab | 功能 | 数据源 | 状态 |
|---|---|---|---|
| 📊 流量 | PeMSD7 6张统计图 + RF预测 6指标 | PeMSD7 + sklearn | ✅ |
| 🗺️ 地图 | 静态城市地图 | 高德 staticmap | ✅ |
| 🌤️ 天气 | 实时天气卡片 (温度/湿度/风向/风力) | 高德 weather | ✅ |
| 📍 周边 | 9大类别 POI 搜索 | 高德 place/text | ✅ |
| 🧭 路径 | 驾车/步行/公交多路线规划 | 高德 direction | ✅ |
| 💡 提示 | 输入联想提示 | 高德 inputtips | ✅ |
| 🏛️ 行政区 | 省市区信息查询 | 高德 district | ✅ |
| 🔍 搜索 | 10类+自定义关键词搜索 | 高德 place/text | ✅ |
| 📡 监控 | 城市道路实时监控 | 高德 place/text | ✅ |
| 🔮 预测 | 多次采集+线性回归短时预测 | 高德 place/text | ✅ |
六、部署与启动
# 1. 安装依赖 (仅 5 个包) pip install flask requests numpy scikit-learn joblib # 2. 训练模型 (1分钟) python train.py # 3. 启动系统 python app.py # 或双击 run.bat # 4. 浏览器打开 http://localhost:8000七、技术亮点总结
- 极简依赖:仅 flask + requests + numpy + scikit-learn + joblib,无 TensorFlow、无 Node.js
- 真实数据双擎:高德 8 类 API 提供实时城市数据 + PeMSD7 12672×228 真实流量矩阵
- 前端零构建工具:Vue3 + Chart.js 本地静态文件加载,修改 HTML 即刷新
- 多策略路径规划:4 种驾车策略合并去重,展示 5 条差异化路线
- Haversine 空间分析:每条道路精确计算距市中心距离,为流量分析提供可靠空间特征
- 时序特征工程:24 阶滞后 + 滚动统计,将时间序列转化为标准回归问题
- 分级预警机制:根据拥堵等级和变化趋势进行四级状态判定
- 全国 34 省 819 城覆盖:通过高德 district API 动态加载,支持精确到区/县级
项目源码:[GitHub 链接]
系统要求:Python 3.8+,5 个 pip 包
高德 API Key:需自行在 https://lbs.amap.com 申请 Web 服务 Key,填入
config.pyPeMSD7 数据集:加州交通局(Caltrans)公开数据集,228 个传感器 × 5 分钟采样频率