UNPKG

aqi

Version:

A JavaScript library to calculate National Air Quality index based on concentrations

135 lines (128 loc) 2.46 kB
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; } };