校园空气质量监测系统的设计与实现*

2022-04-22 06:45张敬环张志东
山西电子技术 2022年2期
关键词:计算公式空气质量可视化

张敬环,张志东,刘 鑫

(山西工程技术学院,山西 阳泉 045097)

随着经济的发展和生活水平的提高,空气质量受到人们前所未有的关注。为了实时监测我校的空气质量,通过部署的传感器每隔五分钟传输一次空气中各个污染物的含量数据至精简云储存,其中主要包括温度、湿度、PM2.5、PM10、NO2、O3、SO2、CO。通过在Python中引入Selenium库虚拟登录的方式从精简云平台爬取这些数据,并将数据存入MySQL数据库中,然后利用PySpark连接数据库使用SparkSQL对总数据进行分析及拆分,最后用ECHarts将分析后的数据进行可视化,为我校师生提供全面、准确、及时的出行建议与预警。系统设计流程图如图1所示。

图1 系统设计流程

1 利用Selenium进行数据获取

首先,在我校选取测试点部署无线传感器并接入精讯云平台http://www.sennor.net。精讯云是一款通用性的物联网云平台,部署在腾讯云服务器上,可以实现全球任意地方都快速访问与接入[1]。在Python中使用Selenium库模拟人为使用浏览器的行为,访问与传感器关联的精讯云账户,再通过模拟点击的方式在云平台中找到所需的数据进行爬取。并将爬取到的数据存入Mysql数据库中的“jilu”表中。

表1 jilu表结构

2 AQI值计算

空气质量监测的传感器收集的是各个空气污染物在空气中的含量,并不能很直观客观地表现出空气质量的好坏,根据国家制定的《环境空气质量标准》(AQI分级计算参考标准GB 3095—2012),构造AQI计算函数计算出各污染物的AQI并与爬取到的原始数据一同存入数据库中的总数据表中,即表1中的字段aqi。与污染物浓度相对应的空气质量分指数计算公式见(1)式。

(1)

由于计算每个污染物对应的IAQI时所用到的计算公式是同一个,所以本系统为简化计算复杂度故将计算公式封装为一个计算函数。主要代码如下:

def js_iaqi(iaqi_lo, iaqi_hi, bp_lo, bp_hi, cp):

iaqi = (iaqi_hi - iaqi_lo) * (cp - bp_lo) / (bp_hi - bp_lo) + iaqi_lo

#代码化计算公式

return iaqi

由于计算单个污染物对应的AQI时所用到的浓度对应标准是不同的,所以对每个污染物的计算IAQI函数均为单独制作并引入相同的计算公式,无法同计算公式一样封装至同一个函数中。主要代码如下:

def js_pm10_iaqi_24h(pm10):

if 0 <= pm10 < 50:

pm10_iaqi = js_iaqi(0,50,0,50,pm10) #各浓度对应参数

elif 50 <= pm10 <100:

pm10_iaqi = js_iaqi(50,100,50,150,pm10)

elif 100 <= pm10 <150:

pm10_iaqi = js_iaqi(100,150,150,250,pm10)

elif 150 <= pm10 <200:

pm10_iaqi = js_iaqi(150,200,250,350,pm10)

elif 200 <= pm10 <300:

pm10_iaqi = js_iaqi(200,300,350,420,pm10)

elif 300 <= pm10 <400:

pm10_iaqi = js_iaqi(300,400,420,500,pm10)

elif 400 <= pm10 <500:

pm10_iaqi = js_iaqi(400,500,500,600,pm10)

elif pm10 < 0:

return -1

else:

pass

return pm10_iaqi #返回该污染物对应IAQI

3 数据拆分

由于空气质量监测系统的传感器每五分钟就会收集并传输一次数据,数据增长速度非常快,后期数据量会越来越大,如果每次都从数据库中的总数据表来进行数据分析的话分析效率会非常低,因此将总的数量庞大的数据进行提前拆分,依据需求分割成不同的表。

1) 时AQI表(表2:hour_aqi)——该表为数据总表里提取出每小时AQI的最高值,并记录该时间与AQI值存入时AQI表中;

2) 日AQI表(表3:day_aqi)——该表为数据总表中提取出每天AQI的最大值,作为当天的AQI的值,并记录下来存入日AQI表中;

3) 月AQI表(表4:month_aqi)——该表为数据总表中提取出每月AQI的最大值,作为该月的AQI的值,并记录下来存入月AQI表中。

表2 hour_aqi表结构

表3 day_aqi表结构

表4 month_aqi表结构

将计算得到的各个IAQI计算出最大值作为AQI并返回[2]。主要代码如下:

def aqi(l):

pm10_iaqi_24h = js_pm10_iaqi_24h(float(l[6]))

pm2_iaqi_24h = js_pm2_iaqi_24h(float(l[5]))

no2_iaqi_24h = js_no2_iaqi_24h(float(l[7]))

so2_iaqi_24h = js_so2_iaqi_24h(float(l[9]))

o3_iaqi_8h = js_o3_iaqi_8h(float(l[8]))

co_iaqi_24h =js_co_iaqi_24h(float(l[10]))

AQI = max(so2_iaqi_24h, no2_iaqi_24h, pm10_iaqi_24h, co_iaqi_24h, o3_iaqi_8h, pm2_iaqi_24h)

return AQI

4 数据提取

本系统的数据提取是通过在Python文件中引入os库、sys库、pyspark库来实现的。通过pyspark连接MySQL数据库中的某个表[3],建立一个临时表,在这个临时表中通过sparkSQL来运行编写好的sql语句。主要代码如下:

df=sqlContext.read.format("jdbc").options(url="jdbc:mysql://localhost:3306/air?user=root&password=123456789",dbtable="jilu").load()

df.registerTempTable("jilu") #连接jilu表创建临时表

df_day=sqlContext.read.format("jdbc").options(url="jdbc:mysql://localhost:3306/air?user=root&password=123456789",dbtable="day_aqi").load()

df_day.registerTempTable("day_aqi") #连接day_aqi表创建临时表

sql_day = "insert into day_aqi select * from (select riqi,shebei ,max(aqi) from jilu where riqi not in (select riqi from day_aqi) group by riqi,shebei) rq"

ls_day = sqlContext.sql(sql_day).collect() #执行sql语句

5 数据可视化

空气质量监测系统可视化采用了flask框架,app.route(‘/’)设置默认路径所执行的函数,本系统中通过render_template("main.html")将执行函数后的页面跳转至本系统的主页。利用Ajax技术设置了可视化页面的异步更新,以保证数据的时效性和准确性。运用ECHarts技术绘制各种可视化图表,方便进行各种数据的可视化显示。可视化大屏如图2所示。

图2 空气质量监测可视化大屏

6 结论

本系统综合运用了网络爬虫、MySQL、Spark、Ajax、ECharts等技术[4],将山西工程技术学院的空气质量状况直观地展示给我校师生。实现了我校实时AQI值显示、24小时AQI值变化趋势,每月AQI等级天数的统计、历年AQI值变化趋势等的可视化展示,从而获得一个良好的出行建议。还可以通过观测主要污染物的实时监测图,得出影响AQI的主要因素,进而采取有针对性的环保措施。

猜你喜欢
计算公式空气质量可视化
基于CiteSpace的足三里穴研究可视化分析
电机温升计算公式的推导和应用
自然资源可视化决策系统
思维可视化
自然资源可视化决策系统
谈拟柱体的体积
车内空气质量标准进展
重视车内空气质量工作 制造更环保、更清洁、更健康的汽车
多功能空气质量远程检测仪
微分在近似计算中的应用