weather-prism
Version:
A node module for retrieving PRISM daily weather data for an arbitrary location (lat-lon)
173 lines (164 loc) • 3.71 kB
text/typescript
const axios = require('axios');
const md5 = require('md5');
import moment from 'moment';
const _ = require('lodash');
let Promise = require('bluebird');
const debug = require('debug');
const info = debug(`weather-prism:info`);
async function fetch({years, lat, lon}) {
if (!lat || !lon) {
throw new Error(`Latitude ("lat") ${lat} or Longitude ("lon"): ${lon} value missing.`)
}
//Handle dates
if (!years) {
let end = moment().year() + 1;
let start = end - 21;
years = _.range(start, end);
info(`Missing parameter "years". Defaulting to 20 years of data, i.e., years:${years}.`)
}
let data:any = {};
let template:any = {
pcpn: {
units: "in"
},
maxt: {
units: "degreeF"
},
mint: {
units: "degreeF"
},
avgt: {
units: "degreeF"
},
ggd: {
units: "GDD Heat Units",
base: {
value: 50,
units: "degreeF"
}
}
}
let tid = md5(JSON.stringify(template))
template.id = tid;
await Promise.each(years.sort(), async (year) => {
info(`Processing year ${year}`)
let response = await axios({
method: "post",
url: "https://data.rcc-acis.org/GridData",
headers: {
"Content-Type": "application/json"
},
data: {
loc: `${lon}, ${lat}`,
"sdate":`${year}-01-01`,
"edate":`${year}-12-31`,
"grid":"21",
"elems":[{
"name":"pcpn",
"interval":"dly",
"duration":1,
"smry":"sum",
"units":"inch"
},{
"name":"maxt",
"interval":"dly",
"duration":1,
"smry":"sum",
"units":"degreeF"
},{
"name":"mint",
"interval":"dly",
"duration":1,
"smry":"sum",
"units":"degreeF"
},{
"name":"avgt",
"interval":"dly",
"duration":1,
"smry":"sum",
"units":"degreeF"
},{
"name":"gdd",
"interval":"dly",
"duration":1,
"smry":"sum",
"units":"degreeF"
}]
}
}).then(r => r.data.data)
//.catch(r => undefined)
if (response) {
response.forEach(item => {
let day = item[0];
/*
data["day-index"][day] = {
pcpn: item[1],
maxt: item[2],
mint: item[3],
avgt: item[4],
};
*/
data[day] = {
pcpn: item[1],
maxt: item[2],
mint: item[3],
avgt: item[4],
gdd: item[5],
time: moment(day).format(),
template: tid
};
})
}
})
return { data, template }
}
async function get(lon, lat, sdate, edate) {
await axios({
method: "post",
url: "https://data.rcc-acis.org/GridData",
headers: {
"Content-Type": "application/json"
},
data: {
loc: `${lon}, ${lat}`,
sdate,
edate,
"grid":"21",
"elems":[{
"name":"pcpn",
"interval":"dly",
"duration":1,
"smry":"sum",
"units":"inch"
},{
"name":"maxt",
"interval":"dly",
"duration":1,
"smry":"sum",
"units":"degreeF"
},{
"name":"mint",
"interval":"dly",
"duration":1,
"smry":"sum",
"units":"degreeF"
},{
"name":"avgt",
"interval":"dly",
"duration":1,
"smry":"sum",
"units":"degreeF"
},{
"name":"gdd",
"interval":"dly",
"duration":1,
"smry":"sum",
"units":"degreeF"
}]
}
}).then(r => r.data.data)
}
module.exports = {
fetch,
get
}