comparison artifacts/src/main/java/org/dive4elements/river/artifacts/sinfo/flowdepth/FlowDepthCalculation.java @ 8891:f431aec10d2c

Implemented access to bed measurements
author gernotbelger
date Wed, 14 Feb 2018 19:06:21 +0100
parents cc86b0f9b3c3
children a66f2a7c4f84 89f3c5462a16
comparison
equal deleted inserted replaced
8890:90b7f45ff4ae 8891:f431aec10d2c
8 * documentation coming with Dive4Elements River for details. 8 * documentation coming with Dive4Elements River for details.
9 */ 9 */
10 package org.dive4elements.river.artifacts.sinfo.flowdepth; 10 package org.dive4elements.river.artifacts.sinfo.flowdepth;
11 11
12 import java.util.ArrayList; 12 import java.util.ArrayList;
13 import java.util.Calendar;
13 import java.util.Collection; 14 import java.util.Collection;
14 import java.util.Collections; 15 import java.util.Collections;
16 import java.util.Date;
15 import java.util.List; 17 import java.util.List;
16 18
17 import org.apache.commons.math.FunctionEvaluationException; 19 import org.apache.commons.math.FunctionEvaluationException;
18 import org.apache.commons.math.analysis.UnivariateRealFunction; 20 import org.apache.commons.math.analysis.UnivariateRealFunction;
19 import org.dive4elements.artifacts.ArtifactDatabase; 21 import org.dive4elements.artifacts.ArtifactDatabase;
22 import org.dive4elements.river.artifacts.model.Calculation; 24 import org.dive4elements.river.artifacts.model.Calculation;
23 import org.dive4elements.river.artifacts.model.CalculationResult; 25 import org.dive4elements.river.artifacts.model.CalculationResult;
24 import org.dive4elements.river.artifacts.model.LocationProvider; 26 import org.dive4elements.river.artifacts.model.LocationProvider;
25 import org.dive4elements.river.artifacts.model.QKms; 27 import org.dive4elements.river.artifacts.model.QKms;
26 import org.dive4elements.river.artifacts.model.WKms; 28 import org.dive4elements.river.artifacts.model.WKms;
29 import org.dive4elements.river.artifacts.model.minfo.QualityMeasurementFactory;
30 import org.dive4elements.river.artifacts.model.minfo.QualityMeasurements;
27 import org.dive4elements.river.artifacts.resources.Resources; 31 import org.dive4elements.river.artifacts.resources.Resources;
28 import org.dive4elements.river.artifacts.sinfo.SINFOArtifact; 32 import org.dive4elements.river.artifacts.sinfo.SINFOArtifact;
29 import org.dive4elements.river.artifacts.sinfo.flowdepth.FlowDepthAccess.DifferencesPair; 33 import org.dive4elements.river.artifacts.sinfo.flowdepth.FlowDepthAccess.DifferencesPair;
30 import org.dive4elements.river.artifacts.states.WaterlevelData; 34 import org.dive4elements.river.artifacts.states.WaterlevelData;
31 import org.dive4elements.river.artifacts.states.WaterlevelFetcher; 35 import org.dive4elements.river.artifacts.states.WaterlevelFetcher;
37 import org.dive4elements.river.utils.GaugeIndex; 41 import org.dive4elements.river.utils.GaugeIndex;
38 import org.dive4elements.river.utils.RiverUtils; 42 import org.dive4elements.river.utils.RiverUtils;
39 43
40 class FlowDepthCalculation { 44 class FlowDepthCalculation {
41 45
46 private static final int VALID_BED_MEASUREMENT_YEARS = 20;
47
42 private static final String CSV_NOT_IN_GAUGE_RANGE = "export.waterlevel.csv.not.in.gauge.range"; 48 private static final String CSV_NOT_IN_GAUGE_RANGE = "export.waterlevel.csv.not.in.gauge.range";
43 49
44 private final CallContext context; 50 private final CallContext context;
45 51
46 public FlowDepthCalculation(final CallContext context) { 52 public FlowDepthCalculation(final CallContext context) {
134 final String message = Resources.getMsg(this.context.getMeta(), "sinfo_calc_flow_depth.warning.missingQ", null, label); 140 final String message = Resources.getMsg(this.context.getMeta(), "sinfo_calc_flow_depth.warning.missingQ", null, label);
135 problems.addProblem(message); 141 problems.addProblem(message);
136 // TODO: keine Berechnung TKH 142 // TODO: keine Berechnung TKH
137 } 143 }
138 144
139 // FIXME 145 final QualityMeasurements bedMeasurements = getBedMeasurements(river, from, to, sounding.getYear());
140 // - Sohlbeschaffenheit (D50 Korndurchmesser aus Seddb) 146 // FIXME: prüfung ob (genug) werte vorhanden sind? was sind genau die kriterien? falls nein, problemhinzufügen und keine
141 // - Abhängig von Peiljahr 147 // berechnung tkh
142 // - kein D50 vorhanden --> Fehler 148 // FIXME: wie wird ggf. interpoliert? --> absprache?
143 149 // FIXME: mir direkt aufgefallen, die Beispieldatenbank liefert Werte zum gleichen km und zeitpunkt, die messwerte sind
144 // FIXME 150 // aber unterschiedlich....???
145 // - Art der Gewässersohle (starr/mobil) 151 // FIXME: die eigentlichen daten extrahieren, ggf. wenn esswerte zum gleichen datum voriliegen. das neueste nehmen? oder
152 // das näheste zum Peiljahr?
153
154 // FIXME Art der Gewässersohle (starr/mobil)
155 // FIXME: wie wird ggf. interpoliert? prüfung ob werte vorhanden?
146 156
147 final String bedHeightLabel = bedHeight.getDescription(); 157 final String bedHeightLabel = bedHeight.getDescription();
148 final String wstLabel = wstKms.getName(); 158 final String wstLabel = wstKms.getName();
149 159
150 final UnivariateRealFunction wstInterpolator = DoubleUtil.getLinearInterpolator(wstKms.allKms(), wstKms.allWs()); 160 final UnivariateRealFunction wstInterpolator = DoubleUtil.getLinearInterpolator(wstKms.allKms(), wstKms.allWs());
240 } 250 }
241 251
242 } 252 }
243 253
244 return resultData; 254 return resultData;
255 }
256
257 /**
258 * Sohlbeschaffenheit (D50 Korndurchmesser aus Seddb)
259 * Abhängig von Peiljahr
260 */
261 private QualityMeasurements getBedMeasurements(final River river, final double from, final double to, final int soundingYear) {
262
263 /* construct valid measurement time range */
264 final Calendar cal = Calendar.getInstance();
265 cal.clear();
266
267 cal.set(soundingYear - VALID_BED_MEASUREMENT_YEARS, 0, 1);
268 final Date startTime = cal.getTime();
269
270 cal.set(soundingYear + VALID_BED_MEASUREMENT_YEARS, 11, 31);
271 final Date endTime = cal.getTime();
272
273 return QualityMeasurementFactory.getBedMeasurements(river.getName(), from, to, startTime, endTime);
245 } 274 }
246 275
247 /** 276 /**
248 * Checks the year difference between waterlevels and sounding, and issues a warning if too big. 277 * Checks the year difference between waterlevels and sounding, and issues a warning if too big.
249 * 278 *

http://dive4elements.wald.intevation.org