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;
|
}
|
|
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);
|
resultMap.put("pollutant",nameList);
|
return resultMap;
|
}
|
|
//PM2.5 IAQI
|
public 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
|
public 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
|
public 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
|
public 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
|
public 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
|
public 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);
|
}
|
}
|