cjl
2025-01-06 27e6bc3df3e39e0d0b147b155a89ad6837ea972b
screen-common/src/main/java/com/moral/util/AQIUtils.java
@@ -1,370 +1,419 @@
package com.moral.util;
import org.springframework.util.ObjectUtils;
import com.moral.pojo.AQI;
import java.util.*;
import com.moral.constant.Constants;
public class AQIUtils {
    public static int hourlyAqi(Map<String, Object> map) {
        List<Integer> AQIList = new ArrayList<>();
        for (Map.Entry<String, Object> 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;
    /*24小时浓度限值*/
    private static Double[] SO2_Daily_Limit_Data = new Double[]{0d, 50d, 150d, 475d, 800d, 1600d, 2100d, 2620d};
    private static Double[] NO2_Daily_Limit_Data = new Double[]{0d, 40d, 80d, 180d, 280d, 565d, 750d, 940d};
    private static Double[] PM10_Daily_Limit_Data = new Double[]{0d, 50d, 150d, 250d, 350d, 420d, 500d, 600d};
    private static Double[] CO_Daily_Limit_Data = new Double[]{0d, 2d, 4d, 14d, 24d, 36d, 48d, 60d};
    private static Double[] PM2_5_Daily_Limit_Data = new Double[]{0d, 35d, 75d, 115d, 150d, 250d, 350d, 500d};
    private static Double[] O3_Daily_Limit_Data = new Double[]{0d, 100d, 160d, 215d, 265d, 800d};
    /*1小时浓度限值*/
    private static Double[] SO2_Hourly_Limit_Data = new Double[]{0d, 150d, 500d, 650d, 800d};
    private static Double[] NO2_Hourly_Limit_Data = new Double[]{0d, 100d, 200d, 700d, 1200d, 2340d, 3090d, 3840d};
    private static Double[] PM10_Hourly_Limit_Data = new Double[]{0d, 50d, 150d, 250d, 350d, 420d, 500d, 600d};
    private static Double[] CO_Hourly_Limit_Data = new Double[]{0d, 5d, 10d, 35d, 60d, 90d, 120d, 150d};
    private static Double[] PM2_5_Hourly_Limit_Data = new Double[]{0d, 35d, 75d, 115d, 150d, 250d, 350d, 500d};
    private static Double[] O3_Hourly_Limit_Data = new Double[]{0d, 160d, 200d, 300d, 400d, 800d, 1000d, 1200d};
    /*空气质量分指数*/
    private static Double[] IAQI_Array = new Double[]{0d,50d,100d,150d,200d,300d,400d,500d};
    //计算6参未超标因子数
    public static int standardCount(Map<String,Object> data){
        int count = 0;
        if(data.get("PM2_5")!=null&&PM2_5IsStandard(Double.valueOf(data.get("PM2_5").toString())))
            count++;
        if(data.get("PM10")!=null&&PM10IsStandard(Double.valueOf(data.get("PM10").toString())))
            count++;
        if(data.get("SO2")!=null&&SO2IsStandard(Double.valueOf(data.get("SO2").toString())))
            count++;
        if(data.get("NO2")!=null&&NO2IsStandard(Double.valueOf(data.get("NO2").toString())))
            count++;
        if(data.get("CO")!=null&&COIsStandard(Double.valueOf(data.get("CO").toString())))
            count++;
        if(data.get("O3")!=null&&O3IsStandard(Double.valueOf(data.get("O3").toString())))
            count++;
        return count;
    }
    //判断aqi是否达标
    public static boolean aqiIsStandard(int aqi){
        if(aqi<=100)
            return true;
        return false;
    }
    public static boolean PM2_5IsStandard(Double pm2_5){
        if(pm2_5<=75)
            return true;
        return false;
    }
    public static boolean PM10IsStandard(Double pm10){
        if(pm10<=150)
            return true;
        return false;
    }
    public static boolean SO2IsStandard(Double so2){
        if(so2<=500)
            return true;
        return false;
    }
    public static boolean NO2IsStandard(Double no2){
        if(no2<=80)
            return true;
        return false;
    }
    public static boolean COIsStandard(Double co){
        if(co<=4)
            return true;
        return false;
    }
    public static boolean O3IsStandard(Double o3){
        if(o3<=200)
            return true;
        return false;
    }
    /**
     * @Description: 小时AQI首要污染物,map的key为sensorCode,value为数值
     * @Param: [map]
     * @return: java.util.Map<java.lang.String, java.lang.Object>
     * @Author: 陈凯裕
     * @Date: 2021/10/29
     */
    public static Map<String, Object> hourlyAqi_pollutant(Map<String, Object> map) {
        List<Integer> AQIList = new ArrayList<>();
        Map<String, Integer> AQIMap = new HashMap<>();
        for (Map.Entry<String, Object> 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<String> nameList = new ArrayList<>();
        for (String key : AQIMap.keySet()) {
            if (AQIMap.get(key).equals(AQIMAX)) {
                nameList.add(key);
            }
        }
        Map<String, Object> resultMap = new HashMap<>();
        resultMap.put("aqi", AQIMAX);
        if (AQIMAX > 50)
            resultMap.put("pollutant", nameList);
        return resultMap;
    }
    public static void main(String[] args) {
        Map<String, Object> 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_WEATHER;
        if(aqi>200)
            return Constants.SERIOUS_WEATHER;
        if(aqi>150)
            return Constants.MIDDLE_WEATHER;
        if(aqi>100)
            return Constants.MILD_WEATHER;
        if(aqi>50)
            return Constants.GOOD_WEATHER;
        return Constants.EXCELLENT_WEATHER;
    }
    /**
     * @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);
    * @Description: 根据AQI计算污染等级,返回污染等级Code
            * @Param: [aqi]
            * @return: java.lang.String
            * @Author: 陈凯裕
            * @Date: 2021/11/11
            */
    public static String classCodeOfPollutionByAqi(Integer aqi){
        if(aqi>300)
            return Constants.SERVER_WEATHER_CODE;
        if(aqi>200)
            return Constants.SERIOUS_WEATHER_CODE;
        if(aqi>150)
            return Constants.MIDDLE_WEATHER_CODE;
        if(aqi>100)
            return Constants.MILD_WEATHER_CODE;
        if(aqi>50)
            return Constants.GOOD_WEATHER_CODE;
        return Constants.EXCELLENT_WEATHER_CODE;
    }
    /**
     * @Description: 小时AQI首要污染物,map的key为sensorCode,value为数值
     * @Param: [map]
     * @return: java.util.Map<java.lang.String, java.lang.Object>
     * @Description: 24小时AQI
     * @Param: [paramMap]
     * @return: java.lang.Integer
     * @Author: 陈凯裕
     * @Date: 2021/10/29
     * @Date: 2021/11/3
     */
    public static Map<String, Object> cityAqiPollutant(Map<String, Object> map) {
        List<Integer> AQIList = new ArrayList<>();
        Map<String, Integer> AQIMap = new HashMap<>();
        for (Map.Entry<String, Object> 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 "pm2_5":
                    PM2_5AQI = PM2_5AQI(Double.valueOf(entry.getValue().toString()));
                    AQIList.add(PM2_5AQI);
                    AQIMap.put("pm2_5", PM2_5AQI);
                    break;
                case "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;
    public static AQI dailyAQI(Map<String,Object> paramMap){
        if(paramMap==null)
            return null;
        List<Integer> IAQIList = new ArrayList<>();
        List<String> primaryPollutantNames = new ArrayList<>();
        List<String> primaryPollutantCodes = new ArrayList<>();
        Integer PM2_5IAQI;
        Integer SO2IAQI;
        Integer NO2IAQI;
        Integer COIAQI;
        Integer PM10IAQI;
        Integer O3IAQI;
        if(paramMap.get(Constants.SENSOR_CODE_PM25)!=null){
            Double PM2_5 = Double.valueOf(paramMap.get("a34004").toString());
            PM2_5IAQI = calculateIAQIUniversal(PM2_5,PM2_5_Daily_Limit_Data);
            IAQIList.add(PM2_5IAQI);
            if(PM2_5IAQI>50){
                primaryPollutantCodes.add(Constants.SENSOR_CODE_PM25);
                primaryPollutantNames.add("PM2.5");
            }
        }
        int AQIMAX = 0;
        if (!ObjectUtils.isEmpty(AQIList)) {
            AQIMAX = Collections.max(AQIList);
        }
        List<String> nameList = new ArrayList<>();
        for (String key : AQIMap.keySet()) {
            if (AQIMap.get(key).equals(AQIMAX)) {
                nameList.add(key);
        if(paramMap.get(Constants.SENSOR_CODE_SO2)!=null){
            Double SO2 = Double.valueOf(paramMap.get("a21026").toString());
            SO2IAQI = calculateIAQIUniversal(SO2,SO2_Daily_Limit_Data);
            IAQIList.add(SO2IAQI);
            if(SO2IAQI>50){
                primaryPollutantNames.add("SO2");
                primaryPollutantCodes.add(Constants.SENSOR_CODE_SO2);
            }
        }
        Map<String, Object> resultMap = new HashMap<>();
        resultMap.put("aqi", AQIMAX);
        if (AQIMAX > 50)
            resultMap.put("pollutant", nameList);
        return resultMap;
        if(paramMap.get(Constants.SENSOR_CODE_NO2)!=null){
            Double NO2 = Double.valueOf(paramMap.get("a21004").toString());
            NO2IAQI = calculateIAQIUniversal(NO2,NO2_Daily_Limit_Data);
            IAQIList.add(NO2IAQI);
            if(NO2IAQI>50){
                primaryPollutantNames.add("NO2");
                primaryPollutantCodes.add(Constants.SENSOR_CODE_NO2);
            }
        }
        if(paramMap.get(Constants.SENSOR_CODE_CO)!=null){
            Double CO = Double.valueOf(paramMap.get("a21005").toString());
            COIAQI = calculateIAQIUniversal(CO,CO_Daily_Limit_Data);
            IAQIList.add(COIAQI);
            if(COIAQI>50){
                primaryPollutantNames.add("CO");
                primaryPollutantCodes.add(Constants.SENSOR_CODE_CO);
            }
        }
        if(paramMap.get(Constants.SENSOR_CODE_PM10)!=null){
            Double PM10 = Double.valueOf(paramMap.get("a34002").toString());
            PM10IAQI = calculateIAQIUniversal(PM10,PM10_Daily_Limit_Data);
            IAQIList.add(PM10IAQI);
            if(PM10IAQI>50){
                primaryPollutantNames.add("PM10");
                primaryPollutantCodes.add(Constants.SENSOR_CODE_PM10);
            }
        }
        if(paramMap.get(Constants.SENSOR_CODE_O3)!=null){
            Double O3 = Double.valueOf(paramMap.get("a05024").toString());
            O3IAQI = calculateO3DailyIAQI(O3);
            IAQIList.add(O3IAQI);
            if(O3IAQI>50){
                primaryPollutantNames.add("O3");
                primaryPollutantCodes.add(Constants.SENSOR_CODE_O3);
            }
        }
        AQI aqi= new AQI();
        aqi.setAQIValue(getAQIByIAQIs(IAQIList));
        aqi.setPrimaryPollutantCodes(primaryPollutantCodes);
        aqi.setPrimaryPollutantNames(primaryPollutantNames);
        return aqi;
    }
    /**
     * @Description: 1小时AQI
     * @Param: [paramMap]
     * @return: java.lang.Integer
     * @Author: 陈凯裕
     * @Date: 2021/11/3
     */
    public static AQI hourlyAQI(Map<String,Object> paramMap){
        if(paramMap==null)
            return null;
        List<Integer> IAQIList = new ArrayList<>();
        List<String> primaryPollutantNames = new ArrayList<>();
        List<String> primaryPollutantCodes = new ArrayList<>();
        Integer PM2_5IAQI;
        Integer SO2IAQI;
        Integer NO2IAQI;
        Integer COIAQI;
        Integer PM10IAQI;
        Integer O3IAQI;
        if(paramMap.get("a34004")!=null){
            Double PM2_5 = Double.valueOf(paramMap.get("a34004").toString());
            PM2_5IAQI = calculateIAQIUniversal(PM2_5,PM2_5_Hourly_Limit_Data);
            IAQIList.add(PM2_5IAQI);
            if(PM2_5IAQI>50){
                primaryPollutantCodes.add(Constants.SENSOR_CODE_PM25);
                primaryPollutantNames.add("PM2.5");
            }
        }
        if(paramMap.get("a21026")!=null){
            Double SO2 = Double.valueOf(paramMap.get("a21026").toString());
            SO2IAQI = calculateSO2HourlyIAQI(SO2);
            IAQIList.add(SO2IAQI);
            if(SO2IAQI>50){
                primaryPollutantNames.add("SO2");
                primaryPollutantCodes.add(Constants.SENSOR_CODE_SO2);
            }
        }
        if(paramMap.get("a21004")!=null){
            Double NO2 = Double.valueOf(paramMap.get("a21004").toString());
            NO2IAQI = calculateIAQIUniversal(NO2,NO2_Hourly_Limit_Data);
            IAQIList.add(NO2IAQI);
            if(NO2IAQI>50){
                primaryPollutantNames.add("NO2");
                primaryPollutantCodes.add(Constants.SENSOR_CODE_NO2);
            }
        }
        if(paramMap.get("a21005")!=null){
            Double CO = Double.valueOf(paramMap.get("a21005").toString());
            COIAQI = calculateIAQIUniversal(CO,CO_Hourly_Limit_Data);
            IAQIList.add(COIAQI);
            if(COIAQI>50){
                primaryPollutantNames.add("CO");
                primaryPollutantCodes.add(Constants.SENSOR_CODE_CO);
            }
        }
        if(paramMap.get("a34002")!=null){
            Double PM10 = Double.valueOf(paramMap.get("a34002").toString());
            PM10IAQI = calculateIAQIUniversal(PM10,PM10_Hourly_Limit_Data);
            IAQIList.add(PM10IAQI);
            if(PM10IAQI>50){
                primaryPollutantNames.add("PM10");
                primaryPollutantCodes.add(Constants.SENSOR_CODE_PM10);
            }
        }
        if(paramMap.get("a05024")!=null){
            Double O3 = Double.valueOf(paramMap.get("a05024").toString());
            O3IAQI = calculateIAQIUniversal(O3,O3_Hourly_Limit_Data);
            IAQIList.add(O3IAQI);
            if(O3IAQI>50) {
                primaryPollutantNames.add("O3");
                primaryPollutantCodes.add(Constants.SENSOR_CODE_O3);
            }
        }
        AQI aqi= new AQI();
        aqi.setAQIValue(getAQIByIAQIs(IAQIList));
        aqi.setPrimaryPollutantCodes(primaryPollutantCodes);
        aqi.setPrimaryPollutantNames(primaryPollutantNames);
        return aqi;
    }
    /**
     * @Description: 根据IAQI计算AQI
     * @Param: [IAQIs]
     * @return: int
     * @Author: 陈凯裕
     * @Date: 2021/11/3
     */
    private static Integer getAQIByIAQIs(List<Integer> IAQIs){
        if(IAQIs.size()==0)
            return null;
        Optional<Integer> max = IAQIs.stream().max(Comparator.comparing(Integer::intValue));
        return max.get();
    }
    /**
     * @Description: 除了so2的小时IAQI,O3的日IAQI外的IAQI计算公式
     * @Param: [Cp, limitData]
     * @return: java.lang.Integer
     * @Author: 陈凯裕
     * @Date: 2021/11/2
     */
    private static Integer calculateIAQIUniversal(Double Cp,Double[] limitData){
        int index = getStartIndexFromArray(Cp, limitData);
        Double BPHi;
        Double BPLo;
        Double IAQIHi;
        Double IAQILo;
        if(index==limitData.length-1){
            return 500;
        }else{
            BPHi = limitData[index+1];
            BPLo = limitData[index];
            IAQIHi = IAQI_Array[index+1];
            IAQILo = IAQI_Array[index];
        }
        return calculateIAQIFormula(Cp,BPHi,BPLo,IAQIHi,IAQILo);
    }
    /**
     * @Description: 计算so2的小时IAQI
     * @Param: [Cp, limitData]
     * @return: java.lang.Integer
     * @Author: 陈凯裕
     * @Date: 2021/11/2
     */
    private static Integer calculateSO2HourlyIAQI(Double Cp){
        Double BPHi;
        Double BPLo;
        Double IAQIHi;
        Double IAQILo;
        Double[] limitData = SO2_Hourly_Limit_Data;
        int index = getStartIndexFromArray(Cp, limitData);
        //如果so2超过了小时最大限值,则采用24小时的限值标准,再计算分指数
        if(index ==SO2_Hourly_Limit_Data.length-1){
            limitData = SO2_Daily_Limit_Data;
            index = getStartIndexFromArray(Cp,limitData);
        }
        if(index==limitData.length-1){
            return 500;
        }else{
            BPHi = limitData[index+1];
            BPLo = limitData[index];
            IAQIHi = IAQI_Array[index+1];
            IAQILo = IAQI_Array[index];
        }
        return calculateIAQIFormula(Cp,BPHi,BPLo,IAQIHi,IAQILo);
    }
    /**
     * @Description: 计算O3日的IAQI
     * @Param: [Cp]
     * @return: java.lang.Integer
     * @Author: 陈凯裕
     * @Date: 2021/11/3
     */
    private static Integer calculateO3DailyIAQI(Double Cp){
        Double BPHi;
        Double BPLo;
        Double IAQIHi;
        Double IAQILo;
        Double[] limitData = O3_Daily_Limit_Data;
        int index = getStartIndexFromArray(Cp, limitData);
        //如果so2超过了小时最大限值,则采用24小时的限值标准,再计算分指数
        if(index ==O3_Daily_Limit_Data.length-1){
            limitData = O3_Hourly_Limit_Data;
            index = getStartIndexFromArray(Cp,limitData);
        }
        if(index==limitData.length-1){
            return 500;
        }else{
            BPHi = limitData[index+1];
            BPLo = limitData[index];
            IAQIHi = IAQI_Array[index+1];
            IAQILo = IAQI_Array[index];
        }
        return calculateIAQIFormula(Cp,BPHi,BPLo,IAQIHi,IAQILo);
    }
    /**
     * @Description: 计算IAQI的公式
     * @Param: [Cp, BPHi, BPLo, IAQIHi, IAQILo]
     * @return: java.lang.Integer
     * @Author: 陈凯裕
     * @Date: 2021/11/3
     */
    private static Integer calculateIAQIFormula(Double Cp, Double BPHi, Double BPLo, Double IAQIHi, Double IAQILo) {
        Double tmp1 = MathUtils.sub(IAQIHi, IAQILo);
        Double tmp2 = MathUtils.sub(BPHi, BPLo);
        Double tmp3 = MathUtils.sub(Cp, BPLo);
        Double tmp4 = MathUtils.division(tmp1, tmp2, 2);
        Double tmp5 = MathUtils.mul(tmp4, tmp3);
        Double IAQI = MathUtils.add(tmp5, IAQILo);
        return new Double(AmendUtils.sciCal(IAQI, 0)).intValue();
    }
    /*获取数值对应数组中的索引范围的开始值
     * 例如:数值:5               10
     *       数组:[0,5,15,20]     [0,5,8,12]
     *       结果:1(左闭右开)     2
     *       */
    private static int getStartIndexFromArray(Double num, Double[] array) {
        for (int i = 0; i < array.length - 1; i++) {
            if (num >= array[i] && num < array[i + 1])
                return i;
            if (i == array.length - 2)
                return i + 1;
        }
        return 0;
    }
}