diff artifacts/src/main/java/org/dive4elements/river/artifacts/sinfo/flood_duration/FloodDurationCalculator.java @ 9257:ef7b65576d4b

Added W and Q main values to S-Info flood duration curve chart
author mschaefer
date Fri, 13 Jul 2018 18:38:05 +0200
parents c2a0028bfa9f
children 66b003701546
line wrap: on
line diff
--- a/artifacts/src/main/java/org/dive4elements/river/artifacts/sinfo/flood_duration/FloodDurationCalculator.java	Fri Jul 13 12:04:21 2018 +0200
+++ b/artifacts/src/main/java/org/dive4elements/river/artifacts/sinfo/flood_duration/FloodDurationCalculator.java	Fri Jul 13 18:38:05 2018 +0200
@@ -33,6 +33,9 @@
 import org.dive4elements.river.artifacts.sinfo.common.WQBaseTableFinder;
 import org.dive4elements.river.artifacts.sinfo.flood_duration.RiversideRadioChoice.RiversideChoiceKey;
 import org.dive4elements.river.exports.WaterlevelDescriptionBuilder;
+import org.dive4elements.river.jfree.RiverAnnotation;
+import org.dive4elements.river.jfree.StickyAxisAnnotation;
+import org.dive4elements.river.jfree.StickyAxisAnnotation.SimpleAxis;
 import org.dive4elements.river.model.Attribute.AttributeKey;
 import org.dive4elements.river.model.Gauge;
 import org.dive4elements.river.model.sinfo.InfrastructureValue;
@@ -116,11 +119,17 @@
         }
         results.addResult(new FloodDurationCalculationResult(label, mainValueLabels, this.rows), problems);
         calcWQDays(problems, stationsSorted[0], AttributeKey.LEFT, winfo, results);
+        calcMainValueAnnotations(label, problems, 0, AttributeKey.LEFT, wqkmsArray, mainValueLabels, results);
+        // TODO Infrastrukturhoehe
     }
 
-    public void calcWQDays(final Calculation problems, final double station, final AttributeKey riverside, final WINFOArtifact winfo,
+    /**
+     * Calculate duration curve for a station and add to result collection
+     */
+    private void calcWQDays(final Calculation problems, final double station, final AttributeKey riverside, final WINFOArtifact winfo,
             final FloodDurationCalculationResults results) {
 
+        // Same processing as in W-Info DurationCurveState
         winfo.addStringData("ld_locations", Double.toString(station));
         final CalculationResult res = winfo.getDurationCurveData();
         final WQDay underflow = (WQDay) res.getData();
@@ -134,12 +143,51 @@
             qs[j] = underflow.getQ(i);
         }
         res.setData(new WQDay(days, ws, qs));
-        // TODO Infrastrukturhoehe
-        // TODO WSPL/Hauptwerte
         results.setDurationCurve(res);
     }
 
     /**
+     * Calculate the data for the W and Q main value lines in the duration curve chart and add to result collection
+     */
+    private void calcMainValueAnnotations(final String label, final Calculation problems, final int stationIndex, final AttributeKey riverside,
+            final WQKms[] wqkmsArray, final String[] mainValueLabels, final FloodDurationCalculationResults results) {
+
+        // Same way as in MainValueWFacet and ..QFacet
+        final List<StickyAxisAnnotation> ws = new ArrayList<>();
+        final List<StickyAxisAnnotation> qs = new ArrayList<>();
+        for (int i = 0; i <= wqkmsArray.length - 1; i++) {
+            final StickyAxisAnnotation qAnnotation = new StickyAxisAnnotation(mainValueLabels[i], (float) wqkmsArray[i].getQ(stationIndex), SimpleAxis.Y_AXIS,
+                    FloodDurationCurveGenerator.YAXIS.Q.idx);
+            qs.add(qAnnotation);
+            setHitPoint((WQDay) results.getDurationCurve().getData(), qAnnotation);
+            final StickyAxisAnnotation wAnnotation = new StickyAxisAnnotation(mainValueLabels[i], (float) wqkmsArray[i].getW(stationIndex), SimpleAxis.Y_AXIS,
+                    FloodDurationCurveGenerator.YAXIS.W.idx);
+            ws.add(wAnnotation);
+            setHitPoint((WQDay) results.getDurationCurve().getData(), wAnnotation);
+        }
+        // TODO RiverAnnotation ersetzen weil das eine NotSerializableException erzeugt
+        results.setMainValueQAnnotation(new RiverAnnotation(label, qs));
+        results.setMainValueWAnnotation(new RiverAnnotation(label, ws));
+    }
+
+    /**
+     * Set the hit-point in Q where a line drawn from the axis would hit the
+     * curve in WQDay (if hit).
+     * Employ linear interpolation.
+     */
+    private static void setHitPoint(final WQDay wqday, final StickyAxisAnnotation annotation) {
+
+        final float q = annotation.getPos();
+        final Double day = wqday.interpolateDayByQ(q);
+        if (day != null) {
+            annotation.setHitPoint(day.floatValue());
+        }
+        // else if (log.isDebugEnabled()) {
+        // log.debug("StickyAnnotation does not hit wqday curve: " + q);
+        // }
+    }
+
+    /**
      * Adds to a stations map all stations corresponding to the active range and step
      */
     private void addRangeStations(final Map<Double, InfrastructureValue> allStations, final WINFOArtifact winfo) {

http://dive4elements.wald.intevation.org