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);