package com.moral.util;
|
|
import java.util.ArrayList;
|
import java.util.Collections;
|
import java.util.HashMap;
|
import java.util.List;
|
import java.util.Map;
|
|
public class AQICalculation {
|
|
public static Map<String, Object> hourlyAQI(Map<String, Double> map){
|
List<Double> AQIList = new ArrayList<>();
|
for (Map.Entry<String, Double> entry : map.entrySet()) {
|
String key = entry.getKey();
|
Double value = entry.getValue();
|
Double PM2_5AQI;
|
Double PM10AQI;
|
Double SO2AQI;
|
Double NO2AQI;
|
Double COAQI;
|
Double O3AQI;
|
switch (key) {
|
case "e1":PM2_5AQI = PM2_5AQI(value);
|
AQIList.add(PM2_5AQI);
|
break;
|
case "e2":PM10AQI = PM10AQI(value);
|
AQIList.add(PM10AQI);
|
break;
|
case "e11":SO2AQI = SO2AQI(value);
|
AQIList.add(SO2AQI);
|
break;
|
case "e16":NO2AQI = NO2AQI(value);
|
AQIList.add(NO2AQI);
|
break;
|
case "e10":COAQI = COAQI(value);
|
AQIList.add(COAQI);
|
break;
|
case "e15":O3AQI = O3AQI(value);
|
AQIList.add(O3AQI);
|
break;
|
|
default:
|
break;
|
}
|
}
|
Double AQIMAX = Collections.max(AQIList);
|
Map<String, Object> returnMap = new HashMap<>();
|
returnMap.put("AQI", AQIMAX);
|
return returnMap;
|
}
|
|
static double PM2_5AQI(Double value) {
|
Double result = (double) 0;
|
if(value<=0) {
|
result=(double) 0;
|
}else if (value<=35) {
|
result = 50/35*(value-0)+0;
|
}else if (value<=75) {
|
result = 50/40*(value-35)+50;
|
}else if (value<=115) {
|
result = 50/40*(value-75)+100;
|
}else if (value<=150) {
|
result = 50/35*(value-115)+150;
|
}else if (value<=250) {
|
result = 100/100*(value-150)+200;
|
}else if (value<=350) {
|
result = 100/100*(value-250)+300;
|
}else {
|
result = 100/150*(value-350)+400;
|
}
|
return result;
|
}
|
|
static double PM10AQI(Double value) {
|
Double result = (double) 0;
|
if(value<=0) {
|
result=(double) 0;
|
}else if (value<=50) {
|
result = 50/50*(value-0)+0;
|
}else if (value<=150) {
|
result = 50/100*(value-50)+50;
|
}else if (value<=250) {
|
result = 50/100*(value-150)+100;
|
}else if (value<=350) {
|
result = 50/100*(value-250)+150;
|
}else if (value<=420) {
|
result = 100/70*(value-350)+200;
|
}else if (value<=500) {
|
result = 100/80*(value-420)+300;
|
}else {
|
result = 100/100*(value-500)+400;
|
}
|
return result;
|
}
|
|
static double SO2AQI(Double value) {
|
Double result = (double) 0;
|
if(value<=0) {
|
result=(double) 0;
|
}else if (value<=150) {
|
result = 50/150*(value-0)+0;
|
}else if (value<=500) {
|
result = 50/350*(value-150)+50;
|
}else if (value<=650) {
|
result = 50/150*(value-500)+100;
|
}else {
|
result = 50/150*(value-650)+150;
|
}
|
return result;
|
}
|
|
static double NO2AQI(Double value) {
|
Double result = (double) 0;
|
if(value<=0) {
|
result=(double) 0;
|
}else if (value<=100) {
|
result = 50/100*(value-0)+0;
|
}else if (value<=200) {
|
result = 50/100*(value-100)+50;
|
}else if (value<=700) {
|
result = 50/500*(value-200)+100;
|
}else if (value<=1200) {
|
result = 50/500*(value-700)+150;
|
}else if (value<=2340) {
|
result = 100/1140*(value-1200)+200;
|
}else if (value<=3090) {
|
result = 100/750*(value-2340)+300;
|
}else {
|
result = 100/750*(value-3090)+400;
|
}
|
return result;
|
}
|
|
static double COAQI(Double value) {
|
Double result = (double) 0;
|
if(value<=0) {
|
result=(double) 0;
|
}else if (value<=5) {
|
result = 50/5*(value-0)+0;
|
}else if (value<=10) {
|
result = 50/5*(value-5)+50;
|
}else if (value<=35) {
|
result = 50/25*(value-10)+100;
|
}else if (value<=60) {
|
result = 50/25*(value-35)+150;
|
}else if (value<=90) {
|
result = 100/30*(value-60)+200;
|
}else if (value<=120) {
|
result = 100/30*(value-90)+300;
|
}else {
|
result = 100/30*(value-120)+400;
|
}
|
return result;
|
}
|
|
static double O3AQI(Double value) {
|
Double result = (double) 0;
|
if(value<=0) {
|
result=(double) 0;
|
}else if (value<=100) {
|
result = 50/100*(value-0)+0;
|
}else if (value<=160) {
|
result = 50/60*(value-100)+50;
|
}else if (value<=215) {
|
result = 50/55*(value-160)+100;
|
}else if (value<=265) {
|
result = 50/150*(value-215)+150;
|
}else if (value<=800) {
|
result = 100/535*(value-265)+200;
|
}else if (value<=2100) {
|
result = 100/12*(value-800)+300;
|
}else {
|
result = 100/12*(value-48)+400;
|
}
|
return result;
|
}
|
|
}
|