IAQI的計算工具類,根據空氣檢測濃度值計算IAQI值和空氣質量等級(pm2.5,pm10,so2,no2,co,o3)

空氣質量指數計算方法

計算公式:

空氣等級對應的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;
	}

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章