Mercurial > dive4elements > river
diff artifacts/src/main/java/org/dive4elements/river/artifacts/sinfo/flood_duration/FloodDurationCalculator.java @ 9266:465347d12990
Station specific calculation of flood duration curve and infrastructure annotations
author | mschaefer |
---|---|
date | Wed, 18 Jul 2018 12:20:01 +0200 |
parents | e5367900dd6d |
children | 83ebeb620b5a |
line wrap: on
line diff
--- a/artifacts/src/main/java/org/dive4elements/river/artifacts/sinfo/flood_duration/FloodDurationCalculator.java Tue Jul 17 19:48:28 2018 +0200 +++ b/artifacts/src/main/java/org/dive4elements/river/artifacts/sinfo/flood_duration/FloodDurationCalculator.java Wed Jul 18 12:20:01 2018 +0200 @@ -10,6 +10,7 @@ package org.dive4elements.river.artifacts.sinfo.flood_duration; import java.util.ArrayList; +import java.util.Collection; import java.util.HashMap; import java.util.List; import java.util.Map; @@ -118,18 +119,17 @@ mainValueLabels[i] = wqkmsArray[i].getName(); results.addResult(new FloodDurationCalculationResult(label, mainValueLabels, this.rows), problems); - calcWQDays(problems, stationsSorted[0], AttributeKey.LEFT, winfo, results); - - calcMainValueAnnotations(problems, 0, AttributeKey.LEFT, wqkmsArray, results); - - calcInfrastructureAnnotations(problems, this.rows.get(0), wqkmsArray, results); + // calcWQDays(problems, stationsSorted[0], AttributeKey.LEFT, winfo, results); + // + // calcMainValueAnnotations(problems, 0, AttributeKey.LEFT, wqkmsArray, results); + // + // calcInfrastructureAnnotations(problems, this.rows.get(0), wqkmsArray, results); } /** - * Calculate duration curve for a station and add to result collection + * Calculates the duration curve for a station */ - private void calcWQDays(final Calculation problems, final double station, final AttributeKey riverside, final WINFOArtifact winfo, - final FloodDurationCalculationResults results) { + public WQDay calcWQDays(final Calculation problems, final double station, final WINFOArtifact winfo) { // Same processing as in W-Info DurationCurveState winfo.addStringData("ld_locations", Double.toString(station)); @@ -144,13 +144,13 @@ ws[j] = underflow.getW(i); qs[j] = underflow.getQ(i); } - results.setDurationCurve(new WQDay(days, ws, qs)); + return new WQDay(days, ws, qs); } /** * 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 Calculation problems, final int stationIndex, final AttributeKey riverside, + public void calcMainValueAnnotations(final Calculation problems, final int stationIndex, final AttributeKey riverside, final WQKms[] wqkmsArray, final FloodDurationCalculationResults results) { // Same way as in MainValueWFacet and ..QFacet, but special label handling @@ -178,28 +178,70 @@ * Calculate the data for the W and Q lines in the duration curve chart for the infrastructure height and add to result * collection */ - private void calcInfrastructureAnnotations(final Calculation problems, final ResultRow row, final WQKms[] wqkmsArray, - final FloodDurationCalculationResults results) { + public List<StickyAxisAnnotation> calcInfrastructureAnnotations(final Calculation problems, final double station, + final FloodDurationCalculationResult result) { - if (row.getValue(SInfoResultType.infrastructuretype) == null) { - results.setInfrastructureWAnnotation(null); - results.setInfrastructureQAnnotation(null); - return; + // Search the station in the previously calculated result rows and terminate if no infrastructure row found + double station1 = station; + if (Double.isNaN(station)) { + for (final ResultRow row : result.getRows()) { + station1 = row.getDoubleValue(GeneralResultType.station); + break; + } + } + final List<ResultRow> stationRows = searchStation(station1, result.getRows()); + if (stationRows.isEmpty() || (stationRows.get(0).getValue(SInfoResultType.infrastructuretype) == null)) { + return null; } // Same way as in MainValueWFacet and ..QFacet + final List<StickyAxisAnnotation> annotations = new ArrayList<>(); + for (final ResultRow row : stationRows) { + annotations.add(calcWAnnotation(row)); + annotations.add(calcQAnnotation(row)); + } + return annotations; + } + + /** + * Searches the one or two rows of a station in a result rows collection + */ + private List<ResultRow> searchStation(final double station, final Collection<ResultRow> rows) { + final List<ResultRow> found = new ArrayList<>(); + for (final ResultRow row : rows) { + if (row.getDoubleValue(GeneralResultType.station) > station + 0.0001) + break; + else if (row.getDoubleValue(GeneralResultType.station) > station - 0.0001) + found.add(row); + } + return found; + } + + /** + * Calculates the Q annotation lines of an infrastructure + */ + private StickyAxisAnnotation calcQAnnotation(final ResultRow row) { final String label = Resources.getMsg(this.context.getMeta(), "sinfo.chart.flood_duration.curve.infrastructure", "sinfo.chart.flood_duration.curve.infrastructure", SInfoResultType.infrastructuretype.exportValue(this.context, row.getValue(SInfoResultType.infrastructuretype)) + ", " + SInfoResultType.riverside.exportValue(this.context, row.getValue(SInfoResultType.riverside))); - final StickyAxisAnnotation qAnnotation = new StickyAxisAnnotation(label, (float) row.getDoubleValue(SInfoResultType.floodDischarge), + final StickyAxisAnnotation annotation = new StickyAxisAnnotation(label, (float) row.getDoubleValue(SInfoResultType.floodDischarge), SimpleAxis.Y_AXIS, FloodDurationCurveGenerator.YAXIS.Q.idx); - FloodDurationMainValuesQFacet.setHitPoint(results.getDurationCurve(), qAnnotation); - final StickyAxisAnnotation wAnnotation = new StickyAxisAnnotation(label, (float) row.getDoubleValue(SInfoResultType.infrastructureHeight), + annotation.setHitPoint((float) row.getDoubleValue(SInfoResultType.floodDuration)); + return annotation; + } + + /** + * Calculates the W annotation lines of an infrastructure + */ + private StickyAxisAnnotation calcWAnnotation(final ResultRow row) { + final String label = Resources.getMsg(this.context.getMeta(), "sinfo.chart.flood_duration.curve.infrastructure", + "sinfo.chart.flood_duration.curve.infrastructure", + SInfoResultType.infrastructuretype.exportValue(this.context, row.getValue(SInfoResultType.infrastructuretype)) + + ", " + SInfoResultType.riverside.exportValue(this.context, row.getValue(SInfoResultType.riverside))); + final StickyAxisAnnotation annotation = new StickyAxisAnnotation(label, (float) row.getDoubleValue(SInfoResultType.infrastructureHeight), SimpleAxis.Y_AXIS, FloodDurationCurveGenerator.YAXIS.W.idx); - FloodDurationMainValuesWFacet.setHitPoint(results.getDurationCurve(), wAnnotation); - - results.setInfrastructureQAnnotation(qAnnotation); - results.setInfrastructureWAnnotation(wAnnotation); + annotation.setHitPoint((float) row.getDoubleValue(SInfoResultType.floodDuration)); + return annotation; } /**