jinpengyong
2021-11-03 9485a0cb33bb4535bb553a5bf49debeadbe0c89d
city_aqi o3_8h,综指,首要污染物计算
4 files modified
241 ■■■■ changed files
screen-common/src/main/java/com/moral/util/AQIUtils.java 152 ●●●● patch | view | raw | blame | history
screen-common/src/main/java/com/moral/util/ComprehensiveIndexUtils.java 29 ●●●● patch | view | raw | blame | history
screen-job/src/main/java/com/moral/api/service/impl/CityAqiDailyServiceImpl.java 14 ●●●● patch | view | raw | blame | history
screen-job/src/main/java/com/moral/api/service/impl/CityAqiServiceImpl.java 46 ●●●●● patch | view | raw | blame | history
screen-common/src/main/java/com/moral/util/AQIUtils.java
@@ -59,15 +59,15 @@
    }
    /**
    * @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) {
     * @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<>();
        Map<String, Integer> AQIMap = new HashMap<>();
        for (Map.Entry<String, Object> entry : map.entrySet()) {
            String key = entry.getKey();
            if (entry.getValue().toString().equals("")) {
@@ -83,32 +83,32 @@
                case Constants.SENSOR_CODE_PM25:
                    PM2_5AQI = PM2_5AQI(Double.valueOf(entry.getValue().toString()));
                    AQIList.add(PM2_5AQI);
                    AQIMap.put("PM2.5",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);
                    AQIMap.put("PM10", PM10AQI);
                    break;
                case Constants.SENSOR_CODE_SO2:
                    SO2AQI = SO2AQI(Double.valueOf(entry.getValue().toString()));
                    AQIList.add(SO2AQI);
                    AQIMap.put("SO2",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);
                    AQIMap.put("NO2", NO2AQI);
                    break;
                case Constants.SENSOR_CODE_CO:
                    COAQI = COAQI(Double.valueOf(entry.getValue().toString()));
                    AQIList.add(COAQI);
                    AQIMap.put("CO",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);
                    AQIMap.put("O3", O3AQI);
                    break;
                default:
                    break;
@@ -119,49 +119,50 @@
            AQIMAX = Collections.max(AQIList);
        }
        List<String> nameList = new ArrayList<>();
        for (String key:AQIMap.keySet()){
            if (AQIMap.get(key).equals(AQIMAX)){
        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);
        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);
        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)
     * @Description: 计算AQI污染等级
     * @Param:
     * @return:
     * @Author: 陈凯裕
     * @Date: 2021/10/29
     */
    public static String classOfPollutionByAqi(Integer aqi) {
        if (aqi > 300)
            return Constants.SERVER;
        if(aqi>200)
        if (aqi > 200)
            return Constants.SERIOUS;
        if(aqi>150)
        if (aqi > 150)
            return Constants.MIDDLE;
        if(aqi>100)
        if (aqi > 100)
            return Constants.MILD;
        if(aqi>50)
        if (aqi > 50)
            return Constants.GOOD;
        return Constants.EXCELLENT;
    }
    //PM2.5 IAQI
    private static int PM2_5AQI(Double value) {
        double result;
@@ -293,4 +294,77 @@
        }
        return (int) Math.ceil(result);
    }
    /**
     * @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> 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;
            }
        }
        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;
    }
}
screen-common/src/main/java/com/moral/util/ComprehensiveIndexUtils.java
@@ -1,5 +1,7 @@
package com.moral.util;
import org.springframework.util.ObjectUtils;
import java.util.*;
/**
@@ -170,12 +172,17 @@
    public static Double dailyData(Map<String, Object> data) {
        if (data == null)
            return null;
        Double CPM25 = (Double) data.get("pm2_5");
        Double CPM10 = (Double) data.get("pm10");
        Double CSO2 = (Double) data.get("so2");
        Double CNO2 = (Double) data.get("no2");
        Double CCO = (Double) data.get("co");
        Double CO3 = (Double) data.get("o3");
        Double CPM25 = Double.parseDouble(data.get("pm2_5").toString());
        Double CPM10 = Double.parseDouble(data.get("pm10").toString());
        Double CSO2 = Double.parseDouble(data.get("so2").toString());
        Double CNO2 = Double.parseDouble(data.get("no2").toString());
        Double CCO = Double.parseDouble(data.get("co").toString());
        Object o3 = data.get("o3");
        Double CO3 = null;
        if (!ObjectUtils.isEmpty(o3)) {
            CO3 = Double.parseDouble(o3.toString());
        }
        //S开头为污染物年均值二级标准(当污染物是CO时,采用日均值二级标准。当污染是O3时,采用八小时均值二级标准)
        //数据来源GB 3095-2012
        Double SSO2 = 60d;
@@ -190,13 +197,19 @@
        Double IPM25 = CPM25 / SPM25;
        Double IPM10 = CPM10 / SPM10;
        Double ICO = CCO / SCO;
        Double IO3 = CO3 / SO3;
        Double IO3 = null;
        if (!ObjectUtils.isEmpty(CO3)) {
            IO3 = CO3 / SO3;
        }
        //计算综合指数
        Double comprehensiveIndex = MathUtils.add(ISO2, INO2);
        comprehensiveIndex = MathUtils.add(comprehensiveIndex, IPM25);
        comprehensiveIndex = MathUtils.add(comprehensiveIndex, IPM10);
        comprehensiveIndex = MathUtils.add(comprehensiveIndex, ICO);
        comprehensiveIndex = MathUtils.add(comprehensiveIndex, IO3);
        if (!ObjectUtils.isEmpty(IO3)) {
            comprehensiveIndex = MathUtils.add(comprehensiveIndex, IO3);
        }
        comprehensiveIndex = AmendUtils.sciCal(comprehensiveIndex, 2);
        return comprehensiveIndex;
    }
screen-job/src/main/java/com/moral/api/service/impl/CityAqiDailyServiceImpl.java
@@ -16,6 +16,7 @@
import org.springframework.stereotype.Service;
import org.springframework.util.ObjectUtils;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Date;
import java.util.HashMap;
@@ -55,7 +56,7 @@
        QueryWrapper<CityAqi> wrapper = new QueryWrapper<>();
        wrapper.select("city_code", "time", "value")
                .ge("time", DateUtils.dateToDateString(start))
                .lt("time", DateUtils.dateToDateString(end));
                .le("time", DateUtils.dateToDateString(end));
        List<Map<String, Object>> dailyData = cityAqiService.listMaps(wrapper);
        if (dailyData.size() == 0) {
@@ -70,14 +71,21 @@
            cityAqiDaily.setCityCode(Integer.parseInt(cityCode));
            cityAqiDaily.setTime(start);
            //臭氧采用滑动值算法
            //中间变量,用于计算除臭氧外其它因子
            List<Map<String, Object>> tempValue = new ArrayList<>(value);
            //移除第一天数据(0点的),O3滑动值第一条数据是从1点-8点
            value.removeIf(map -> ((Date) map.get("time")).getTime() == start.getTime());
            Double o3OfDay = AmendUtils.o3OfDay(value);
            if (o3OfDay != null) {
                jsonMap.put("o3", o3OfDay);
            }
            //除臭氧外其他因子均值计算
            tempValue.removeIf(o -> ((Date) o.get("time")).getTime() == end.getTime());
            sensors.forEach(sensor -> {
                OptionalDouble optionalDouble = value.parallelStream().flatMapToDouble(v -> {
                OptionalDouble optionalDouble = tempValue.parallelStream().flatMapToDouble(v -> {
                    Map<String, Object> dataValue = JSONObject.parseObject((String) v.get("value"), Map.class);
                    //臭氧单独计算
                    if ("o3".equals(sensor)) {
screen-job/src/main/java/com/moral/api/service/impl/CityAqiServiceImpl.java
@@ -26,6 +26,8 @@
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.OptionalDouble;
import java.util.stream.DoubleStream;
/**
 * <p>
@@ -55,11 +57,20 @@
    @Override
    public void insertCityAqi() {
        Date now = new Date();
        Date time = DateUtils.dataToTimeStampTime(now, DateUtils.yyyy_MM_dd_HH_EN);
        String format = DateUtils.yyyy_MM_dd_EN;
        Date start = null;
        if (DateUtils.getHour(time) == 0 || DateUtils.getHour(time) >= 8) {
            start = DateUtils.addHours(time, -7);
        }
        //获取城市配置
        QueryWrapper<CityConfig> wrapper = new QueryWrapper<>();
        wrapper.select("city_code", "city_id").eq("is_delete", Constants.NOT_DELETE);
        List<CityConfig> list = cityConfigService.list(wrapper);
        Date time = DateUtils.dataToTimeStampTime(new Date(), DateUtils.yyyy_MM_dd_HH_EN);
        for (CityConfig cityConfig : list) {
            Integer cityCode = cityConfig.getCityCode();
            Map<String, Object> data;
@@ -85,18 +96,25 @@
            aqi.put("aqi", aqi.remove("value"));
            //o3滑动值计算
            //获取一天内每个小时o3数据
            QueryWrapper<CityAqi> queryWrapper = new QueryWrapper<>();
            queryWrapper.select("time", "value").eq("city_code", cityCode);
            List<Map<String, Object>> cityAqis = cityAqiMapper.selectMaps(queryWrapper);
            List<Map<String, Object>> o3_8H = AmendUtils.getO3_8H(cityAqis);
            if (!ObjectUtils.isEmpty(o3_8H)) {
                for (Map<String, Object> o3Map : o3_8H) {
                    String hourTime = o3Map.get("time").toString();
                    if (DateUtils.dateToDateString(time, DateUtils.yyyy_MM_dd_HH_mm_ss_EN).equals(hourTime)) {
                        o3Map.get("o3");
                        aqi.put("o3_8h", o3Map.get("o3"));
                        break;
            if (start != null) {
                QueryWrapper<CityAqi> queryWrapper = new QueryWrapper<>();
                queryWrapper.select("time", "value")
                        .eq("city_code", cityCode)
                        .ge("time", DateUtils.dateToDateString(start));
                List<Map<String, Object>> cityAqis = cityAqiMapper.selectMaps(queryWrapper);
                Map<String, Object> params = new HashMap<>();
                params.put("time", DateUtils.dateToDateString(time,DateUtils.yyyy_MM_dd_HH_mm_ss_S_EN));
                params.put("value", JSONObject.toJSONString(aqi));
                cityAqis.add(params);
                if (cityAqis.size() >= 6) {
                    OptionalDouble average = cityAqis.parallelStream().flatMapToDouble(v -> {
                        Map<String, Object> dataValue = JSONObject.parseObject((String) v.get("value"), Map.class);
                        double o3 = Double.parseDouble(dataValue.get("o3").toString());
                        return DoubleStream.of(o3);
                    }).average();
                    if (average.isPresent()) {
                        double o3_8h = AmendUtils.sciCal(average.getAsDouble(), 0);
                        aqi.put("o3_8h", o3_8h);
                    }
                }
            }
@@ -107,13 +125,11 @@
            Double compositeIndex = ComprehensiveIndexUtils.dailyData(temp);
            aqi.put("compositeIndex", compositeIndex);
            //首要污染物计算
            Map<String, Object> pollutant = AQIUtils.cityAqiPollutant(aqi);
            if (!ObjectUtils.isEmpty(pollutant)) {
                aqi.putAll(pollutant);
            }
            CityAqi cityAqi = new CityAqi();
            cityAqi.setCityCode(cityCode);