aqi-us
Version:
Air Quality Index (AQI) calculation module according to USEPA AQI breakpoints.
173 lines (156 loc) • 3.68 kB
JavaScript
'use strict';
var aqi_breakpoints = [
[],
[],
[],
[],
[],
[],
[],
];
var co_breakpoints = [
[],
[],
[],
[],
[],
[],
[],
];
var no2_breakpoints = [
[],
[],
[],
[],
[],
[],
[],
];
var o3_1hr_breakpoints = [
null,
null,
[],
[],
[],
[],
[],
];
var o3_8hr_breakpoints = [
[],
[],
[],
[],
[],
];
var pm10_breakpoints = [
[],
[],
[],
[],
[],
[],
[],
];
var pm25_breakpoints = [
[],
[],
[],
[],
[],
[],
[],
];
var so2_breakpoints = [
[],
[],
[],
[],
[],
[],
[],
];
var aqi_labels = [
'Good',
'Moderate',
'Unhealthy for Sensitive Groups',
'Unhealthy',
'Very Unhealthy',
'Hazardous',
'Hazardous'
];
var aqi_colors = [
'009966',
'ffde33',
'ff9933',
'cc0033',
'660099',
'7e0023',
'7e0023'
];
if (undefined === Array.prototype.findIndex) {
Array.prototype.findIndex = function (callback) {
for (var i = 0; i < this.length; i++) {
if (callback.call(this, this[i], i, this)) {
return i;
}
}
return -1;
};
}
function breakpointIndex (value, breakpoints) {
return breakpoints.findIndex(function (breakpoint) {
if (null === breakpoint) {
return false;
}
return breakpoint[0] <= value && value <= breakpoint[1];
});
}
function aqi (concentration, breakpoints) {
var index = breakpointIndex(concentration, breakpoints);
if (-1 === index) {
return NaN;
}
var i_high = aqi_breakpoints[index][1],
i_low = aqi_breakpoints[index][0],
c_high = breakpoints[index][1],
c_low = breakpoints[index][0];
return Math.round((i_high - i_low) / (c_high - c_low) * (concentration - c_low) + i_low);
}
exports.co = function (concentration) {
concentration = Math.floor(concentration * 10) / 10;
return aqi(concentration, co_breakpoints);
};
exports.o3_1hr = function (concentration) {
concentration = Math.floor(concentration);
return aqi(concentration, o3_1hr_breakpoints);
};
exports.o3_8hr = function (concentration) {
concentration = Math.floor(concentration);
return aqi(concentration, o3_8hr_breakpoints);
};
exports.no2 = function (concentration) {
concentration = Math.floor(concentration);
return aqi(concentration, no2_breakpoints);
};
exports.pm10 = function (concentration) {
concentration = Math.floor(concentration);
return aqi(concentration, pm10_breakpoints);
};
exports.pm25 = function (concentration) {
concentration = Math.floor(concentration * 10) / 10;
return aqi(concentration, pm25_breakpoints);
};
exports.so2 = function (concentration) {
concentration = Math.floor(concentration);
return aqi(concentration, so2_breakpoints);
};
// Airnow.gov descriptions by range
exports.aqi_label = function (aqi) {
var idx = breakpointIndex(aqi, aqi_breakpoints);
return aqi_labels[idx];
};
// Aqi color mapping. Returns hex color code.
exports.aqi_color = function (aqi) {
var idx = breakpointIndex(aqi, aqi_breakpoints);
return aqi_colors[idx];
};