aqi
Version:
A JavaScript library to calculate National Air Quality index based on concentrations
135 lines (128 loc) • 2.46 kB
JavaScript
var breakpoints = {
'Carbon Monoxide': ['0.0-1.0', '1.1-2.0', '2.1-10.0', '10.1-17.0', '17.1-34.0'],
'Nitrogen Dioxide': ['0-40', '41-80', '81-180', '181-280', '281-400'],
'PM 2dot5': ['0-30', '31-60', '61-90', '91-120', '121-250'],
'Sulfur Dioxide': ['0-40', '41-80', '81-380', '381-800', '801-1600'],
'PM10': ['0-50', '51-100', '101-250', '251-350', '351-430'],
'Ozone': ['0-50', '51-100', '101-168', '169-208', '209-748'],
'Ammonia': ['0-200', '201-400', '401-800', '801-1200', '1200-1800']
};
var aqi = {
'Carbon Monoxide': {
'0.0': 0,
'1.0': 50,
'1.1': 51,
'2.0': 100,
'2.1': 101,
'10.0': 200,
'10.1': 201,
'17.0': 300,
'17.1': 301,
'34.0': 400,
'34.1': 401,
'max': 500
},
'Nitrogen Dioxide': {
'0': 0,
'40': 50,
'41': 51,
'80': 100,
'81': 101,
'180': 200,
'181': 201,
'280': 300,
'281': 301,
'400': 400,
'401': 401,
'max': 500
},
'PM 2dot5': {
'0': 0,
'30': 50,
'31': 51,
'60': 100,
'61': 101,
'90': 200,
'91': 201,
'120': 300,
'121': 301,
'250': 400,
'251': 401,
'max': 500
},
'Sulfur Dioxide': {
'0': 0,
'40': 50,
'41': 51,
'80': 100,
'81': 101,
'380': 200,
'381': 201,
'800': 300,
'801': 301,
'1600': 400,
'1601': 401,
'max': 500
},
'PM10': {
'0': 0,
'50': 50,
'51': 51,
'100': 100,
'101': 101,
'250': 200,
'251': 201,
'350': 300,
'351': 301,
'430': 400,
'431': 401,
'max': 500
},
'Ozone': {
'0': 0,
'50': 50,
'51': 51,
'100': 100,
'101': 101,
'168': 200,
'169': 201,
'208': 300,
'209': 301,
'748': 400,
'749': 401,
'max': 500
},
'Ammonia': {
'0': 0,
'200': 50,
'201': 51,
'400': 100,
'401': 101,
'800': 200,
'801': 201,
'1200': 300,
'1201': 301,
'1800': 400,
'1801': 401,
'max': 500
}
};
module.exports = {
calculateAqi: function (parameter, concentration) {
var paramBreakpoints = breakpoints[parameter];
var paramAqi = aqi[parameter];
var iP = 0;
for (var i = 0; i < paramBreakpoints.length; i++) {
var arrBreakpointRange = paramBreakpoints[i].split('-');
var bpLow = parseFloat(arrBreakpointRange[0]);
var bpHigh = parseFloat(arrBreakpointRange[1]);
if (concentration >= bpLow && concentration <= bpHigh) {
var iLow = paramAqi[arrBreakpointRange[0]];
var iHigh = paramAqi[arrBreakpointRange[1]];
iP = Math.round((((iHigh - iLow) / (bpHigh - bpLow)) * (concentration - bpLow)) + iLow);
break;
}
}
return iP;
}
};