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<String,Object> getAqi(Map<String,Object> map){ 
 | 
  
 | 
        HashMap<String, Object> rsMap = new HashMap<>(); 
 | 
        ArrayList<Double> 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; 
 | 
    } 
 | 
  
 | 
} 
 |