From 9485a0cb33bb4535bb553a5bf49debeadbe0c89d Mon Sep 17 00:00:00 2001
From: jinpengyong <jpy123456>
Date: Wed, 03 Nov 2021 11:48:55 +0800
Subject: [PATCH] city_aqi o3_8h,综指,首要污染物计算
---
screen-common/src/main/java/com/moral/util/AQIUtils.java | 152 ++++++++++++++++++++++-------
screen-common/src/main/java/com/moral/util/ComprehensiveIndexUtils.java | 29 ++++-
screen-job/src/main/java/com/moral/api/service/impl/CityAqiServiceImpl.java | 46 ++++++---
screen-job/src/main/java/com/moral/api/service/impl/CityAqiDailyServiceImpl.java | 14 ++
4 files changed, 176 insertions(+), 65 deletions(-)
diff --git a/screen-common/src/main/java/com/moral/util/AQIUtils.java b/screen-common/src/main/java/com/moral/util/AQIUtils.java
index a55c8f5..d283d23 100644
--- a/screen-common/src/main/java/com/moral/util/AQIUtils.java
+++ b/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;
+ }
}
diff --git a/screen-common/src/main/java/com/moral/util/ComprehensiveIndexUtils.java b/screen-common/src/main/java/com/moral/util/ComprehensiveIndexUtils.java
index 7aae70f..ae30e5c 100644
--- a/screen-common/src/main/java/com/moral/util/ComprehensiveIndexUtils.java
+++ b/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;
}
diff --git a/screen-job/src/main/java/com/moral/api/service/impl/CityAqiDailyServiceImpl.java b/screen-job/src/main/java/com/moral/api/service/impl/CityAqiDailyServiceImpl.java
index 5c4d849..92b325d 100644
--- a/screen-job/src/main/java/com/moral/api/service/impl/CityAqiDailyServiceImpl.java
+++ b/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)) {
diff --git a/screen-job/src/main/java/com/moral/api/service/impl/CityAqiServiceImpl.java b/screen-job/src/main/java/com/moral/api/service/impl/CityAqiServiceImpl.java
index 1f91041..9b31a27 100644
--- a/screen-job/src/main/java/com/moral/api/service/impl/CityAqiServiceImpl.java
+++ b/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);
--
Gitblit v1.8.0