Skip to content

Commit

Permalink
Merge pull request #3033 from WikiWatershed/tt/unit-conversion-mapshed
Browse files Browse the repository at this point in the history
Unit Conversion: MapShed

Connects #3024
  • Loading branch information
rajadain authored Nov 28, 2018
2 parents 4d54bdf + 5095277 commit 834c40d
Show file tree
Hide file tree
Showing 18 changed files with 318 additions and 104 deletions.
44 changes: 22 additions & 22 deletions src/mmw/js/src/compare/constants.js
Original file line number Diff line number Diff line change
Expand Up @@ -114,41 +114,41 @@ var CHARTS = 'charts',
name: 'Sediment',
key: 'Sediment',
chartDiv: 's-chart',
unit: 'kg',
unit: 'MASS_M',
},
{
name: 'Total Nitrogen',
key: 'TotalN',
chartDiv: 'tn-chart',
unit: 'kg',
unit: 'MASS_M',
},
{
name: 'Total Phosphorus',
key: 'TotalP',
chartDiv: 'tp-chart',
unit: 'kg',
unit: 'MASS_M',
}
],
gwlfeQualitySelectionOptionConfig = [
{ group: 'SummaryLoads', groupName: 'Summary', name: 'Total Loads', unit: 'kg', active: true },
{ group: 'SummaryLoads', groupName: 'Summary', name: 'Loading Rates', unit: 'kg/ha' },
{ group: 'SummaryLoads', groupName: 'Summary', name: 'Mean Annual Concentration', unit: 'mg/l' },
{ group: 'SummaryLoads', groupName: 'Summary', name: 'Mean Low-Flow Concentration', unit: 'mg/l' },
{ group: 'Loads', groupName: 'Land Use', name: 'Hay/Pasture', unit: 'kg' },
{ group: 'Loads', groupName: 'Land Use', name: 'Cropland', unit: 'kg' },
{ group: 'Loads', groupName: 'Land Use', name: 'Wooded Areas', unit: 'kg' },
{ group: 'Loads', groupName: 'Land Use', name: 'Wetlands', unit: 'kg' },
{ group: 'Loads', groupName: 'Land Use', name: 'Open Land', unit: 'kg' },
{ group: 'Loads', groupName: 'Land Use', name: 'Barren Areas', unit: 'kg' },
{ group: 'Loads', groupName: 'Land Use', name: 'Low-Density Mixed', unit: 'kg' },
{ group: 'Loads', groupName: 'Land Use', name: 'Medium-Density Mixed', unit: 'kg' },
{ group: 'Loads', groupName: 'Land Use', name: 'High-Density Mixed', unit: 'kg' },
{ group: 'Loads', groupName: 'Land Use', name: 'Low-Density Open Space', unit: 'kg' },
{ group: 'Loads', groupName: 'Land Use', name: 'Farm Animals', unit: 'kg' },
{ group: 'Loads', groupName: 'Land Use', name: 'Stream Bank Erosion', unit: 'kg' },
{ group: 'Loads', groupName: 'Land Use', name: 'Subsurface Flow', unit: 'kg' },
{ group: 'Loads', groupName: 'Land Use', name: 'Point Sources', unit: 'kg' },
{ group: 'Loads', groupName: 'Land Use', name: 'Septic Systems', unit: 'kg' },
{ group: 'SummaryLoads', groupName: 'Summary', name: 'Total Loads', unit: 'MASS_M', active: true },
{ group: 'SummaryLoads', groupName: 'Summary', name: 'Loading Rates', unit: 'MASSPERAREA_M' },
{ group: 'SummaryLoads', groupName: 'Summary', name: 'Mean Annual Concentration', unit: 'CONCENTRATION' },
{ group: 'SummaryLoads', groupName: 'Summary', name: 'Mean Low-Flow Concentration', unit: 'CONCENTRATION' },
{ group: 'Loads', groupName: 'Land Use', name: 'Hay/Pasture', unit: 'MASS_M' },
{ group: 'Loads', groupName: 'Land Use', name: 'Cropland', unit: 'MASS_M' },
{ group: 'Loads', groupName: 'Land Use', name: 'Wooded Areas', unit: 'MASS_M' },
{ group: 'Loads', groupName: 'Land Use', name: 'Wetlands', unit: 'MASS_M' },
{ group: 'Loads', groupName: 'Land Use', name: 'Open Land', unit: 'MASS_M' },
{ group: 'Loads', groupName: 'Land Use', name: 'Barren Areas', unit: 'MASS_M' },
{ group: 'Loads', groupName: 'Land Use', name: 'Low-Density Mixed', unit: 'MASS_M' },
{ group: 'Loads', groupName: 'Land Use', name: 'Medium-Density Mixed', unit: 'MASS_M' },
{ group: 'Loads', groupName: 'Land Use', name: 'High-Density Mixed', unit: 'MASS_M' },
{ group: 'Loads', groupName: 'Land Use', name: 'Low-Density Open Space', unit: 'MASS_M' },
{ group: 'Loads', groupName: 'Land Use', name: 'Farm Animals', unit: 'MASS_M' },
{ group: 'Loads', groupName: 'Land Use', name: 'Stream Bank Erosion', unit: 'MASS_M' },
{ group: 'Loads', groupName: 'Land Use', name: 'Subsurface Flow', unit: 'MASS_M' },
{ group: 'Loads', groupName: 'Land Use', name: 'Point Sources', unit: 'MASS_M' },
{ group: 'Loads', groupName: 'Land Use', name: 'Septic Systems', unit: 'MASS_M' },
];

module.exports = {
Expand Down
10 changes: 6 additions & 4 deletions src/mmw/js/src/compare/models.js
Original file line number Diff line number Diff line change
Expand Up @@ -161,25 +161,27 @@ var GwlfeQualityCharts = BarChartRowsCollection.extend({
});

this.forEach(function(chart) {
var key = chart.get('key'),
var scheme = settings.get('unit_scheme'),
key = chart.get('key'),
group = selection.get('group'),
source = selection.get('value'),
unit = selection.get('unit'),
unitName = coreUnits[scheme][unit].name,
unitLabel = selection.get('name'),
values = _.map(results, function(r) {
return {
x: r.name,
y: Number(
y: coreUnits.get(unit, Number(
_.find(
r.result[group],
{ Source: source }
)[key]
),
)).value,
};
});

chart.set({
unit: unit,
unit: unitName,
unitLabel: unitLabel,
values: values,
});
Expand Down
11 changes: 7 additions & 4 deletions src/mmw/js/src/compare/utils.js
Original file line number Diff line number Diff line change
Expand Up @@ -35,9 +35,12 @@ function mapScenariosToHydrologyTableData(scenarios) {
return n.get('displayName') === constants.HYDROLOGY;
})
.map(function(m) {
return m
.get('result')
.monthly;
// Convert cm to m
return m.get('result').monthly.map(function(monthly) {
return _.mapValues(monthly, function(value) {
return value / 100;
});
});
});

return accumulator.concat(nextAttribute);
Expand All @@ -49,7 +52,7 @@ function mapScenariosToHydrologyTableData(scenarios) {
return {
key: key,
name: moment(name, 'MMM').format('MMMM'),
unit: 'cm',
unit: 'LENGTH_S',
values: scenarioData
.map(function(element) {
return element[key];
Expand Down
32 changes: 27 additions & 5 deletions src/mmw/js/src/compare/views.js
Original file line number Diff line number Diff line change
Expand Up @@ -719,6 +719,8 @@ var LineChartRowView = Marionette.ItemView.extend({

renderChart: function() {
var self = this,
scheme = settings.get('unit_scheme'),
lengthUnit = coreUnits[scheme].LENGTH_S.name,
chartDiv = this.model.get('chartDiv'),
chartEl = document.getElementById(chartDiv),
data = this.model.get('data')
Expand All @@ -728,7 +730,7 @@ var LineChartRowView = Marionette.ItemView.extend({
values: scenarioData.map(function(val, x) {
return {
x: x,
y: Number(val),
y: coreUnits.get('LENGTH_S', Number(val) / 100).value,
};
}),
color: constants.SCENARIO_COLORS[index % 32],
Expand All @@ -737,8 +739,8 @@ var LineChartRowView = Marionette.ItemView.extend({
.slice()
.reverse(),
options = {
yAxisLabel: 'Water Depth (cm)',
yAxisUnit: 'cm',
yAxisLabel: 'Water Depth (' + lengthUnit + ')',
yAxisUnit: lengthUnit,
xAxisLabel: function(xValue) {
return constants.monthNames[xValue];
},
Expand Down Expand Up @@ -899,13 +901,16 @@ var GwlfeHydrologyTableRowView = TableRowView.extend({
template: compareTableRowTmpl,

templateHelpers: function() {
var selectedAttribute = this.model.get('selectedAttribute');
var selectedAttribute = this.model.get('selectedAttribute'),
scheme = settings.get('unit_scheme'),
unit = this.model.get('unit');

return {
unit: coreUnits[scheme][unit].name,
values: this.model
.get('values')
.map(function(v) {
return v[selectedAttribute];
return coreUnits.get(unit, v[selectedAttribute]).value;
}),
};
},
Expand All @@ -917,6 +922,23 @@ var GwlfeHydrologyTableView = TableView.extend({

var GwlfeQualityTableRowView = TableRowView.extend({
className: 'compare-table-row -gwlfe -quality',

templateHelpers: function() {
var scheme = settings.get('unit_scheme'),
unit = this.model.get('unit');

if (!unit) {
// Special header case
return {};
}

return {
unit: coreUnits[scheme][unit].name ,
values: this.model.get('values').map(function(v) {
return coreUnits.get(unit, v).value;
}),
};
}
});

var GwlfeQualityTableView = TableView.extend({
Expand Down
5 changes: 5 additions & 0 deletions src/mmw/js/src/core/filters.js
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@

var nunjucks = require('nunjucks');
var utils = require('./utils');
var coreUnits = require('./units');
var _ = require('lodash');
var moment = require('moment');

Expand Down Expand Up @@ -94,3 +95,7 @@ nunjucks.env.addFilter('toFriendlyBytes', function(bytes) {

return roundToOneDecimal(bytes) + ' GB';
});

nunjucks.env.addFilter('toUnit', function(value, unit) {
return coreUnits.get(unit, value).value;
});
20 changes: 20 additions & 0 deletions src/mmw/js/src/core/units.js
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,11 @@ var units = {
factor: 2.58999E+06,
offset: 0
},
AREA_L_FROM_HA: { // Used for converting ha values
name: 'acre',
factor: 4.04686E-01,
offset: 0
},
AREA_L: {
name: 'acre',
factor: 4.04686E+03,
Expand All @@ -23,6 +28,11 @@ var units = {
factor: 9.29030E-02,
offset: 0
},
LENGTH_XL_FROM_KM: {
name: 'mi',
factor: 1.60934,
offset: 0
},
LENGTH_XL: {
name: 'mi',
factor: 1.60934E+03,
Expand Down Expand Up @@ -85,6 +95,11 @@ var units = {
factor: 1.00000E+06,
offset: 0
},
AREA_L_FROM_HA: {
name: 'ha',
factor: 1,
offset: 0
},
AREA_L: {
name: 'ha',
factor: 1.00000E+04,
Expand All @@ -95,6 +110,11 @@ var units = {
factor: 1,
offset: 0
},
LENGTH_XL_FROM_KM: {
name: 'km',
factor: 1,
offset: 0
},
LENGTH_XL: {
name: 'km',
factor: 1.00000E+03,
Expand Down
33 changes: 29 additions & 4 deletions src/mmw/js/src/modeling/controls.js
Original file line number Diff line number Diff line change
Expand Up @@ -169,8 +169,17 @@ var UserInputView = Marionette.LayoutView.extend({
},

templateHelpers: function() {
var scheme = settings.get('unit_scheme'),
areaUnit = coreUnits[scheme].AREA_L_FROM_HA.name,
lengthUnit = coreUnits[scheme].LENGTH_XL_FROM_KM.name,
labelUnits = function(string) {
return string
.replace('AREAUNITNAME', areaUnit)
.replace('LENGTHUNITNAME', lengthUnit);
};

return {
displayNames: gwlfeConfig.displayNames
displayNames: _.mapValues(gwlfeConfig.displayNames, labelUnits),
};
}
});
Expand Down Expand Up @@ -204,10 +213,20 @@ var ManualEntryView = Marionette.CompositeView.extend({
},

templateHelpers: function() {
var manualMod = this.model.get('manualMod');
var manualMod = this.model.get('manualMod'),
scheme = settings.get('unit_scheme'),
areaUnit = coreUnits[scheme].AREA_L_FROM_HA.name,
lengthUnit = coreUnits[scheme].LENGTH_XL_FROM_KM.name,
labelUnits = function(string) {
return string
.replace('AREAUNITNAME', areaUnit)
.replace('LENGTHUNITNAME', lengthUnit);
};

return {
modConfig: gwlfeConfig.configs[manualMod],
displayNames: gwlfeConfig.displayNames,
displayNames: _.mapValues(gwlfeConfig.displayNames, labelUnits),
displayUnits: gwlfeConfig.displayUnits,
dataModel: this.model.get('dataModel')
};
},
Expand Down Expand Up @@ -243,7 +262,13 @@ var ManualEntryView = Marionette.CompositeView.extend({
computeOutput: function() {
var modConfig = gwlfeConfig.configs[this.model.get('manualMod')],
userInput = _.map(modConfig.userInputNames, function(userInputName) {
return $('#'+userInputName).val();
var value = $('#'+userInputName).val();

if (modConfig.unit) {
value /= coreUnits.get(modConfig.unit, 1).value;
}

return value.toString();
}),
output;

Expand Down
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
{% if is_modified %}
Total: <strong>{{ userTotal | toLocaleString(1) }} ha</strong>
Total: <strong>{{ userTotal | toLocaleString(1) }} {{ unit }}</strong>
{% if (userTotal) != (autoTotal) %}
<small>
(<span class="error">{{ (userTotal - autoTotal) | abs | toLocaleString(1) }}
Expand All @@ -9,5 +9,5 @@
</small>
{% endif %}
{% else %}
Total: {{ autoTotal | toLocaleString(1) }} ha
Total: {{ autoTotal | toLocaleString(1) }} {{ unit }}
{% endif %}
Loading

0 comments on commit 834c40d

Please sign in to comment.