【计算】空气质量综合指数+空气质量指数

目录

1.空气质量指数

2.空气质量综合指数


1.空气质量指数

        空气质量指数,综合表示空气污染程度或空气质量等级的无量纲的相对数值。

        根据网络上的文档资料:来源为百度文库

import java.lang.reflect.Field;
import java.math.BigDecimal;
import java.util.HashMap;
import java.util.Map;

/**
 * 计算aqi
 * 分为计算日aqi和实时(小时)aqi
 * 
 * @author Winy
 *
 */
public class ComputeAQIUtil {
	
	
	public static Float comAQI(Map<String, Object> map,Boolean isDay) {
		Float aqi = 0f;
		Float iaqi = 0f;
		if (map.get("pm10") != null&&(Float)map.get("pm10") >0)
			iaqi = getPM10IAQI((Float) map.get("pm10"));
//		System.out.println("pm10iaqi:"+iaqi);
		if (iaqi > aqi)
			aqi = iaqi;
		if (map.get("pm25") != null&&(Float)map.get("pm25")>0)
			iaqi = getPM25IAQI((Float) map.get("pm25"));
//		System.out.println("pm25iaqi:"+iaqi);
		if (iaqi > aqi)
			aqi = iaqi;
		if (map.get("no2") != null&&(Float)map.get("no2")>0)
			iaqi = getNO2IAQI((Float) map.get("no2"),isDay);
//		System.out.println("no2iaqi:"+iaqi);
		if (iaqi > aqi)
			aqi = iaqi;
		if (map.get("so2") != null&&(Float)map.get("so2")>0)
			iaqi = getSO2IAQI((Float) map.get("so2"),isDay);
//		System.out.println("so2iaqi:"+iaqi);
		if (iaqi > aqi)
			aqi = iaqi;
		if (map.get("co") != null&&(Float)map.get("co")>0)
			iaqi = getCOIAQI((Float) map.get("co"),isDay);
//		System.out.println("coiaqi:"+iaqi);
		if (iaqi > aqi)
			aqi = iaqi;
		if (map.get("o3") != null&&(Float)map.get("o3")>0)
			iaqi = getO3IAQI((Float) map.get("o3"),isDay);
//		System.out.println("o3iaqi:"+iaqi);
		if (iaqi > aqi)
			aqi = iaqi;
		return aqi;
	}
	
	/**
	 * 计算每种污染物项目 P的空气质量分指数
	 * 
	 * @param cp
	 *            污染物项目P的质量浓度
	 * @param r
	 *            污染物项目P所在数组中的行号
	 * @return
	 */
	public static float countPerIaqi(float cp, int r) {
		double bph = 0; // 与 cp相近的污染物浓度限值的高位值
		double bpl = 0; // 与 cp相近的污染物浓度限值的低位值
		double iaqih = 0; // 与 bph对应的空气质量分指数
		double iaqil = 0; // 与 bpl对应的空气质量分指数
		double iaqip = 0; // 当前污染物项目P的空气质量分指数
		// 空气质量分指数及对应的污染物项目浓度限值
		int[][] aqiArr = { { 0, 50, 150, 250, 350, 420, 500,600 }, //pm10  0
											{ 0, 35, 75, 115, 150, 250, 350, 500 },//pm25  1
											{ 0, 50, 150, 475, 800, 1600, 2100, 2620 }, //so2_day  2
											{ 0, 40, 80, 180, 280,565,750, 940},//no2_day  3
											{ 0,160,200,300,400,800,1000,1200 },//o3_day  4
											{ 0, 2,4,14,24,36,48 },//co_day  5
											{0,150,500,650,800},//so2_hour  6
											{0,100,200,700,1200,2340,3090,3840},//no2_hour   7
											{0,5,10,35,60,90,120,150},//co_hour  8
											{ 0, 50, 150, 475, 800, 1600, 2100, 2620 } //o3_hour	9
											};
		
		int[] iaqi = { 0, 50, 100, 150, 200, 300,400,500 };
		
 
		double min = aqiArr[r][0];
		int index= aqiArr[r].length-1;
		double max = aqiArr[r][index];
		if (cp<=min || cp>=max){
			return 0;
		}else {
			// 对每种污染物的bph、bpl、iaqih、iaqil进行赋值
			for (int i = r; i < r + 1; i++) {
				for (int j = 0; j < aqiArr[0].length; j++) {
					if (cp < aqiArr[i][j]) {
						bph = aqiArr[i][j];
						bpl = aqiArr[i][j - 1];
						iaqih = iaqi[j];
						iaqil = iaqi[j - 1];
						break;
					}
				}
			}
			// 计算污染物项目 P的空气质量分指数
			iaqip = (iaqih - iaqil) / (bph - bpl) * (cp - bpl) + iaqil;
			BigDecimal bg = new BigDecimal(Math.ceil(iaqip));
			float f1 = bg.setScale(0, BigDecimal.ROUND_HALF_UP).floatValue();
			return f1;
		}
	}

	/**
	 * object转map
	 * 
	 * @throws IllegalAccessException
	 * @throws IllegalArgumentException
	 */
	public static Map<String, Object> objectToMap(Object obj) throws IllegalArgumentException, IllegalAccessException {
		if (obj == null) {
			return null;
		}
		Map<String, Object> map = new HashMap<String, Object>();
		Field[] declaredFields = obj.getClass().getDeclaredFields();
		for (Field field : declaredFields) {
			field.setAccessible(true);
			map.put(field.getName(), field.get(obj));
		}
		return map;
	}

	/** 直接传入数据实体获取aqi */
	public static Float getAQI(Object obj,Boolean isDay) {
		if(isDay==null)
			isDay=false;
		if (obj == null)
			return null;
		try {
			return comAQI(objectToMap(obj),isDay);
		} catch (IllegalArgumentException e) {
			e.printStackTrace();
		} catch (IllegalAccessException e) {
			e.printStackTrace();
		}
		return 0f;
	}
	
	/** 计算iaqi */
	public static Float getIaqi(String param, Object obj,Boolean isDay) {
		if(isDay==null)
			isDay=false;
		if (obj == null)
			return null;
		Float iaqi=0f;
		try {
			Map<String, Object> map = objectToMap(obj);
			switch (param) {
			case "so2":
				iaqi=getSO2IAQI((Float)map.get(param),isDay);
				break;
			case "no2":
				iaqi=getNO2IAQI((Float)map.get(param),isDay);
				break;
			case "pm10":
				iaqi=getPM10IAQI((Float)map.get(param));
				break;
			case "pm25":
				iaqi=getPM25IAQI((Float)map.get(param));
				break;
			case "co":
				iaqi=getCOIAQI((Float)map.get(param),isDay);
				break;
			case "o3":
				iaqi=getO3IAQI((Float)map.get(param),isDay);
				break;
			default:
				iaqi=0f;
				break;
			}
		} catch (IllegalArgumentException e) {
			e.printStackTrace();
		} catch (IllegalAccessException e) {
			e.printStackTrace();
		}

		return iaqi;
	}
	
	private static Float getCOIAQI(Float f, Boolean isDay) {
		if(isDay) 
			return countPerIaqi(f, 5);
		else
			return countPerIaqi(f, 8);
	}

	private static Float getPM25IAQI(Float f) {
			return countPerIaqi(f, 1);
	}

	private static Float getPM10IAQI(Float f) {
			return countPerIaqi(f, 0);
	}

	private static Float getNO2IAQI(Float f, Boolean isDay) {
		if(isDay) 
			return countPerIaqi(f, 3);
		else
			return countPerIaqi(f, 7);
	}

	private static Float getSO2IAQI(Float f, Boolean isDay) {
		if(isDay) 
			return countPerIaqi(f, 2);
		else
			return countPerIaqi(f, 6);
	}

	private static Float getO3IAQI(Float f, Boolean isDay) {
		if(isDay) 
			return countPerIaqi(f, 4);
		else
			return countPerIaqi(f, 9);
	}

	/**获取首要污染物*/
	public static String getMainPollution(Object bean,Boolean isDay) {
		if(isDay==null)
			isDay=false;
		Float aqi = 0f;
		Float iaqi = 0f;
		String mian= "";
		try {
			Map<String,Object> map = objectToMap(bean);
			if (map.get("pm10") != null) {
				iaqi = getPM10IAQI((Float) map.get("pm10"));
				if (iaqi > aqi) {
					aqi = iaqi;
					mian="pm10";
				}
			}
			if (map.get("pm25") != null) {
				iaqi = getPM25IAQI((Float) map.get("pm25"));
				if (iaqi > aqi) {
					aqi = iaqi;
					mian="pm2.5";
				}
			}
			if (map.get("no2") != null) {
				iaqi = getNO2IAQI((Float) map.get("no2"),isDay);
				if (iaqi > aqi) {
					aqi = iaqi;
					mian = "no2";
				}
			}
			if (map.get("so2") != null) {
				iaqi = getSO2IAQI((Float) map.get("so2"),isDay);
				if (iaqi > aqi) {
					aqi = iaqi;
					mian = "so2";
				}
			}
			if (map.get("co") != null) {
				iaqi = getCOIAQI((Float) map.get("co"),isDay);
				if (iaqi > aqi) {
					aqi = iaqi;
					mian = "co";
				}
			}
			if (map.get("o3") != null) {
				iaqi = getO3IAQI((Float) map.get("o3"),isDay);
				if (iaqi > aqi) {
					aqi = iaqi;
					mian = "o3";
				}
			}
		} catch (Exception e) {
		} 
		return mian.length()==0?null:mian;
	}
	
	
	
	  /** 计算iaqi */
		public static Map<String, Object> getIaqi(Map<String, Object> map,Boolean isDay) {
			if(isDay==null)
				isDay=false;
			if (map.get("pm10") != null&&(Float)map.get("pm10") >0 && map.containsKey("pm10IAQI"))
				 map.put("pm10IAQI", getPM10IAQI((Float) map.get("pm10")));
			if (map.get("pm25") != null&&(Float)map.get("pm25")>0 && map.containsKey("pm25IAQI"))
				 map.put("pm25IAQI", getPM25IAQI((Float) map.get("pm25")));
			if (map.get("no2") != null&&(Float)map.get("no2")>0 && map.containsKey("no2IAQI"))
				 map.put("no2IAQI", getNO2IAQI((Float) map.get("no2"),isDay));
			if (map.get("so2") != null&&(Float)map.get("so2")>0 && map.containsKey("so2IAQI"))
				 map.put("so2IAQI", getSO2IAQI((Float) map.get("so2"),isDay));
			if (map.get("co") != null&&(Float)map.get("co")>0 && map.containsKey("coIAQI"))
				 map.put("coIAQI", getCOIAQI((Float) map.get("co"),isDay));
			if (map.get("o3") != null&&(Float)map.get("o3")>0 && map.containsKey("o3IAQI"))
				 map.put("o3IAQI", getO3IAQI((Float) map.get("o3"),isDay));
			return map;
		}
		
		/**
		 * 获取AQI 和分指数
		 * 要求对象中有参数分指数且一一对应
		 * @return 返回实体对象
		 */
		public static Object getAQIAndIAqi(Object obj,Boolean isDay) {
			if (obj == null)
				return null;
			try {
				Map<String, Object> map = new HashMap<String, Object>();
				map = getIaqi(MapObjectUtils.objectToMap(obj),isDay);
				map.put("aqi", comAQI(MapObjectUtils.objectToMap(obj),isDay));
				return MapObjectUtils.mapToObject(map,obj);
			} catch (IllegalArgumentException e) {
				e.printStackTrace();
			} catch (IllegalAccessException e) {
				e.printStackTrace();
			}
			return null;
			
		}
		
		/** 直接传入数据实体获取aqi */
		public static Float getAQI(Object obj) {
			if (obj == null)
				return null;
			try {
				return comAQI(objectToMap(obj),true);
			} catch (IllegalArgumentException e) {
				e.printStackTrace();
			} catch (IllegalAccessException e) {
				e.printStackTrace();
			}
			return 0f;
		}

}

2.空气质量综合指数

        基本信息空气质量综合指数,亦可称环境空气质量综合指数,是描述城市环境空气质量综合状况的无量纲指数,综合考虑了《环境空气质量指数(AQI)技术规定(试行)》(HJ633-2012)中规定的:SO₂、NO₂、PMPM、CO、O₃等六种污染物污染程度,空气质量综合指数值越大表明综合污染程度越重。《百度百科》

import java.lang.reflect.Field;
import java.util.HashMap;
import java.util.Map;

/**
 * 综合指数计算
 *
 *
 * @author Winy
 * @version 1.0
 * 附件1:综合指数计算公式=PM2.5/35+PM10/70+SO2/60+NO2/40+CO/4+O3/160
 * 序号		污染物指数	日排名取值			月排名取值                       年
 * 1		PM2.5		日平均值				月平均值                         年均值 第95百    分位数
 * 2		PM10		日平均值				月平均值                         年均值 第95百分位数
 * 3		SO2			日平均值				月平均值                         年均值 第98百分位数
 * 4		NO2			日平均值				月平均值                         年均值 第98百分位数
 * 5		CO			日平均值				月第95百分比                     年均值 第95百分位数
 * 6		O3			日最大8小时平均值		月 日最大8小时平均值的 第90百分比    日最大 O3_8年均值 第90百分位数
 * @date 2022年4月7日
 */
public class CompositeIndexUtil {

    /**
     * 计算综合指数各参数得取值类型
     */
    public static enum Type {DAY, MONTH, YEAR};

    
    public static Float getComIndex(Object o, Type type) {
        Float coi = null;
        try {
            Map<String, Object> map = objectToMap(o);
            float pm10 = 0, pm25 = 0, so2 = 0, no2 = 0, co = 0, o3 = 0;
            if (map.get("pm10") != null && (Float) map.get("pm10") > 0) {
                pm10 = (float) map.get("pm10");
            }
            if (map.get("pm25") != null && (Float) map.get("pm25") > 0) {
                pm25 = (float) map.get("pm25");
            }
            if (map.get("so2") != null && (Float) map.get("so2") > 0) {
                so2 = (float) map.get("so2");
            }
            if (map.get("no2") != null && (Float) map.get("no2") > 0) {
                no2 = (float) map.get("no2");
            }
            if (map.get("co") != null && (Float) map.get("co") > 0) {
                co = (float) map.get("co");
            }
            switch (type) {
                case DAY:
                    if (map.get("o3") != null && (Float) map.get("o3") > 0) {
                        o3 = (float) map.get("o3");
                    }
                    break;
                case MONTH:
                    co = co * 0.95f;
                    if (map.get("o3_8") != null && (Float) map.get("o3_8") > 0) {
                        o3 = (float) map.get("o3_8") * 0.9f;
                    }
                    break;
                case YEAR:
                    //用于年报中 年均值
                    pm10 = pm10 * 0.95f;
                    pm25 = pm25 * 0.95f;
                    so2 = so2 * 0.98f;
                    no2 = no2 * 0.98f;
                    co = co * 0.95f;
                    if (map.get("o3_8") != null && (Float) map.get("o3_8") > 0) {
                        o3 = (float) map.get("o3_8") * 0.9f;
                    }
                    break;
                default:
                    return null;

            }
            coi = pm25 / 35 + pm10 / 70 + so2 / 60 + no2 / 40 + co / 4 + o3 / 160;
            return FloatUtil.subPoint_1(coi);
        } catch (IllegalArgumentException | IllegalAccessException e) {
            e.printStackTrace();
        }
        return null;
    }

    /**
     * object转map
     *
     * @throws IllegalAccessException
     * @throws IllegalArgumentException
     */
    public static Map<String, Object> objectToMap(Object obj) throws IllegalArgumentException, IllegalAccessException {
        if (obj == null) {
            return null;
        }
        Map<String, Object> map = new HashMap<String, Object>();
        Field[] declaredFields = obj.getClass().getDeclaredFields();
        for (Field field : declaredFields) {
            field.setAccessible(true);
            map.put(field.getName(), field.get(obj));
        }
        return map;
    }
}
  • 4
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 5
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Winy_26

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值