changeset 3501:c5c7cc24fe72

client: spuc12: implemented nash sutcliffe for forcast vs reality accuracy indicator
author Markus Kottlaender <markus@intevation.de>
date Tue, 28 May 2019 11:28:38 +0200
parents 5c4f117d8f98
children 45483dd0d801
files client/src/components/map/layers.js client/src/components/map/styles.js client/src/lib/classifications.js client/src/store/gauges.js
diffstat 4 files changed, 64 insertions(+), 2 deletions(-) [+]
line wrap: on
line diff
--- a/client/src/components/map/layers.js	Tue May 28 11:25:34 2019 +0200
+++ b/client/src/components/map/layers.js	Tue May 28 11:28:38 2019 +0200
@@ -531,7 +531,33 @@
               ]
             },
             source,
-            true
+            true,
+            async (f, store) => {
+              if (f.getId().indexOf("gauges") > -1) {
+                // look for nashSutcliffeOverview in store. If present and
+                // not older than 15 min use it or fetch new data and store it.
+                let data = store.getters["gauges/nashSutcliffeOverview"](f);
+                if (
+                  data &&
+                  new Date().getTime() - data.createdAt.getTime() < 900000
+                ) {
+                  f.set("nsc_data", data.data);
+                } else {
+                  data = await store.dispatch(
+                    "gauges/loadNashSutcliffeForOverview",
+                    f.get("isrs_code")
+                  );
+                  if (data) {
+                    store.commit("gauges/addNashSutcliffeOverviewEntry", {
+                      feature: f,
+                      data,
+                      createdAt: new Date()
+                    });
+                    f.set("nsc_data", data);
+                  }
+                }
+              }
+            }
           )
         );
         return new VectorLayer({
--- a/client/src/components/map/styles.js	Tue May 28 11:25:34 2019 +0200
+++ b/client/src/components/map/styles.js	Tue May 28 11:28:38 2019 +0200
@@ -240,7 +240,7 @@
       // TODO: Get information from feature and check the ranges according to #423, #424, #425
       let colorWaterlevel = classifications.gmAvailability(feature);
       let colorUniformTriangle = "lime";
-      let colorComparison = "white";
+      let colorComparison = classifications.forecastVsReality(feature);
       let colorAccuracy = classifications.forecastAccuracy(feature);
       let maps = store.state.map.openLayersMaps;
       let geom = feature.getGeometry();
--- a/client/src/lib/classifications.js	Tue May 28 11:25:34 2019 +0200
+++ b/client/src/lib/classifications.js	Tue May 28 11:28:38 2019 +0200
@@ -65,5 +65,14 @@
       }
     }
     return "white";
+  },
+  forecastVsReality(gauge) {
+    let nsc = gauge.get("nsc_data");
+    if (nsc && nsc.coeffs.reduce((sum, coeff) => sum + coeff.samples, 0)) {
+      if (nsc.coeffs[0].samples && nsc.coeffs[0].value < -12.5) return "red";
+      if (nsc.coeffs[2].samples && nsc.coeffs[2].value < -12.5) return "yellow";
+      return "lime";
+    }
+    return "white";
   }
 };
--- a/client/src/store/gauges.js	Tue May 28 11:25:34 2019 +0200
+++ b/client/src/store/gauges.js	Tue May 28 11:28:38 2019 +0200
@@ -30,6 +30,7 @@
     longtermInterval: [],
     yearWaterlevels: [],
     nashSutcliffe: null,
+    nashSutcliffeOverview: [],
     dateFrom: dateFrom,
     dateTo: dateTo,
     yearCompare: new Date().getFullYear()
@@ -45,6 +46,11 @@
       return state.gauges.find(
         g => g.properties.isrs_code === state.selectedGaugeISRS
       );
+    },
+    nashSutcliffeOverview: state => feature => {
+      return state.nashSutcliffeOverview.find(
+        d => d.feature.get("id") === feature.get("id")
+      );
     }
   },
   mutations: {
@@ -72,6 +78,14 @@
     nashSutcliffe: (state, data) => {
       state.nashSutcliffe = data;
     },
+    addNashSutcliffeOverviewEntry: (state, data) => {
+      let existingIndex = state.nashSutcliffeOverview.findIndex(
+        d => d.feature.get("id") === data.feature.get("id")
+      );
+      if (existingIndex !== -1)
+        state.nashSutcliffeOverview.splice(existingIndex, 1);
+      state.nashSutcliffeOverview.push(data);
+    },
     dateFrom: (state, dateFrom) => {
       state.dateFrom = dateFrom;
     },
@@ -263,6 +277,19 @@
             reject(error);
           });
       });
+    },
+    loadNashSutcliffeForOverview(context, isrsCode) {
+      return new Promise((resolve, reject) => {
+        HTTP.get(`/data/nash-sutcliffe/${isrsCode}`, {
+          headers: { "X-Gemma-Auth": localStorage.getItem("token") }
+        })
+          .then(response => {
+            resolve(response.data);
+          })
+          .catch(error => {
+            reject(error);
+          });
+      });
     }
   }
 };