为了形象的将全国或局部地区各地区的空气质量表达出来,我们可以根据选择切换日期和污染物种类,使用Echarts的地图图表来根据污染级别(可以为空气质量指数AQI,也可以为某项污染物)来开发全国或局部地区的专题地图。
近些年随着国家对环境保护的重视以及人们对生活居住环境的关注,相信大家都看到或听过空气质量等级(优,良,轻度污染,中度污染,重度污染,严重污染),以及空气质量指数(AQI)这个词汇。了解当前某个地方的气象信息时,除了天气情况,温湿度,降水外也会显示空气质量等级(优,良,轻度污染,中度污染,重度污染,严重污染)。如下两张图:空气质量等级是根据空气质量指数(AQI)计算而来,而空气质量指数(AQI)是根据PM2.5(细颗粒物),PM10(可吸入颗粒物),SO2(二氧化硫),NO2(二氧化硫),O3(臭氧),CO(一氧化碳)六项空气污染物的浓度综合计算。
我们在前端浏览器尝试使用JavaScript来按照上面两张表的数值范围标准生成测试数据,这里我们主要使用underscore.js的random和sortedIndex函数。注意:监测污染物可能会有多个(24小时平均值,1小时平均值,8小时平均值)评价项目。
步骤如下:
- 使用_.random(0,maxValue)生成某项污染物的浓度,maxValue表示生成的数不超过此值。比如对于二氧化硫(SO2)24小时平均值使用_.random(1,1000)得到523计算结果。
2.根据分指数对应关系,使用下面公式计算各污染评价项目的空气质量分指数(IAQI),比如上面SO2(二氧化硫)24小时平均值值为523计算如下:((200-150)/(800-475))*(523-475) 150=157.38
注意:如果SO2_1h(二氧化硫1小时平均)>800mg/m³,不参与最后计算。如果O3_8h(臭氧8小时平均)>800mg/m³,不参与最后计算。
同时如果是日报,SO2_1h(二氧化硫1小时平均),NO2_1h(二氧化氮1小时平均)),CO_1h(一氧化碳1小时平均),不参与最后计算。
3.按照1,2步骤计算每一项评价项目(SO2_24h(二氧化硫24小时平均),SO2_1h(二氧化硫1小时平均)(根据浓度值判断是否参与最后计算,日报不参与计算),NO2_24h(二氧化氮24小时平均),NO2_1h(二氧化氮1小时平均)(日报不参与计算),PM10_24h(可吸入颗粒物24小时平均),PM25_24(细颗粒物24小时平均),CO_24h(一氧化碳24小时平均),CO_1h(一氧化碳1小时平均)(,日报不参与计算),O3_8h(臭氧8小时平均)(根据浓度值判断是否参与最后计算),O3_1h(臭氧1小时平均))
4.最后取各项因子分指数里最大的分指数为最后的空气质量指数(AQI)
简言之,AQI就是各项污染物的空气质量分指数(IAQI)中的最大值,当AQI大于50时,IAQI最大的污染物为首要污染物,若IAQI最大的污染物为两项或两项以上时,并列为首要污染物。IAQI大于100的污染物为超标污染物。
JS代码如下:
代码语言:javascript复制//核心函数,根据各项污染物浓度值,计算它们的空气质量分指数,以及最终AQI,以及主要污染因子(可为多个)
function calcIAQI(data,type){
var dictRange={
'SO2_24h':[0,50,150,475,800,1600,2100,2620],
'SO2_1h':[0,150,500,650,800],
'NO2_24h':[0,40,80,180,280,565,750,940],
'NO2_1h':[0,100,200,700,1200,2340,3090,3840],
'PM10_24h':[0,50,150,250,350,420,500,600],
'CO_24h':[0,2,4,14,24,36,48,60],
'CO_1h':[0,5,10,35,60,90,120,150],
'O3_1h':[0,160,200,300,400,800,1000,1200],
'O3_8h':[0,100,160,215,265,800],
'PM25_24h':[0,35,75,115,150,250,350,500],
'IAQI':[0,50,100,150,200,300,400,500]};
var arrayIAQI=dictRange['IAQI'];
var dictIAQI=_.object(_.map(data,(v,k)=>{
var array=dictRange[k];
var index=_.sortedIndex(array,v);
var IAQI=
((arrayIAQI[index]-arrayIAQI[index-1])/(array[index]-array[index-1]))*(v-array[index-1]) arrayIAQI[index-1]
return [k,parseFloat(IAQI.toFixed(2))];
}))
if(data['SO2_1h']>800){
dictIAQI=_.omit(dictIAQI,'SO2_1h')
}
if(data['O3_8h']>800){
dictIAQI=_.omit(dictIAQI,'O3_8h')
}
AQI=_.max(dictIAQI,(x,i)=>x);
if(type=='day'){
dictIAQI=_.omit(dictIAQI,'SO2_1h','NO2_1h','CO_1h');
}
primarys=[]
if(AQI>50){
var primaryItem=_.sortBy(_.pairs(dictIAQI),(x,i)=>-x[1])[0];
var primaryFactor=primaryItem[0];
var primaryValue=primaryItem[1];
primarys=_.findKey(dictIAQI,(v,k)=>(v>=primaryValue));
}
var levelRange=[50,100,150,200,300]
var levelIndex=_.sortedIndex(levelRange,AQI);
var levels = ["优", "良", "轻度", "中度", "重度", "严重"];
var level=levels[levelIndex]
return {'dictIAQI':dictIAQI,'AQI':AQI,'primarys':primarys,'level':level}
}
//假设一组数据
var data={"SO2_24h":148,"SO2_1h":328,"NO2_24h":106,"NO2_1h":262,"PM10_24h":408,"CO_24h":54,"CO_1h":27,"O3_1h":38,"O3_8h":46,"PM25_24h":287}
var result=calcAQI(data,'hour');
//计算小时结果,有各项空气质量分指数(IAQI),空气质量指数(AQI),首要污染物(可为多个),以及空气污染等级
//{"dictIAQI":{"SO2_24h":99,"SO2_1h":75.43,"NO2_24h":113,"NO2_1h":106.2,"PM10_24h":282.86,"CO_24h":450,"CO_1h":134,"O3_1h":11.88,"O3_8h":23,"PM25_24h":337},"AQI":450,"primarys":"CO_24h","level":"严重"}
var result=calcAQI(data,'day');
//计算日结果,有各项空气质量分指数(IAQI),空气质量指数(AQI),首要污染物(可为多个),以及空气污染等级
//{"dictIAQI":{"SO2_24h":99,"NO2_24h":113,"PM10_24h":282.86,"CO_24h":450,"O3_1h":11.88,"O3_8h":23,"PM25_24h":337},"AQI":450,"primarys":"CO_24h","level":"严重"}