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;
	}

  • 10
    点赞
  • 57
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
以下是Python实现的计算AQI的代码: ```python def calc_aqi(pm10, o3, so2, pm25, no2, co): # 定义空气质量分指数的分段划分和对应的污染级别 aqi_boundaries = [ (0, 50, '优'), (51, 100, '良'), (101, 150, '轻度污染'), (151, 200, '中度污染'), (201, 300, '重度污染'), (301, 500, '严重污染') ] # 计算每种污染物的IAQI iaqi_pm10 = calc_iaqi(pm10, 100, 0, 50, 100) iaqi_o3 = calc_iaqi(o3, 160, 0, 50, 100, 150, 200, 300, 400) iaqi_so2 = calc_iaqi(so2, 800, 0, 50, 150, 475, 800, 1600, 2100) iaqi_pm25 = calc_iaqi(pm25, 75, 0, 35, 75, 115, 150, 250, 350) iaqi_no2 = calc_iaqi(no2, 200, 0, 40, 80, 180, 280, 565, 750) iaqi_co = calc_iaqi(co, 50, 0, 2, 4, 14, 24, 36, 48) # 取六种IAQI的最大作为AQI iaqi_list = [iaqi_pm10, iaqi_o3, iaqi_so2, iaqi_pm25, iaqi_no2, iaqi_co] aqi = max(iaqi_list) # 根据AQI的,确定污染级别和建议采取的措施 for low, high, level in aqi_boundaries: if low <= aqi <= high: suggestion = get_suggestion(level) break return aqi, suggestion def calc_iaqi(cp, ih, il, bp, bl, bh, cl, ch, dl): """计算单个污染物的IAQI""" if bp <= cp < bl: iaqi = (ih - il) / (bl - bp) * (cp - bp) + il elif bl <= cp < bh: iaqi = (ch - cl) / (bh - bl) * (cp - bl) + cl elif bh <= cp < ih: iaqi = (dh - ch) / (ih - bh) * (cp - bh) + ch else: iaqi = 0 return iaqi def get_suggestion(level): """根据污染级别返回建议采取的措施""" if level == '优': return '吸氧,多喝水' elif level == '良': return '出门戴口罩,减少户外活动' elif level == '轻度污染': return '减少户外活动,出门戴口罩' elif level == '中度污染': return '不要进行剧烈的户外活动,出门戴口罩' elif level == '重度污染': return '尽量不要外出,必要时戴口罩' else: return '停课停工,尽量不要外出' ``` 其中,`calc_aqi()`函数接受六个参数,分别是PM10O3SO2PM2.5、NO2、CO的浓度,返回AQI和建议采取的措施。`calc_iaqi()`函数用于计算单个污染物的IAQI,`get_suggestion()`函数用于根据污染级别返回建议采取的措施。具体的污染级别划分和IAQI计算方法参考国家环境保护局发布的《环境空气质量标准》。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值