Mercurial > dive4elements > river
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) {