package com.moral.api.utils;
|
|
import java.util.ArrayList;
|
import java.util.Collections;
|
import java.util.HashMap;
|
import java.util.Map;
|
|
public class AqiUtils {
|
/**
|
* 根据6因子计算aqi和首要污染物
|
* @param map
|
* @return
|
*/
|
public static Map<String,Object> getAqi(Map<String,Object> map){
|
|
HashMap<String, Object> rsMap = new HashMap<>();
|
ArrayList<Double> list = new ArrayList<>();
|
if (map.get("PM2_5")!=null && map.get("PM10")!=null && map.get("CO")!=null
|
&& map.get("SO2")!=null
|
&& map.get("NO2")!=null
|
&& map.get("O3")!=null
|
){
|
double pm2_5 = getPm2_5(Double.parseDouble(map.get("PM2_5").toString()));
|
list.add(pm2_5);
|
double pm10 = getPm10(Double.parseDouble(map.get("PM10").toString()));
|
list.add(pm10);
|
double co = getCo(Double.parseDouble(map.get("CO").toString()));
|
list.add(co);
|
double So2 = getSo2(Double.parseDouble(map.get("SO2").toString()));
|
list.add(So2);
|
double No2 = getNo2(Double.parseDouble(map.get("NO2").toString()));
|
list.add(No2);
|
double O3 = getO3(Double.parseDouble(map.get("O3").toString()));
|
list.add(O3);
|
}
|
|
double max = Collections.max(list);
|
int AQI = (int) max;
|
rsMap.put("AQI",AQI);
|
|
rsMap.put("SU",getSU(max,list));
|
|
return rsMap;
|
}
|
|
|
|
private static double getSo2(double so2){
|
double v = 0.0;
|
if (so2<50){
|
v = 50 * so2 / 50;
|
}else if (so2<150 && so2 >= 50){
|
v = 50 * (so2 - 50) / 100 + 50;
|
}else if (so2<475 && so2 >= 150){
|
v = 50 * (so2 - 150) / 325 + 100;
|
}else if (so2<800 && so2 >= 475){
|
v = 50 * (so2 - 475) / 325 + 150;
|
}else {
|
v = 100 * (so2 - 800) / 800 + 200;
|
}
|
return Math.round(v);
|
}
|
|
private static double getNo2(double no2){
|
double v = 0.0;
|
if (no2<40){
|
v = 50 * no2 / 40;
|
}else if (no2<80 && no2 >= 40){
|
v = 50 * (no2 - 40) / 40 + 50;
|
}else if (no2<180 && no2 >= 80){
|
v = 50 * (no2 - 80) / 100 + 100;
|
}else if (no2<280 && no2 >= 180){
|
v = 50 * (no2 - 180) / 100 + 150;
|
}else if (no2<565 && no2 >= 280){
|
v = 100 * (no2 - 280) / 285 + 200;
|
}else if (no2<750 && no2 >= 565){
|
v = 100 * (no2 - 565) / 185 + 300;
|
}
|
else {
|
v = 100 * (no2 - 750) / 190 + 400;
|
}
|
return Math.round(v);
|
}
|
|
|
private static double getCo(double co){
|
double v = 0.0;
|
if (co<2){
|
v = 50 * co / 2;
|
}else if (co<4 && co >= 2){
|
v = 50 * (co - 2) / 2 + 50;
|
}else if (co<14 && co >= 4){
|
v = 50 * (co - 4) / 10 + 100;
|
}else if (co<24 && co >= 14){
|
v = 50 * (co - 14) / 10 + 150;
|
}else if (co<36 && co >= 24){
|
v = 100 * (co - 24) / 12 + 200;
|
}else if (co<48 && co >= 36){
|
v = 100 * (co - 36) / 12 + 300;
|
}
|
else {
|
v = 100 * (co - 48) / 12 + 400;
|
}
|
return Math.round(v);
|
}
|
|
private static double getPm10(double pm10){
|
double v = 0.0;
|
if (pm10<50){
|
v = 50 * pm10 / 50;
|
}else if (pm10<150 && pm10 >= 50){
|
v = 50 * (pm10 - 50) / 100 + 50;
|
}else if (pm10<250 && pm10 >= 150){
|
v = 50 * (pm10 - 150) / 100 + 100;
|
}else if (pm10<350 && pm10 >= 250){
|
v = 50 * (pm10 - 250) / 100 + 150;
|
}else if (pm10<420 && pm10 >= 350){
|
v = 100 * (pm10 - 350) / 70 + 200;
|
}else if (pm10<500 && pm10 >= 420){
|
v = 100 * (pm10 - 420) / 80 + 300;
|
}
|
else {
|
v = 100 * (pm10 - 500) / 100 + 400;
|
}
|
return Math.round(v);
|
}
|
|
private static double getPm2_5(double pm2_5){
|
double v = 0.0;
|
if (pm2_5<35){
|
v = 50 * pm2_5 / 35;
|
}else if (pm2_5<75 && pm2_5 >= 35){
|
v = 50 * (pm2_5 - 35) / 40 + 50;
|
}else if (pm2_5<115 && pm2_5 >= 75){
|
v = 50 * (pm2_5 - 75) / 40 + 100;
|
}else if (pm2_5<150 && pm2_5 >= 115){
|
v = 50 * (pm2_5 - 115) / 35 + 150;
|
}else if (pm2_5<250 && pm2_5 >= 150){
|
v = 100 * (pm2_5 - 150) / 100 + 200;
|
}else if (pm2_5<350 && pm2_5 >= 250){
|
v = 100 * (pm2_5 - 250) / 100 + 300;
|
}
|
else {
|
v = 100 * (pm2_5 - 350) / 150 + 400;
|
}
|
return Math.round(v);
|
}
|
|
|
private static double getO3(double o3){
|
double v = 0.0;
|
if (o3<100){
|
v = 50 * o3 / 100;
|
}else if (o3<160 && o3 >= 100){
|
v = 50 * (o3 - 100) / 60 + 50;
|
}else if (o3<215 && o3 >= 160){
|
v = 50 * (o3 - 160) / 55 + 100;
|
}else if (o3<265 && o3 >= 215){
|
v = 50 * (o3 - 215) / 50 + 150;
|
}else if (o3<800 && o3 >= 265){
|
v = 100 * (o3 - 265) / 535 + 200;
|
}else if (o3<1000 && o3 >= 800){
|
v = 100 * (o3 - 800) / 200 + 300;
|
}
|
return Math.round(v);
|
}
|
|
|
private static String getSU(Double aqi,ArrayList list){
|
String SU=null;
|
if (aqi<=50){
|
SU="-";
|
} else if (aqi.toString().equals(list.get(1).toString())){
|
SU="PM10";
|
}else if (aqi.toString().equals(list.get(0).toString())){
|
SU="PM2.5";
|
}else if (aqi.toString().equals(list.get(2).toString())){
|
SU="CO";
|
}else if (aqi.toString().equals(list.get(3).toString())){
|
SU="SO2";
|
}else if (aqi.toString().equals(list.get(4).toString())){
|
SU="NO2";
|
}else if (aqi.toString().equals(list.get(5).toString())){
|
SU="O3";
|
}
|
return SU;
|
}
|
|
}
|