package com.moral.util; import org.springframework.util.ObjectUtils; import java.util.*; import com.moral.constant.Constants; public class AQIUtils { public static int hourlyAqi(Map map) { List AQIList = new ArrayList<>(); for (Map.Entry entry : map.entrySet()) { String key = entry.getKey(); if (entry.getValue().toString().equals("")) { continue; } int PM2_5AQI; int PM10AQI; int SO2AQI; int NO2AQI; int COAQI; int O3AQI; switch (key) { case Constants.SENSOR_CODE_PM25: PM2_5AQI = PM2_5AQI(Double.valueOf(entry.getValue().toString())); AQIList.add(PM2_5AQI); break; case Constants.SENSOR_CODE_PM10: PM10AQI = PM10AQI(Double.valueOf(entry.getValue().toString())); AQIList.add(PM10AQI); break; case Constants.SENSOR_CODE_SO2: SO2AQI = SO2AQI(Double.valueOf(entry.getValue().toString())); AQIList.add(SO2AQI); break; case Constants.SENSOR_CODE_NO2: NO2AQI = NO2AQI(Double.valueOf(entry.getValue().toString())); AQIList.add(NO2AQI); break; case Constants.SENSOR_CODE_CO: COAQI = COAQI(Double.valueOf(entry.getValue().toString())); AQIList.add(COAQI); break; case Constants.SENSOR_CODE_O3: O3AQI = O3AQI(Double.valueOf(entry.getValue().toString())); AQIList.add(O3AQI); break; default: break; } } int AQIMAX = 0; if (!ObjectUtils.isEmpty(AQIList)) { if (AQIList.size() == 6) { AQIMAX = Collections.max(AQIList); } } return AQIMAX; } /** * @Description: 小时AQI首要污染物,map的key为sensorCode,value为数值 * @Param: [map] * @return: java.util.Map * @Author: 陈凯裕 * @Date: 2021/10/29 */ public static Map hourlyAqi_pollutant(Map map) { List AQIList = new ArrayList<>(); Map AQIMap = new HashMap<>(); for (Map.Entry entry : map.entrySet()) { String key = entry.getKey(); if (entry.getValue().toString().equals("")) { continue; } int PM2_5AQI; int PM10AQI; int SO2AQI; int NO2AQI; int COAQI; int O3AQI; switch (key) { case Constants.SENSOR_CODE_PM25: PM2_5AQI = PM2_5AQI(Double.valueOf(entry.getValue().toString())); AQIList.add(PM2_5AQI); AQIMap.put("PM2.5",PM2_5AQI); break; case Constants.SENSOR_CODE_PM10: PM10AQI = PM10AQI(Double.valueOf(entry.getValue().toString())); AQIList.add(PM10AQI); AQIMap.put("PM10",PM10AQI); break; case Constants.SENSOR_CODE_SO2: SO2AQI = SO2AQI(Double.valueOf(entry.getValue().toString())); AQIList.add(SO2AQI); AQIMap.put("SO2",SO2AQI); break; case Constants.SENSOR_CODE_NO2: NO2AQI = NO2AQI(Double.valueOf(entry.getValue().toString())); AQIList.add(NO2AQI); AQIMap.put("NO2",NO2AQI); break; case Constants.SENSOR_CODE_CO: COAQI = COAQI(Double.valueOf(entry.getValue().toString())); AQIList.add(COAQI); AQIMap.put("CO",COAQI); break; case Constants.SENSOR_CODE_O3: O3AQI = O3AQI(Double.valueOf(entry.getValue().toString())); AQIList.add(O3AQI); AQIMap.put("O3",O3AQI); break; default: break; } } int AQIMAX = 0; if (!ObjectUtils.isEmpty(AQIList)) { AQIMAX = Collections.max(AQIList); } List nameList = new ArrayList<>(); for (String key:AQIMap.keySet()){ if (AQIMap.get(key).equals(AQIMAX)){ nameList.add(key); } } Map resultMap = new HashMap<>(); resultMap.put("aqi",AQIMAX); if(AQIMAX>50) resultMap.put("pollutant",nameList); return resultMap; } public static void main(String[] args) { Map map = new HashMap<>(); map.put("a34004",11.25); map.put("a34002",18.25); map.put("a21026",55); map.put("a21004",200.01); map.put("a21005",18.94); map.put("a05024",55); System.out.println(hourlyAqi_pollutant(map)); } /** * @Description: 计算AQI污染等级 * @Param: * @return: * @Author: 陈凯裕 * @Date: 2021/10/29 */ public static String classOfPollutionByAqi(Integer aqi){ if(aqi>300) return Constants.SERVER; if(aqi>200) return Constants.SERIOUS; if(aqi>150) return Constants.MIDDLE; if(aqi>100) return Constants.MILD; if(aqi>50) return Constants.GOOD; return Constants.EXCELLENT; } //PM2.5 IAQI private static int PM2_5AQI(Double value) { double result; if (value <= 0) { result = 0; } else if (value <= 35) { result = 50d / 35d * (value - 0) + 0; } else if (value <= 75) { result = 50d / 40d * (value - 35) + 50; } else if (value <= 115) { result = 50d / 40d * (value - 75) + 100; } else if (value <= 150) { result = 50d / 35d * (value - 115) + 150; } else if (value <= 250) { result = 100d / 100d * (value - 150) + 200; } else if (value <= 350) { result = 100d / 100d * (value - 250) + 300; } else { result = 100d / 150d * (value - 350) + 400; } return (int) Math.ceil(result); } //PM10 IAQI private static int PM10AQI(Double value) { double result; if (value <= 0) { result = 0; } else if (value <= 50) { result = 50d / 50d * (value - 0) + 0; } else if (value <= 150) { result = 50d / 100d * (value - 50) + 50; } else if (value <= 250) { result = 50d / 100d * (value - 150) + 100; } else if (value <= 350) { result = 50d / 100d * (value - 250) + 150; } else if (value <= 420) { result = 100d / 70d * (value - 350) + 200; } else if (value <= 500) { result = 100d / 80d * (value - 420) + 300; } else { result = 100d / 100d * (value - 500) + 400; } return (int) Math.ceil(result); } //SO2 IAQI private static int SO2AQI(Double value) { double result; if (value <= 0) { result = 0; } else if (value <= 150) { result = 50d / 150d * (value - 0) + 0; } else if (value <= 500) { result = 50d / 350d * (value - 150) + 50; } else if (value <= 650) { result = 50d / 150d * (value - 500) + 100; } else { result = 50d / 150d * (value - 650) + 150; } return (int) Math.ceil(result); } //NO2 IAQI private static int NO2AQI(Double value) { double result; if (value <= 0) { result = 0; } else if (value <= 100) { result = 50d / 100d * (value - 0) + 0; } else if (value <= 200) { result = 50d / 100d * (value - 100) + 50; } else if (value <= 700) { result = 50d / 500d * (value - 200) + 100; } else if (value <= 1200) { result = 50d / 500d * (value - 700) + 150; } else if (value <= 2340) { result = 100d / 1140d * (value - 1200) + 200; } else if (value <= 3090) { result = 100d / 750d * (value - 2340) + 300; } else { result = 100d / 750d * (value - 3090) + 400; } return (int) Math.ceil(result); } //CO IAQI private static int COAQI(Double value) { double result; if (value <= 0) { result = 0; } else if (value <= 5) { result = 50d / 5d * (value - 0) + 0; } else if (value <= 10) { result = 50d / 5d * (value - 5) + 50; } else if (value <= 35) { result = 50d / 25d * (value - 10) + 100; } else if (value <= 60) { result = 50d / 25d * (value - 35) + 150; } else if (value <= 90) { result = 100d / 30d * (value - 60) + 200; } else if (value <= 120) { result = 100d / 30d * (value - 90) + 300; } else { result = 100d / 30d * (value - 120) + 400; } return (int) Math.ceil(result); } //O3 IAQI private static int O3AQI(Double value) { double result; if (value <= 0) { result = 0; } else if (value <= 100) { result = 50d / 100d * (value - 0) + 0; } else if (value <= 160) { result = 50d / 60d * (value - 100) + 50; } else if (value <= 215) { result = 50d / 55d * (value - 160) + 100; } else if (value <= 265) { result = 50d / 150d * (value - 215) + 150; } else if (value <= 800) { result = 100d / 535d * (value - 265) + 200; } else if (value <= 2100) { result = 100d / 12d * (value - 800) + 300; } else { result = 100d / 12d * (value - 48) + 400; } return (int) Math.ceil(result); } }