changeset 8882:f762fadc5313

Further work on SINFO-FlowDepth
author gernotbelger
date Fri, 09 Feb 2018 16:11:47 +0100
parents 6b93a2498e06
children a536e1aacf0f
files artifacts/src/main/java/org/dive4elements/river/artifacts/sinfo/flowdepth/BedHeightInfo.java artifacts/src/main/java/org/dive4elements/river/artifacts/sinfo/flowdepth/FlowDepthCalculation.java artifacts/src/main/java/org/dive4elements/river/artifacts/sinfo/flowdepth/FlowDepthCalculationResults.java artifacts/src/main/java/org/dive4elements/river/artifacts/sinfo/flowdepth/FlowDepthExporter.java artifacts/src/main/java/org/dive4elements/river/artifacts/sinfo/flowdepth/WstInfo.java artifacts/src/main/resources/messages.properties artifacts/src/main/resources/messages_de.properties artifacts/src/main/resources/messages_de_DE.properties artifacts/src/main/resources/messages_en.properties
diffstat 9 files changed, 164 insertions(+), 107 deletions(-) [+]
line wrap: on
line diff
--- a/artifacts/src/main/java/org/dive4elements/river/artifacts/sinfo/flowdepth/BedHeightInfo.java	Fri Feb 09 16:11:34 2018 +0100
+++ b/artifacts/src/main/java/org/dive4elements/river/artifacts/sinfo/flowdepth/BedHeightInfo.java	Fri Feb 09 16:11:47 2018 +0100
@@ -24,27 +24,25 @@
 
     private final String type;
 
+    private final String evaluationBy;
+
     private final String locationSystem;
 
     private final String curElevationModelUnit;
 
     private final String oldElevationModelUnit;
 
+
     public static BedHeightInfo from(final BedHeight bedHeight) {
         return new BedHeightInfo(bedHeight);
     }
 
     private BedHeightInfo(final BedHeight bedHeight) {
-
         this.year = bedHeight.getYear();
-
-        // private String evaluationBy;
         this.description = bedHeight.getDescription();
-
         this.type = bedHeight.getType().getName();
-
+        this.evaluationBy = bedHeight.getEvaluationBy();
         this.locationSystem = bedHeight.getLocationSystem().getName();
-
         this.curElevationModelUnit = bedHeight.getCurElevationModel().getUnit().getName();
         this.oldElevationModelUnit = bedHeight.getCurElevationModel().getUnit().getName();
     }
@@ -61,6 +59,10 @@
         return this.type;
     }
 
+    public String getEvaluationBy() {
+        return this.evaluationBy;
+    }
+
     public String getLocationSystem() {
         return this.locationSystem;
     }
--- a/artifacts/src/main/java/org/dive4elements/river/artifacts/sinfo/flowdepth/FlowDepthCalculation.java	Fri Feb 09 16:11:34 2018 +0100
+++ b/artifacts/src/main/java/org/dive4elements/river/artifacts/sinfo/flowdepth/FlowDepthCalculation.java	Fri Feb 09 16:11:47 2018 +0100
@@ -23,7 +23,8 @@
 import org.dive4elements.river.artifacts.resources.Resources;
 import org.dive4elements.river.artifacts.sinfo.SINFOArtifact;
 import org.dive4elements.river.artifacts.sinfo.flowdepth.FlowDepthAccess.DifferencesPair;
-import org.dive4elements.river.artifacts.states.WDifferencesState;
+import org.dive4elements.river.artifacts.states.WaterlevelData;
+import org.dive4elements.river.artifacts.states.WaterlevelFetcher;
 import org.dive4elements.river.model.BedHeight;
 import org.dive4elements.river.model.Gauge;
 import org.dive4elements.river.model.River;
@@ -36,7 +37,7 @@
 
     private final CallContext context;
 
-    public FlowDepthCalculation( final CallContext context ) {
+    public FlowDepthCalculation(final CallContext context) {
         this.context = context;
     }
 
@@ -66,81 +67,86 @@
         final List<Gauge> gauges = river.determineGauges(from, to);
         final GaugeIndex gaugeIndex = new GaugeIndex(gauges);
 
-        final String calcModeLabel = Resources.getMsg(this.context.getMeta(),sinfo.getCalculationMode().name() );
+        final String calcModeLabel = Resources.getMsg(this.context.getMeta(), sinfo.getCalculationMode().name());
 
-        final FlowDepthCalculationResults results = new FlowDepthCalculationResults(calcModeLabel, user, river, from, to, useTkh);
+        final FlowDepthCalculationResults results = new FlowDepthCalculationResults(calcModeLabel, user, river, from,
+                to, useTkh);
 
         for (final DifferencesPair diffPair : diffPairs) {
-            final FlowDepthCalculationResult result = calculateResult( river, from, to, diffPair, problems, gaugeIndex );
-            if( result != null )
+            final FlowDepthCalculationResult result = calculateResult(river, from, to, diffPair, problems, gaugeIndex);
+            if (result != null)
                 results.addResult(result);
         }
 
-        return new CalculationResult(results,problems);
+        return new CalculationResult(results, problems);
     }
 
-    private FlowDepthCalculationResult calculateResult(final River river, final double from, final double to, final DifferencesPair diffPair, final Calculation problems, final GaugeIndex gaugeIndex) {
+    private FlowDepthCalculationResult calculateResult(final River river, final double from, final double to,
+            final DifferencesPair diffPair, final Calculation problems, final GaugeIndex gaugeIndex) {
 
         /* access real input data from database */
         final String soundingId = diffPair.getSoundingId();
         final String wstId = diffPair.getWstId();
 
-        final BedHeight bedHeight = loadBedHeight( soundingId, from, to );
-        if( bedHeight == null )
-        {
-            final String message = Resources.format(this.context.getMeta(), "Failed to access sounding with id '{0}'", soundingId);
+        final BedHeight bedHeight = loadBedHeight(soundingId, from, to);
+        if (bedHeight == null) {
+            final String message = Resources.format(this.context.getMeta(), "Failed to access sounding with id '{0}'",
+                    soundingId);
             problems.addProblem(message);
             return null;
         }
 
-        final WKms wstKms = new WDifferencesState().getWKms(wstId, this.context, from, to);
-        if( wstKms == null )
-        {
-            final String message = Resources.format(this.context.getMeta(), "Failed to access waterlevel with id '{0}'", wstId);
+        /* REMARK: fetch ALL wst kms, because we want to determine the original reference gauge */
+        final WaterlevelData waterlevel = new WaterlevelFetcher().findWaterlevel(this.context, wstId, Double.NaN,
+                Double.NaN);
+        if (waterlevel == null) {
+            final String message = Resources.format(this.context.getMeta(), "Failed to access waterlevel with id '{0}'",
+                    wstId);
             problems.addProblem(message);
             return null;
         }
+        final WKms wstKms = waterlevel.getWkms();
+
+        checkWaterlevelDiscretisation(wstKms, problems);
 
         // FIXME: woher bekommen?
         final int wspYear = 0;
-        // FIXME: angeblich metadatum bestimmter wsps?
-        // Könnte 'source' an 'wst_columns' sein
-        final String wspSource = "FIXME";
-        // FIXME: Umsetzung IDENTISCH zu allen möglichen Arten wie ein WSPL berechnet wird....
-        final String wspGauge = "FIXME";
+
+        /* re-determine the reference gauge, in the same way as the WaterlevelArtifact would do it */
+        final String notinrange = Resources.getMsg(this.context.getMeta(), CSV_NOT_IN_GAUGE_RANGE,
+                CSV_NOT_IN_GAUGE_RANGE);
+
+        final Gauge refGauge = waterlevel.findReferenceGauge(river);
+        final String refGaugeName = refGauge == null ? notinrange : refGauge.getName();
 
         final String wspLabel = wstKms.getName();
         final String soundingLabel = bedHeight.getDescription();
         final String label = String.format("%s - %s", wspLabel, soundingLabel);
 
         final BedHeightInfo sounding = BedHeightInfo.from(bedHeight);
-        final WstInfo wstInfo = new WstInfo(wspLabel, wspYear, wspSource, wspGauge);
+        final WstInfo wstInfo = new WstInfo(wspLabel, wspYear, refGaugeName);
 
         final FlowDepthCalculationResult resultData = new FlowDepthCalculationResult(label, wstInfo, sounding);
 
-        final String notinrange = Resources.getMsg(this.context.getMeta(), CSV_NOT_IN_GAUGE_RANGE, CSV_NOT_IN_GAUGE_RANGE);
-
-        // TODO: prüfe diskretisierung wsp --> > 1000m --> Fehlermeldung
-
         // TODO: Berechnung der Transportkörperhöhen
-        // - woher kommen die zusätzlichen eingangsdaten? sind das fixe daten pro gewässer? --> falls ja, warum nicht einmal berechnen und in db ablegen?
+        // - woher kommen die zusätzlichen eingangsdaten? sind das fixe daten pro gewässer? --> falls ja, warum nicht
+        // einmal berechnen und in db ablegen?
 
         // Benötigte Daten
         // - Abfluss / Station
-        //   - kein Abfluss --> Fehler
-        if( !(wstKms instanceof QKms))
-        {
-            final String message = Resources.format(this.context.getMeta(), "{0}: keine Abflussdaten vorhanden, Transportkörperhöhenberechnung nicht möglich", label);
+        // - kein Abfluss --> Fehler
+        if (!(wstKms instanceof QKms)) {
+            final String message = Resources.getMsg(this.context.getMeta(), "sinfo_calc_flow_depth.warning.missingQ",
+                    null, label);
             problems.addProblem(message);
             // TODO: keine Berechnung TKH
         }
 
         // - Sohlbeschaffenheit (D50 Korndurchmesser aus Seddb)
-        //   - Abhängig von Peiljahr
-        //   - kein D50 vorhanden --> Fehler
+        // - Abhängig von Peiljahr
+        // - kein D50 vorhanden --> Fehler
         // - Art der Gewässersohle (starr/mobil)
 
-
         final String bedHeightLabel = bedHeight.getDescription();
         final String wstLabel = wstKms.getName();
 
@@ -164,36 +170,74 @@
             final String location = LocationProvider.getLocation(river.getName(), km);
 
             // REMARK: access the gauge once only during calculation
-            // FIXME: copy specific handling from original wst
-            final Gauge gauge = gaugeIndex.findGauge(km);
+            final Gauge gauge = findGauge(waterlevel, refGauge, gaugeIndex, km);
+
             final String gaugeLabel = gauge == null ? notinrange : gauge.getName();
 
-            resultData.addRow( km, flowDepth, flowDepthTkh, tkh, wst, discharge, wstLabel, gaugeLabel, meanBedHeight, bedHeightLabel, location );
+            resultData.addRow(km, flowDepth, flowDepthTkh, tkh, wst, discharge, wstLabel, gaugeLabel, meanBedHeight,
+                    bedHeightLabel, location);
         }
 
         return resultData;
     }
 
+    private Gauge findGauge(final WaterlevelData waterlevel, final Gauge refGauge, final GaugeIndex gaugeIndex,
+            final double km) {
+
+        // REMARK: using same logic as in WaterlevelExporter here
+
+        final boolean showAllGauges = waterlevel.isShowAllGauges();
+
+        if (showAllGauges)
+            return gaugeIndex.findGauge(km);
+
+        if (refGauge.getRange().contains(km))
+            return refGauge;
+
+        return null;
+    }
+
+    /* Checks if the discretisation of the waterlevel exceeds 1000m */
+    private void checkWaterlevelDiscretisation(final WKms wstKms, final Calculation problems) {
+        final int size = wstKms.size();
+        for (int i = 0; i < size - 2; i++) {
+            final double kmPrev = wstKms.getKm(i);
+            final double kmNext = wstKms.getKm(i + 1);
+
+            if (Math.abs(kmPrev - kmNext) > 1) {
+                final String label = wstKms.getName();
+
+                final String message = Resources.getMsg(this.context.getMeta(),
+                        "sinfo_calc_flow_depth.warning.waterlevel_discretisation", null, label);
+                problems.addProblem(kmPrev, message);
+            }
+        }
+    }
+
     private BedHeight loadBedHeight(final String soundingId, final double from, final double to) {
 
         // FIXME: absolutely unbelievable....
-        // The way how bed-heights (and other data too) is accessed is different for nearly ever calculation-type throughout flys.
+        // The way how bed-heights (and other data too) is accessed is different for nearly ever calculation-type
+        // throughout flys.
         // The knowledge on how to parse the datacage-ids is spread through the complete code-base...
 
-        // We use here the way on how bed-heights are accessed by the BedDifferenceAccess/BedDifferenceCalculation, but this is plain random
+        // We use here the way on how bed-heights are accessed by the BedDifferenceAccess/BedDifferenceCalculation, but
+        // this is plain random
         final String[] parts = soundingId.split(";");
 
         final BedHeightsArtifact artifact = (BedHeightsArtifact) RiverUtils.getArtifact(parts[0], this.context);
 
         final Integer bedheightId = artifact.getDataAsInteger("height_id");
-        // FIXME: this only works with type 'single'; unclear on how to distinguish from epoch data (or whatever the other type means)
+        // FIXME: this only works with type 'single'; unclear on how to distinguish from epoch data (or whatever the
+        // other type means)
         // Luckily, the requirement is to only access 'single' data here.
         // final String bedheightType = artifact.getDataAsString("type");
 
         // FIXME: BedDifferences uses this, but we also need the metadata of the BedHeight
-        // FIXME: second absolutely awful thing: BedHeight is a hibernate binding class, accessing the database via hibernate stuff
+        // FIXME: second absolutely awful thing: BedHeight is a hibernate binding class, accessing the database via
+        // hibernate stuff
         // BedHeightFactory uses its own (direct) way of accessing the data, with its own implemented data classes.
-        //return BedHeightFactory.getHeight(bedheightType, bedheightId, from, to);
+        // return BedHeightFactory.getHeight(bedheightType, bedheightId, from, to);
 
         return BedHeight.getBedHeightById(bedheightId);
     }
--- a/artifacts/src/main/java/org/dive4elements/river/artifacts/sinfo/flowdepth/FlowDepthCalculationResults.java	Fri Feb 09 16:11:34 2018 +0100
+++ b/artifacts/src/main/java/org/dive4elements/river/artifacts/sinfo/flowdepth/FlowDepthCalculationResults.java	Fri Feb 09 16:11:47 2018 +0100
@@ -1,6 +1,6 @@
 /** Copyright (C) 2017 by Bundesanstalt für Gewässerkunde
- * Software engineering by 
- *  Björnsen Beratende Ingenieure GmbH 
+ * Software engineering by
+ *  Björnsen Beratende Ingenieure GmbH
  *  Dr. Schumacher Ingenieurbüro für Wasser und Umwelt
  *
  * This file is Free Software under the GNU AGPL (>=v3)
@@ -17,61 +17,61 @@
 
 /**
  * @author Gernot Belger
- *
  */
-public final class FlowDepthCalculationResults{
-	private final List<FlowDepthCalculationResult> results = new ArrayList<>();
+public final class FlowDepthCalculationResults {
+    private final List<FlowDepthCalculationResult> results = new ArrayList<>();
 
-	private final River river;
-	
-	private final double from;
-	
-	private final double to;
-	
-	private final boolean useTkh;
+    private final River river;
+
+    private final double from;
+
+    private final double to;
+
+    private final boolean useTkh;
 
     private final String calcModeLabel;
 
     private final String user;
 
-	public FlowDepthCalculationResults(final String calcModeLabel, final String user, final River river, final double from, final double to, final boolean useTkh) {
-		this.calcModeLabel = calcModeLabel;
+    public FlowDepthCalculationResults(final String calcModeLabel, final String user, final River river,
+            final double from, final double to, final boolean useTkh) {
+        this.calcModeLabel = calcModeLabel;
         this.user = user;
         this.river = river;
-		this.from = from;
-		this.to = to;
-		this.useTkh = useTkh;
-	}
-	
-	public String getCalcModeLabel() {
+        this.from = from;
+        this.to = to;
+        this.useTkh = useTkh;
+    }
+
+    public String getCalcModeLabel() {
         return this.calcModeLabel;
     }
-	
-	public String getUser() {
+
+    public String getUser() {
         return this.user;
     }
-	
-	public River getRiver() {
-		return this.river;
-	}
-
-	public double getFrom() {
-		return this.from;
-	}
 
-	public double getTo() {
-		return this.to;
-	}
+    public River getRiver() {
+        return this.river;
+    }
 
-	public boolean isUseTkh() {
-		return this.useTkh;
-	}
-	
-	void addResult(final FlowDepthCalculationResult result) {
-		results.add(result);
-	}
-	
-	public List<FlowDepthCalculationResult> getResults() {
-		return Collections.unmodifiableList(results);
-	}
+    public double getFrom() {
+        return this.from;
+    }
+
+    public double getTo() {
+        return this.to;
+    }
+
+    public boolean isUseTkh() {
+        return this.useTkh;
+    }
+
+    void addResult(final FlowDepthCalculationResult result) {
+        this.results.add(result);
+    }
+
+    public List<FlowDepthCalculationResult> getResults() {
+        return Collections.unmodifiableList(this.results);
+    }
 }
--- a/artifacts/src/main/java/org/dive4elements/river/artifacts/sinfo/flowdepth/FlowDepthExporter.java	Fri Feb 09 16:11:34 2018 +0100
+++ b/artifacts/src/main/java/org/dive4elements/river/artifacts/sinfo/flowdepth/FlowDepthExporter.java	Fri Feb 09 16:11:47 2018 +0100
@@ -28,6 +28,7 @@
 import org.dive4elements.river.exports.AbstractExporter;
 import org.dive4elements.river.model.River;
 import org.dive4elements.river.model.Unit;
+import org.dive4elements.river.utils.RiverUtils;
 
 import au.com.bytecode.opencsv.CSVWriter;
 import net.sf.jasperreports.engine.JRDataSource;
@@ -87,6 +88,8 @@
 
     private static final String CSV_META_HEADER_SOUNDING_TYPE = "sinfo.export.flow_depth.csv.meta.header.sounding.type";
 
+    private static final String CSV_META_HEADER_SOUNDING_EVALUATOR = "sinfo.export.flow_depth.csv.meta.header.sounding.evaluator";
+
     private static final String CSV_META_HEADER_SOUNDING_PRJ = "sinfo.export.flow_depth.csv.meta.header.sounding.prj";
 
     private static final String CSV_META_HEADER_SOUNDING_ELEVATIOIN_MODEL = "sinfo.export.flow_depth.csv.meta.header.sounding.elevationmodel";
@@ -97,7 +100,6 @@
 
     private static final String CSV_META_HEADER_WATERLEVEL_NAME = "sinfo.export.flow_depth.csv.meta.header.waterlevel.name";
 
-    private static final String CSV_META_HEADER_WATERLEVEL_EVALUATOR = "sinfo.export.flow_depth.csv.meta.header.waterlevel.evaluator";
 
     private static final String CSV_META_HEADER_WATERLEVEL_GAUGE = "sinfo.export.flow_depth.csv.meta.header.waterlevel.gauge";
 
@@ -175,6 +177,8 @@
         writeCSVMetaEntry(writer, CSV_META_HEADER_SOUNDING_YEAR, Integer.toString(sounding.getYear()));
         // "# Aufnahmeart: "
         writeCSVMetaEntry(writer, CSV_META_HEADER_SOUNDING_TYPE, sounding.getType());
+        // "# Auswerter: "
+        writeCSVMetaEntry(writer, CSV_META_HEADER_SOUNDING_EVALUATOR, sounding.getEvaluationBy());
         // "# Lagesystem: "
         writeCSVMetaEntry(writer, CSV_META_HEADER_SOUNDING_PRJ, sounding.getLocationSystem());
         // "# Höhensystem: "
@@ -187,8 +191,6 @@
         writeCSVMetaEntry(writer, CSV_META_HEADER_WATERLEVEL);
         // "# Bezeichnung der Wasserspiegellage: "
         writeCSVMetaEntry(writer, CSV_META_HEADER_WATERLEVEL_NAME, wst.getLabel());
-        // "# Auswerter: "
-        writeCSVMetaEntry(writer, CSV_META_HEADER_WATERLEVEL_EVALUATOR, wst.getSource());
         // "# Bezugspegel: "
         writeCSVMetaEntry(writer, CSV_META_HEADER_WATERLEVEL_GAUGE, wst.getGauge());
         // "# Jahr/Zeitraum der Wasserspiegellage: "
@@ -303,7 +305,10 @@
         if( Double.isNaN(discharge))
             lines.add(StringUtils.EMPTY);
         else
-            lines.add(getQFormatter().format(discharge));
+        {
+            final double roundedDischarge = RiverUtils.roundQ(discharge);
+            lines.add(getQFormatter().format(roundedDischarge));
+        }
 
         // Bezeichnung
         lines.add(row.getWaterlevelLabel());
--- a/artifacts/src/main/java/org/dive4elements/river/artifacts/sinfo/flowdepth/WstInfo.java	Fri Feb 09 16:11:34 2018 +0100
+++ b/artifacts/src/main/java/org/dive4elements/river/artifacts/sinfo/flowdepth/WstInfo.java	Fri Feb 09 16:11:47 2018 +0100
@@ -16,13 +16,11 @@
 
     private final String label;
     private final int year;
-    private final String source;
     private final String gauge;
 
-    public WstInfo(final String label, final int year, final String source, final String gauge) {
+    public WstInfo(final String label, final int year, final String gauge) {
         this.label = label;
         this.year = year;
-        this.source = source;
         this.gauge = gauge;
     }
 
@@ -34,10 +32,6 @@
         return this.year;
     }
 
-    public String getSource() {
-        return this.source;
-    }
-
     public String getGauge() {
         return this.gauge;
     }
--- a/artifacts/src/main/resources/messages.properties	Fri Feb 09 16:11:34 2018 +0100
+++ b/artifacts/src/main/resources/messages.properties	Fri Feb 09 16:11:47 2018 +0100
@@ -770,6 +770,9 @@
 state.sinfo.calculation_mode=Calculation Mode
 
 sinfo_calc_flow_depth=Flie\u00dftiefen
+sinfo_calc_flow_depth.warning.missingQ = {0}: keine Abflussdaten vorhanden, Transportk\u00f6rperh\u00f6henberechnung nicht m\u00f6glich
+sinfo_calc_flow_depth.warning.waterlevel_discretisation  = Wasserspiegel {0}: r\u00e4umliche Aufl\u00f6sung betr\u00e4gt mehr als 1000m
+
 sinfo_calc_flow_depth_development=Flie\u00dftiefenentwicklung
 sinfo_calc_flow_depth_minmax=Minimale und Maximale Flie\u00dftiefe
 sinfo_calc_grounding=Grundber\u00fchrungen
@@ -806,12 +809,12 @@
 sinfo.export.flow_depth.csv.meta.header.sounding = ##METADATEN PEILUNG
 sinfo.export.flow_depth.csv.meta.header.sounding.year = # Jahr der Peilung: {0}
 sinfo.export.flow_depth.csv.meta.header.sounding.type = # Aufnahmeart: {0}
+sinfo.export.flow_depth.csv.meta.header.sounding.evaluator = # Auswerter: {0}
 sinfo.export.flow_depth.csv.meta.header.sounding.prj = # Lagesystem: {0}
 sinfo.export.flow_depth.csv.meta.header.sounding.elevationmodel = # H\u00f6hensystem: {0} 
 sinfo.export.flow_depth.csv.meta.header.sounding.elevationmodel.original = # urspr\u00fcngliches H\u00f6hensystem: {0} 
 sinfo.export.flow_depth.csv.meta.header.waterlevel = ##METADATEN WASSERSPIEGELLAGE
 sinfo.export.flow_depth.csv.meta.header.waterlevel.name = # Bezeichnung der Wasserspiegellage: {0} 
-sinfo.export.flow_depth.csv.meta.header.waterlevel.evaluator = # Auswerter: {0}
 sinfo.export.flow_depth.csv.meta.header.waterlevel.gauge = # Bezugspegel: {0}
 sinfo.export.flow_depth.csv.meta.header.waterlevel.year = # Jahr/Zeitraum der Wasserspiegellage: {0}
 sinfo.export.flow_depth.csv.meta.range = # {0}: {1} - {2}
--- a/artifacts/src/main/resources/messages_de.properties	Fri Feb 09 16:11:34 2018 +0100
+++ b/artifacts/src/main/resources/messages_de.properties	Fri Feb 09 16:11:47 2018 +0100
@@ -776,6 +776,9 @@
 state.sinfo.calculation_mode=Berechnungsart
 
 sinfo_calc_flow_depth=Flie\u00dftiefen
+sinfo_calc_flow_depth.warning.missingQ = {0}: keine Abflussdaten vorhanden, Transportk\u00f6rperh\u00f6henberechnung nicht m\u00f6glich
+sinfo_calc_flow_depth.warning.waterlevel_discretisation  = Wasserspiegel {0}: r\u00e4umliche Aufl\u00f6sung betr\u00e4gt mehr als 1000m
+
 sinfo_calc_flow_depth_development=Flie\u00dftiefenentwicklung
 sinfo_calc_flow_depth_minmax=Minimale und Maximale Flie\u00dftiefe
 sinfo_calc_grounding=Grundber\u00fchrungen
@@ -812,12 +815,12 @@
 sinfo.export.flow_depth.csv.meta.header.sounding = ##METADATEN PEILUNG
 sinfo.export.flow_depth.csv.meta.header.sounding.year = # Jahr der Peilung: {0}
 sinfo.export.flow_depth.csv.meta.header.sounding.type = # Aufnahmeart: {0}
+sinfo.export.flow_depth.csv.meta.header.sounding.evaluator = # Auswerter: {0}
 sinfo.export.flow_depth.csv.meta.header.sounding.prj = # Lagesystem: {0}
 sinfo.export.flow_depth.csv.meta.header.sounding.elevationmodel = # H\u00f6hensystem: {0} 
 sinfo.export.flow_depth.csv.meta.header.sounding.elevationmodel.original = # urspr\u00fcngliches H\u00f6hensystem: {0}
 sinfo.export.flow_depth.csv.meta.header.waterlevel = ##METADATEN WASSERSPIEGELLAGE
 sinfo.export.flow_depth.csv.meta.header.waterlevel.name = # Bezeichnung der Wasserspiegellage: {0} 
-sinfo.export.flow_depth.csv.meta.header.waterlevel.evaluator = # Auswerter: {0}
 sinfo.export.flow_depth.csv.meta.header.waterlevel.gauge = # Bezugspegel: {0}
 sinfo.export.flow_depth.csv.meta.header.waterlevel.year = # Jahr/Zeitraum der Wasserspiegellage: {0}
 sinfo.export.flow_depth.csv.meta.range = # {0}: {1} - {2}
--- a/artifacts/src/main/resources/messages_de_DE.properties	Fri Feb 09 16:11:34 2018 +0100
+++ b/artifacts/src/main/resources/messages_de_DE.properties	Fri Feb 09 16:11:47 2018 +0100
@@ -772,6 +772,9 @@
 state.sinfo.calculation_mode=Berechnungsart
 
 sinfo_calc_flow_depth=Flie\u00dftiefen
+sinfo_calc_flow_depth.warning.missingQ = {0}: keine Abflussdaten vorhanden, Transportk\u00f6rperh\u00f6henberechnung nicht m\u00f6glich
+sinfo_calc_flow_depth.warning.waterlevel_discretisation  = Wasserspiegel {0}: r\u00e4umliche Aufl\u00f6sung betr\u00e4gt mehr als 1000m
+
 sinfo_calc_flow_depth_development=Flie\u00dftiefenentwicklung
 sinfo_calc_flow_depth_minmax=Minimale und Maximale Flie\u00dftiefe
 sinfo_calc_grounding=Grundber\u00fchrungen
@@ -808,12 +811,12 @@
 sinfo.export.flow_depth.csv.meta.header.sounding = ##METADATEN PEILUNG
 sinfo.export.flow_depth.csv.meta.header.sounding.year = # Jahr der Peilung: {0}
 sinfo.export.flow_depth.csv.meta.header.sounding.type = # Aufnahmeart: {0}
+sinfo.export.flow_depth.csv.meta.header.sounding.evaluator = # Auswerter: {0}
 sinfo.export.flow_depth.csv.meta.header.sounding.prj = # Lagesystem: {0}
 sinfo.export.flow_depth.csv.meta.header.sounding.elevationmodel = # H\u00f6hensystem: {0} 
 sinfo.export.flow_depth.csv.meta.header.sounding.elevationmodel.original = # urspr\u00fcngliches H\u00f6hensystem: {0}
 sinfo.export.flow_depth.csv.meta.header.waterlevel = ##METADATEN WASSERSPIEGELLAGE
 sinfo.export.flow_depth.csv.meta.header.waterlevel.name = # Bezeichnung der Wasserspiegellage: {0} 
-sinfo.export.flow_depth.csv.meta.header.waterlevel.evaluator = # Auswerter: {0}
 sinfo.export.flow_depth.csv.meta.header.waterlevel.gauge = # Bezugspegel: {0}
 sinfo.export.flow_depth.csv.meta.header.waterlevel.year = # Jahr/Zeitraum der Wasserspiegellage: {0}
 sinfo.export.flow_depth.csv.meta.range = # {0}: {1} - {2}
--- a/artifacts/src/main/resources/messages_en.properties	Fri Feb 09 16:11:34 2018 +0100
+++ b/artifacts/src/main/resources/messages_en.properties	Fri Feb 09 16:11:47 2018 +0100
@@ -771,6 +771,9 @@
 state.sinfo.calculation_mode=Calculation Mode
 
 sinfo_calc_flow_depth=Flie\u00dftiefen
+sinfo_calc_flow_depth.warning.missingQ = {0}: keine Abflussdaten vorhanden, Transportk\u00f6rperh\u00f6henberechnung nicht m\u00f6glich
+sinfo_calc_flow_depth.warning.waterlevel_discretisation  = Wasserspiegel {0}: r\u00e4umliche Aufl\u00f6sung betr\u00e4gt mehr als 1000m
+
 sinfo_calc_flow_depth_development=Flie\u00dftiefenentwicklung
 sinfo_calc_flow_depth_minmax=Minimale und Maximale Flie\u00dftiefe
 sinfo_calc_grounding=Grundber\u00fchrungen
@@ -807,12 +810,12 @@
 sinfo.export.flow_depth.csv.meta.header.sounding = ##METADATEN PEILUNG
 sinfo.export.flow_depth.csv.meta.header.sounding.year = # Jahr der Peilung: {0}
 sinfo.export.flow_depth.csv.meta.header.sounding.type = # Aufnahmeart: {0}
+sinfo.export.flow_depth.csv.meta.header.sounding.evaluator = # Auswerter: {0}
 sinfo.export.flow_depth.csv.meta.header.sounding.prj = # Lagesystem: {0}
 sinfo.export.flow_depth.csv.meta.header.sounding.elevationmodel = # H\u00f6hensystem: {0} 
 sinfo.export.flow_depth.csv.meta.header.sounding.elevationmodel.original = # urspr\u00fcngliches H\u00f6hensystem: {0}
 sinfo.export.flow_depth.csv.meta.header.waterlevel = ##METADATEN WASSERSPIEGELLAGE
 sinfo.export.flow_depth.csv.meta.header.waterlevel.name = # Bezeichnung der Wasserspiegellage: {0} 
-sinfo.export.flow_depth.csv.meta.header.waterlevel.evaluator = # Auswerter: {0}
 sinfo.export.flow_depth.csv.meta.header.waterlevel.gauge = # Bezugspegel: {0}
 sinfo.export.flow_depth.csv.meta.header.waterlevel.year = # Jahr/Zeitraum der Wasserspiegellage: {0}
 sinfo.export.flow_depth.csv.meta.range = # {0}: {1} - {2}

http://dive4elements.wald.intevation.org