package com.moral.util;
|
|
import org.springframework.util.ObjectUtils;
|
|
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;
|
}
|
|
/**
|
* @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;
|
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);
|
}
|
}
|