Files
elderly-heat-warning/thesis/chapters/ch5-system.tex
T

136 lines
6.8 KiB
TeX
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
\chapter{预警可视化大屏系统}
本章介绍基于Flask后端和ECharts前端的Web可视化大屏系统的设计、架构和实现。
\section{系统需求分析}
\subsection{功能需求}
高温健康风险预警可视化系统面向政府管理者、社区工作者和公众三类用户,核心功能需求包括:
\begin{enumerate}
\item \textbf{实时温度与风险展示}:以图表形式展示当前及未来数日的温度变化趋势和风险等级预测
\item \textbf{多时间尺度覆盖}:同时呈现短期(3天)、中期(7天)和长期(30天)三个时间尺度的预警信息
\item \textbf{人口脆弱性概览}:展示老年人口比例和暴露-反应关系,辅助风险评估
\item \textbf{历史数据回溯}:支持查看过去90天的温度、体感温度和风险等级历史记录
\item \textbf{年度统计摘要}:提供各年份的高温天数、平均温度等汇总统计
\end{enumerate}
\subsection{非功能需求}
\begin{itemize}
\item 深色科技蓝风格,符合数据大屏的视觉规范
\item 页面首次加载时间不超过3秒
\item 支持1920×1080及以上分辨率显示
\item 自动刷新数据(30分钟周期),确保大屏长时间运行时信息不过时
\item 模型不可用时自动降级为默认预测,保证系统可用性
\end{itemize}
\section{系统架构设计}
系统采用经典的B/SBrowser/Server)架构,前后端分离:
\begin{itemize}
\item \textbf{后端(Python Flask):}负责数据查询、模型推理(LSTM/XGBoost)、JSON响应封装。启动时延迟加载模型文件,减少初始内存占用
\item \textbf{前端(HTML5 + CSS3 + JavaScript):}单页架构,使用ECharts 5.5进行图表渲染,通过fetch API异步请求后端数据
\item \textbf{数据流:}前端定时请求 → Flask路由分发 → 模型推理/数据查询 → JSON序列化 → 前端ECharts渲染
\end{itemize}
系统部署于开发服务器(Flask内置Werkzeug),监听所有网络接口(0.0.0.0:5005),支持局域网内多设备访问。
\section{后端API设计}
Flask后端提供4个核心RESTful API端点:
\subsection{预测接口 GET /api/predict}
返回三个时间尺度的风险预测结果。响应JSON结构包含:
\begin{itemize}
\item \texttt{city}:当前预测城市(焦作/郑州)
\item \texttt{date}:预测基准日期
\item \texttt{predictions}:包含\texttt{short}\texttt{medium}\texttt{long}三个子对象
\item 每个子对象包含:\texttt{level}(风险等级0-3)、\texttt{label}(中文标签)、\texttt{probabilities}4维概率向量)、\texttt{confidence}(置信度0-1)、\texttt{suggestions}(防护建议字符串列表)、\texttt{color}CSS颜色码)
\item \texttt{risk\_population}:估算的风险暴露老年人口数
\end{itemize}
当模型文件不可用时,接口返回基于均匀概率的fallback默认预测。
\subsection{历史接口 GET /api/history}
返回JSON数组,包含最近90天每日的温度、体感温度、风险等级和热浪标识,供前端趋势图表使用。
\subsection{统计接口 GET /api/stats}
返回年度汇总JSON,包含各年份平均温度数组、热浪天数数组、最高温度数组,以及焦作(12.8\%)和郑州(11.6\%)的固定老龄化率。
\subsection{主页 GET /}
返回包含完整前端代码的HTML页面(单文件架构)。
\section{前端可视化面板}
前端为单HTML文件,使用CSS Grid定义响应式布局,包含六个功能面板:
\subsection{面板1:温度变化趋势}
双Y轴折线图,蓝色线表示日均气温(temp\_mean)、橙色线表示体感温度(heat\_index)。背景标注三条水平阈值线:绿色虚线(32°C,中风险阈值)、黄色虚线(35°C,高风险阈值)、红色虚线(38°C,严重风险阈值)。X轴为日期,时间跨度90天,底部支持dataZoom缩放。
\subsection{面板2:多时间尺度风险展示}
三个并列卡片,分别展示短期(3天)、中期(7天)和长期(30天)的风险预测结果。每个卡片包含风险等级大字号中文标签(低风险/中风险/高风险/严重风险)、对应颜色圆点、置信度进度条和具体防护建议。
\subsection{面板3:老年人口结构}
饼图展示焦作市和郑州市的65岁及以上人口与65岁以下人口的比例,中心文本显示「65岁及以上:XX\%」。数据来源第七次全国人口普查(2020年)。
\subsection{面板4:预警时间线}
堆叠柱状图,X轴为月份(1-12月),Y轴为天数,不同颜色堆叠表示各风险等级。直观展示夏季(6-8月)高风险天数集中爆发的季节性特征。
\subsection{面板5:暴露-反应曲线}
折线图展示基于Chen等(2018)文献构建的温度-相对风险(RR)暴露-反应曲线,X轴为日平均温度(°C),Y轴为相对风险。标注最适温度(MMT)参考线(RR=1.0),以及95\%置信区间的上下界。
\subsection{面板6:历史数据表格}
近7天的每日明细表格,列包括日期、平均温度(°C)、体感温度(°C)、风险等级、热浪标识。支持垂直滚动。
\section{前端技术实现}
\subsection{配色方案}
深色科技蓝主题:
\begin{itemize}
\item 页面背景:\texttt{\#0a1632}(深蓝黑)
\item 面板背景:\texttt{rgba(255, 255, 255, 0.05)}(半透明白色毛玻璃)
\item 边框:\texttt{rgba(0, 212, 255, 0.15)}(青色低透明度)
\item 图表强调色:青色\texttt{\#00d4ff}、蓝色\texttt{\#1e90ff}、金色\texttt{\#ffd700}
\item 风险配色:绿色(低)、黄色(中)、橙色(高)、红色(严重)
\end{itemize}
\subsection{CSS Grid布局}
使用CSS Grid定义6个面板区域:
\begin{verbatim}
grid-template-areas:
"temp trend temp risk pop stats"
"temp history temp timeline curve table"
\end{verbatim}
每个面板使用\texttt{backdrop-filter: blur(10px)}实现背景毛玻璃效果,\texttt{border-radius: 8px}圆角边框,\texttt{padding: 16px}内边距。
\subsection{ECharts初始化}
所有6个图表通过\texttt{echarts.init()}独立初始化,使用\texttt{option}配置对象的JSON声明式语法进行渲染。全局设置dark背景主题和统一的\texttt{textStyle.color: '\#e0e6ed'}浅色文本。
\section{系统运行}
启动命令:
\begin{verbatim}
python -m src.web.app
\end{verbatim}
启动后在浏览器访问\texttt{http://localhost:5005}即可查看大屏。开发模式(debug=True)支持代码热更新。生产环境建议使用Gunicorn或Waitress作为WSGI服务器。
系统当前为原型版本,使用开发服务器运行。未来可扩展方向包括:接入实时气象数据流、增加预警信息自动推送(邮件/短信)、支持多城市切换、添加用户认证和操作日志。