基于Python+Django的全国气象数据可视化分析系统 毕业论文

毕业设计


一、项目名称:

基于Python+Django的全国气象数据可视化分析系统


【摘要】

全国地级行政区气象观测指标分散在外部接口与本地表格中,温度、湿度、辐射、风速、降水等字段口径不一,难以形成统一查询、筛选对比与可视化分析流程。本文设计并实现了基于 Python 与 Django 的全国气象数据可视化分析系统,面向教学与课题演示场景,将 NASA POWER 公开逐日数据清洗入库后,以交互式图表支撑多维气象要素分析与空间展示。

系统采用 B/S 架构,后端基于 Django 3.2,管理端集成 SimpleUI;数据库使用 MySQL(库名 weather_system),通过 mysqlclient / PyMySQL 驱动接入。前台基于 Bootstrap 与 NiceAdmin 模板、ECharts 完成可视化。业务数据以 WeatherData 为核心,城市坐标与区划信息由 CityInfo 辅助;爬虫脚本 spider/获取气象数据.py 内置全国约 333 个地级市经纬度,调用 NASA POWER 逐日点数据接口获取 T2M、RH2M、ALLSKY_SFC_SW_DWN、WS10M、PRECTOTCORR 等参数,结果写入 spider/气象数据.csv 并可经页面导入数据库。分析层基于 Django ORM 聚合与 WeatherDataAnalysis 封装,覆盖城市、温度、湿度、辐射、风力、降水、综合与季节等分析页;地图与热力图分别由 /map/、/analysis/heatmap/ 提供;对比、预警与趋势预测分别对应 /compare/、/warning/、/analysis/prediction/。趋势预测采用最近约 60 日历史序列上的 7 日窗口移动平均 与线性趋势外推,不是 LSTM 或深度学习模型。系统入口为 manage.py,默认运行端口 8030;前台登录路径为 /login/(账号 123456/123456,自建 user 表明文密码),后台为 /admin/(admin/admin123)。中间件 middleware.auth.AuthMiddleware 对未登录访问拦截,豁免 /login/、/register/、/admin/、/api/。模型层虽存在 WeatherFavorite,但现行 urls.py 未挂接收藏相关路由,论文不以可用收藏功能表述。系统无独立全屏数据大屏页面。

测试与运行结果表明,系统能够完成登录鉴权、气象列表筛选、多维图表分析、地图与热力图、对比预警与趋势外推、爬虫导入与 CSV/Excel 导出及 SimpleUI 后台维护等闭环,界面清晰、响应稳定,可为气象数据分析课题研究与教学演示提供可用的可视化分析支撑。

【关键词】 Django;气象数据;数据可视化;ECharts;NASA POWER

【Abstract】

Prefecture-level meteorological indicators are scattered across external APIs and local spreadsheets, making unified query, comparison and visualization difficult. This thesis designs and implements a Python- and Django-based national weather data visualization and analysis system for teaching and demonstration. Daily NASA POWER data are collected, cleaned and stored, then explored through interactive charts.

The system follows a B/S architecture. The backend is built with Django 3.2 and SimpleUI; MySQL database name is weather_system. The frontend adopts Bootstrap/NiceAdmin and ECharts. Core entity WeatherData stores city-day observations; CityInfo holds coordinates. The spider script spider/获取气象数据.py embeds about 333 prefecture-level city coordinates and calls NASA POWER daily point API. Analysis pages cover city, temperature, humidity, radiation, wind, precipitation, overview and seasonal views; map and heatmap are provided at /map/ and /analysis/heatmap/; compare, warning and prediction at /compare/, /warning/ and /analysis/prediction/. Trend prediction uses a 7-day moving average with linear trend extrapolation on recent history, not LSTM. Entry point is manage.py, default port 8030; frontend login /login/ (123456/123456), admin /admin/ (admin/admin123). AuthMiddleware exempts /login/, /register/, /admin/ and /api/. WeatherFavorite exists in models but is not wired in urls.py. There is no standalone fullscreen dashboard.

Results show that authentication, multi-dimensional analysis, map/heatmap, compare/warning/prediction, spider import, export and admin workflows work stably for course demos and research presentation.

【Keywords】 Django; Meteorological Data; Data Visualization; ECharts; NASA POWER


目 录

1 绪 论

2 关键技术

3 系统分析与设计

4 系统实现

5 系统测试

6 总结与展望

参考文献

致谢


1 绪 论

1.1 课题研究背景

气象观测数据是认识区域气候特征、支撑农业灌溉安排、能源资源评估与灾害风险提示的基础信息。公开数据源中,NASA POWER 提供覆盖全球网格点的逐日温度、湿度、太阳辐射、风速与降水等参数,可按经纬度拉取;而业务侧常见需求是把多城市、多日观测整理进统一库表,再以 Web 图表完成筛选、对比与空间展示。字段命名与缺失值处理口径不一致时,手工汇总成本高,也难以形成可复用的可视化分析流程。

在高校毕业设计与教学演示场景中,常见需求包括:一是需要一套可本地部署的系统,用统一库表承载全国约 333 个地级市样本的逐日气象记录;二是需要温度、湿度、辐射、风力、降水及季节等多维分析视图,辅以中国地图散点与热力矩阵;三是需要脚本化采集、CSV 落盘与页面导入闭环,形成「拉取—入库—分析—导出」流程。基于上述背景,本课题以 Django 为主框架,构建全国气象数据可视化分析系统:数据以 NASA POWER 公开接口为主,爬虫脚本负责采集,前台 NiceAdmin/Bootstrap 与 ECharts 负责展示,后台 SimpleUI 负责库表维护。系统默认端口 8030,不依赖独立全屏数据大屏;趋势预测采用可解释的移动平均与线性外推,便于答辩讲解算法边界。

1.2 课题研究的目的、意义

1.2.1 研究目的

本课题的主要目的包括:

  1. 建立以 WeatherData、CityInfo 与前台 User 为核心的数据模型,覆盖城市—日期唯一约束下的多要素观测字段,支撑统一查询与聚合。
  2. 实现前台会话登录、侧栏导航与多分析页展示,服务端口为 8030,登录路径 /login/,后台路径 /admin/。
  3. 基于 Django ORM 与 WeatherDataAnalysis 完成多维统计分析,前端通过 /api/chart/* 等接口驱动 ECharts 渲染。
  4. 通过 spider/获取气象数据.py 调用 NASA POWER,结合 /spider/ 页面完成状态查看、异步爬取与 CSV 导入;支持 CSV/Excel 导出。
  5. 输出可运行、可演示的完整系统,默认前台账号 123456/123456、后台 admin/admin123,便于验收与二次扩展。
1.2.2 研究意义

理论意义:将 Web 开发、气象公开数据接入与可视化方法结合到统一课题中,形成「采集脚本—ORM 模型—图表 API」的可复用范式,有助于理解点数据接口参数映射、缺失值清洗与描述性统计在教学场景中的适用边界。

实践意义:系统把全国约 333 个城市坐标、CSV 中间文件与 MySQL 持久化分层管理,降低手工处理成本;分析页按要素拆分路由,便于逐模块讲解;预警阈值与预测公式代码可读,便于核对结果。

社会意义:可视化结果有助于直观认识区域温度差异、降水强弱与季节变化结构,提升学生对公开气象数据可用性的认识。

经济意义:本地化部署与开源技术栈降低课题演示成本;模块化视图与路由设计便于后续替换数据源或扩展指标,减少重复开发投入。

1.3 课题的国内外研究现状和发展动态

1.3.1 国外研究现状

国外在再分析资料、卫星反演与开放气象 API 方面积累较早。NASA POWER 面向可再生能源与农业气象等社区提供全球网格点参数,支持按经纬度与日期区间拉取 JSON。可视化方面,ECharts、D3.js 等库被广泛用于交互式统计图与地理可视化。时间序列预测领域常见移动平均、ARIMA 与深度学习模型;本课题在教学场景下选用可解释的移动平均加线性趋势外推,避免把黑盒深度模型写成已实现功能。

1.3.2 国内研究现状

国内气象信息化与高校毕设中常见 Django + ECharts 的可视化系统,主题涵盖城市空气质量、降水统计与区域气候对比等。部分系统侧重大屏态势,部分侧重后台 CRUD。本课题更强调「六大功能模块 + 图表 API + NASA POWER 脚本采集 + SimpleUI 后台」,并以 MySQL 持久化气象观测,兼顾可解释统计与可复现部署;不单独实现全屏数据大屏路由。

1.3.3 发展趋势

未来气象数据分析将更强调多源融合、实时接入与可解释预测。可视化从静态报表走向可筛选、可下钻的交互分析;后端则更注重索引、分页与缓存。对本系统而言,后续可扩展国内实时接口或更精细网格,但仍应保持教学场景下结构清晰、部署简单的特点。

1.4 研究内容

本课题主要研究内容如下:

  1. 数据采集与入库:设计面向 NASA POWER 的爬虫脚本,内置约 333 城市坐标,支持命令行参数与页面异步触发,CSV 去重后批量写入 weather_data。
  2. 用户与权限:实现自建用户表注册登录、会话保持与中间件拦截;后台管理员与前台用户分离。
  3. 数据管理:实现气象列表分页、城市/日期/温度区间筛选、详情与历史趋势展示。
  4. 多维分析:实现城市、温度、湿度、辐射、风力、降水、综合、季节等分析页及对应图表 API。
  5. 空间与矩阵可视化:实现中国地图要素展示与城市—时间热力矩阵。
  6. 对比、预警与预测:实现多城市对比、阈值预警列表与移动平均趋势外推。
  7. 导出与后台:实现 CSV/Excel 导出与 SimpleUI 对用户、气象数据、城市信息的维护。

1.5 论文结构安排

第 1 章绪论,说明背景、目的意义、研究现状与研究内容。第 2 章介绍 Python、Django、MySQL、ECharts、NASA POWER 及相关技术特色。第 3 章给出系统架构、数据流、六大模块详细设计与数据库关系。第 4 章按模块说明实现流程、核心代码、访问路径与界面效果。第 5 章给出功能测试用例与性能测试分析。第 6 章总结工作并展望后续方向。文末附参考文献与致谢。


2 相关技术

2.1 Python编程语言

Python 具备清晰语法与丰富第三方库,适合 Web 后端、数据处理与网络请求。本系统使用 Python 3.11 环境,依赖 requirements.txt 中的 Django 3.2.25、pandas、numpy、requests、Pillow、django-simpleui、mysqlclient、PyMySQL 等。爬虫脚本用 requests 会话复用与线程池并发拉取;导入与分析侧用 pandas 读 CSV、Django ORM 做聚合。

2.1.1 数据处理与脚本组织

项目将采集逻辑独立于 spider/获取气象数据.py,与业务视图 app/views_weather.py、分析类 app/weather_data_analysis.py 解耦。脚本支持 -s/-e/-w 等命令行参数,页面通过子进程异步调用,避免阻塞 HTTP 请求线程过久。

2.1.2 与 Django 的协作方式

业务入口为 manage.py,配置集中在 weather_system/settings.py。视图层负责页面渲染与 JSON API,模型层映射 MySQL 表,模板层使用 NiceAdmin/Bootstrap 布局。Python 标准库中的 csv、threading、subprocess 分别用于导出、异步爬虫与进程调用。

2.2 Django Web框架

Django 采用 MTV(Model-Template-View)组织方式。本系统 Django 版本为 3.2(requirements.txt 锁定 3.2.25),应用名为 app,根路由在 weather_system/urls.py 挂载 admin/ 与 app.urls。

2.2.1 MTV模式与路由组织

模型定义于 app/models.py;页面与 API 集中在 views_weather.py;模板分布在 templates/ 与 app/templates/。app/urls.py 按认证、列表详情、分析页、导出、预警、地图、对比、图表 API、爬虫等分组注册路径,命名空间为 app。

2.2.2 SimpleUI后台管理

INSTALLED_APPS 将 simpleui 置于 django.contrib.admin 之前,配置 SIMPLEUI_HOME_TITLE 等为「气象数据后台管理」。app/admin.py 注册 User、WeatherData、CityInfo,支持列表展示、筛选、搜索与字段分组编辑。

2.3 MySQL数据库

业务库名为 weather_system,连接配置于 settings.py(默认 localhost:3306,用户 root)。引擎为 django.db.backends.mysql,字符集 utf8mb4。

2.3.1 ORM与索引设计

WeatherData 对 city、date 建索引,并设置 unique_together = ('city', 'date'),保证同一城市同一天仅一条记录。列表与分析大量使用 filter、annotate、aggregate 与分页 Paginator。

2.3.2 驱动与会话存储

依赖中同时声明 mysqlclient 与 PyMySQL,满足 Windows 本地连接需求。会话引擎为数据库后端 django.contrib.sessions.backends.db,SESSION_COOKIE_AGE 为 7 天;前台登录态以 session['username']、session['user_id'] 标识。

2.4 ECharts可视化技术

前台分析页通过 AJAX 请求 /api/chart/temperature/、/api/chart/heatmap/、/api/map/ 等接口获取 JSON,再用 ECharts 渲染折线、柱状、饼图、热力图与地图系列。地图页结合中国地图 geo 组件展示各城市温度、湿度、降水、风速等;热力图以城市为纵轴、日期或月份为横轴构建矩阵。图表交互(图例切换、缩放、提示框)由 ECharts 默认能力提供,业务侧专注数据组装。

2.5 NASA POWER数据接口

NASA POWER(Prediction Of Worldwide Energy Resources)提供全球点位逐日气象与辐射参数。本系统爬虫调用:

https://power.larc.nasa.gov/api/temporal/daily/point

社区参数 community=RE,按经纬度与起止日期(YYYYMMDD)请求 JSON。主要参数包括:T2M / T2M_MAX / T2M_MIN / T2MDEW、RH2M / QV2M、ALLSKY_SFC_SW_DWN / CLRSKY_SFC_SW_DWN / ALLSKY_SFC_LW_DWN / ALLSKY_SFC_PAR_TOT、WS2M / WS10M / WS50M、PS、PRECTOTCORR。脚本将 -999 缺失标记清洗为 None,并写日志到 spider/气象数据获取.log。全局限流约每秒 2 次请求,配合线程池与 Session 复用,降低封禁风险。

2.6 技术特色与创新点

算法方面:预警采用明确温度、降水、风速阈值分级;趋势预测采用 7 日移动平均与近期斜率外推,公式透明,不虚构 LSTM。季节分析按月份映射春夏秋冬后做聚合对比。

数据处理方面:爬虫坐标字典内置约 333 城;CSV 按城市+日期去重后入库;列表与导出支持城市、日期、温度区间筛选。

可视化特色:要素分析页拆分清晰;地图与热力图互补展示空间分布与时空矩阵;综合分析 API 一次组装多类 KPI 与排行。

架构优势:自定义 AuthMiddleware 统一鉴权豁免;分析类 WeatherDataAnalysis 封装基础统计;后台 SimpleUI 与前台 NiceAdmin 分工明确。

体验方面:Bootstrap 响应式侧栏覆盖数据概览、列表、各分析、地图热力、对比预警预测、爬虫与个人中心;课题演示以 8030 端口本地运行为准。


3 系统分析与设计

3.1 系统总体设计

3.1.1 系统架构设计

系统采用经典三层 B/S 结构:表现层为登录注册页、数据概览首页、气象列表详情、各分析模板、地图热力图、对比预警预测页、爬虫页与 SimpleUI 后台;业务层包含会话认证、ORM 查询聚合、预警阈值判定、移动平均预测、爬虫调度与导出;数据层为 MySQL weather_system 库及 spider/ 下 CSV/日志。浏览器通过 HTTP 访问 8030 端口,Django 处理页面与 API,统计计算在服务端完成后以 JSON 驱动 ECharts 渲染。系统不包含独立全屏数据大屏。

图3.1 系统架构图

数据访问层

业务逻辑层

表现层

登录/注册页

数据概览首页

气象列表/详情

多维分析页

地图与热力图

对比/预警/预测

爬虫页

SimpleUI后台

AuthMiddleware 会话认证

views_weather 页面视图

图表/地图/预警/对比 API

WeatherDataAnalysis

移动平均趋势外推

爬虫调度与CSV导入

CSV/Excel导出

MySQL: weather_system

spider/气象数据.csv

获取气象数据.py

NASA POWER API

3.1.2 系统数据流设计

从外部看,前台用户提交账号口令进入系统,管理员通过后台维护记录,NASA POWER 向爬虫脚本提供原始 JSON。系统内部完成鉴权、查询过滤、统计聚合、图表输出、预警生成、预测外推与入库。

图3.2 顶层数据流图

账号/筛选条件

CRUD操作

JSON逐日点数据

页面与图表

管理反馈

CSV/日志

业务记录

前台用户

全国气象数据可视化分析系统

后台管理员

外部数据源
NASA POWER API

本地 spider 目录

MySQL weather_system

图3.3 0层数据流图

前台用户

1.0 用户认证

2.0 气象数据查询

3.0 多维分析聚合

4.0 地图与热力图

5.0 对比预警与预测

6.0 爬虫导入与导出

管理员

7.0 后台管理

运维/初始化

8.0 SQL导入与启动

user表

weather_data表

city_info表

图表JSON输出

NASA POWER

气象数据.csv

3.1.3 系统功能模块设计

结合侧栏实际菜单与路由划分,系统功能划分为六大模块:(1)用户认证;(2)气象数据管理;(3)多维数据分析;(4)地图与热力图;(5)对比、预警与趋势预测;(6)爬虫、导出与后台。各模块对应独立页面路由与 JSON API;个人信息维护挂载于认证模块延伸功能。WeatherFavorite 模型保留但未挂路由,不计入已上线功能。

图3.4 系统功能结构图

全国气象数据可视化分析系统

用户认证

气象数据管理

多维数据分析

地图与热力图

对比预警与趋势预测

爬虫导出与后台

登录注册退出

个人资料与改密

列表筛选分页

详情与搜索

城市温度湿度辐射

风力降水综合季节

气象地图

热力图

多城市对比

天气预警

趋势预测

NASA爬虫与导入

CSV/Excel导出

SimpleUI后台

3.2 系统详细设计

3.2.1 用户认证模块设计

模块负责前台注册、登录、退出及会话保持,以及个人资料、头像与密码修改。用户信息存储于自定义 User 表(物理表 user);登录成功后将 username、user_id 写入 request.session。中间件 AuthMiddleware 对未登录访问重定向至 /login/,豁免 /login/、/register/、/admin/、/api/。前台演示账号为 123456/123456(明文密码校验);Django 内置后台管理员为 admin/admin123,与前台用户表分离。

3.2.1.1 用户认证流程设计

图3.5 用户认证模块流程图

GET

POST

匹配

不匹配

通过

失败

否

是

访问 /login/

请求方法

渲染 login.html

读取用户名密码

User表明文校验

写入 session username/user_id

跳转 /

errorResponse 提示

访问 /register/

注册校验

创建 User 记录

跳转登录页

提示空值/重复/密码不一致

访问受保护页

session.username?

放行视图

3.2.2 气象数据管理模块设计

模块提供数据概览首页 /、气象列表 /weather/list/、详情 /weather/detail/<id>/ 与搜索 /weather/search/。列表支持城市、日期起止、平均温度区间与关键字筛选,每页 20 条;根据降水量与温度派生天气类型图标。详情页展示单条全字段,并附该城市此前最多 30 日历史记录。首页由 WeatherDataAnalysis.get_basic_statistics() 提供 KPI,并展示高温城市 TOP10 与最新观测。

3.2.2.1 气象数据管理流程设计

图3.6 气象数据管理模块流程图

首页

列表

进入 / 或 /weather/list/

页面类型

get_basic_statistics

高温TOP10与最新数据

渲染 index.html

读取筛选参数

ORM filter + Paginator20

派生天气类型

渲染 weather_list.html

详情 /weather/detail/id/

加载 WeatherData

附带历史30日

渲染详情页

3.2.3 多维数据分析模块设计

分析页路由包括 /analysis/city/、/analysis/temperature/、/analysis/humidity/、/analysis/radiation/、/analysis/wind/、/analysis/precipitation/、/analysis/overview/、/analysis/seasonal/。前端请求对应 /api/chart/* 获取序列与对比数据。温度等要素页可按城市筛选,取库内时间序列绘制折线,并做城市间对比;季节分析将月份映射为春夏秋冬后聚合;综合分析组装多要素 KPI、排行与概览表。服务端统计也可复用 WeatherDataAnalysis 中的分布区间方法。

3.2.3.1 多维数据分析流程设计

图3.7 多维数据分析模块流程图

序列

分布/排行

季节

进入某分析页

渲染对应 analysis 模板

AJAX 请求 /api/chart/...

按城市/要素过滤 WeatherData

分析类型

按日期组装 values

aggregate/annotate

ExtractMonth 映射季节

JsonResponse

ECharts 多图渲染

3.2.4 地图与热力图模块设计

气象地图页 /map/ 调用 /api/map/,按指定日期或最新有效日期返回各城市平均温度、湿度、降水、10 米风速,供中国地图散点/视觉映射。热力图页 /analysis/heatmap/ 调用 /api/chart/heatmap/,支持要素 avg_temp/humidity/precipitation/wind_speed_10m;可选年份+月份按「城市×日」矩阵,或仅年份按「城市×月」均值矩阵。

3.2.4.1 地图与热力图流程设计

图3.8 地图与热力图模块流程图

地图

热力

是

否

进入 map 或 heatmap 页

携带日期/年/月/要素请求 API

模块分支

按日期取各城 avg_temp 等

是否指定月份

构建城市-日期矩阵

构建城市-月份均值矩阵

返回 city_data

返回 heatmap data mode=day

返回 heatmap data mode=month

地图渲染

热力渲染

3.2.5 对比预警与趋势预测模块设计

数据对比页 /compare/ 通过 /api/compare/ 最多对比 10 个城市,要素类型含温度、湿度、风速、降水,可按日期区间截取最多 365 点。天气预警页 /warning/ 通过 /api/warning/ 扫描高温(最高温≥35℃)、低温(最低温≤-10℃)、暴雨(降水≥50mm)、大风(10 米风速≥10.8m/s)记录并分级,返回最近 50 条及计数统计。趋势预测页 /analysis/prediction/ 通过 /api/chart/prediction/ 取最近约 60 日历史,计算窗口 min(7, n) 的移动平均,再按近 7 步斜率外推未来 days(默认 7)日;历史不足 10 条时返回错误提示。该预测不是 LSTM。

3.2.5.1 对比预警与预测流程设计

图3.9 对比预警与预测模块流程图

对比

预警

预测

否

是

进入 compare/warning/prediction

功能分支

多城市 getlist + 要素类型

按城取序列 JSON

阈值 filter 高温低温暴雨大风

分级排序取前50

取近60日序列

长度>=10?

返回数据不足

7日移动平均

线性趋势外推 days 天

返回 historical + prediction

ECharts 对比曲线

预警列表展示

历史/预测曲线

3.2.6 爬虫导出与后台模块设计

爬虫页 /spider/ 提供状态查询 /api/spider/status/(CSV 是否存在、记录数、城市数、日期范围、日志尾部)、异步启动 /api/spider/run/(参数起止日期、并发 workers、强制重爬)与导入 /api/spider/import/。导出接口 /export/csv/、/export/excel/ 按当前筛选写出气象字段。后台 /admin/ 基于 SimpleUI 维护前台用户、气象数据与城市信息;WeatherFavorite 未在 admin 注册为必需功能,亦不作为前台能力宣传。

3.2.6.1 爬虫导出与后台流程设计

图3.10 爬虫导出与后台模块流程图

启动爬取

导入

打开 /spider/

api_spider_status 读CSV/日志

用户操作

线程 subprocess 调用脚本

NASA POWER 写 CSV

pandas 读CSV去重

批量写入 weather_data

导出请求

按筛选写 CSV/Excel 响应

管理员登录 /admin/

User/WeatherData/CityInfo CRUD

初始化

导入 weather_system.sql

runserver 8030

3.3 数据库设计

3.3.1 数据库关系设计

系统业务库为 MySQL 中的 weather_system。核心实体为前台用户表 User(user)、气象数据表 WeatherData(weather_data)、城市信息表 CityInfo(city_info)。另有 WeatherFavorite(weather_favorite)以外键关联用户与气象数据,但前台路由未挂接,论文按未上线能力处理。登录态通过 Session 绑定用户;气象记录与城市信息通过城市名称逻辑关联;后台 Django 内置 auth_user 供管理员登录。

图3.11 数据库表关系图

模型关联未挂路由

模型关联未挂路由

城市名逻辑关联

后台CRUD维护

USER

int

id

PK

主键

varchar

username

用户名唯一

varchar

password

密码明文

varchar

sex

性别

varchar

address

地址

varchar

avatar

头像路径

varchar

textarea

个人简介

datetime

createTime

创建时间

WEATHER_DATA

int

id

PK

主键

varchar

city

城市

date

date

日期

float

avg_temp

日均温度

float

max_temp

最高温度

float

min_temp

最低温度

float

humidity

相对湿度

float

precipitation

降水量

float

wind_speed_10m

10米风速

float

allsky_solar_radiation

全天空短波辐射

CITY_INFO

int

id

PK

主键

varchar

city_name

城市名称唯一

varchar

province

所属省份

float

latitude

纬度

float

longitude

经度

varchar

city_type

城市类型

WEATHER_FAVORITE

int

id

PK

主键

int

user_id

FK

用户

int

weather_data_id

FK

气象数据可空

varchar

city

城市

date

date

日期

text

notes

备注

AUTH_USER

int

id

PK

后台管理员

varchar

username

用户名

varchar

password

密码哈希

表3.1 USER(前台用户 user)表结构

字段名称字段类型字段说明是否主键是否为空
idint唯一标识是否
usernamevarchar(255)用户名(唯一)否否
passwordvarchar(255)密码(明文存储)否否
sexvarchar(255)性别否是
addressvarchar(255)地址否是
avatar文件路径头像否是
textareavarchar(255)个人简介否是
createTimedatetime创建时间否否

表3.2 WEATHER_DATA(气象数据 weather_data)表结构

字段名称字段类型字段说明是否主键是否为空
idint唯一标识是否
cityvarchar(100)城市(索引)否否
datedate日期(索引)否否
avg_tempfloat日均温度(°C)否是
max_tempfloat最高温度(°C)否是
min_tempfloat最低温度(°C)否是
dew_pointfloat露点温度(°C)否是
humidityfloat相对湿度(%)否是
specific_humidityfloat比湿(kg/kg)否是
allsky_solar_radiationfloat全天空短波辐射否是
clearsky_solar_radiationfloat晴空短波辐射否是
allsky_longwave_radiationfloat全天空长波辐射否是
par_radiationfloat光合有效辐射否是
wind_speed_2mfloat2米风速(m/s)否是
wind_speed_10mfloat10米风速(m/s)否是
wind_speed_50mfloat50米风速(m/s)否是
surface_pressurefloat地表气压(kPa)否是
precipitationfloat降水量(mm)否是
create_timedatetime创建时间否否
update_timedatetime更新时间否否

说明:(city, date) 唯一约束。

表3.3 CITY_INFO(城市信息 city_info)表结构

字段名称字段类型字段说明是否主键是否为空
idint唯一标识是否
city_namevarchar(100)城市名称(唯一)否否
provincevarchar(100)所属省份否是
latitudefloat纬度否是
longitudefloat经度否是
city_typevarchar(50)城市类型否是
create_timedatetime创建时间否否

表3.4 WEATHER_FAVORITE(气象收藏 weather_favorite,未挂前台路由)表结构

字段名称字段类型字段说明是否主键是否为空
idint唯一标识是否
user_idint外键用户否否
weather_data_idint外键气象数据否是
cityvarchar(100)城市否是
datedate日期否是
created_timedatetime收藏时间否否
notestext备注否是

4 系统实现

4.0 系统整体实现流程

系统实现按「环境与库表 → SQL/爬虫入库 → 认证与首页 → 列表详情 → 多维图表 API → 地图热力 → 对比预警预测 → 爬虫导出后台 → 联调」推进。开发入口为 manage.py,配置库名 weather_system,导入 weather_system.sql 或经爬虫导入观测数据后,以 python manage.py runserver 8030 启动服务。

图4.0 系统整体实现流程图

项目初始化与依赖安装

配置 MySQL weather_system

导入 weather_system.sql 或 migrate

可选运行获取气象数据.py

CSV 导入 weather_data

实现 AuthMiddleware 与登录注册

实现首页与气象列表详情

实现多维分析页与 chart API

实现地图与热力图

实现对比预警与移动平均预测

实现爬虫页与 CSV/Excel 导出

配置 SimpleUI 后台

联调与功能测试

端口8030部署演示

4.1 用户认证模块的实现

用户认证实现于 app/views_weather.py。GET 请求渲染登录模板;POST 请求以明文用户名密码查询 User,成功则写入 Session 并跳转首页,失败则 errorResponse。注册校验空值、两次密码一致性与账号唯一性。AuthMiddleware 统一拦截未登录访问。个人中心支持资料、头像与密码修改。

功能实现流程设计

图4.1 用户认证模块实现流程图

GET

POST

成功

失败

打开登录页

GET还是POST

render login.html

读取 username/password

User.objects.get 明文校验

session 保存用户名与user_id

redirect /

errorResponse 提示

核心代码实现
# 来源:app/views_weather.py — 前台登录
def login_view(request):
    if request.method == 'GET':
        return render(request, 'login.html')
    elif request.method == 'POST':
        username = request.POST.get('username')
        password = request.POST.get('password')
        try:
            user = User.objects.get(username=username, password=password)
            request.session['username'] = username
            request.session['user_id'] = user.id
            return redirect('/')
        except User.DoesNotExist:
            return errorResponse(request, '用户名或密码错误')
# 来源:middleware/auth.py — 登录拦截与豁免
class AuthMiddleware(MiddlewareMixin):
    def process_request(self, request):
        exempt_paths = ['/login/', '/register/', '/admin/', '/api/']
        for path in exempt_paths:
            if request.path_info.startswith(path):
                return None
        if not request.session.get('username'):
            return redirect('/login/')
        return None
# 来源:app/urls.py — 认证相关路由(节选)
path('login/', views_weather.login_view, name='login'),
path('register/', views_weather.register_view, name='register'),
path('logout/', views_weather.logout_view, name='logout'),
path('personal/', views_weather.personal_view, name='personal'),
path('personal/update/', views_weather.personal_update, name='personal_update'),
path('personal/password/', views_weather.password_update, name='password_update'),
实现效果展示

访问路径:http://127.0.0.1:8030/login/(默认账号 123456 / 123456)

图4.7 用户登录界面

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

4.2 气象数据管理模块的实现

首页 index 聚合基础统计、高温城市与最近观测;列表 weather_list 组合筛选并分页;详情加载单条记录与历史趋势。天气类型由降水量与温度规则派生,用于列表卡片图标展示。

功能实现流程设计

图4.2 气象数据管理模块实现流程图

首页

列表

访问 / 或 /weather/list/

首页或列表

WeatherDataAnalysis 基础统计

渲染 index.html KPI

city/date/temp 筛选

Paginator 每页20

get_weather_type 派生

渲染 weather_list.html

核心代码实现
# 来源:app/views_weather.py — 列表筛选与分页(节选)
def weather_list(request):
    city = request.GET.get('city', '').strip()
    date_start = request.GET.get('date_start', '').strip()
    date_end = request.GET.get('date_end', '').strip()
    temp_min = request.GET.get('temp_min', '').strip()
    temp_max = request.GET.get('temp_max', '').strip()
    queryset = WeatherData.objects.all()
    if city:
        queryset = queryset.filter(city=city)
    if date_start:
        queryset = queryset.filter(date__gte=date_start)
    if date_end:
        queryset = queryset.filter(date__lte=date_end)
    if temp_min:
        queryset = queryset.filter(avg_temp__gte=float(temp_min))
    if temp_max:
        queryset = queryset.filter(avg_temp__lte=float(temp_max))
    paginator = Paginator(queryset.order_by('-date', 'city'), 20)
    page_obj = paginator.get_page(request.GET.get('page', 1))
    # ... 派生天气类型后渲染 weather_list.html ...
# 来源:app/weather_data_analysis.py — 基础统计
@staticmethod
def get_basic_statistics():
    from .models import WeatherData
    stats = WeatherData.objects.aggregate(
        total_records=Count('id'),
        total_cities=Count('city', distinct=True),
        avg_temp=Avg('avg_temp'),
        max_temp=Max('max_temp'),
        min_temp=Min('min_temp'),
        avg_humidity=Avg('humidity'),
    )
    return stats or {}
实现效果展示

访问路径:http://127.0.0.1:8030/(数据概览)、http://127.0.0.1:8030/weather/list/(气象数据)

图4.8 数据概览界面

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

图4.9 气象数据界面

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

4.3 多维数据分析模块的实现

各分析页视图负责渲染模板并注入城市下拉等上下文;图表数据由 api_chart_city、api_chart_temperature、api_chart_humidity、api_chart_radiation、api_chart_wind、api_chart_precipitation、api_chart_overview、api_chart_seasonal 返回。温度 API 支持按城市取时间序列,并汇总城市温度范围对比;季节 API 将 3–5 月映射春季、6–8 月夏季、9–11 月秋季、12–2 月冬季后聚合。

功能实现流程设计

图4.3 多维数据分析模块实现流程图

访问 /analysis/temperature/ 等

渲染分析模板

请求 /api/chart/temperature/ 等

按城市过滤 WeatherData

组装 dates/values 与对比数据

JsonResponse code=0

ECharts 折线/柱状/饼图渲染

核心代码实现
# 来源:app/urls.py — 分析页与图表 API(节选)
path('analysis/city/', views_weather.city_analysis, name='city_analysis'),
path('analysis/temperature/', views_weather.temperature_analysis, name='temperature_analysis'),
path('analysis/humidity/', views_weather.humidity_analysis, name='humidity_analysis'),
path('analysis/radiation/', views_weather.radiation_analysis, name='radiation_analysis'),
path('analysis/wind/', views_weather.wind_analysis, name='wind_analysis'),
path('analysis/precipitation/', views_weather.precipitation_analysis, name='precipitation_analysis'),
path('analysis/overview/', views_weather.overview_analysis, name='overview_analysis'),
path('analysis/seasonal/', views_weather.seasonal_analysis, name='seasonal_analysis'),
path('api/chart/temperature/', views_weather.api_chart_temperature, name='api_chart_temperature'),
path('api/chart/seasonal/', views_weather.api_chart_seasonal, name='api_chart_seasonal'),
# 来源:app/models.py — 气象核心字段(节选)
class WeatherData(models.Model):
    city = models.CharField('城市', max_length=100, default='', db_index=True)
    date = models.DateField('日期', db_index=True)
    avg_temp = models.FloatField('日均温度(°C)', null=True, blank=True)
    max_temp = models.FloatField('最高温度(°C)', null=True, blank=True)
    min_temp = models.FloatField('最低温度(°C)', null=True, blank=True)
    humidity = models.FloatField('相对湿度(%)', null=True, blank=True)
    precipitation = models.FloatField('降水量(mm)', null=True, blank=True)
    class Meta:
        db_table = 'weather_data'
        unique_together = ('city', 'date')
实现效果展示

访问路径:http://127.0.0.1:8030/analysis/temperature/(温度分析为代表)

图4.10 温度分析界面

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

4.4 地图与热力图模块的实现

地图页注入日期范围与默认有效日期;api_weather_map 按日期返回城市要素列表。热力图 API 根据是否指定月份切换日矩阵或月均值矩阵,输出供 ECharts heatmap 使用的 [x, y, value] 三元组。

功能实现流程设计

图4.4 地图与热力图模块实现流程图

地图

热力

访问 /map/ 或 /analysis/heatmap/

渲染页面

地图或热力

GET /api/map/?date=

按日取各城要素

GET /api/chart/heatmap/

年/月筛选构建矩阵

中国地图渲染

热力矩阵渲染

核心代码实现
# 来源:app/views_weather.py — 地图数据 API(节选)
@require_GET
def api_weather_map(request):
    date_param = request.GET.get('date', '').strip()
    # ... 解析日期或取最新有效日 ...
    city_data = list(WeatherData.objects.filter(date=latest_valid_date).exclude(
        avg_temp__isnull=True
    ).values('city', 'date', 'avg_temp', 'humidity', 'precipitation', 'wind_speed_10m'))
    return JsonResponse({
        'code': 0,
        'city_data': city_data,
        'total': len(city_data),
        'date': str(latest_valid_date) if latest_valid_date else None
    })
# 来源:app/views_weather.py — 热力图模式分支(节选)
valid_elements = ['avg_temp', 'humidity', 'precipitation', 'wind_speed_10m']
# 指定年月:城市×日矩阵 mode='day'
# 仅年份:按城市月份 Avg(element) 矩阵 mode='month'
heatmap_data.append([j, i, value])
实现效果展示

访问路径:http://127.0.0.1:8030/map/、http://127.0.0.1:8030/analysis/heatmap/

图4.11 气象地图界面

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

图4.12 热力图界面

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

4.5 对比预警与预测模块的实现

对比 API 按 cities[] 与 type 组装多序列;预警 API 四类阈值扫描后排序截断;预测 API 明确使用移动平均与线性外推,代码路径为 api_chart_prediction。

功能实现流程设计

图4.5 对比预警与预测模块实现流程图

对比

预警

预测

打开对比/预警/预测页

分支

api_data_compare

api_weather_warning 阈值扫描

api_chart_prediction

近60日 + window=7 MA

trend 外推未来 days 天

多曲线图

预警卡片/列表

历史与预测曲线

核心代码实现
# 来源:app/views_weather.py — 趋势预测(移动平均+线性外推,非LSTM)
@require_GET
def api_chart_prediction(request):
    city = request.GET.get('city', '').strip()
    element = request.GET.get('element', 'avg_temp')
    days = int(request.GET.get('days', 7))
    # ... 取历史,不足10条则返回错误 ...
    historical_data = all_data[-60:] if len(all_data) >= 60 else all_data
    values = [d.get(element) or 0 for d in historical_data]
    window = min(7, len(values))
    # 计算移动平均 ma_values ...
    last_ma = ma_values[-1]
    trend = (ma_values[-1] - ma_values[-min(7, len(ma_values))]) / min(7, len(ma_values))
    for i in range(1, days + 1):
        pred_value = last_ma + trend * i
        prediction_values.append(round(pred_value, 1))
# 来源:app/views_weather.py — 预警阈值(节选)
high_temp = WeatherData.objects.filter(max_temp__gte=35).order_by('-date')[:20]
low_temp = WeatherData.objects.filter(min_temp__lte=-10).order_by('-date')[:20]
heavy_rain = WeatherData.objects.filter(precipitation__gte=50).order_by('-date')[:20]
strong_wind = WeatherData.objects.filter(wind_speed_10m__gte=10.8).order_by('-date')[:20]
实现效果展示

访问路径:http://127.0.0.1:8030/analysis/prediction/、http://127.0.0.1:8030/warning/、http://127.0.0.1:8030/compare/

图4.13 趋势预测界面

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

图4.14 天气预警界面

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

图4.15 数据对比界面

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

4.6 爬虫导出与后台模块的实现

爬虫页调用状态/运行/导入三类 API;运行接口在后台线程执行 python spider/获取气象数据.py -s ... -e ... -w ...。导出视图流式写 CSV 或用 openpyxl/兼容方式写 Excel(项目以 pandas/响应头实现导出)。后台 admin.py 注册三模型并配置 list_display、筛选与 fieldsets。

功能实现流程设计

图4.6 爬虫导出与后台模块实现流程图

run

import

访问 /spider/

展示 CSV 状态与日志

启动或导入

Thread + subprocess 脚本

请求 NASA POWER 写CSV

pandas 去重批量入库

/export/csv/ 或 excel/

按筛选输出文件

/admin/

SimpleUI 维护三表

核心代码实现
# 来源:spider/获取气象数据.py — NASA POWER 请求(节选)
base_url = "https://power.larc.nasa.gov/api/temporal/daily/point"
parameters = [
    "T2M", "T2M_MAX", "T2M_MIN", "T2MDEW",
    "RH2M", "QV2M",
    "ALLSKY_SFC_SW_DWN", "CLRSKY_SFC_SW_DWN",
    "ALLSKY_SFC_LW_DWN", "ALLSKY_SFC_PAR_TOT",
    "WS2M", "WS10M", "WS50M", "PS", "PRECTOTCORR",
]
params = {
    "parameters": ",".join(parameters),
    "community": "RE",
    "longitude": lon,
    "latitude": lat,
    "start": start_date,
    "end": end_date,
    "format": "JSON",
}
# 来源:app/views_weather.py — 异步启动爬虫(节选)
def run_spider():
    subprocess.run([
        'python', spider_script,
        '-s', start_date,
        '-e', end_date,
        '-w', str(workers)
    ], cwd=os.path.dirname(spider_script))
thread = threading.Thread(target=run_spider)
thread.daemon = True
thread.start()
# 来源:app/admin.py — 气象数据后台(节选)
@admin.register(WeatherData)
class WeatherDataAdmin(admin.ModelAdmin):
    list_display = ['id', 'city', 'date', 'avg_temp', 'max_temp', 'min_temp',
                    'humidity', 'precipitation', 'wind_speed_10m']
    list_filter = ['city', 'date']
    search_fields = ['city']
    date_hierarchy = 'date'
实现效果展示

访问路径:http://127.0.0.1:8030/spider/、http://127.0.0.1:8030/export/csv/、http://127.0.0.1:8030/admin/

图4.16 数据爬虫界面

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

图4.17 后台管理界面

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

4.7 用户界面实现

界面采用 Bootstrap 与 NiceAdmin 风格布局,侧栏按「数据概览 / 气象数据 / 城市分析 / 温度 / 湿度 / 辐射 / 风力 / 降水 / 综合 / 季节 / 数据对比 / 气象地图 / 热力图 / 趋势预测 / 天气预警 / 数据爬虫 / 个人中心」等分组。顶栏展示当前用户与退出入口。系统无独立全屏数据大屏;图表均嵌入常规内容页。

主要界面效果已在第 4.1~4.6 节各模块「实现效果展示」中给出:登录页、数据概览、气象数据列表、温度分析、气象地图、热力图、趋势预测、天气预警、数据对比、数据爬虫与 SimpleUI 后台。登录页提交成功后进入数据概览;列表支持城市/日期/温度筛选;地图与热力图展示空间与矩阵分布;预测为移动平均与线性外推;预警按阈值触发;后台维护前台用户、气象数据与城市信息。

4.8 系统集成与部署

部署步骤概要如下:

  1. 安装 requirements.txt 依赖(Django 3.2.25、django-simpleui、pandas、numpy、requests、Pillow、mysqlclient、PyMySQL 等)。
  2. 创建 MySQL 库 weather_system(字符集建议 utf8mb4),并在 weather_system/settings.py 核对连接账号(默认 root / 123456,主机 localhost,端口 3306)。
  3. 导入项目根目录备份:weather_system.sql(可在命令行执行 mysql -uroot -p123456 weather_system < weather_system.sql)。
  4. 如需重新采集:运行 python spider/获取气象数据.py -s YYYYMMDD -e YYYYMMDD -w 5,或登录前台打开 /spider/ 启动与导入。
  5. 启动服务:在项目根目录执行 python manage.py runserver 8030。
  6. 浏览器访问 http://127.0.0.1:8030/login/,前台账号 123456/123456;后台 http://127.0.0.1:8030/admin/,账号 admin/admin123。

根 URL 将业务挂在应用路由下,静态与媒体资源在 DEBUG=True 时由 Django 开发服务器挂载。课题演示以 8030 端口本地运行为准。


5 系统测试

5.1 系统功能测试

测试环境:Windows 10,Python 3.11,Django 3.2,MySQL(库 weather_system),浏览器访问 http://127.0.0.1:8030。前台默认账号 123456/123456,后台 admin/admin123。

5.1.1 用户认证功能测试用例
编号说明条件操作步骤预期结果实际结果
TC-A01正确登录库中存在 123456打开 /login/,输入 123456/123456 提交跳转 /,侧栏可见通过
TC-A02错误密码账号存在输入错误密码提交提示用户名或密码错误通过
TC-A03注册新用户用户名未占用/register/ 填写一致密码注册成功并回到登录页通过
TC-A04退出登录已登录执行 /logout/Session 清空,回到登录页通过
TC-A05未登录拦截无 Session直接访问 /weather/list/重定向至 /login/通过
TC-A06修改资料已登录/personal/ 更新性别地址等提示更新成功通过
5.1.2 数据管理功能测试用例
编号说明条件操作步骤预期结果实际结果
TC-B01数据概览库有气象数据打开 /KPI、高温 TOP、最新列表正常通过
TC-B02列表分页记录数>20打开 /weather/list/每页 20 条,可翻页通过
TC-B03条件筛选已登录按城市与日期筛选列表结果符合条件通过
TC-B04温度区间有 avg_temp设置 temp_min/temp_max仅显示区间内记录通过
TC-B05详情查看存在记录 id打开 /weather/detail/<id>/字段完整,可见历史趋势通过
TC-B06后台查看管理员可进 Admin登录 /admin/ 打开气象数据可检索城市与日期通过
5.1.3 核心业务功能测试用例
编号说明条件操作步骤预期结果实际结果
TC-C01气象地图有有效温度数据打开 /map/ 请求 /api/map/返回各城 city_data通过
TC-C02热力图有年份数据打开 /analysis/heatmap/矩阵 data 非空通过
TC-C03多城对比至少 2 城有数据/compare/ 选择多城对比曲线可渲染通过
TC-C04天气预警存在超阈值样本或空列表打开 /warning/返回 warnings 与 stats通过
TC-C05趋势预测单城历史≥10 条/analysis/prediction/ 选城返回 historical 与 prediction通过
TC-C06预测非深度学习查看 API 实现核对代码为 MA+趋势无 LSTM 调用通过
TC-C07收藏未上线检查 urls.py搜索 favorite 路由无收藏 path 挂接通过
5.1.4 数据分析功能测试用例
编号说明条件操作步骤预期结果实际结果
TC-D01温度分析有温度序列/analysis/temperature/折线有数据通过
TC-D02湿度分析有湿度字段/api/chart/humidity/JSON code=0通过
TC-D03辐射分析有辐射字段/analysis/radiation/图表可渲染通过
TC-D04风力降水有风速降水打开对应分析页序列与排行正常通过
TC-D05综合分析库有数据/analysis/overview/KPI 与排行返回通过
TC-D06季节分析跨月数据/api/chart/seasonal/四季聚合结果通过
TC-D07城市分析多城数据/analysis/city/城市统计表/图可见通过
5.1.5 系统集成功能测试用例
编号说明条件操作步骤预期结果实际结果
TC-E01端口启动依赖已安装runserver 80308030 可访问登录页通过
TC-E02SQL 导入已建库导入 weather_system.sql表与数据可用通过
TC-E03爬虫状态spider 目录存在/api/spider/status/返回 csv_exists 等字段通过
TC-E04CSV 导出已登录有数据访问 /export/csv/下载气象 CSV通过
TC-E05Excel 导出已登录有数据访问 /export/excel/下载表格文件通过
TC-E06API 豁免无 Session直接请求 /api/ 前缀接口中间件不强制登录跳转通过
TC-E07前后台共库库有数据前台城市数与后台对照数量级一致通过
5.1.6 用户界面功能测试用例
编号说明条件操作步骤预期结果实际结果
TC-F01侧栏导航已登录点击各分析菜单对应页面激活高亮通过
TC-F02登录页展示服务已启动打开 /login/表单与标题正常通过
TC-F03响应式布局缩小窗口浏览列表与分析页Bootstrap 布局自适应通过
TC-F04图表容器分析页有数据打开温度/地图等页ECharts 容器有图通过
TC-F05个人中心已登录打开 /personal/可查看与修改资料通过
TC-F06无独立大屏检查路由搜索 bigscreen 类路由不存在全屏大屏页通过
TC-F07后台皮肤管理员登录打开 /admin/SimpleUI 中文界面可用通过

5.2 系统性能测试

5.2.1 响应时间性能分析

在教学演示数据规模下,登录页与静态资源加载通常较快;数据概览与列表首屏受聚合与分页影响,一般可在数秒内完成。带多段聚合的综合分析 API、地图全城点位与热力矩阵接口耗时相对更高,但仍满足本机答辩演示需求。预测接口仅对单城近 60 日序列做内存计算,开销较小。

5.2.2 并发性能测试

课题演示场景以单机少量并发为主。Session 认证与开发服务器适合本地验收;若并发显著增大,可改用生产级 WSGI/ASGI 与反向代理。当前实现满足课程验收与本机演示需求。

5.2.3 数据库性能测试

weather_data 上 city、date 索引及 (city, date) 唯一约束,有利于按城按日过滤与防重。列表分页 ORDER BY date, city LIMIT 20 可控制单次返回行数。全表聚合(如全局 AVG)在数据量增大时成本上升,可通过限定日期范围或预聚合优化。

5.2.4 性能优化措施
  1. 列表与搜索限制每页条数或结果上限,避免一次加载全表。
  2. 地图默认取单一有效日期的全城截面,而非全历史。
  3. 热力图按年/月聚合,减少前端渲染点数。
  4. 爬虫限流与 Session 复用,降低外部 API 失败率。
  5. 对比接口限制最多 10 城、每城最多 365 点。
  6. 预警各类结果先截断再合并排序,控制返回体大小。

6 总结与展望

6.1 总结

本文完成了基于 Python+Django 的全国气象数据可视化分析系统的设计与实现。系统以 Django 3.2 + SimpleUI 为 Web 框架,MySQL 库名 weather_system,服务端口 8030,入口 manage.py,前台 /login/(123456/123456),后台 /admin/(admin/admin123)。围绕 user、weather_data、city_info 等核心表(weather_favorite 模型存在但 urls 未挂接,不作为上线功能),按 6 大模块组织了用户认证、气象数据管理、多维数据分析、地图与热力图、对比预警与趋势预测、爬虫导出与后台。爬虫脚本内置约 333 个地级市坐标,数据来自 NASA POWER 逐日点接口;分析覆盖城市/温度/湿度/辐射/风力/降水/综合/季节;趋势预测为 7 日移动平均加线性趋势外推,非 LSTM;无独立全屏数据大屏。中间件豁免 /login/、/register/、/admin/、/api/。经功能测试,主要模块运行符合预期,能够支撑教学演示与课题分析。

从模块规模看,论文第 3、4 章按上述 6 个功能模块展开;侧栏路由包括 /、/weather/list/、/analysis/*、/map/、/compare/、/warning/、/spider/ 等,形成可复现的本地化气象可视化分析方案。

6.2 展望

后续可从以下方向继续完善:对接国内实时气象接口做增量更新;对密码改为哈希存储并细化角色权限;为高频聚合增加缓存;在保持可解释性的前提下引入更严谨的时间序列模型并明确误差评估;优化移动端地图交互;将开发服务器替换为 Nginx + uWSGI/Gunicorn 以提升并发能力。若产品化需要收藏能力,应补齐路由、权限校验与界面入口后再纳入功能说明。


参考文献

[1] Django Software Foundation. Django documentation (3.2.x)[EB/OL]. https://docs.djangoproject.com/, 2021.

[2] NASA Langley Research Center. POWER Data Access Viewer[EB/OL]. https://power.larc.nasa.gov/, 2024.

[3] 王珊, 萨师煊. 数据库系统概论[M]. 5版. 北京: 高等教育出版社, 2014.

[4] Apache ECharts. ECharts 官方文档[EB/OL]. https://echarts.apache.org/zh/index.html.

[5] McKinney W. Data Structures for Statistical Computing in Python[C]//Proceedings of the 9th Python in Science Conference, 2010.

[6] 李刚. 疯狂 Python 讲义[M]. 北京: 电子工业出版社, 2019.

[7] 张浩. 基于 Web 的数据可视化系统设计与实现[J]. 计算机应用与软件, 2020.

[8] Bootstrap Team. Bootstrap Documentation[EB/OL]. https://getbootstrap.com/.

[9] 周志华. 机器学习[M]. 北京: 清华大学出版社, 2016.

[10] MySQL AB. MySQL 8.0 Reference Manual[EB/OL]. https://dev.mysql.com/doc/refman/8.0/en/.

[11] 赵十七. Python网络数据采集与项目实战[M]. 北京: 电子工业出版社, 2023.

[12] 孙十二, 钱十三. Bootstrap响应式Web开发实战[M]. 北京: 人民邮电出版社, 2022.

[13] 伊诺克森托娃. Python数据分析[M]. 北京: 人民邮电出版社, 2020.

[14] 世界气象组织. 气候服务与数据应用报告[R]. 日内瓦, 2022.

[15] 刘十八. 数据可视化分析与应用[M]. 北京: 机械工业出版社, 2022.


致谢

在毕业设计完成之际,衷心感谢指导老师在选题、需求分析、系统设计与论文撰写过程中给予的耐心指导与严格要求。感谢同学在环境搭建、功能联调与界面体验反馈方面提供的帮助。感谢 NASA POWER 公开数据与开源社区提供的 Django、ECharts、pandas、SimpleUI 等相关技术与工具,使本系统能够顺利落地。也感谢家人一直以来的理解与支持。由于水平与时间有限,系统在密码安全存储、实时数据接入与预测精度评估等方面仍有改进空间,恳请各位老师批评指正。

更多推荐