空氣質量指數計算方法
計算公式:
空氣等級對應的IAQI值:
工具類:(注意:算IAQI的方法分計算日數據的和小時數據的)
/**
* 計算空氣質量等級
* @author xu
*
*/
public class KqzlUtil {
/**
* 計算IAQI的值
*
* @param value
* 監測濃度值
* @param lowI
* 與lowL相對應的IAQI值
* @param highI
* 與highL相對應的IAQI值
* @param lowC
* 與監測濃度相近的污染物濃度低位值
* @param highC
* 與監測濃度相近的污染物濃度高位值
* @return (I高-I低)/(C高-C低)*(C-C低)+I低
*/
//濃度值,IAQI低,IAQI高,低值,高值
private static int IAQICal(double value, int lowI, int highI, int lowC, int highC) {
if(value<0||highI<0||lowI<0||highC<0||lowC<0){
return -99;
}
if (highC == lowC) {
return lowI;
}
double iaqi = (value - lowC) * (highI - lowI) / (highC - lowC) + lowI;
//轉int
int ret=new Double(Math.ceil(iaqi)).intValue();
return ret;
}
/**
* 計算pm2.5的IAQI
* @param value pm2.5濃度值
* @return
*/
public static int PM25IAQI(double pm25_value) {
int iaqi_pm25 =0;
// 計算pm2.5的iaqi值
if (0 <= pm25_value && pm25_value< 35) {
//濃度值,IAQI低,IAQI高,低值,高值
iaqi_pm25 = IAQICal(pm25_value,0,50,0,35); //調用函數(計算公式),同時也相當於賦值
}else if (35 <= pm25_value && pm25_value< 75) {
iaqi_pm25 = IAQICal(pm25_value,50,100,35,75); //調用函數(計算公式),同時也相當於賦值
}else if (75 <= pm25_value && pm25_value < 115){
iaqi_pm25 = IAQICal(pm25_value,100,150,75,115); //調用函數(計算公式),同時也相當於賦值
}else if (115 <= pm25_value && pm25_value < 150){
iaqi_pm25 = IAQICal(pm25_value,150,200,115,150); //調用函數(計算公式),同時也相當於賦值
} else if (150 <= pm25_value && pm25_value < 250){
iaqi_pm25 = IAQICal(pm25_value,200,300,150,250);
} else if (250 <= pm25_value && pm25_value < 350) {
iaqi_pm25 = IAQICal(pm25_value,300,400,250,350);
}else if (350 <= pm25_value && pm25_value< 500) {
iaqi_pm25 = IAQICal(pm25_value,400,500,350,500);
}else {
iaqi_pm25=-99;
}
return iaqi_pm25;
}
/**
* 計算pm10的IAQI
* @param value pm10濃度值
* @return
*/
public static int PM10IAQI(double pm10_value) {
int iaqi_pm10 =0;
// 計算pm10的iaqi值
if (0 <= pm10_value && pm10_value< 50) {
//濃度值,IAQI低,IAQI高,低值,高值
iaqi_pm10 = IAQICal(pm10_value,0,50,0,50); //調用函數(計算公式),同時也相當於賦值
}else if (50 <= pm10_value && pm10_value< 150) {
iaqi_pm10 = IAQICal(pm10_value,50,100,50,150); //調用函數(計算公式),同時也相當於賦值
}else if (150 <= pm10_value && pm10_value < 250){
iaqi_pm10 = IAQICal(pm10_value,100,150,150,250); //調用函數(計算公式),同時也相當於賦值
}else if (250 <= pm10_value && pm10_value < 350){
iaqi_pm10 = IAQICal(pm10_value,150,200,250,350); //調用函數(計算公式),同時也相當於賦值
} else if (350 <= pm10_value && pm10_value < 420){
iaqi_pm10 = IAQICal(pm10_value,200,300,350,420);
} else if (420 <= pm10_value && pm10_value < 500) {
iaqi_pm10 = IAQICal(pm10_value,300,400,420,500);
}else if (500 <= pm10_value && pm10_value< 600) {
iaqi_pm10 = IAQICal(pm10_value,400,500,500,600);
}else {
iaqi_pm10=-99;
}
return iaqi_pm10;
}
/**
* 計算co的IAQI
* @param value co濃度值(日數據)
* @return
*/
public static int COIAQI(double co_value) {
int iaqi_co =0;
// 計算co的iaqi值
if (0 <= co_value && co_value< 2) {
//濃度值,IAQI低,IAQI高,低值,高值
iaqi_co = IAQICal(co_value,0,50,0,2); //調用函數(計算公式),同時也相當於賦值
}else if (2 <= co_value && co_value< 4) {
iaqi_co = IAQICal(co_value,50,100,2,4); //調用函數(計算公式),同時也相當於賦值
}else if (4 <= co_value && co_value < 14){
iaqi_co = IAQICal(co_value,100,150,4,14); //調用函數(計算公式),同時也相當於賦值
}else if (14 <= co_value && co_value < 24){
iaqi_co = IAQICal(co_value,150,200,14,24); //調用函數(計算公式),同時也相當於賦值
} else if (24 <= co_value && co_value < 36){
iaqi_co = IAQICal(co_value,200,300,24,36);
} else if (36 <= co_value && co_value < 48) {
iaqi_co = IAQICal(co_value,300,400,36,48);
}else if (48 <= co_value && co_value< 60) {
iaqi_co = IAQICal(co_value,400,500,48,60);
}else {
iaqi_co=-99;
}
return iaqi_co;
}
/**
* 計算so2的IAQI
* @param value so2濃度值(日數據)
* @return
*/
public static int SO2IAQI(double so2_value) {
int iaqi_so2 =0;
// 計算so2的iaqi值
if (0 <= so2_value && so2_value< 50) {
//濃度值,IAQI低,IAQI高,低值,高值
iaqi_so2 = IAQICal(so2_value,0,50,0,50); //調用函數(計算公式),同時也相當於賦值
}else if (50 <= so2_value && so2_value< 150) {
iaqi_so2 = IAQICal(so2_value,50,100,50,150); //調用函數(計算公式),同時也相當於賦值
}else if (150 <= so2_value && so2_value < 475){
iaqi_so2 = IAQICal(so2_value,100,150,150,475); //調用函數(計算公式),同時也相當於賦值
}else if (475 <= so2_value && so2_value < 800){
iaqi_so2 = IAQICal(so2_value,150,200,475,800); //調用函數(計算公式),同時也相當於賦值
} else if (800 <= so2_value && so2_value < 1600){
iaqi_so2 = IAQICal(so2_value,200,300,800,1600);
} else if (1600 <= so2_value && so2_value < 2100) {
iaqi_so2 = IAQICal(so2_value,300,400,1600,2100);
}else if (2100 <= so2_value && so2_value< 2620) {
iaqi_so2 = IAQICal(so2_value,400,500,1600,2620);
}else {
iaqi_so2=-99;
}
return iaqi_so2;
}
/**
* 計算o3的IAQI
* @param value o3濃度值(日數據)
* @return
*/
public static int O3IAQI(double o3_value) {
int iaqi_03 =0;
// 計算03的iaqi值
if (0 <= o3_value && o3_value< 100) {
//濃度值,IAQI低,IAQI高,低值,高值
iaqi_03 = IAQICal(o3_value,0,50,0,100); //調用函數(計算公式),同時也相當於賦值
}else if (100 <= o3_value && o3_value< 160) {
iaqi_03 = IAQICal(o3_value,50,100,100,160); //調用函數(計算公式),同時也相當於賦值
}else if (160 <= o3_value && o3_value < 215){
iaqi_03 = IAQICal(o3_value,100,150,160,215); //調用函數(計算公式),同時也相當於賦值
}else if (215 <= o3_value && o3_value < 265){
iaqi_03 = IAQICal(o3_value,150,200,215,265); //調用函數(計算公式),同時也相當於賦值
} else if (265 <= o3_value && o3_value < 800){
iaqi_03 = IAQICal(o3_value,200,300,265,800);
} else {
iaqi_03=-99;
}
return iaqi_03;
}
/**
* 計算no2的IAQI
* @param value no2濃度值(日數據)
* @return
*/
public static int no2IAQI(double no2_value) {
int iaqi_no2 =0;
// 計算no2的iaqi值
if (0 <= no2_value && no2_value< 40) {
//濃度值,IAQI低,IAQI高,低值,高值
iaqi_no2 = IAQICal(no2_value,0,50,0,40); //調用函數(計算公式),同時也相當於賦值
}else if (40 <= no2_value && no2_value< 80) {
iaqi_no2 = IAQICal(no2_value,50,100,40,80); //調用函數(計算公式),同時也相當於賦值
}else if (80 <= no2_value && no2_value < 180){
iaqi_no2 = IAQICal(no2_value,100,150,80,180); //調用函數(計算公式),同時也相當於賦值
}else if (180 <= no2_value && no2_value < 280){
iaqi_no2 = IAQICal(no2_value,150,200,180,280); //調用函數(計算公式),同時也相當於賦值
} else if (280 <= no2_value && no2_value < 565){
iaqi_no2 = IAQICal(no2_value,200,300,280,565);
}else if (565 <= no2_value && no2_value < 754){
iaqi_no2 = IAQICal(no2_value,300,400,565,754); //調用函數(計算公式),同時也相當於賦值
} else if (754 <= no2_value && no2_value < 940){
iaqi_no2 = IAQICal(no2_value,400,500,754,940);
} else {
iaqi_no2=-99;
}
return iaqi_no2;
}
//------------------------空氣質量小時數據計算
/**
* 計算co的IAQI
* @param value co濃度值(小時數據)
* @return
*/
public static int COIAQI1(double co_value) {
int iaqi_co =0;
// 計算co的iaqi值
if (0 <= co_value && co_value< 5) {
//濃度值,IAQI低,IAQI高,低值,高值
iaqi_co = IAQICal(co_value,0,50,0,5); //調用函數(計算公式),同時也相當於賦值
}else if (5 <= co_value && co_value< 10) {
iaqi_co = IAQICal(co_value,50,100,5,10); //調用函數(計算公式),同時也相當於賦值
}else if (10 <= co_value && co_value < 35){
iaqi_co = IAQICal(co_value,100,150,10,35); //調用函數(計算公式),同時也相當於賦值
}else if (35 <= co_value && co_value < 60){
iaqi_co = IAQICal(co_value,150,200,35,60); //調用函數(計算公式),同時也相當於賦值
} else if (60 <= co_value && co_value < 90){
iaqi_co = IAQICal(co_value,200,300,60,90);
} else if (90 <= co_value && co_value < 120) {
iaqi_co = IAQICal(co_value,300,400,90,120);
}else if (120 <= co_value && co_value< 150) {
iaqi_co = IAQICal(co_value,400,500,120,150);
}else {
iaqi_co=-99;
}
return iaqi_co;
}
/**
* 計算so2的IAQI
* @param value so2濃度值(小時數據)
* @return
*/
public static int SO2IAQI1(double so2_value) {
int iaqi_so2 =0;
// 計算so2的iaqi值
if (0 <= so2_value && so2_value< 150) {
//濃度值,IAQI低,IAQI高,低值,高值
iaqi_so2 = IAQICal(so2_value,0,50,0,150); //調用函數(計算公式),同時也相當於賦值
}else if (150 <= so2_value && so2_value< 500) {
iaqi_so2 = IAQICal(so2_value,50,100,150,500); //調用函數(計算公式),同時也相當於賦值
}else if (500 <= so2_value && so2_value < 650){
iaqi_so2 = IAQICal(so2_value,100,150,500,650); //調用函數(計算公式),同時也相當於賦值
}else if (650 <= so2_value && so2_value < 800){
iaqi_so2 = IAQICal(so2_value,150,200,650,800); //調用函數(計算公式),同時也相當於賦值
} else {
iaqi_so2=-99;
}
return iaqi_so2;
}
/**
* 計算o3的IAQI
* @param value o3濃度值(小時數據)
* @return
*/
public static int O3IAQI1(double o3_value) {
int iaqi_03 =0;
// 計算03的iaqi值
if (0 <= o3_value && o3_value< 160) {
//濃度值,IAQI低,IAQI高,低值,高值
iaqi_03 = IAQICal(o3_value,0,50,0,160); //調用函數(計算公式),同時也相當於賦值
}else if (160 <= o3_value && o3_value< 200) {
iaqi_03 = IAQICal(o3_value,50,100,160,200); //調用函數(計算公式),同時也相當於賦值
}else if (200 <= o3_value && o3_value < 300){
iaqi_03 = IAQICal(o3_value,100,150,200,300); //調用函數(計算公式),同時也相當於賦值
}else if (300 <= o3_value && o3_value < 400){
iaqi_03 = IAQICal(o3_value,150,200,300,400); //調用函數(計算公式),同時也相當於賦值
} else if (400 <= o3_value && o3_value < 800){
iaqi_03 = IAQICal(o3_value,200,300,400,800);
}else if (800 <= o3_value && o3_value < 1000){
iaqi_03 = IAQICal(o3_value,300,400,800,1000); //調用函數(計算公式),同時也相當於賦值
} else if (1000 <= o3_value && o3_value < 1200){
iaqi_03 = IAQICal(o3_value,400,500,1000,1200);
} else {
iaqi_03=-99;
}
return iaqi_03;
}
/**
* 計算no2的IAQI
* @param value no2濃度值(小時數據)
* @return
*/
public static int no2IAQI1(double no2_value) {
int iaqi_no2 =0;
// 計算no2的iaqi值
if (0 <= no2_value && no2_value< 100) {
//濃度值,IAQI低,IAQI高,低值,高值
iaqi_no2 = IAQICal(no2_value,0,50,0,100); //調用函數(計算公式),同時也相當於賦值
}else if (100 <= no2_value && no2_value< 200) {
iaqi_no2 = IAQICal(no2_value,50,100,100,200); //調用函數(計算公式),同時也相當於賦值
}else if (200 <= no2_value && no2_value < 700){
iaqi_no2 = IAQICal(no2_value,100,150,200,700); //調用函數(計算公式),同時也相當於賦值
}else if (700 <= no2_value && no2_value < 1200){
iaqi_no2 = IAQICal(no2_value,150,200,700,1200); //調用函數(計算公式),同時也相當於賦值
} else if (1200 <= no2_value && no2_value < 2340){
iaqi_no2 = IAQICal(no2_value,200,300,1200,2340);
}else if (2340 <= no2_value && no2_value < 3090){
iaqi_no2 = IAQICal(no2_value,300,400,2340,3090); //調用函數(計算公式),同時也相當於賦值
} else if (3090 <= no2_value && no2_value < 3840){
iaqi_no2 = IAQICal(no2_value,400,500,3090,3840);
} else {
iaqi_no2=-99;
}
return iaqi_no2;
}
/**
* 根據IAQI計算空氣質量等級
* 一級,優
* 二級,良
* 三級,輕度污染
* 四級,中度污染
* 五級,重度污染
* 六級,嚴重污染
* @param value IAQI值
* @return 1-6對應空氣質量一級到六級
*/
public static int kqzldj(int value) {
int dj=0;
if(0<=value && value<=50) {
dj=1;
}else if(51<=value && value<=100) {
dj=2;
}else if(101<=value && value<=150) {
dj=3;
}else if(151<=value && value<=200) {
dj=4;
}else if(201<=value && value<=300) {
dj=5;
}else if(value<300) {
dj=6;
}else{
// 有的數據可能數-99
//-99代表數字超出計算範圍了,應該作廢的,我這裏不做其他處理直接6級
dj=6;
}
return dj;
}