package com.moral.util; import java.util.*; public class AQICalculation2 { public static Map hourlyAQI(Map map){ Map AQIMap = new HashMap<>(); Map maxMap = new HashMap(); for (Map.Entry entry : map.entrySet()) { String key = entry.getKey(); if (entry.getValue().toString().equals("")){ continue; } Double value = Double.parseDouble(entry.getValue().toString()); if (key!="O3_8h"){ maxMap.put(key,value); }else { continue; } Double PM2_5AQI; Double PM10AQI; Double SO2AQI; Double NO2AQI; Double COAQI; Double O3AQI; switch (key) { case "PM2_5":PM2_5AQI = PM2_5AQI(value); AQIMap.put("PM2_5",PM2_5AQI); break; case "PM10":PM10AQI = PM10AQI(value); AQIMap.put("PM10",PM10AQI); break; case "SO2":SO2AQI = SO2AQI(value); AQIMap.put("SO2",SO2AQI); break; case "NO2":NO2AQI = NO2AQI(value); AQIMap.put("NO2",NO2AQI); break; case "CO":COAQI = COAQI(value); AQIMap.put("CO",COAQI); break; case "maxO3_8h":O3AQI = O3AQI(value); AQIMap.put("maxO3_8h",O3AQI); break; default: break; } } Map returnMap = new HashMap<>(); Optional> max0 = AQIMap.entrySet() .stream() .max(Map.Entry.comparingByValue()); returnMap.put("maxSensor", max0.get().getKey()); returnMap.put("AQI", new Double(Math.floor(Math.round(max0.get().getValue()+0.5))).intValue()); return returnMap; } public static Map dayAQI(Map map){ Map AQIMap = new HashMap<>(); Map maxMap = new HashMap(); for (Map.Entry entry : map.entrySet()) { String key = entry.getKey(); if (entry.getValue().toString().equals("")){ continue; } Double value = Double.parseDouble(entry.getValue().toString()); if (key!="O3_day"){ maxMap.put(key,value); }else { continue; } Double PM2_5AQI; Double PM10AQI; Double SO2AQI; Double NO2AQI; Double COAQI; Double maxO38hAQI; switch (key) { case "PM2_5":PM2_5AQI = PM2_5AQI(value); AQIMap.put("PM2_5",PM2_5AQI); break; case "PM10":PM10AQI = PM10AQI(value); AQIMap.put("PM10",PM10AQI); break; case "SO2":SO2AQI = SO2AQI(value); AQIMap.put("SO2",SO2AQI); break; case "NO2":NO2AQI = NO2AQI(value); AQIMap.put("NO2",NO2AQI); break; case "CO":COAQI = COAQI(value); AQIMap.put("CO",COAQI); break; case "maxO3_8h":maxO38hAQI = O3DayAQI(value); AQIMap.put("maxO3_8h",maxO38hAQI); break; default: break; } } Map returnMap = new HashMap<>(); if (AQIMap.size()>0){ Optional> max0 = AQIMap.entrySet() .stream() .max(Map.Entry.comparingByValue()); returnMap.put("maxSensor",max0.get().getKey()); returnMap.put("AQI", new Double(Math.floor(Math.round(max0.get().getValue()+0.5))).intValue()); }else { returnMap.put("maxSensor",""); returnMap.put("AQI", ""); } return returnMap; } static double PM2_5AQI(Double value) { Double result = (double) 0; if(value<=0) { result=(double) 0; }else if (value<=35) { result = 50.0/35*(value-0)+0; }else if (value<=75) { result = 50.0/40*(value-35)+50; }else if (value<=115) { result = 50.0/40*(value-75)+100; }else if (value<=150) { result = 50.0/35*(value-115)+150; }else if (value<=250) { result = 100.0/100*(value-150)+200; }else if (value<=350) { result = 100.0/100*(value-250)+300; }else { result = 100.0/150*(value-350)+400; } return result; } static double PM10AQI(Double value) { Double result = (double) 0; if(value<=0) { result=(double) 0; }else if (value<=50) { result = 50.0/50*(value-0)+0; }else if (value<=150) { result = 50.0/100*(value-50)+50; }else if (value<=250) { result = 50.0/100*(value-150)+100; }else if (value<=350) { result = 50.0/100*(value-250)+150; }else if (value<=420) { result = 100.0/70*(value-350)+200; }else if (value<=500) { result = 100.0/80*(value-420)+300; }else { result = 100.0/100*(value-500)+400; } return result; } static double SO2AQI(Double value) { Double result = (double) 0; if(value<=0) { result=(double) 0; }else if (value<=150) { result = 50.0/150*(value-0)+0; }else if (value<=500) { result = 50.0/350*(value-150)+50; }else if (value<=650) { result = 50.0/150*(value-500)+100; }else { result = 50.0/150*(value-650)+150; } return result; } static double NO2AQI(Double value) { Double result = (double) 0; if(value<=0) { result=(double) 0; }else if (value<=100) { result = 50.0/100*(value-0)+0; }else if (value<=200) { result = 50.0/100*(value-100)+50; }else if (value<=700) { result = 50.0/500*(value-200)+100; }else if (value<=1200) { result = 50.0/500*(value-700)+150; }else if (value<=2340) { result = 100.0/1140*(value-1200)+200; }else if (value<=3090) { result = 100.0/750*(value-2340)+300; }else { result = 100.0/750*(value-3090)+400; } return result; } static double COAQI(Double value) { Double result = (double) 0; if(value<=0) { result=(double) 0; }else if (value<=5) { result = 50.0/5*(value-0)+0; }else if (value<=10) { result = 50.0/5*(value-5)+50; }else if (value<=35) { result = 50.0/25*(value-10)+100; }else if (value<=60) { result = 50.0/25*(value-35)+150; }else if (value<=90) { result = 100.0/30*(value-60)+200; }else if (value<=120) { result = 100.0/30*(value-90)+300; }else { result = 100.0/30*(value-120)+400; } return result; } static double O3AQI(Double value) { Double result = (double) 0; if(value<=0) { result=(double) 0; }else if (value<=100) { result = 50.0/160*(value-0)+0; }else if (value<=160) { result = 50.0/40*(value-160)+50; }else if (value<=215) { result = 50.0/100*(value-200)+100; }else if (value<=265) { result = 50.0/100*(value-300)+150; }else if (value<=800) { result = 100.0/400*(value-400)+200; }else if (value<=2100) { result = 100.0/200*(value-800)+300; }else { result = 100.0/200*(value-1000)+400; } return result; } static double O3DayAQI(Double value) { Double result = (double) 0; if(value<=0) { result=(double) 0; }else if (value<=100) { result = 50.0/100*(value-0)+0; }else if (value<=160) { result = 50.0/60*(value-100)+50; }else if (value<=215) { result = 50.0/55*(value-160)+100; }else if (value<=265) { result = 50.0/150*(value-215)+150; }else if (value<=800) { result = 100.0/535*(value-265)+200; }else if (value<=2100) { result = 100.0/12*(value-800)+300; }else { result = 100.0/12*(value-48)+400; } return result; } static double SO2DayAQI(Double value) { Double result = (double) 0; if(value<=0) { result=(double) 0; }else if (value<=50) { result = 50.0/50*(value-0)+0; }else if (value<=150) { result = 50.0/100*(value-50)+50; }else if (value<=475) { result = 50.0/325*(value-150)+100; }else if (value<=800) { result = 50.0/325*(value-475)+150; }else if (value<=1600) { result = 100.0/800*(value-800)+200; }else if (value<=2100) { result = 100.0/500*(value-1600)+300; }else { result = 100.0/520*(value-2100)+400; } return result; } static double NO2DayAQI(Double value) { Double result = (double) 0; if(value<=0) { result=(double) 0; }else if (value<=40) { result = 50.0/40*(value-0)+0; }else if (value<=80) { result = 50.0/40*(value-40)+50; }else if (value<=180) { result = 50.0/100*(value-80)+100; }else if (value<=280) { result = 50.0/100*(value-180)+150; }else if (value<=565) { result = 100.0/285*(value-280)+200; }else if (value<=750) { result = 100.0/185*(value-565)+300; }else { result = 100.0/190*(value-750)+400; } return result; } static double CODayAQI(Double value) { Double result = (double) 0; if(value<=0) { result=(double) 0; }else if (value<=5) { result = 50.0/2*(value-0)+0; }else if (value<=10) { result = 50.0/2*(value-2)+50; }else if (value<=35) { result = 50.0/10*(value-4)+100; }else if (value<=60) { result = 50.0/10*(value-14)+150; }else if (value<=90) { result = 100.0/12*(value-24)+200; }else if (value<=120) { result = 100.0/12*(value-36)+300; }else { result = 100.0/12*(value-48)+400; } return result; } }