Skip to content
Snippets Groups Projects

Accumulated gdd

Merged Tucker Gary Siegel requested to merge accumulated-gdd into master
11 files
+ 856
205
Compare changes
  • Side-by-side
  • Inline
Files
11
gdd = require('./models/gdd.js');
gdd_current = require('./models/gdd_current.js');
normals = require('./models/normals.js');
gdd = require('../models/gdd.js');
gdd_current = require('../models/gdd_current.js');
gdd_normal = require('../models/normals.js');
utils = require('../lib/utils');
function send_response(message, gdds, data, res) {
res.json({
message: message,
date: data["last_date"],
data: gdds,
closest_lon: data["location"]["coordinates"][0],
closest_lat: data["location"]["coordinates"][1]
})
}
function find(collection, query, projection, temps, res) {
collection.findOne(query, projection).then(function(data) {
var min_temps = data["min_temps"]
var max_temps = data["max_temps"]
var gdds = [];
function isNumeric(value) {
return /^-?\d+$/.test(value);
var { t_base, t_max, t_min } = temps;
var min_temp = 0
var max_temp = 0
var gdd_sum = 0;
for (var i = 0; i < min_temps.length; i++) {
min_temp = min_temps[i] >= t_min ? min_temps[i] : t_min;
max_temp = max_temps[i] <= t_max ? max_temps[i] : t_max;
gdd_sum += ((max_temp + min_temp) / 2) - t_base
gdds.push(gdd_sum)
}
send_response("Accumulated GDDs", gdds, data, res);
}, function(err) {
res.status(500).send({"internal error": err})
})
}
exports.year_gdd = function (req, res) {
if (!isNumeric(req.params.year)) {
res.status(400).send({"parameter error": "\"year\" parameter is not an integer"})
}
exports.accumulated_gdd = function (req, res) {
var year = parseInt(req.params.year);
var product = req.params.product;
if (typeof req.body.latitude === "undefined" || typeof req.body.longitude === "undefined") {
res.status(400).send({"parameter error": "missing latitude or longitude"})
}
var latitude = parseFloat(req.body.latitude)
var longitude = parseFloat(req.body.longitude)
@@ -32,12 +59,6 @@ exports.year_gdd = function (req, res) {
year: year,
}
var projection = {
min_temps: 1,
max_temps: 1,
location: 1,
}
var t_base = 50
var t_max = 86
var t_min = 50
@@ -64,40 +85,12 @@ exports.year_gdd = function (req, res) {
t_min = t_base;
}
} else {
switch (product) {
case "soybean":
case "corn":
case "sunflower":
case "tomato":
case "sugar_beat":
t_base = 50;
break;
case "potato":
t_base = 44.6;
t_min = 44.6; // NEED TO ASK ABOUT MIN AND MAX TEMPS IN DAY. SHOULD T_MIN BE SET EQUAL TO T_BASE IF IT IS LESS THAN T_BASE?
break;
case "wheat":
t_base = 41.9;
t_min = 41.9;
break;
case "peas":
t_base = 41;
t_min = 41;
break;
case "brussels_sprout":
case "parsley":
case "cabbage":
t_base = 32;
t_min = 32;
break;
default:
errors.push({
parameter_error: "product",
message: product + " is not available for GDD calculations"
});
break;
}
out = utils.product_base_switch(product, errors);
t_base = out.t_base;
t_min = out.t_min;
errors = out.errors;
}
if (longitude < -125 || longitude > -66.5) {
errors.push({
@@ -111,73 +104,35 @@ exports.year_gdd = function (req, res) {
errors: errors
})
}
var projection = {
min_temps: 1,
max_temps: 1,
location: 1,
}
temps = {
t_base: t_base,
t_max: t_max,
t_min: t_min,
}
if (year != new Date().getFullYear()) {
gdd.findOne(query, projection).then(function(data) {
var min_temps = data["min_temps"]
var max_temps = data["max_temps"]
var gdds = [];
var min_temp = 0
var max_temp = 0
for (var i = 0; i < min_temps.length; i++) {
min_temp = min_temps[i] >= t_min ? min_temps[i] : t_min;
max_temp = max_temps[i] <= t_max ? max_temps[i] : t_max;
gdds.push(((max_temp + min_temp) / 2) - t_base)
}
res.json({
message: "GDDs",
date: data["last_date"],
data: gdds,
closest_lon: data["location"]["coordinates"][0],
closest_lat: data["location"]["coordinates"][1]
})
}, function(err) {
console.log(err);
})
find(gdd, query, projection, temps, res);
} else {
gdd_current.findOne(query, projection).then(function(data) {
var min_temps = data["min_temps"]
var max_temps = data["max_temps"]
var gdds = [];
var min_temp = 0
var max_temp = 0
for (var i = 0; i < min_temps.length; i++) {
min_temp = min_temps[i] >= t_min ? min_temps[i] : t_min;
max_temp = max_temps[i] <= t_max ? max_temps[i] : t_max;
gdds.push(((max_temp + min_temp) / 2) - t_base)
}
res.json({
message: "GDDs",
date: data["last_date"],
data: gdds,
closest_lon: data["location"]["coordinates"][0],
closest_lat: data["location"]["coordinates"][1]
})
}, function(err) {
console.log(err);
})
find(gdd_current, query, projection, temps, res);
}
};
exports.normal = function (req, res) {
var product = req.params.product;
exports.accumulated_normal_gdd = function (req, res) {
if (typeof req.body.latitude === "undefined" || typeof req.body.longitude === "undefined") {
res.status(400).send({"parameter error": "missing latitude or longitude"})
}
var product = req.params.product;
var latitude = parseFloat(req.body.latitude)
var longitude = parseFloat(req.body.longitude)
var query = {
location: {
"$near": {
@@ -189,12 +144,6 @@ exports.normal = function (req, res) {
},
}
var projection = {
min_temps: 1,
max_temps: 1,
location: 1,
}
var t_base = 50
var t_max = 86
var t_min = 50
@@ -214,40 +163,12 @@ exports.normal = function (req, res) {
t_min = t_base;
}
} else {
switch (product) {
case "soybean":
case "corn":
case "sunflower":
case "tomato":
case "sugar_beat":
t_base = 50;
break;
case "potato":
t_base = 44.6;
t_min = 44.6; // NEED TO ASK ABOUT MIN AND MAX TEMPS IN DAY. SHOULD T_MIN BE SET EQUAL TO T_BASE IF IT IS LESS THAN T_BASE?
break;
case "wheat":
t_base = 41.9;
t_min = 41.9;
break;
case "peas":
t_base = 41;
t_min = 41;
break;
case "brussels_sprout":
case "parsley":
case "cabbage":
t_base = 32;
t_min = 32;
break;
default:
errors.push({
parameter_error: "product",
message: product + " is not available for GDD calculations"
});
break;
}
out = utils.product_base_switch(product, errors);
t_base = out.t_base;
t_min = out.t_min;
errors = out.errors;
}
if (longitude < -125 || longitude > -66.5) {
errors.push({
@@ -262,29 +183,17 @@ exports.normal = function (req, res) {
})
}
normals.findOne(query, projection).then(function(data) {
var min_temps = data["min_temps"]
var max_temps = data["max_temps"]
var gdds = [];
var min_temp = 0
var max_temp = 0
for (var i = 0; i < min_temps.length; i++) {
min_temp = min_temps[i] >= t_min ? min_temps[i] : t_min;
max_temp = max_temps[i] <= t_max ? max_temps[i] : t_max;
gdds.push(((max_temp + min_temp) / 2) - t_base)
}
var projection = {
min_temps: 1,
max_temps: 1,
location: 1,
}
res.json({
message: "30-year Normal GDDs",
data: gdds,
closest_lon: data["location"]["coordinates"][0],
closest_lat: data["location"]["coordinates"][1]
})
temps = {
t_base: t_base,
t_max: t_max,
t_min: t_min,
}
}, function(err) {
console.log(err);
})
};
find(gdd_normal, query, projection, temps, res);
};
\ No newline at end of file
Loading