赞
踩
随着科技技术的不断发展,人民物质生活质量不断提高,我们越来越关注身边的气象、空气等地理环境。对于普通居民我们会选择合适的气象进行出游,提高精神层面的生活质量;对于企业会关注气象变换状况,来定制相关的生产计划,来提高企业生产效率并降低生成过程中由气象造成的风险损失。从社会角度我们不难看出,气象时时刻刻影响我们的规划和生活,因此我们开发一套中国气象数据可视化系统,更加直观的呈现气象状况,是有必要的。
中国气象质量大数据展示与分析系统,通过使用python爬虫技术对中国气象数据进行实时获取,然后利用相关数据清洗以及数据库处理技术存入数据库,再通过Python Web框架也就是Flask框架进线系统后台数据接口开发,通过Echarts技术进行数据分析可视化展示以及通过LayUI前端技术开发后台数据管理页面从而来完成我们最终的中国气象数据可视化系统。
开发环境 | 版本/工具 |
---|---|
PYTHON | 3.6.8 |
开发工具 | PyCharm |
操作系统 | Windows 10 |
内存要求 | 8GB 以上 |
浏览器 | Firefox (推荐)、Google Chrome (推荐)、Edge |
数据库 | MySQL 8.0 (推荐) |
数据库工具 | Navicat Premium 15 (推荐) |
项目框架 | FLASK |
本系统经过相关调研,设计了气象数据后台管理模块以及气象可视化模块。
其中气象后台数据管理模块包含功能有基础系统数的据增删改查、气象相关数据的增删改查以及气象数据网络爬虫等,气象数据网络爬虫主要通过登录系统后进行启动操作,然后系统会通过网络加载气象数据,对气象数据进行解析,再进行相应的数据处理操作,例如缺失值处理、文字数据编码等一些列操作,最终存入数据库。
数据可视化功能,则主要分为温度、空气、风力等多维度对气象数据进行视化分析处理。系统功能结构如图所示。
系统可视化
用户登录页面
用户注册页面
后台管理首页面
后台用户管理页面
后台版本管理页面
后台气象管理页面
后台气象编辑页面
后台爬虫日志管理页面
爬虫头部实现代码
class GetWeather: def __init__(self): self.baseUrl = r"" self.headers = {'Accept': "*/*", 'Accept-Encoding': 'gzip, deflate', 'Accept-Language': 'keep-alive', 'Connection': '', 'Cookie': ''.encode("utf-8").decode("latin1"), 'Host': 'd1.weather.com.cn', 'Referer': '', 'User-Agent': '', } self.loadList = [] # 格式为:列表里面的子列表都是一个省份的所有城市,子列表里所有元素都是字典,每个字典有两项 self.cityList = [] self.cityDict = {} self.result = xlwt.Workbook(encoding='utf-8', style_compression=0) self.sheet = self.result.add_sheet('result', cell_overwrite_ok=True) self.cityRow = 0 self.totalGet = 0
数据清洗存入数据库
data = json.loads(self.htmlResult.replace("var dataSK=", "")) nameen = data["nameen"] # 城市拼音 cityname = data["cityname"] # 城市名称 temp = data["temp"] # 当前温度 WD = data["WD"] # 风向 WS = data["WS"].replace("级", "") # 风力 wse = data["wse"].replace("km/h", "") # 风速 sd = data["sd"].replace("%", "") # 湿度 weather = data["weather"] # 天气 record_date = data["date"] # 时间 record_time = data["time"] # 时分 aqi = data["aqi"] # 时分 judge_sql = "select count(id) from `weather` where nameen = '" + nameen + "' and cityname='" + cityname + "' and record_date='" + record_date + "' and record_time='" + record_time + "'"; sql = "INSERT INTO `weather` VALUES (null, '" + nameen + "', '" + cityname + "', '" + record_date + "', '" + record_time + "', " + str( temp) + ", '" + WD + "', " + WS + ", " + wse + ", " + sd + ", '" + weather + "', " + aqi + ", '" + time.strftime( "%Y-%m-%d %H:%M:%S", time.localtime()) + "',0);" i = db.query_noargs(judge_sql)[0][0] if int(i) > 0: print("跳过:", judge_sql) continue update_sql = "update `weather` set is_old=1 where nameen = '" + nameen + "' and cityname='" + cityname + "'"; print("插入:", sql) count += 1 db.query_noargs(update_sql) db.query_noargs(sql)
首页城市空气质量统计
# 获取城市空气质量统计 def get_AQI_total_data(): db = dbUtil() lh_sql = "SELECT COUNT(id) FROM weather WHERE aqi<=50 AND is_old=0" zd_sql = "SELECT COUNT(id) FROM weather WHERE aqi>50 AND aqi<=100 AND is_old=0" pc_sql = "SELECT COUNT(id) FROM weather WHERE aqi>100 AND aqi<=150 AND is_old=0" c_sql = "SELECT COUNT(id) FROM weather WHERE aqi>150 AND aqi<=200 AND is_old=0" jc_sql = "SELECT COUNT(id) FROM weather WHERE aqi>200 AND aqi<=300 AND is_old=0" yd_sql = "SELECT COUNT(id) FROM weather WHERE aqi>300 AND is_old=0" lh = db.query_noargs(lh_sql)[0][0] zd = db.query_noargs(zd_sql)[0][0] pc = db.query_noargs(pc_sql)[0][0] c = db.query_noargs(c_sql)[0][0] jc = db.query_noargs(jc_sql)[0][0] yd = db.query_noargs(yd_sql)[0][0] db.close_commit() return jsonify([{"time": "良好", "value": lh, "name": "空气质量"}, {"time": "中等", "value": zd, "name": "空气质量"}, {"time": "偏差", "value": pc, "name": "空气质量"}, {"time": "较差", "value": c, "name": "空气质量"}, {"time": "极差", "value": jc, "name": "空气质量"}, {"time": "有毒", "value": yd, "name": "空气质量"}])
空气质量可视化构建
function center_kqzlfm() { $.ajax({ url: "/main/aqi", method: "get", success: function (obj) { // 基于准备好的dom,初始化echarts实例 const myChart = echarts.init(document.getElementById("kqzlfm-table")) // 指定图表的配置项 let option = {...} // 指定图表的数据 let data = obj //数据处理 开始 let xKey = "time" let yKey = "value" let sKey = "name" let seriesArr = [] let dataColumn = [] //....省略数据格式化处理太长了 option.yAxis.type = "value" option.xAxis.type = "category" option.xAxis.data = dataColumn // 数据处理完 option.series = seriesObj // 使用刚指定的配置项和数据显示图表。 myChart.setOption(option) } })}
slog表
字段名称 | 数据类型 | 是否必填 | 注释 |
---|---|---|---|
id | int | 是 | |
log | varchar(255) | 否 | |
create_time | datetime | 否 |
sys_version表
字段名称 | 数据类型 | 是否必填 | 注释 |
---|---|---|---|
id | int | 是 | 系统版本 |
sys_name | varchar(255) | 否 | 名称 |
sys_version | varchar(255) | 否 | 描述 |
user表
字段名称 | 数据类型 | 是否必填 | 注释 |
---|---|---|---|
id | int | 是 | |
name | varchar(255) | 否 | 用户名称(供应商名称) |
account | varchar(255) | 否 | 用户账号 |
password | varchar(255) | 否 | 用户密码 |
company | varchar(255) | 否 | 企业名称 |
phone | varchar(255) | 否 | 电话号码 |
varchar(255) | 否 | 邮箱 | |
type | int | 否 | 0管理员,1普通用户 |
status | int | 否 | 0禁用1启用 |
weather表
字段名称 | 数据类型 | 是否必填 | 注释 |
---|---|---|---|
id | int | 是 | |
nameen | varchar(255) | 否 | 城市拼音 |
cityname | varchar(50) | 否 | 城市名称 |
record_date | varchar(50) | 否 | 天气时间 |
record_time | varchar(50) | 否 | 实时时分 |
temp | int | 否 | 当前温度 |
wd | varchar(20) | 否 | 风向 |
ws | int | 否 | 凤力 |
wse | int | 否 | 风速 |
sd | int | 否 | 湿度 |
weather | varchar(20) | 否 | 天气 |
aqi | int | 否 | 空气质量 |
create_time | datetime | 是 | 数据创建时间 |
is_old | int | 否 | 1老数据,0新数据 |
源码、安装教程文档、项目简介文档以及其它相关文档已经上传到是云猿实战官网,可以通过下面官网进行获取项目!
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。