package com.moral.api.utils; import java.util.ArrayList; import java.util.Collections; import java.util.HashMap; import java.util.Map; public class AqiUtils { /** * 根据6因子计算aqi和首要污染物 * @param map * @return */ public static Map getAqi(Map map){ HashMap rsMap = new HashMap<>(); ArrayList list = new ArrayList<>(); if (map.get("PM2_5")!=null && map.get("PM10")!=null && map.get("CO")!=null && map.get("SO2")!=null && map.get("NO2")!=null && map.get("O3")!=null ){ double pm2_5 = getPm2_5(Double.parseDouble(map.get("PM2_5").toString())); list.add(pm2_5); double pm10 = getPm10(Double.parseDouble(map.get("PM10").toString())); list.add(pm10); double co = getCo(Double.parseDouble(map.get("CO").toString())); list.add(co); double So2 = getSo2(Double.parseDouble(map.get("SO2").toString())); list.add(So2); double No2 = getNo2(Double.parseDouble(map.get("NO2").toString())); list.add(No2); double O3 = getO3(Double.parseDouble(map.get("O3").toString())); list.add(O3); } double max = Collections.max(list); int AQI = (int) max; rsMap.put("AQI",AQI); rsMap.put("SU",getSU(max,list)); return rsMap; } private static double getSo2(double so2){ double v = 0.0; if (so2<50){ v = 50 * so2 / 50; }else if (so2<150 && so2 >= 50){ v = 50 * (so2 - 50) / 100 + 50; }else if (so2<475 && so2 >= 150){ v = 50 * (so2 - 150) / 325 + 100; }else if (so2<800 && so2 >= 475){ v = 50 * (so2 - 475) / 325 + 150; }else { v = 100 * (so2 - 800) / 800 + 200; } return Math.round(v); } private static double getNo2(double no2){ double v = 0.0; if (no2<40){ v = 50 * no2 / 40; }else if (no2<80 && no2 >= 40){ v = 50 * (no2 - 40) / 40 + 50; }else if (no2<180 && no2 >= 80){ v = 50 * (no2 - 80) / 100 + 100; }else if (no2<280 && no2 >= 180){ v = 50 * (no2 - 180) / 100 + 150; }else if (no2<565 && no2 >= 280){ v = 100 * (no2 - 280) / 285 + 200; }else if (no2<750 && no2 >= 565){ v = 100 * (no2 - 565) / 185 + 300; } else { v = 100 * (no2 - 750) / 190 + 400; } return Math.round(v); } private static double getCo(double co){ double v = 0.0; if (co<2){ v = 50 * co / 2; }else if (co<4 && co >= 2){ v = 50 * (co - 2) / 2 + 50; }else if (co<14 && co >= 4){ v = 50 * (co - 4) / 10 + 100; }else if (co<24 && co >= 14){ v = 50 * (co - 14) / 10 + 150; }else if (co<36 && co >= 24){ v = 100 * (co - 24) / 12 + 200; }else if (co<48 && co >= 36){ v = 100 * (co - 36) / 12 + 300; } else { v = 100 * (co - 48) / 12 + 400; } return Math.round(v); } private static double getPm10(double pm10){ double v = 0.0; if (pm10<50){ v = 50 * pm10 / 50; }else if (pm10<150 && pm10 >= 50){ v = 50 * (pm10 - 50) / 100 + 50; }else if (pm10<250 && pm10 >= 150){ v = 50 * (pm10 - 150) / 100 + 100; }else if (pm10<350 && pm10 >= 250){ v = 50 * (pm10 - 250) / 100 + 150; }else if (pm10<420 && pm10 >= 350){ v = 100 * (pm10 - 350) / 70 + 200; }else if (pm10<500 && pm10 >= 420){ v = 100 * (pm10 - 420) / 80 + 300; } else { v = 100 * (pm10 - 500) / 100 + 400; } return Math.round(v); } private static double getPm2_5(double pm2_5){ double v = 0.0; if (pm2_5<35){ v = 50 * pm2_5 / 35; }else if (pm2_5<75 && pm2_5 >= 35){ v = 50 * (pm2_5 - 35) / 40 + 50; }else if (pm2_5<115 && pm2_5 >= 75){ v = 50 * (pm2_5 - 75) / 40 + 100; }else if (pm2_5<150 && pm2_5 >= 115){ v = 50 * (pm2_5 - 115) / 35 + 150; }else if (pm2_5<250 && pm2_5 >= 150){ v = 100 * (pm2_5 - 150) / 100 + 200; }else if (pm2_5<350 && pm2_5 >= 250){ v = 100 * (pm2_5 - 250) / 100 + 300; } else { v = 100 * (pm2_5 - 350) / 150 + 400; } return Math.round(v); } private static double getO3(double o3){ double v = 0.0; if (o3<100){ v = 50 * o3 / 100; }else if (o3<160 && o3 >= 100){ v = 50 * (o3 - 100) / 60 + 50; }else if (o3<215 && o3 >= 160){ v = 50 * (o3 - 160) / 55 + 100; }else if (o3<265 && o3 >= 215){ v = 50 * (o3 - 215) / 50 + 150; }else if (o3<800 && o3 >= 265){ v = 100 * (o3 - 265) / 535 + 200; }else if (o3<1000 && o3 >= 800){ v = 100 * (o3 - 800) / 200 + 300; } return Math.round(v); } private static String getSU(Double aqi,ArrayList list){ String SU=null; if (aqi<=50){ SU="-"; } else if (aqi.toString().equals(list.get(1).toString())){ SU="PM10"; }else if (aqi.toString().equals(list.get(0).toString())){ SU="PM2.5"; }else if (aqi.toString().equals(list.get(2).toString())){ SU="CO"; }else if (aqi.toString().equals(list.get(3).toString())){ SU="SO2"; }else if (aqi.toString().equals(list.get(4).toString())){ SU="NO2"; }else if (aqi.toString().equals(list.get(5).toString())){ SU="O3"; } return SU; } }