UNPKG

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
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 }