# HG changeset patch # User gernotbelger # Date 1528988191 -7200 # Node ID 23945061daece2efc7c0d1f53ebd0a54f77cccd4 # Parent 5be112fba8324dd6803a8f48b96c36612ef009a1 gigantic refactoring: exporter, result, results to support multiple jaspers -> collisions diff -r 5be112fba832 -r 23945061daec artifacts/doc/conf/generators/generators.xml --- a/artifacts/doc/conf/generators/generators.xml Thu Jun 14 15:12:25 2018 +0200 +++ b/artifacts/doc/conf/generators/generators.xml Thu Jun 14 16:56:31 2018 +0200 @@ -69,7 +69,8 @@ - + + diff -r 5be112fba832 -r 23945061daec artifacts/doc/conf/jasper/templates/sinfo.collision.detail.jrxml --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/artifacts/doc/conf/jasper/templates/sinfo.collision.detail.jrxml Thu Jun 14 16:56:31 2018 +0200 @@ -0,0 +1,180 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + <band height="30" splitType="Stretch"> + <textField> + <reportElement style="htmlStyle" x="0" y="0" width="515" height="30"/> + <textElement> + <font size="18"/> + </textElement> + <textFieldExpression><![CDATA[$F{meta:header} + " " + $F{meta:river}]]></textFieldExpression> + </textField> + </band> + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff -r 5be112fba832 -r 23945061daec artifacts/doc/conf/jasper/templates/sinfo.collision.overview.jrxml --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/artifacts/doc/conf/jasper/templates/sinfo.collision.overview.jrxml Thu Jun 14 16:56:31 2018 +0200 @@ -0,0 +1,214 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + <band height="169" splitType="Stretch"> + <textField> + <reportElement style="htmlStyle" x="0" y="0" width="515" height="30"/> + <textElement> + <font size="18"/> + </textElement> + <textFieldExpression><![CDATA[$F{meta:header} + " " + $F{meta:river}]]></textFieldExpression> + </textField> + <textField> + <reportElement style="htmlStyle" x="0" y="39" width="165" height="20"/> + <textFieldExpression><![CDATA[$F{meta:calcMode}]]></textFieldExpression> + </textField> + <textField> + <reportElement style="htmlStyle" x="0" y="69" width="123" height="20"/> + <textFieldExpression><![CDATA[$F{meta:version_label} + ":"]]></textFieldExpression> + </textField> + <textField> + <reportElement style="htmlStyle" x="123" y="69" width="392" height="20"/> + <textFieldExpression><![CDATA[$F{meta:version}]]></textFieldExpression> + </textField> + <textField> + <reportElement style="htmlStyle" x="0" y="89" width="123" height="20"/> + <textFieldExpression><![CDATA[$F{meta:user_label} + ":"]]></textFieldExpression> + </textField> + <textField> + <reportElement style="htmlStyle" x="123" y="89" width="392" height="20"/> + <textFieldExpression><![CDATA[$F{meta:user}]]></textFieldExpression> + </textField> + <textField> + <reportElement style="htmlStyle" x="0" y="109" width="123" height="20"/> + <textFieldExpression><![CDATA[$F{meta:date_label} + ":"]]></textFieldExpression> + </textField> + <textField> + <reportElement style="htmlStyle" x="123" y="109" width="392" height="20"/> + <textFieldExpression><![CDATA[$F{meta:date}]]></textFieldExpression> + </textField> + <textField> + <reportElement style="htmlStyle" x="0" y="129" width="123" height="20"/> + <textFieldExpression><![CDATA[$F{meta:river_label} + ":"]]></textFieldExpression> + </textField> + <textField> + <reportElement style="htmlStyle" x="123" y="129" width="392" height="20"/> + <textFieldExpression><![CDATA[$F{meta:river}]]></textFieldExpression> + </textField> + <textField> + <reportElement style="htmlStyle" x="0" y="149" width="123" height="20"/> + <textFieldExpression><![CDATA[$F{meta:range_label} + ":"]]></textFieldExpression> + </textField> + <textField> + <reportElement style="htmlStyle" x="123" y="149" width="392" height="20"/> + <textFieldExpression><![CDATA[$F{meta:range}]]></textFieldExpression> + </textField> + </band> + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff -r 5be112fba832 -r 23945061daec artifacts/doc/conf/jasper/templates/sinfo.flowdepth.jrxml --- a/artifacts/doc/conf/jasper/templates/sinfo.flowdepth.jrxml Thu Jun 14 15:12:25 2018 +0200 +++ b/artifacts/doc/conf/jasper/templates/sinfo.flowdepth.jrxml Thu Jun 14 16:56:31 2018 +0200 @@ -1,6 +1,6 @@ - + @@ -106,34 +106,34 @@ - + - + - + [m]"]]> - + - + [cm]"]]> - + @@ -141,37 +141,37 @@ [" + $F{meta:river_unit} + "]"]]> - + [m³/s]"]]> - + - + - + [" + $F{meta:river_unit} + "]"]]> - + - + @@ -181,7 +181,7 @@ - + @@ -189,55 +189,55 @@ - + - + - + - + - + - + - + - + - + @@ -246,7 +246,7 @@ - + diff -r 5be112fba832 -r 23945061daec artifacts/doc/conf/jasper/templates/sinfo.flowdepthdevelopment.jrxml --- a/artifacts/doc/conf/jasper/templates/sinfo.flowdepthdevelopment.jrxml Thu Jun 14 15:12:25 2018 +0200 +++ b/artifacts/doc/conf/jasper/templates/sinfo.flowdepthdevelopment.jrxml Thu Jun 14 16:56:31 2018 +0200 @@ -1,6 +1,6 @@ - + @@ -56,6 +56,10 @@ + + + + @@ -187,45 +191,25 @@ - - - - - - - - - - - - - - - ["+$F{meta:river_unit}+"]"]]> - - + + + + + + + + + + + + + ["+$F{meta:river_unit}+"]"]]> + - - - - - - - - - - - - - - - - - @@ -255,6 +239,23 @@ + + + + + + + + + + + + + + + + + diff -r 5be112fba832 -r 23945061daec artifacts/doc/conf/jasper/templates/sinfo.tkh.jrxml --- a/artifacts/doc/conf/jasper/templates/sinfo.tkh.jrxml Thu Jun 14 15:12:25 2018 +0200 +++ b/artifacts/doc/conf/jasper/templates/sinfo.tkh.jrxml Thu Jun 14 16:56:31 2018 +0200 @@ -1,6 +1,6 @@ - + diff -r 5be112fba832 -r 23945061daec artifacts/src/main/java/org/dive4elements/river/artifacts/common/AbstractCalculationExportableResult.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/artifacts/src/main/java/org/dive4elements/river/artifacts/common/AbstractCalculationExportableResult.java Thu Jun 14 16:56:31 2018 +0200 @@ -0,0 +1,79 @@ +/** Copyright (C) 2017 by Bundesanstalt für Gewässerkunde + * 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) + * and comes with ABSOLUTELY NO WARRANTY! Check out the + * documentation coming with Dive4Elements River for details. + */ +package org.dive4elements.river.artifacts.common; + +import java.util.Collection; + +import org.dive4elements.river.artifacts.sinfo.util.RiverInfo; + +import net.sf.jasperreports.engine.JRException; + +/** + * @author Domenico Nardi Tironi + */ +public abstract class AbstractCalculationExportableResult extends AbstractCalculationResult { + + private static final long serialVersionUID = 1L; + + public AbstractCalculationExportableResult(final String label, final Collection rows) { + super(label, rows); + } + + public abstract void writeCSVHeader(ExportContextCSV exportContextCSV, final RESULTS results, final RiverInfo river); + + public final void writeCsv(final ExportContextCSV exportContextCSV, final RESULTS results) { + + writeCSVResultMetadata(exportContextCSV, results); + // wenn resultsmetadata null sind!? keine neue zeile + // writer.writeNext(new String[] { "" }); // break line in den Implementationen, + // weil es sein kann, dass KEINE ResultMetadata geschrieben werden; dann wäre eine Leerzeile überflüssig + + /* now the value rows */ + final Collection rows = getRows(); + for (final ResultRow row : rows) + writeCSVRow(exportContextCSV, results, row); + } + + protected abstract void writeCSVResultMetadata(final ExportContextCSV exportContextCSV, final RESULTS results); + + protected void writeCSVRow(final ExportContextCSV exportContextCSV, final RESULTS results, final ResultRow row) { + final String[] formattedRow = formatCSVRow(exportContextCSV, results, row); + exportContextCSV.writeCSVLine(formattedRow); + + } + + protected abstract String[] formatCSVRow(ExportContextCSV exportContextCSV, final RESULTS results, final ResultRow row); + + protected abstract String[] formatPDFRow(ExportContextCSV exportContextPDF, RESULTS results, ResultRow row); + + public JasperDesigner addReport(final ExportContextCSV exportContextPDF, final RESULTS results, final JasperReporter reporter, + final MetaAndTableJRDataSource source) throws JRException { + + final JasperDesigner design = reporter.addReport(getJasperFile(), source); + addJRTableHeader(exportContextPDF, source, results); + addJRTableData(exportContextPDF, source, results); + return design; + } + + protected abstract String getJasperFile(); + + protected abstract void addJRTableHeader(ExportContextCSV exportContextPDF, MetaAndTableJRDataSource source, RESULTS results); + + private void addJRTableData(final ExportContextCSV exportContextPDF, final MetaAndTableJRDataSource source, final RESULTS results) { + + final Collection rows = getRows(); + + for (final ResultRow row : rows) { + + final String[] formattedRow = formatPDFRow(exportContextPDF, results, row); + source.addData(formattedRow); + } + } +} \ No newline at end of file diff -r 5be112fba832 -r 23945061daec artifacts/src/main/java/org/dive4elements/river/artifacts/common/AbstractCalculationListResults.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/artifacts/src/main/java/org/dive4elements/river/artifacts/common/AbstractCalculationListResults.java Thu Jun 14 16:56:31 2018 +0200 @@ -0,0 +1,50 @@ +/** Copyright (C) 2017 by Bundesanstalt für Gewässerkunde + * 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) + * and comes with ABSOLUTELY NO WARRANTY! Check out the + * documentation coming with Dive4Elements River for details. + */ +package org.dive4elements.river.artifacts.common; + +import java.util.ArrayList; +import java.util.Collections; +import java.util.List; + +import org.apache.commons.lang.math.DoubleRange; +import org.dive4elements.river.artifacts.model.Calculation; +import org.dive4elements.river.artifacts.sinfo.util.RiverInfo; + +/** + * @author Gernot Belger + */ +public abstract class AbstractCalculationListResults extends AbstractCalculationResults { + + private static final long serialVersionUID = 1L; + + private final List results = new ArrayList<>(); + + public AbstractCalculationListResults(final String calcModeLabel, final String user, final RiverInfo river, final DoubleRange calcRange) { + super(calcModeLabel, user, river, calcRange); + } + + public final void addResult(final RESULT result, final Calculation problems) { + /* we assume error reporting was already done in this case */ + if (result == null) + return; + + if (result.isEmpty()) { + problems.addProblem("abstractsinfocalculationresults.emptyResult", result.getLabel()); + return; + } + + this.results.add(result); + } + + public final List getResults() { + return Collections.unmodifiableList(this.results); + } + +} \ No newline at end of file diff -r 5be112fba832 -r 23945061daec artifacts/src/main/java/org/dive4elements/river/artifacts/common/AbstractCalculationResult.java --- a/artifacts/src/main/java/org/dive4elements/river/artifacts/common/AbstractCalculationResult.java Thu Jun 14 15:12:25 2018 +0200 +++ b/artifacts/src/main/java/org/dive4elements/river/artifacts/common/AbstractCalculationResult.java Thu Jun 14 16:56:31 2018 +0200 @@ -15,7 +15,6 @@ import java.util.Collections; import java.util.List; -import org.dive4elements.river.artifacts.common.IResultType; import gnu.trove.TDoubleArrayList; /** @@ -29,38 +28,35 @@ private final String label; - - - public AbstractCalculationResult(final String label, final Collection rows) { - this.label = label; + public AbstractCalculationResult(final String label, final Collection rows) { + this.label = label; this.rows = new ArrayList<>(rows); } public final String getLabel() { return this.label; } - public boolean isEmpty() { return this.rows.isEmpty(); } - public final void addRow(final ResultRow resultRow) { - this.rows.add(resultRow); - } + // public final void addRow(final ResultRow resultRow) { + // this.rows.add(resultRow); + // } public final Collection getRows() { return Collections.unmodifiableCollection(this.rows); } - public final double[][] getStationPoints(final IResultType type) { //gehört die Methode hier rein? oder in erbende Klassen? + public final double[][] getStationPoints(final IResultType type) { // gehört die Methode hier rein? oder in erbende Klassen? final TDoubleArrayList xPoints = new TDoubleArrayList(this.rows.size()); final TDoubleArrayList yPoints = new TDoubleArrayList(this.rows.size()); for (final ResultRow row : this.rows) { - final double station = row.getDoubleValue(GeneralResultType.station); //TODO: move "station" (and others) to common + final double station = row.getDoubleValue(GeneralResultType.station); // TODO: move "station" (and others) to common final double value = row.getDoubleValue(type); xPoints.add(station); diff -r 5be112fba832 -r 23945061daec artifacts/src/main/java/org/dive4elements/river/artifacts/common/AbstractCalculationResults.java --- a/artifacts/src/main/java/org/dive4elements/river/artifacts/common/AbstractCalculationResults.java Thu Jun 14 15:12:25 2018 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,77 +0,0 @@ -/** Copyright (C) 2017 by Bundesanstalt für Gewässerkunde - * 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) - * and comes with ABSOLUTELY NO WARRANTY! Check out the - * documentation coming with Dive4Elements River for details. - */ -package org.dive4elements.river.artifacts.common; - -import java.io.Serializable; -import java.util.ArrayList; -import java.util.Collections; -import java.util.List; - -import org.apache.commons.lang.math.DoubleRange; -import org.dive4elements.river.artifacts.model.Calculation; -import org.dive4elements.river.artifacts.sinfo.util.RiverInfo; - -/** - * @author Gernot Belger - */ -public abstract class AbstractCalculationResults implements Serializable { - - private static final long serialVersionUID = 1L; - - private final List results = new ArrayList<>(); - - private final String calcModeLabel; - - private final String user; - - private final RiverInfo river; - - private final DoubleRange calcRange; - - public AbstractCalculationResults(final String calcModeLabel, final String user, final RiverInfo river, final DoubleRange calcRange) { - this.calcModeLabel = calcModeLabel; - this.user = user; - this.river = river; - this.calcRange = calcRange; - } - - public String getCalcModeLabel() { - return this.calcModeLabel; - } - - public String getUser() { - return this.user; - } - - public RiverInfo getRiver() { - return this.river; - } - - public DoubleRange getCalcRange() { - return this.calcRange; - } - - public void addResult(final RESULT result, final Calculation problems) { - /* we assume error reporting was already done in this case */ - if (result == null) - return; - - if (result.isEmpty()) { - problems.addProblem("abstractsinfocalculationresults.emptyResult", result.getLabel()); - return; - } - - this.results.add(result); - } - - public List getResults() { - return Collections.unmodifiableList(this.results); - } -} \ No newline at end of file diff -r 5be112fba832 -r 23945061daec artifacts/src/main/java/org/dive4elements/river/artifacts/common/AbstractCommonExporter.java --- a/artifacts/src/main/java/org/dive4elements/river/artifacts/common/AbstractCommonExporter.java Thu Jun 14 15:12:25 2018 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,168 +0,0 @@ -/** Copyright (C) 2017 by Bundesanstalt für Gewässerkunde - * 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) - * and comes with ABSOLUTELY NO WARRANTY! Check out the - * documentation coming with Dive4Elements River for details. - */ -package org.dive4elements.river.artifacts.common; - -import java.util.Collection; - -import org.apache.log4j.Logger; -import org.dive4elements.artifacts.CallMeta; -import org.dive4elements.river.artifacts.model.CalculationResult; -import org.dive4elements.river.artifacts.resources.Resources; -import org.dive4elements.river.artifacts.sinfo.util.RiverInfo; -import org.dive4elements.river.exports.AbstractExporter; - -import au.com.bytecode.opencsv.CSVWriter; - -/** - * @author Gernot Belger - */ -public abstract class AbstractCommonExporter> extends AbstractExporter { - - /** The storage that contains the current calculation result. */ - protected static enum ExportMode { - pdf, csv - } - - /** The log used in this exporter. */ - protected abstract Logger getLog(); - - protected RESULTS data = null; - - public final RESULTS getData() { - return this.data; - } - - @Override - protected final void addData(final Object d) { - /* reset */ - this.data = null; - if (d instanceof CalculationResult) { - - final Object dat = ((CalculationResult) d).getData(); - if (dat != null) { - @SuppressWarnings("unchecked") - final RESULTS result = (RESULTS) dat; - this.data = result; - } - } - } - - /** - * Formats header with unit and label: msg [unit] (label) - */ - protected final String msgUnitLabel(final String key, final String unit, final String label) { - final String msg = msg(key); - return String.format("%s [%s] (%s)", msg, unit, label); - } - - @Override - protected final void writeCSVData(final CSVWriter writer) { - getLog().info("writeCSVData"); - - /* fetch calculation results */ - final RESULTS results = this.data; - - /* write as csv */ - writeCSVGlobalMetadata(writer, results); - writer.writeNext(new String[] { "" }); // break line HERE to avoid redundance - final RiverInfo river = results.getRiver(); - // FIXME :with comment if not first result - writeCSVHeader(writer, results, river); - writer.writeNext(new String[] { "" }); // break line HERE to avoid redundance - - for (final RESULT result : results.getResults()) { - writeCSVResult(writer, results, result); - writer.writeNext(new String[] { "" }); // break line HERE after each resultset - } - - } - - protected abstract void writeCSVHeader(final CSVWriter writer, final RESULTS results, final RiverInfo river); - - /** - * Add metadata that is once written to the top of the file. - */ - protected abstract void writeCSVGlobalMetadata(final CSVWriter writer, final RESULTS results); - - protected final void writeCSVMetaEntry(final CSVWriter writer, final String message, final Object... messageArgs) { - - final CallMeta meta = this.context.getMeta(); - - writer.writeNext(new String[] { Resources.getMsg(meta, message, message, messageArgs) }); - } - - private final void writeCSVResult(final CSVWriter writer, final RESULTS results, final RESULT result) { - - writeCSVResultMetadata(writer, results, result); - // wenn resultsmetadata null sind!? keine neue zeile - // writer.writeNext(new String[] { "" }); // break line in den Implementationen, - // weil es sein kann, dass KEINE ResultMetadata geschrieben werden; dann wäre eine Leerzeile überflüssig - - /* now the value rows */ - final Collection rows = result.getRows(); - for (final ResultRow row : rows) { - writeCSVRow(writer, results, result, row); - } - } - - /** - * Add metadata that is written once per result set. - */ - protected abstract void writeCSVResultMetadata(CSVWriter writer, RESULTS results, RESULT result); - - protected void writeCSVRow(final CSVWriter writer, final RESULTS results, final RESULT result, final ResultRow row) { - getLog().debug("writeCSVFlowDepthRow"); - - final String[] formattedRow = formatCSVRow(results, row); - writer.writeNext(formattedRow); - } - - protected final String[] formatCSVRow(final RESULTS results, final ResultRow row) { - return formatRow(results, row, ExportMode.csv); - } - - protected final MetaAndTableJRDataSource createJRData(final AbstractCalculationResults data) { - - /* fetch calculation results */ - final RESULTS results = this.data; - - final MetaAndTableJRDataSource source = new MetaAndTableJRDataSource(); - - addJRMetaData(source, results); - - for (final RESULT result : results.getResults()) - addJRTableData(source, results, result); - - return source; - } - - protected abstract void addJRMetaData(final MetaAndTableJRDataSource source, final RESULTS results); - - private void addJRTableData(final MetaAndTableJRDataSource source, final RESULTS results, final RESULT result) { - - final Collection rows = result.getRows(); - - for (final ResultRow row : rows) { - - final String[] formattedRow = formatPDFRow(results, row); - source.addData(formattedRow); - } - } - - protected abstract String[] formatRow(RESULTS results, ResultRow row, ExportMode mode); - - private final String[] formatPDFRow(final RESULTS results, final ResultRow row) { - return formatRow(results, row, ExportMode.pdf); - } - - protected abstract void writeCSVGlobalMetadataDefaults(final CSVWriter writer, final RESULTS results); - - protected abstract void addJRMetaDataDefaults(final MetaAndTableJRDataSource source, final RESULTS results); -} \ No newline at end of file diff -r 5be112fba832 -r 23945061daec artifacts/src/main/java/org/dive4elements/river/artifacts/common/AbstractCommonListExporter.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/artifacts/src/main/java/org/dive4elements/river/artifacts/common/AbstractCommonListExporter.java Thu Jun 14 16:56:31 2018 +0200 @@ -0,0 +1,117 @@ +/** Copyright (C) 2017 by Bundesanstalt für Gewässerkunde + * 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) + * and comes with ABSOLUTELY NO WARRANTY! Check out the + * documentation coming with Dive4Elements River for details. + */ +package org.dive4elements.river.artifacts.common; + +import java.util.Collection; + +import org.dive4elements.river.artifacts.sinfo.util.RiverInfo; + +import au.com.bytecode.opencsv.CSVWriter; + +/** + * @author Gernot Belger + */ +public abstract class AbstractCommonListExporter> extends AbstractCommonExporter { + + /** The storage that contains the current calculation result. */ + protected static enum ExportMode { + pdf, csv + } + + @Override + protected void doWriteCSVData(final CSVWriter writer, final RESULTS results) { + + getLog().info("writeCSVData"); + + /* write as csv */ + writeCSVGlobalMetadata(writer, results); + + writer.writeNext(new String[] { "" }); // break line HERE to avoid redundance + final RiverInfo river = results.getRiver(); + // FIXME :with comment if not first result + writeCSVHeader(writer, results, river); + writer.writeNext(new String[] { "" }); // break line HERE to avoid redundance + + for (final RESULT result : results.getResults()) { + writeCSVResult(writer, results, result); + writer.writeNext(new String[] { "" }); // break line HERE after each resultset + } + } + + protected abstract void writeCSVHeader(final CSVWriter writer, final RESULTS results, final RiverInfo river); + + /** + * Add metadata that is once written to the top of the file. + */ + protected abstract void writeCSVGlobalMetadata(final CSVWriter writer, final RESULTS results); + + private final void writeCSVResult(final CSVWriter writer, final RESULTS results, final RESULT result) { + + writeCSVResultMetadata(writer, results, result); + // wenn resultsmetadata null sind!? keine neue zeile + // writer.writeNext(new String[] { "" }); // break line in den Implementationen, + // weil es sein kann, dass KEINE ResultMetadata geschrieben werden; dann wäre eine Leerzeile überflüssig + + /* now the value rows */ + final Collection rows = result.getRows(); + for (final ResultRow row : rows) + writeCSVRow(writer, results, result, row); + } + + /** + * Add metadata that is written once per result set. + */ + protected abstract void writeCSVResultMetadata(CSVWriter writer, RESULTS results, RESULT result); + + protected void writeCSVRow(final CSVWriter writer, final RESULTS results, final RESULT result, final ResultRow row) { + getLog().debug("writeCSVFlowDepthRow"); + + final String[] formattedRow = formatCSVRow(results, row); + writer.writeNext(formattedRow); + } + + protected final String[] formatCSVRow(final RESULTS results, final ResultRow row) { + return formatRow(results, row, ExportMode.csv); + } + + protected final MetaAndTableJRDataSource createJRData() { + + /* fetch calculation results */ + final RESULTS results = getResults(); + + final MetaAndTableJRDataSource source = new MetaAndTableJRDataSource(); + + addJRMetaData(source, results); + + for (final RESULT result : results.getResults()) + addJRTableData(source, results, result); + + return source; + } + + protected abstract void addJRMetaData(final MetaAndTableJRDataSource source, final RESULTS results); + + private void addJRTableData(final MetaAndTableJRDataSource source, final RESULTS results, final RESULT result) { + + final Collection rows = result.getRows(); + + for (final ResultRow row : rows) { + + final String[] formattedRow = formatPDFRow(results, row); + source.addData(formattedRow); + } + } + + protected abstract String[] formatRow(RESULTS results, ResultRow row, ExportMode mode); + + private final String[] formatPDFRow(final RESULTS results, final ResultRow row) { + return formatRow(results, row, ExportMode.pdf); + } +} \ No newline at end of file diff -r 5be112fba832 -r 23945061daec artifacts/src/main/java/org/dive4elements/river/artifacts/common/AbstractResultType.java --- a/artifacts/src/main/java/org/dive4elements/river/artifacts/common/AbstractResultType.java Thu Jun 14 15:12:25 2018 +0200 +++ b/artifacts/src/main/java/org/dive4elements/river/artifacts/common/AbstractResultType.java Thu Jun 14 16:56:31 2018 +0200 @@ -86,6 +86,7 @@ protected abstract NumberFormat createFormatter(CallContext context); + @Override public final String getCsvHeader() { return this.csvHeader; } diff -r 5be112fba832 -r 23945061daec artifacts/src/main/java/org/dive4elements/river/artifacts/common/ExportContextCSV.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/artifacts/src/main/java/org/dive4elements/river/artifacts/common/ExportContextCSV.java Thu Jun 14 16:56:31 2018 +0200 @@ -0,0 +1,236 @@ +/** Copyright (C) 2017 by Bundesanstalt für Gewässerkunde + * 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) + * and comes with ABSOLUTELY NO WARRANTY! Check out the + * documentation coming with Dive4Elements River for details. + */ +package org.dive4elements.river.artifacts.common; + +import java.text.DateFormat; +import java.text.NumberFormat; +import java.util.Date; +import java.util.Locale; + +import org.apache.commons.lang.math.DoubleRange; +import org.dive4elements.artifacts.CallContext; +import org.dive4elements.artifacts.CallMeta; +import org.dive4elements.river.FLYS; +import org.dive4elements.river.artifacts.resources.Resources; +import org.dive4elements.river.artifacts.sinfo.common.SInfoI18NStrings; +import org.dive4elements.river.artifacts.sinfo.common.SInfoResultType; +import org.dive4elements.river.artifacts.sinfo.util.BedHeightInfo; +import org.dive4elements.river.artifacts.sinfo.util.RiverInfo; +import org.dive4elements.river.artifacts.sinfo.util.WstInfo; +import org.dive4elements.river.utils.Formatter; + +import au.com.bytecode.opencsv.CSVWriter; + +/** + * @author Domenico Nardi Tironi + * + */ +public final class ExportContextCSV { + + private static final String CSV_META_HEADER_EVALUATOR = "sinfo.export.flow_depth.csv.meta.header.sounding.evaluator"; + + private static final String CSV_META_HEADER_SOUNDING = "sinfo.export.flow_depth.csv.meta.header.sounding"; + + private static final String CSV_META_HEADER_SOUNDING_YEAR = "sinfo.export.flow_depth.csv.meta.header.sounding.year"; + + 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_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"; + + private static final String CSV_META_HEADER_SOUNDING_ELEVATIOIN_MODEL_ORIGINAL = "sinfo.export.flow_depth.csv.meta.header.sounding.elevationmodel.original"; + + private static NumberFormat qFormat = null; + + private static NumberFormat flowDepthFormat = null; + + private NumberFormat kmFormat; + + /** The CallContext object. */ + private final CallContext context; + + private final CSVWriter writer; + + public ExportContextCSV(final CallContext context, final CSVWriter writer) { + this.context = context; + this.writer = writer; + } + + private String msg(final String key) { + return Resources.getMsg(this.context.getMeta(), key, key); + } + + public String msg(final String key, final Object... args) { + return Resources.getMsg(this.context.getMeta(), key, key, args); + } + + public final void writeCSVMetaEntry(final String message, final Object... messageArgs) { + + final CallMeta meta = this.context.getMeta(); + + this.writer.writeNext(new String[] { Resources.getMsg(meta, message, message, messageArgs) }); + } + + public void writeBlankLine() { + writeCSVLine(new String[] { "" }); + + } + + // *** CUSTOM STUFF that is used multiple times ***/// + + public final void writeCSVSoundingMetadata2(final BedHeightInfo sounding, final String mainLabel) { + // "##METADATEN PEILUNG" + writeCSVMetaEntry(mainLabel); + + // "# Jahr der Peilung: " + writeCSVMetaEntry(CSV_META_HEADER_SOUNDING_YEAR, Integer.toString(sounding.getYear())); + // "# Aufnahmeart: " + writeCSVMetaEntry(CSV_META_HEADER_SOUNDING_TYPE, sounding.getType()); + // "# Auswerter: " + writeCSVMetaEntry(CSV_META_HEADER_EVALUATOR, sounding.getEvaluationBy()); + // "# Lagesystem: " + writeCSVMetaEntry(CSV_META_HEADER_SOUNDING_PRJ, sounding.getLocationSystem()); + // "# Höhensystem: " + writeCSVMetaEntry(CSV_META_HEADER_SOUNDING_ELEVATIOIN_MODEL, sounding.getCurElevationModelUnit()); + // "# ursprüngliches Höhensystem: " + writeCSVMetaEntry(CSV_META_HEADER_SOUNDING_ELEVATIOIN_MODEL_ORIGINAL, sounding.getOldElevationModelUnit()); + } + + public final void writeCSVSoundingMetadata(final BedHeightInfo sounding) { + // "##METADATEN PEILUNG" + writeCSVMetaEntry(CSV_META_HEADER_SOUNDING); + + } + + public void writeCSVLine(final String[] line) { + this.writer.writeNext(line); + } + + public String formatCsvHeader(final IResultType type) { + return msg(type.getCsvHeader()); + } + + public String formatRowValue(final ResultRow row, final IResultType type) { + return row.exportValue(this.context, type); + } + + public void addJRMetadata(final MetaAndTableJRDataSource source, final String key, final IResultType type) { + source.addMetaData(key, type.getPdfHeader(this.context.getMeta())); + } + + public final void writeCSVGlobalMetadataDefaults(final AbstractCalculationResults results) { + // TODO: results as member + final String calcModeLabel = results.getCalcModeLabel(); + final RiverInfo river = results.getRiver(); + final DoubleRange calcRange = results.getCalcRange(); + + writeCSVMetaEntry(I18NStrings.CSV_META_HEADER_RESULT, msg(I18NStrings.CSV_META_HEADER_RESULT_LABEL), river.getName(), calcModeLabel); + + // "# FLYS-Version: " + writeCSVMetaEntry(I18NStrings.CSV_META_VERSION, msg(I18NStrings.CSV_META_VERSION_LABEL), FLYS.VERSION); + + // "# Bearbeiter: " + writeCSVMetaEntry(I18NStrings.CSV_META_USER, msg(I18NStrings.CSV_META_USER_LABEL), results.getUser()); + + // "# Datum der Erstellung: " + final Locale locale = Resources.getLocale(this.context.getMeta()); + final DateFormat df = DateFormat.getDateInstance(DateFormat.SHORT, locale); + writeCSVMetaEntry(I18NStrings.CSV_META_CREATION, msg(I18NStrings.CSV_META_CREATION_LABEL), df.format(new Date())); + + // "# Gewässer: " + writeCSVMetaEntry(I18NStrings.CSV_META_RIVER, msg(I18NStrings.CSV_META_RIVER_LABEL), river.getName()); + + // "# Höhensystem des Flusses: " + writeCSVMetaEntry(I18NStrings.CSV_META_HEIGHT_UNIT_RIVER, river.getWstUnit()); + + if (calcRange != null) { + // "# Ort/Bereich (km): " + writeCSVMetaEntry(I18NStrings.CSV_META_RANGE, msg(I18NStrings.CSV_META_RANGE_LABEL), getKmFormatter().format(calcRange.getMinimumDouble()), + getKmFormatter().format(calcRange.getMaximumDouble())); + } + } + + public final void writeCSVWaterlevelMetadata(final WstInfo wst) { + writeCSVWaterlevelMetadata(wst, SInfoI18NStrings.CSV_META_HEADER_WATERLEVEL); // default Label; used in 99% + } + + public final void writeCSVWaterlevelMetadata(final WstInfo wst, final String mainLabel) { + // "##METADATEN WASSERSPIEGELLAGE" + writeCSVMetaEntry(mainLabel); + + // "# Bezeichnung der Wasserspiegellage: " + writeCSVMetaEntry(SInfoI18NStrings.CSV_META_HEADER_WATERLEVEL_NAME, wst.getLabel()); + + // "# Bezugspegel: " + writeCSVMetaEntry(SInfoI18NStrings.CSV_META_HEADER_WATERLEVEL_GAUGE, wst.getGauge()); + + // "# Jahr/Zeitraum der Wasserspiegellage: " + final int year = wst.getYear(); + if (year > 0) + writeCSVMetaEntry(SInfoI18NStrings.CSV_META_HEADER_WATERLEVEL_YEAR, Integer.toString(year)); + } + + // copy from AbstractExporter TODO merge with ExportContextPDF + protected NumberFormat getKmFormatter() { + + if (this.kmFormat == null) { + this.kmFormat = Formatter.getWaterlevelKM(this.context); + } + return this.kmFormat; + } + + public void addJRMetadata(final MetaAndTableJRDataSource source, final String key, final String msg) { + source.addMetaData(key, msg); + + } + + public NumberFormat getQFormatter() { + if (this.qFormat == null) { + this.qFormat = Formatter.getWaterlevelQ(this.context); + } + return this.qFormat; + } + + public final NumberFormat getFlowDepthFormatter() { + if (this.flowDepthFormat == null) + this.flowDepthFormat = Formatter.getFlowDepth(this.context); + return this.flowDepthFormat; + } + + /** + * Formats header with unit: msg [unit] + */ + + public String msgUnitCSV(final IResultType typeWithUnit) { // TODO: use generic Type! + final String unit = msg(typeWithUnit.getUnit()); + return msgUnitCSV(typeWithUnit, unit); + } + + public String msgUnitCSV(final IResultType type, final String unit) { + final String msg = msg(type.getCsvHeader()); + return String.format("%s [%s]", msg, unit); + } + + public void writeCSVSoundingMetadata(final BedHeightInfo currentSounding, final String csvMetaHeaderSoundingCurrent) { + + } + + public final String msgUnitLabel(final IResultType typeWithUnit, final String label) { + final String msg = msg(typeWithUnit.getCsvHeader()); + final String unit = msg(typeWithUnit.getUnit()); + return String.format("%s [%s] (%s)", msg, unit, label); + } + + public String msgPdf(final SInfoResultType type) { + return type.getPdfHeader(this.context.getMeta()); + + } +} \ No newline at end of file diff -r 5be112fba832 -r 23945061daec artifacts/src/main/java/org/dive4elements/river/artifacts/common/ExportContextPDF.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/artifacts/src/main/java/org/dive4elements/river/artifacts/common/ExportContextPDF.java Thu Jun 14 16:56:31 2018 +0200 @@ -0,0 +1,113 @@ +/** Copyright (C) 2017 by Bundesanstalt für Gewässerkunde + * 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) + * and comes with ABSOLUTELY NO WARRANTY! Check out the + * documentation coming with Dive4Elements River for details. + */ +package org.dive4elements.river.artifacts.common; + +import java.text.DateFormat; +import java.text.NumberFormat; +import java.util.Date; +import java.util.Locale; + +import org.apache.commons.lang.math.DoubleRange; +import org.dive4elements.artifacts.CallContext; +import org.dive4elements.river.FLYS; +import org.dive4elements.river.artifacts.resources.Resources; +import org.dive4elements.river.artifacts.sinfo.util.RiverInfo; +import org.dive4elements.river.utils.Formatter; + +/** + * @author Domenico Nardi Tironi + * + */ +public final class ExportContextPDF { + + private NumberFormat kmFormat; + + /** The CallContext object. */ + private final CallContext context; + + public ExportContextPDF(final CallContext context) { + this.context = context; + + } + + private String msg(final String key) { + return Resources.getMsg(this.context.getMeta(), key, key); + } + + private String msg(final String key, final Object... args) { + return Resources.getMsg(this.context.getMeta(), key, key, args); + } + + public void addJRMetadata(final MetaAndTableJRDataSource source, final String key, final IResultType type) { + source.addMetaData(key, type.getPdfHeader(this.context.getMeta())); + } + + // *** CUSTOM STUFF that is used multiple times ***/// + public void addJRMetaDataDefaults(final MetaAndTableJRDataSource source, final AbstractCalculationResults results) { + + source.addMetaData("header", msg(I18NStrings.CSV_META_HEADER_RESULT_LABEL)); + source.addMetaData("calcMode", results.getCalcModeLabel()); + + source.addMetaData("version_label", msg(I18NStrings.CSV_META_VERSION_LABEL)); + source.addMetaData("version", FLYS.VERSION); + + source.addMetaData("user_label", msg(I18NStrings.CSV_META_USER_LABEL)); + source.addMetaData("user", results.getUser()); + + final Locale locale = Resources.getLocale(this.context.getMeta()); + final DateFormat df = DateFormat.getDateInstance(DateFormat.SHORT, locale); + source.addMetaData("date_label", msg(I18NStrings.CSV_META_CREATION_LABEL)); + source.addMetaData("date", df.format(new Date())); + } + + public void addJRMetaDataUSINFO(final MetaAndTableJRDataSource source, final AbstractCalculationResults results) { + + /* general metadata */ + addJRMetaDataDefaults(source, results); + + final RiverInfo river = results.getRiver(); + final String wstUnitName = river.getWstUnit(); + + source.addMetaData("river_label", msg(I18NStrings.CSV_META_RIVER_LABEL)); + source.addMetaData("river", river.getName()); + source.addMetaData("river_unit", wstUnitName); + + final DoubleRange calcRange = results.getCalcRange(); + final NumberFormat kmFormatter = getKmFormatter(); + final String rangeValue = String.format("%s - %s", kmFormatter.format(calcRange.getMinimumDouble()), kmFormatter.format(calcRange.getMaximumDouble())); + source.addMetaData("range_label", msg(I18NStrings.CSV_META_RANGE_LABEL)); + source.addMetaData("range", rangeValue); + + /* column headings */ + // source.addMetaData("station_header", GeneralResultType.station.getPdfHeader(this.context.getMeta())); + + // moved to *result + /* column headings */ + // source.addMetaData("flowdepth_header", SInfoResultType.flowdepth.getPdfHeader(this.context.getMeta())); + // source.addMetaData("flowdepth_tkh_header", SInfoResultType.flowdepthtkh.getPdfHeader(this.context.getMeta())); + // source.addMetaData("tkh_header", SInfoResultType.tkh.getPdfHeader(this.context.getMeta())); + // source.addMetaData("waterlevel_header", SInfoResultType.waterlevel.getPdfHeader(this.context.getMeta())); + // source.addMetaData("discharge_header", SInfoResultType.discharge.getPdfHeader(this.context.getMeta())); + // source.addMetaData("waterlevel_name_header", SInfoResultType.waterlevelLabel.getPdfHeader(this.context.getMeta())); + // source.addMetaData("gauge_header", SInfoResultType.gaugeLabel.getPdfHeader(this.context.getMeta())); + // source.addMetaData("bedheight_header", SInfoResultType.meanBedHeight.getPdfHeader(this.context.getMeta())); + // source.addMetaData("sounding_name_header", SInfoResultType.soundingLabel.getPdfHeader(this.context.getMeta())); + // source.addMetaData("location_header", SInfoResultType.location.getPdfHeader(this.context.getMeta())); + } + + // copy from AbstractExporter TODO merge with ExportContextCSV + protected NumberFormat getKmFormatter() { + + if (this.kmFormat == null) { + this.kmFormat = Formatter.getWaterlevelKM(this.context); + } + return this.kmFormat; + } +} \ No newline at end of file diff -r 5be112fba832 -r 23945061daec artifacts/src/main/java/org/dive4elements/river/artifacts/common/GeneralResultType.java --- a/artifacts/src/main/java/org/dive4elements/river/artifacts/common/GeneralResultType.java Thu Jun 14 15:12:25 2018 +0200 +++ b/artifacts/src/main/java/org/dive4elements/river/artifacts/common/GeneralResultType.java Thu Jun 14 16:56:31 2018 +0200 @@ -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) @@ -19,8 +19,10 @@ * */ public abstract class GeneralResultType extends AbstractResultType { - - public static final GeneralResultType station = new GeneralResultType(I18NStrings.UNIT_KM, I18NStrings.CSV_KM_HEADER) { + + private static final long serialVersionUID = 1L; + + public static final GeneralResultType station = new GeneralResultType(I18NStrings.UNIT_KM, I18NStrings.CSV_KM_HEADER) { @Override public String exportValue(final CallContext context, final Object value) { final double doubleValue = asDouble(value); @@ -32,14 +34,13 @@ return Formatter.getWaterlevelKM(context); } }; - - - private GeneralResultType(String unit, String csvHeader) { - + + private GeneralResultType(final String unit, final String csvHeader) { + super(unit, csvHeader, csvHeader); } - private GeneralResultType(String unit, String csvHeader, String pdfHeader) { + + private GeneralResultType(final String unit, final String csvHeader, final String pdfHeader) { super(unit, csvHeader, pdfHeader); } - -} +} \ No newline at end of file diff -r 5be112fba832 -r 23945061daec artifacts/src/main/java/org/dive4elements/river/artifacts/common/IResultType.java --- a/artifacts/src/main/java/org/dive4elements/river/artifacts/common/IResultType.java Thu Jun 14 15:12:25 2018 +0200 +++ b/artifacts/src/main/java/org/dive4elements/river/artifacts/common/IResultType.java Thu Jun 14 16:56:31 2018 +0200 @@ -12,13 +12,20 @@ import java.io.Serializable; import org.dive4elements.artifacts.CallContext; +import org.dive4elements.artifacts.CallMeta; /** * @author Domenico Nardi Tironi */ public interface IResultType extends Serializable { - String exportValue(final CallContext context, final Object value); + String exportValue(CallContext context, Object value); - double asDouble(final Object value); + double asDouble(Object value); + + String getCsvHeader(); + + String getPdfHeader(CallMeta meta); + + String getUnit(); } \ No newline at end of file diff -r 5be112fba832 -r 23945061daec artifacts/src/main/java/org/dive4elements/river/artifacts/common/JasperReporter.java --- a/artifacts/src/main/java/org/dive4elements/river/artifacts/common/JasperReporter.java Thu Jun 14 15:12:25 2018 +0200 +++ b/artifacts/src/main/java/org/dive4elements/river/artifacts/common/JasperReporter.java Thu Jun 14 16:56:31 2018 +0200 @@ -79,9 +79,7 @@ final JasperPrint print = JasperFillManager.fillReport(compiled, this.parameters, source); jasperPrintList.add(print); } else { - - int totalpagesoffset = 0; - int pagesCount = 0; + Integer totalpages = 0; // erstes Rendern, um Seitenzahl zu ermitteln for (final JasperDesigner designer : this.designs) { @@ -91,16 +89,15 @@ final MetaAndTableJRDataSource source = designer.getSource(); final JasperPrint print = JasperFillManager.fillReport(compiled, this.parameters, source); - pagesCount = print.getPages().size(); - designer.setPagesCount(totalpagesoffset); + final Integer pagesCount = print.getPages().size(); + designer.setPagesCount(totalpages); - totalpagesoffset += pagesCount; + totalpages += pagesCount; } - totalpagesoffset = totalpagesoffset - pagesCount; // offset darf die letzten Seiten nicht beinhalten! // Sources mit pages machen for (final JasperDesigner designer : this.designs) { - final JRDataSource sourceWithPages = designer.getSource().withPagePageOffsets(designer.getPagesCount(), totalpagesoffset); + final JRDataSource sourceWithPages = designer.getSource().withPagePageOffsets(designer.getPagesCount(), totalpages); sourcesWithPages.add(sourceWithPages); } diff -r 5be112fba832 -r 23945061daec artifacts/src/main/java/org/dive4elements/river/artifacts/common/MetaAndTableJRDataSource.java --- a/artifacts/src/main/java/org/dive4elements/river/artifacts/common/MetaAndTableJRDataSource.java Thu Jun 14 15:12:25 2018 +0200 +++ b/artifacts/src/main/java/org/dive4elements/river/artifacts/common/MetaAndTableJRDataSource.java Thu Jun 14 16:56:31 2018 +0200 @@ -25,7 +25,7 @@ private final List data = new ArrayList<>(); - private final Map metaData = new HashMap<>(); + private final Map metaData = new HashMap<>(); private int index = -1; @@ -33,7 +33,7 @@ this.data.add(row); } - public void addMetaData(final String key, final String value) { + public void addMetaData(final String key, final Object value) { this.metaData.put(key, value); } @@ -60,14 +60,14 @@ return null; } - public JRDataSource withPagePageOffsets(final int startpageoffset, final int totalpagesoffset) { + public JRDataSource withPagePageOffsets(final Integer startpageoffset, final Integer totalpages) { final MetaAndTableJRDataSource newSource = new MetaAndTableJRDataSource(); newSource.data.addAll(this.data); newSource.metaData.putAll(this.metaData); - newSource.addMetaData("meta:startpageoffset", "" + startpageoffset); - newSource.addMetaData("meta:totalpagesoffset", "" + totalpagesoffset); + newSource.addMetaData("startpageoffset", startpageoffset); + newSource.addMetaData("totalpages", totalpages); return newSource; } diff -r 5be112fba832 -r 23945061daec artifacts/src/main/java/org/dive4elements/river/artifacts/sinfo/collision/CollisionCalcDetailResult.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/artifacts/src/main/java/org/dive4elements/river/artifacts/sinfo/collision/CollisionCalcDetailResult.java Thu Jun 14 16:56:31 2018 +0200 @@ -0,0 +1,109 @@ +/* Copyright (C) 2017 by Bundesanstalt für Gewässerkunde + * 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) + * and comes with ABSOLUTELY NO WARRANTY! Check out the + * documentation coming with Dive4Elements River for details. + */ +package org.dive4elements.river.artifacts.sinfo.collision; + +import java.util.ArrayList; +import java.util.Collection; + +import org.dive4elements.river.artifacts.common.AbstractCalculationExportableResult; +import org.dive4elements.river.artifacts.common.ExportContextCSV; +import org.dive4elements.river.artifacts.common.GeneralResultType; +import org.dive4elements.river.artifacts.common.MetaAndTableJRDataSource; +import org.dive4elements.river.artifacts.common.ResultRow; +import org.dive4elements.river.artifacts.sinfo.util.RiverInfo; + +/** + * Contains the results of a {@link FloodDurationCalculation}. + * + * @author Gernot Belger + */ +final class CollisionCalcDetailResult extends AbstractCalculationExportableResult { + + private static final long serialVersionUID = 1L; + private static final String JASPER_FILE = "/jasper/templates/sinfo.collision.detail.jrxml"; + + public CollisionCalcDetailResult(final String label, final Collection rows) { + super(label, rows); + } + + @Override + protected void writeCSVResultMetadata(final ExportContextCSV exportContextCSV, final CollisionCalculationResults results) { + // TODO Auto-generated method stub + // final WstInfo wst = result.getWst(); + // exportContext.writeCSVWaterlevelMetadata(writer, wst); + // if hasMetadata... + exportContextCSV.writeBlankLine(); + } + + @Override + public void writeCSVHeader(final ExportContextCSV exportContextCSV, final CollisionCalculationResults results, final RiverInfo river) { + + // FIXME wrong columns: + final Collection header = new ArrayList<>(99); + + header.add(exportContextCSV.formatCsvHeader(GeneralResultType.station)); + // + // header.add(exportContext.formatCsvHeader(SInfoResultType.riverside)); + // header.add(exportContext.formatCsvHeader(SInfoResultType.inundationduration)); + // header.add(exportContext.formatCsvHeader(SInfoResultType.inundationdurationq)); + // header.add(exportContext.formatCsvHeader(SInfoResultType.infrastructureHeight)); + // header.add(exportContext.formatCsvHeader(SInfoResultType.infrastructuretype)); + // header.add(exportContext.formatCsvHeader(SInfoResultType.gaugeLabel)); + // header.add(exportContext.formatCsvHeader(SInfoResultType.location)); + + exportContextCSV.writeCSVLine(header.toArray(new String[header.size()])); + } + + @Override + protected String[] formatCSVRow(final ExportContextCSV exportContextCSV, final CollisionCalculationResults results, final ResultRow row) { + return formatRow(exportContextCSV, results, row); + } + + @Override + protected String[] formatPDFRow(final ExportContextCSV exportContextCSV, final CollisionCalculationResults results, final ResultRow row) { + return formatRow(exportContextCSV, results, row); + } + + private String[] formatRow(final ExportContextCSV exportContextCSV, final CollisionCalculationResults results, final ResultRow row) { + + final Collection lines = new ArrayList<>(11); + + // FIXME wrong columns: + lines.add(exportContextCSV.formatRowValue(row, GeneralResultType.station)); + // lines.add(exportContext.formatRowValue(row, SInfoResultType.tkh)); + // lines.add(exportContext.formatRowValue(row, SInfoResultType.soilkind)); + // lines.add(exportContext.formatRowValue(row, SInfoResultType.meanBedHeight)); + // lines.add(exportContext.formatRowValue(row, SInfoResultType.waterlevel)); + // lines.add(exportContext.formatRowValue(row, SInfoResultType.discharge)); + // lines.add(exportContext.formatRowValue(row, SInfoResultType.gaugeLabel)); + // lines.add(exportContext.formatRowValue(row, SInfoResultType.location)); + + return lines.toArray(new String[lines.size()]); + } + + @Override + protected String getJasperFile() { + return JASPER_FILE; + } + + @Override + protected void addJRTableHeader(final ExportContextCSV exportContextCSV, final MetaAndTableJRDataSource source, final CollisionCalculationResults results) { + + /* column headings */ + // FIXME wrong columns: + exportContextCSV.addJRMetadata(source, "station_header", GeneralResultType.station); + // exportContext.addJRMetadata(source, "station_header", GeneralResultType.station); + // exportContext.addJRMetadata(source, "tkh_header", SInfoResultType.tkh); + // exportContext.addJRMetadata(source, "tkhkind_header", SInfoResultType.soilkind); + // exportContext.addJRMetadata(source, "bedheight_header", SInfoResultType.meanBedHeight); + // exportContext.addJRMetadata(source, "waterlevel_header", SInfoResultType.waterlevel); + // exportContext.addJRMetadata(source, "discharge_header", SInfoResultType.discharge); + } +} \ No newline at end of file diff -r 5be112fba832 -r 23945061daec artifacts/src/main/java/org/dive4elements/river/artifacts/sinfo/collision/CollisionCalcOverviewResult.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/artifacts/src/main/java/org/dive4elements/river/artifacts/sinfo/collision/CollisionCalcOverviewResult.java Thu Jun 14 16:56:31 2018 +0200 @@ -0,0 +1,108 @@ +/* Copyright (C) 2017 by Bundesanstalt für Gewässerkunde + * 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) + * and comes with ABSOLUTELY NO WARRANTY! Check out the + * documentation coming with Dive4Elements River for details. + */ +package org.dive4elements.river.artifacts.sinfo.collision; + +import java.util.ArrayList; +import java.util.Collection; + +import org.dive4elements.river.artifacts.common.AbstractCalculationExportableResult; +import org.dive4elements.river.artifacts.common.ExportContextCSV; +import org.dive4elements.river.artifacts.common.GeneralResultType; +import org.dive4elements.river.artifacts.common.MetaAndTableJRDataSource; +import org.dive4elements.river.artifacts.common.ResultRow; +import org.dive4elements.river.artifacts.sinfo.util.RiverInfo; + +/** + * Contains the results of a {@link FloodDurationCalculation}. + * + * @author Gernot Belger + */ +final class CollisionCalcOverviewResult extends AbstractCalculationExportableResult { + + private static final long serialVersionUID = 1L; + + private static final String JASPER_FILE = "/jasper/templates/sinfo.collision.overview.jrxml"; + + public CollisionCalcOverviewResult(final String label, final Collection rows) { + super(label, rows); + } + + @Override + protected void writeCSVResultMetadata(final ExportContextCSV exportContextCSV, final CollisionCalculationResults results) { + // TODO Auto-generated method stub + // final WstInfo wst = result.getWst(); + // exportContext.writeCSVWaterlevelMetadata(writer, wst); + } + + @Override + public void writeCSVHeader(final ExportContextCSV exportContextCSV, final CollisionCalculationResults results, final RiverInfo river) { + + // FIXME wrong columns: + final Collection header = new ArrayList<>(99); + + header.add(exportContextCSV.formatCsvHeader(GeneralResultType.station)); + // + // header.add(exportContext.formatCsvHeader(SInfoResultType.riverside)); + // header.add(exportContext.formatCsvHeader(SInfoResultType.inundationduration)); + // header.add(exportContext.formatCsvHeader(SInfoResultType.inundationdurationq)); + // header.add(exportContext.formatCsvHeader(SInfoResultType.infrastructureHeight)); + // header.add(exportContext.formatCsvHeader(SInfoResultType.infrastructuretype)); + // header.add(exportContext.formatCsvHeader(SInfoResultType.gaugeLabel)); + // header.add(exportContext.formatCsvHeader(SInfoResultType.location)); + + exportContextCSV.writeCSVLine(header.toArray(new String[header.size()])); + } + + @Override + protected String[] formatCSVRow(final ExportContextCSV exportContextCSV, final CollisionCalculationResults results, final ResultRow row) { + return formatRow(exportContextCSV, results, row); + } + + @Override + protected String[] formatPDFRow(final ExportContextCSV exportContextCSV, final CollisionCalculationResults results, final ResultRow row) { + return formatRow(exportContextCSV, results, row); + } + + private String[] formatRow(final ExportContextCSV exportContextCSV, final CollisionCalculationResults results, final ResultRow row) { + + final Collection lines = new ArrayList<>(11); + + // FIXME wrong columns: + lines.add(exportContextCSV.formatRowValue(row, GeneralResultType.station)); + // lines.add(exportContext.formatRowValue(row, SInfoResultType.tkh)); + // lines.add(exportContext.formatRowValue(row, SInfoResultType.soilkind)); + // lines.add(exportContext.formatRowValue(row, SInfoResultType.meanBedHeight)); + // lines.add(exportContext.formatRowValue(row, SInfoResultType.waterlevel)); + // lines.add(exportContext.formatRowValue(row, SInfoResultType.discharge)); + // lines.add(exportContext.formatRowValue(row, SInfoResultType.gaugeLabel)); + // lines.add(exportContext.formatRowValue(row, SInfoResultType.location)); + + return lines.toArray(new String[lines.size()]); + } + + @Override + protected String getJasperFile() { + return JASPER_FILE; + } + + @Override + protected void addJRTableHeader(final ExportContextCSV exportContextCSV, final MetaAndTableJRDataSource source, final CollisionCalculationResults results) { + + /* column headings */ + // FIXME wrong columns: + exportContextCSV.addJRMetadata(source, "station_header", GeneralResultType.station); + // exportContext.addJRMetadata(source, "station_header", GeneralResultType.station); + // exportContext.addJRMetadata(source, "tkh_header", SInfoResultType.tkh); + // exportContext.addJRMetadata(source, "tkhkind_header", SInfoResultType.soilkind); + // exportContext.addJRMetadata(source, "bedheight_header", SInfoResultType.meanBedHeight); + // exportContext.addJRMetadata(source, "waterlevel_header", SInfoResultType.waterlevel); + // exportContext.addJRMetadata(source, "discharge_header", SInfoResultType.discharge); + } +} \ No newline at end of file diff -r 5be112fba832 -r 23945061daec artifacts/src/main/java/org/dive4elements/river/artifacts/sinfo/collision/CollisionCalculation.java --- a/artifacts/src/main/java/org/dive4elements/river/artifacts/sinfo/collision/CollisionCalculation.java Thu Jun 14 15:12:25 2018 +0200 +++ b/artifacts/src/main/java/org/dive4elements/river/artifacts/sinfo/collision/CollisionCalculation.java Thu Jun 14 16:56:31 2018 +0200 @@ -9,8 +9,13 @@ */ package org.dive4elements.river.artifacts.sinfo.collision; +import java.util.ArrayList; +import java.util.Collection; + import org.apache.commons.lang.math.DoubleRange; import org.dive4elements.artifacts.CallContext; +import org.dive4elements.river.artifacts.common.GeneralResultType; +import org.dive4elements.river.artifacts.common.ResultRow; import org.dive4elements.river.artifacts.model.Calculation; import org.dive4elements.river.artifacts.model.CalculationResult; import org.dive4elements.river.artifacts.resources.Resources; @@ -51,7 +56,29 @@ final int[] years = access.getYears(); final int[][] epochs = access.getEpochs(); - return null; // new CalculationResult(results, problems); + final Collection overViewRows = new ArrayList<>(); + final Collection detailsRows = new ArrayList<>(); + + // TODO: calculate + + final CollisionCalculationResults results = new CollisionCalculationResults(calcModeLabel, user, riverInfo, calcRange); + + final ResultRow row = ResultRow.create().putValue(GeneralResultType.station, 8888.888); + final ResultRow row2 = ResultRow.create().putValue(GeneralResultType.station, 777.888); + + for (int i = 0; i < 300; i++) { + overViewRows.add(row); + overViewRows.add(row2); + } + final CollisionCalcOverviewResult overviewResult = new CollisionCalcOverviewResult("Overview", overViewRows); // TODO: get Title-Strings from messages + results.addResult(overviewResult, problems); + for (int i = 0; i < 200; i++) { + detailsRows.add(row); + detailsRows.add(row2); + } + final CollisionCalcDetailResult detailResult = new CollisionCalcDetailResult("Details", detailsRows); + results.addResult(detailResult, problems); + + return new CalculationResult(results, problems); } - } \ No newline at end of file diff -r 5be112fba832 -r 23945061daec artifacts/src/main/java/org/dive4elements/river/artifacts/sinfo/collision/CollisionCalculationResults.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/artifacts/src/main/java/org/dive4elements/river/artifacts/sinfo/collision/CollisionCalculationResults.java Thu Jun 14 16:56:31 2018 +0200 @@ -0,0 +1,28 @@ +/** Copyright (C) 2017 by Bundesanstalt für Gewässerkunde + * 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) + * and comes with ABSOLUTELY NO WARRANTY! Check out the + * documentation coming with Dive4Elements River for details. + */ +package org.dive4elements.river.artifacts.sinfo.collision; + +import org.apache.commons.lang.math.DoubleRange; +import org.dive4elements.river.artifacts.common.AbstractCalculationExportableResult; +import org.dive4elements.river.artifacts.common.AbstractCalculationListResults; +import org.dive4elements.river.artifacts.sinfo.util.RiverInfo; + +/** + * @author Gernot Belger + */ +final class CollisionCalculationResults extends AbstractCalculationListResults> { + + private static final long serialVersionUID = 1L; + + public CollisionCalculationResults(final String calcModeLabel, final String user, final RiverInfo river, final DoubleRange calcRange) { + super(calcModeLabel, user, river, calcRange); + + } +} \ No newline at end of file diff -r 5be112fba832 -r 23945061daec artifacts/src/main/java/org/dive4elements/river/artifacts/sinfo/collision/CollisionExporter.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/artifacts/src/main/java/org/dive4elements/river/artifacts/sinfo/collision/CollisionExporter.java Thu Jun 14 16:56:31 2018 +0200 @@ -0,0 +1,82 @@ +/** Copyright (C) 2017 by Bundesanstalt für Gewässerkunde + * 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) + * and comes with ABSOLUTELY NO WARRANTY! Check out the + * documentation coming with Dive4Elements River for details. + */ +package org.dive4elements.river.artifacts.sinfo.collision; + +import java.io.OutputStream; + +import org.dive4elements.river.artifacts.common.AbstractCalculationExportableResult; +import org.dive4elements.river.artifacts.common.AbstractCommonExporter; +import org.dive4elements.river.artifacts.common.ExportContextCSV; +import org.dive4elements.river.artifacts.common.JasperReporter; +import org.dive4elements.river.artifacts.common.MetaAndTableJRDataSource; +import org.dive4elements.river.artifacts.sinfo.util.RiverInfo; + +import au.com.bytecode.opencsv.CSVWriter; +import net.sf.jasperreports.engine.JRException; + +/** + * @author Gernot Belger + */ +public final class CollisionExporter extends AbstractCommonExporter { + + @Override + protected void doWriteCSVData(final CSVWriter writer, final CollisionCalculationResults results) { + // TODO: Diesen Ablauf in super? + + // TODO: move results into context? + final ExportContextCSV exportContextCSV = new ExportContextCSV(this.context, writer); + + getLog().info("writeCSVData"); + + /* write as csv */ + exportContextCSV.writeCSVGlobalMetadataDefaults(results); // ggf auslagern innerhalb dieser Klasse + + // writer.writeNext(new String[] { "" }); // break line HERE to avoid redundance + + final RiverInfo river = results.getRiver(); + + final Class lastResultType = null; + + for (final AbstractCalculationExportableResult result : results.getResults()) { + + final Class resultType = result.getClass(); + if (lastResultType == null || lastResultType != resultType) { + exportContextCSV.writeBlankLine(); + result.writeCSVHeader(exportContextCSV, results, river); + exportContextCSV.writeBlankLine(); + } else + exportContextCSV.writeCSVLine(new String[] { "#" }); + + result.writeCsv(exportContextCSV, results); + } + } + + @Override + protected void doWritePdf(final OutputStream out, final CollisionCalculationResults results) { + // TODO: Move to super + try { + final ExportContextCSV exportContextCSV = new ExportContextCSV(this.context, null); + + final JasperReporter reporter = new JasperReporter(); + + for (final AbstractCalculationExportableResult result : results.getResults()) { + final MetaAndTableJRDataSource source = new MetaAndTableJRDataSource(); + getHelper().addJRMetaDataUSINFO(source, results); + + result.addReport(exportContextCSV, results, reporter, source); + } + + reporter.exportPDF(out); + } + catch (final JRException je) { + getLog().warn("Error generating PDF Report!", je); + } + } +} diff -r 5be112fba832 -r 23945061daec artifacts/src/main/java/org/dive4elements/river/artifacts/sinfo/collision/CollisionState.java --- a/artifacts/src/main/java/org/dive4elements/river/artifacts/sinfo/collision/CollisionState.java Thu Jun 14 15:12:25 2018 +0200 +++ b/artifacts/src/main/java/org/dive4elements/river/artifacts/sinfo/collision/CollisionState.java Thu Jun 14 16:56:31 2018 +0200 @@ -14,8 +14,11 @@ import org.dive4elements.artifacts.CallContext; import org.dive4elements.river.artifacts.ChartArtifact; import org.dive4elements.river.artifacts.D4EArtifact; +import org.dive4elements.river.artifacts.common.AbstractCalculationExportableResult; import org.dive4elements.river.artifacts.model.CalculationResult; +import org.dive4elements.river.artifacts.model.DataFacet; import org.dive4elements.river.artifacts.model.EmptyFacet; +import org.dive4elements.river.artifacts.model.FacetTypes; import org.dive4elements.river.artifacts.sinfo.SINFOArtifact; import org.dive4elements.river.artifacts.states.DefaultState; @@ -67,13 +70,14 @@ if (facets == null) return res; // - // final FlowDepthCalculationResults results = (FlowDepthCalculationResults) res.getData(); + final CollisionCalculationResults results = (CollisionCalculationResults) res.getData(); // // /* add themes for chart, for each result */ - // final List resultList = results.getResults(); + // final List resultList = results.getResults(); // for (int index = 0; index < resultList.size(); index++) { // - // final FlowDepthCalculationResult result = resultList.get(index); + final AbstractCalculationExportableResult result = results.getResults().get(0); + // // /* filtered (zoom dependent mean) flow depth */ // facets.add(FlowDepthProcessor.createFlowDepthFilteredFacet(context, hash, this.id, result, index)); @@ -88,13 +92,13 @@ // } // } - // if (!resultList.isEmpty()) { - // final Facet csv = new DataFacet(FacetTypes.CSV, "CSV data", ComputeType.ADVANCE, hash, this.id); - // final Facet pdf = new DataFacet(FacetTypes.PDF, "PDF data", ComputeType.ADVANCE, hash, this.id); - // - // facets.add(csv); - // facets.add(pdf); - // } + if (!result.isEmpty()) { + final Facet csv = new DataFacet(FacetTypes.CSV, "CSV data", ComputeType.ADVANCE, hash, this.id); + final Facet pdf = new DataFacet(FacetTypes.PDF, "PDF data", ComputeType.ADVANCE, hash, this.id); + + facets.add(csv); + facets.add(pdf); + } // // final Calculation report = res.getReport(); // diff -r 5be112fba832 -r 23945061daec artifacts/src/main/java/org/dive4elements/river/artifacts/sinfo/common/AbstractSInfoCalculationResults.java --- a/artifacts/src/main/java/org/dive4elements/river/artifacts/sinfo/common/AbstractSInfoCalculationResults.java Thu Jun 14 15:12:25 2018 +0200 +++ b/artifacts/src/main/java/org/dive4elements/river/artifacts/sinfo/common/AbstractSInfoCalculationResults.java Thu Jun 14 16:56:31 2018 +0200 @@ -12,14 +12,14 @@ import org.apache.commons.lang.math.DoubleRange; -import org.dive4elements.river.artifacts.common.AbstractCalculationResults; +import org.dive4elements.river.artifacts.common.AbstractCalculationListResults; import org.dive4elements.river.artifacts.sinfo.util.RiverInfo; /** * @author Gernot Belger */ -public abstract class AbstractSInfoCalculationResults extends AbstractCalculationResults { +public abstract class AbstractSInfoCalculationResults extends AbstractCalculationListResults { private static final long serialVersionUID = 1L; diff -r 5be112fba832 -r 23945061daec artifacts/src/main/java/org/dive4elements/river/artifacts/sinfo/common/AbstractSInfoExporter.java --- a/artifacts/src/main/java/org/dive4elements/river/artifacts/sinfo/common/AbstractSInfoExporter.java Thu Jun 14 15:12:25 2018 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,180 +0,0 @@ -/** Copyright (C) 2017 by Bundesanstalt für Gewässerkunde - * 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) - * and comes with ABSOLUTELY NO WARRANTY! Check out the - * documentation coming with Dive4Elements River for details. - */ -package org.dive4elements.river.artifacts.sinfo.common; - -import java.text.DateFormat; -import java.text.NumberFormat; -import java.util.Date; -import java.util.Locale; - -import org.apache.commons.lang.math.DoubleRange; -import org.dive4elements.river.FLYS; -import org.dive4elements.river.artifacts.common.AbstractCommonExporter; -import org.dive4elements.river.artifacts.common.GeneralResultType; -import org.dive4elements.river.artifacts.common.I18NStrings; -import org.dive4elements.river.artifacts.common.MetaAndTableJRDataSource; -import org.dive4elements.river.artifacts.resources.Resources; -import org.dive4elements.river.artifacts.sinfo.util.BedHeightInfo; -import org.dive4elements.river.artifacts.sinfo.util.RiverInfo; -import org.dive4elements.river.artifacts.sinfo.util.WstInfo; - -import au.com.bytecode.opencsv.CSVWriter; - -/** - * @author Gernot Belger - */ -public abstract class AbstractSInfoExporter> extends AbstractCommonExporter { - - private static final String CSV_META_HEADER_SOUNDING = "sinfo.export.flow_depth.csv.meta.header.sounding"; - - private static final String CSV_META_HEADER_SOUNDING_YEAR = "sinfo.export.flow_depth.csv.meta.header.sounding.year"; - - 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_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"; - - private static final String CSV_META_HEADER_SOUNDING_ELEVATIOIN_MODEL_ORIGINAL = "sinfo.export.flow_depth.csv.meta.header.sounding.elevationmodel.original"; - - protected final void writeCSVSoundingMetadata(final CSVWriter writer, final BedHeightInfo sounding) { - writeCSVSoundingMetadata(writer, sounding, CSV_META_HEADER_SOUNDING); - } - - protected final void writeCSVSoundingMetadata(final CSVWriter writer, final BedHeightInfo sounding, final String mainLabel) { - // "##METADATEN PEILUNG" - writeCSVMetaEntry(writer, mainLabel); - - // "# Jahr der Peilung: " - writeCSVMetaEntry(writer, CSV_META_HEADER_SOUNDING_YEAR, Integer.toString(sounding.getYear())); - // "# Aufnahmeart: " - writeCSVMetaEntry(writer, CSV_META_HEADER_SOUNDING_TYPE, sounding.getType()); - // "# Auswerter: " - writeCSVMetaEntry(writer, SInfoI18NStrings.CSV_META_HEADER_EVALUATOR, sounding.getEvaluationBy()); - // "# Lagesystem: " - writeCSVMetaEntry(writer, CSV_META_HEADER_SOUNDING_PRJ, sounding.getLocationSystem()); - // "# Höhensystem: " - writeCSVMetaEntry(writer, CSV_META_HEADER_SOUNDING_ELEVATIOIN_MODEL, sounding.getCurElevationModelUnit()); - // "# ursprüngliches Höhensystem: " - writeCSVMetaEntry(writer, CSV_META_HEADER_SOUNDING_ELEVATIOIN_MODEL_ORIGINAL, sounding.getOldElevationModelUnit()); - } - - protected final void writeCSVWaterlevelMetadata(final CSVWriter writer, final WstInfo wst) { - writeCSVWaterlevelMetadata(writer, wst, SInfoI18NStrings.CSV_META_HEADER_WATERLEVEL); - } - - protected final void writeCSVWaterlevelMetadata(final CSVWriter writer, final WstInfo wst, final String mainLabel) { - // "##METADATEN WASSERSPIEGELLAGE" - writeCSVMetaEntry(writer, mainLabel); - - // "# Bezeichnung der Wasserspiegellage: " - writeCSVMetaEntry(writer, SInfoI18NStrings.CSV_META_HEADER_WATERLEVEL_NAME, wst.getLabel()); - - // "# Bezugspegel: " - writeCSVMetaEntry(writer, SInfoI18NStrings.CSV_META_HEADER_WATERLEVEL_GAUGE, wst.getGauge()); - - // "# Jahr/Zeitraum der Wasserspiegellage: " - final int year = wst.getYear(); - if (year > 0) - writeCSVMetaEntry(writer, SInfoI18NStrings.CSV_META_HEADER_WATERLEVEL_YEAR, Integer.toString(year)); - } - - @Override - protected void writeCSVGlobalMetadataDefaults(final CSVWriter writer, final RESULTS results) { - - final String calcModeLabel = results.getCalcModeLabel(); - final RiverInfo river = results.getRiver(); - final DoubleRange calcRange = results.getCalcRange(); - - writeCSVMetaEntry(writer, I18NStrings.CSV_META_HEADER_RESULT, msg(I18NStrings.CSV_META_HEADER_RESULT_LABEL), river.getName(), calcModeLabel); - - // "# FLYS-Version: " - writeCSVMetaEntry(writer, I18NStrings.CSV_META_VERSION, msg(I18NStrings.CSV_META_VERSION_LABEL), FLYS.VERSION); - - // "# Bearbeiter: " - writeCSVMetaEntry(writer, I18NStrings.CSV_META_USER, msg(I18NStrings.CSV_META_USER_LABEL), results.getUser()); - - // "# Datum der Erstellung: " - final Locale locale = Resources.getLocale(this.context.getMeta()); - final DateFormat df = DateFormat.getDateInstance(DateFormat.SHORT, locale); - writeCSVMetaEntry(writer, I18NStrings.CSV_META_CREATION, msg(I18NStrings.CSV_META_CREATION_LABEL), df.format(new Date())); - - // "# Gewässer: " - writeCSVMetaEntry(writer, I18NStrings.CSV_META_RIVER, msg(I18NStrings.CSV_META_RIVER_LABEL), river.getName()); - - // "# Höhensystem des Flusses: " - writeCSVMetaEntry(writer, I18NStrings.CSV_META_HEIGHT_UNIT_RIVER, river.getWstUnit()); - - if (calcRange != null) { - // "# Ort/Bereich (km): " - writeCSVMetaEntry(writer, I18NStrings.CSV_META_RANGE, msg(I18NStrings.CSV_META_RANGE_LABEL), getKmFormatter().format(calcRange.getMinimumDouble()), - getKmFormatter().format(calcRange.getMaximumDouble())); - } - } - - @Override - protected void addJRMetaData(final MetaAndTableJRDataSource source, final RESULTS results) { - - /* general metadata */ - this.addJRMetaDataDefaults(source, results); - - final RiverInfo river = results.getRiver(); - final String wstUnitName = river.getWstUnit(); - - source.addMetaData("river_label", msg(I18NStrings.CSV_META_RIVER_LABEL)); - source.addMetaData("river", river.getName()); - source.addMetaData("river_unit", wstUnitName); - - final DoubleRange calcRange = results.getCalcRange(); - final NumberFormat kmFormatter = getKmFormatter(); - final String rangeValue = String.format("%s - %s", kmFormatter.format(calcRange.getMinimumDouble()), kmFormatter.format(calcRange.getMaximumDouble())); - source.addMetaData("range_label", msg(I18NStrings.CSV_META_RANGE_LABEL)); - source.addMetaData("range", rangeValue); - - /* column headings */ - // source.addMetaData("station_header", GeneralResultType.station.getPdfHeader(this.context.getMeta())); // moved to - // super - - // TODO: move to subs - /* column headings */ - source.addMetaData("flowdepth_header", SInfoResultType.flowdepth.getPdfHeader(this.context.getMeta())); - source.addMetaData("flowdepth_tkh_header", SInfoResultType.flowdepthtkh.getPdfHeader(this.context.getMeta())); - source.addMetaData("tkh_header", SInfoResultType.tkh.getPdfHeader(this.context.getMeta())); - source.addMetaData("waterlevel_header", SInfoResultType.waterlevel.getPdfHeader(this.context.getMeta())); - source.addMetaData("discharge_header", SInfoResultType.discharge.getPdfHeader(this.context.getMeta())); - source.addMetaData("waterlevel_name_header", SInfoResultType.waterlevelLabel.getPdfHeader(this.context.getMeta())); - source.addMetaData("gauge_header", SInfoResultType.gaugeLabel.getPdfHeader(this.context.getMeta())); - source.addMetaData("bedheight_header", SInfoResultType.meanBedHeight.getPdfHeader(this.context.getMeta())); - source.addMetaData("sounding_name_header", SInfoResultType.soundingLabel.getPdfHeader(this.context.getMeta())); - source.addMetaData("location_header", SInfoResultType.location.getPdfHeader(this.context.getMeta())); - } - - @Override - protected void addJRMetaDataDefaults(final MetaAndTableJRDataSource source, final RESULTS results) { - - source.addMetaData("header", msg(I18NStrings.CSV_META_HEADER_RESULT_LABEL)); - source.addMetaData("calcMode", results.getCalcModeLabel()); - - source.addMetaData("version_label", msg(I18NStrings.CSV_META_VERSION_LABEL)); - source.addMetaData("version", FLYS.VERSION); - - source.addMetaData("user_label", msg(I18NStrings.CSV_META_USER_LABEL)); - source.addMetaData("user", results.getUser()); - - final Locale locale = Resources.getLocale(this.context.getMeta()); - final DateFormat df = DateFormat.getDateInstance(DateFormat.SHORT, locale); - source.addMetaData("date_label", msg(I18NStrings.CSV_META_CREATION_LABEL)); - source.addMetaData("date", df.format(new Date())); - - /* column headings */ - source.addMetaData("station_header", GeneralResultType.station.getPdfHeader(this.context.getMeta())); - } - -} \ No newline at end of file diff -r 5be112fba832 -r 23945061daec artifacts/src/main/java/org/dive4elements/river/artifacts/sinfo/common/AbstractSInfoLineProcessor.java --- a/artifacts/src/main/java/org/dive4elements/river/artifacts/sinfo/common/AbstractSInfoLineProcessor.java Thu Jun 14 15:12:25 2018 +0200 +++ b/artifacts/src/main/java/org/dive4elements/river/artifacts/sinfo/common/AbstractSInfoLineProcessor.java Thu Jun 14 16:56:31 2018 +0200 @@ -19,6 +19,7 @@ import org.dive4elements.artifacts.CallContext; import org.dive4elements.river.artifacts.D4EArtifact; import org.dive4elements.river.artifacts.access.RiverAccess; +import org.dive4elements.river.artifacts.common.AbstractCalculationResult; import org.dive4elements.river.artifacts.context.RiverContext; import org.dive4elements.river.artifacts.math.MovingAverage; import org.dive4elements.river.artifacts.model.ZoomScale; @@ -29,7 +30,7 @@ import org.dive4elements.river.jfree.StyledXYSeries; import org.dive4elements.river.themes.ThemeDocument; -abstract class AbstractSInfoLineProcessor extends AbstractSInfoProcessor { +abstract class AbstractSInfoLineProcessor extends AbstractSInfoProcessor { private static final double GAP_DISTANCE = 0.101; @@ -101,7 +102,7 @@ return MovingAverage.weighted(points, radius); } - protected static final Facet createFacet(final CallContext context, final String hash, final String id, final AbstractSInfoCalculationResult result, + protected static final Facet createFacet(final CallContext context, final String hash, final String id, final AbstractCalculationResult result, final int index, final String axisLabel, final String facetId, final String description) { final String facetFlowDepthFilteredDescription = Resources.getMsg(context.getMeta(), description, description, result.getLabel()); return new SInfoResultFacet(index, facetId, facetFlowDepthFilteredDescription, axisLabel, ComputeType.ADVANCE, id, hash); diff -r 5be112fba832 -r 23945061daec artifacts/src/main/java/org/dive4elements/river/artifacts/sinfo/common/D50Processor.java --- a/artifacts/src/main/java/org/dive4elements/river/artifacts/sinfo/common/D50Processor.java Thu Jun 14 15:12:25 2018 +0200 +++ b/artifacts/src/main/java/org/dive4elements/river/artifacts/sinfo/common/D50Processor.java Thu Jun 14 16:56:31 2018 +0200 @@ -15,6 +15,7 @@ import org.dive4elements.artifactdatabase.state.Facet; import org.dive4elements.artifacts.CallContext; +import org.dive4elements.river.artifacts.common.AbstractCalculationResult; public final class D50Processor extends AbstractSInfoLineProcessor { @@ -46,8 +47,7 @@ throw new UnsupportedOperationException(error); } - public static Facet createD50Facet(final CallContext context, final String hash, final String id, final AbstractSInfoCalculationResult result, - final int index) { + public static Facet createD50Facet(final CallContext context, final String hash, final String id, final AbstractCalculationResult result, final int index) { return AbstractSInfoLineProcessor.createFacet(context, hash, id, result, index, SINFO_CHART_D50_YAXIS_LABEL, FACET_TKH_D50_FILTERED, I18N_FACET_TKH_D50_FILTERED_DESCRIPTION); } diff -r 5be112fba832 -r 23945061daec artifacts/src/main/java/org/dive4elements/river/artifacts/sinfo/common/FlowDepthDevelopmentPerYearProcessor.java --- a/artifacts/src/main/java/org/dive4elements/river/artifacts/sinfo/common/FlowDepthDevelopmentPerYearProcessor.java Thu Jun 14 15:12:25 2018 +0200 +++ b/artifacts/src/main/java/org/dive4elements/river/artifacts/sinfo/common/FlowDepthDevelopmentPerYearProcessor.java Thu Jun 14 16:56:31 2018 +0200 @@ -15,8 +15,9 @@ import org.dive4elements.artifactdatabase.state.Facet; import org.dive4elements.artifacts.CallContext; +import org.dive4elements.river.artifacts.common.AbstractCalculationResult; -public final class FlowDepthDevelopmentPerYearProcessor extends AbstractSInfoLineProcessor { +public final class FlowDepthDevelopmentPerYearProcessor extends AbstractSInfoLineProcessor { private static final String I18N_AXIS_LABEL = "sinfo.chart.flow_depth_development_per_year.section.yaxis.label"; @@ -47,7 +48,7 @@ } @Override - protected double[][] doGetPoints(final AbstractSInfoCalculationResult data, final String facetName) { + protected double[][] doGetPoints(final AbstractCalculationResult data, final String facetName) { if (FACET_FLOW_DEPTH_DEVELOPMENT_PER_YEAR_FILTERED.contentEquals(facetName)) return data.getStationPoints(SInfoResultType.flowdepthDevelopmentPerYear); @@ -59,13 +60,13 @@ } public static Facet createFlowDepthDevelopmentFilteredFacet(final CallContext context, final String hash, final String id, - final AbstractSInfoCalculationResult result, final int index) { + final AbstractCalculationResult result, final int index) { return AbstractSInfoLineProcessor.createFacet(context, hash, id, result, index, SINFO_CHART_FLOW_DEPTH_DEVELOPMENT_PER_YEAR_YAXIS_LABEL, FACET_FLOW_DEPTH_DEVELOPMENT_PER_YEAR_FILTERED, FACET_FLOW_DEPTH_DEVELOPMENT_PER_YEAR_FILTERED_DESCRIPTION); } public static Facet createFlowDepthDevelopmentRawFacet(final CallContext context, final String hash, final String id, - final AbstractSInfoCalculationResult result, final int index) { + final AbstractCalculationResult result, final int index) { return AbstractSInfoLineProcessor.createFacet(context, hash, id, result, index, SINFO_CHART_FLOW_DEPTH_DEVELOPMENT_PER_YEAR_YAXIS_LABEL, FACET_FLOW_DEPTH_DEVELOPMENT_PER_YEAR_RAW, FACET_FLOW_DEPTH_DEVELOPMENT_PER_YEAR_RAW_DESCRIPTION); } diff -r 5be112fba832 -r 23945061daec artifacts/src/main/java/org/dive4elements/river/artifacts/sinfo/common/FlowDepthDevelopmentProcessor.java --- a/artifacts/src/main/java/org/dive4elements/river/artifacts/sinfo/common/FlowDepthDevelopmentProcessor.java Thu Jun 14 15:12:25 2018 +0200 +++ b/artifacts/src/main/java/org/dive4elements/river/artifacts/sinfo/common/FlowDepthDevelopmentProcessor.java Thu Jun 14 16:56:31 2018 +0200 @@ -15,10 +15,11 @@ import org.dive4elements.artifactdatabase.state.Facet; import org.dive4elements.artifacts.CallContext; +import org.dive4elements.river.artifacts.common.AbstractCalculationResult; import org.dive4elements.river.artifacts.resources.Resources; import org.dive4elements.river.artifacts.states.DefaultState.ComputeType; -public final class FlowDepthDevelopmentProcessor extends AbstractSInfoLineProcessor { +public final class FlowDepthDevelopmentProcessor extends AbstractSInfoLineProcessor { private static final String I18N_AXIS_LABEL = "sinfo.chart.flow_depth_development.section.yaxis.label"; @@ -57,7 +58,7 @@ } @Override - protected double[][] doGetPoints(final AbstractSInfoCalculationResult data, final String facetName) { + protected double[][] doGetPoints(final AbstractCalculationResult data, final String facetName) { if (FACET_FLOW_DEPTH_DEVELOPMENT_FILTERED.contentEquals(facetName)) return data.getStationPoints(SInfoResultType.flowdepthDevelopment); @@ -75,27 +76,27 @@ } public static Facet createFlowDepthDevelopmentFilteredFacet(final CallContext context, final String hash, final String id, - final AbstractSInfoCalculationResult result, final int index) { + final AbstractCalculationResult result, final int index) { return AbstractSInfoLineProcessor.createFacet(context, hash, id, result, index, SINFO_CHART_FLOW_DEPTH_DEVELOPMENT_YAXIS_LABEL, FACET_FLOW_DEPTH_DEVELOPMENT_FILTERED, FACET_FLOW_DEPTH_DEVELOPMENT_FILTERED_DESCRIPTION); } public static Facet createFlowDepthDevelopmentRawFacet(final CallContext context, final String hash, final String id, - final AbstractSInfoCalculationResult result, final int index) { + final AbstractCalculationResult result, final int index) { return AbstractSInfoLineProcessor.createFacet(context, hash, id, result, index, SINFO_CHART_FLOW_DEPTH_DEVELOPMENT_YAXIS_LABEL, FACET_FLOW_DEPTH_DEVELOPMENT_RAW, FACET_FLOW_DEPTH_DEVELOPMENT_RAW_DESCRIPTION); } - public static Facet createWaterlevelDifferenceFacet(final CallContext context, final String hash, final String id, - final AbstractSInfoCalculationResult result, final int index) { + public static Facet createWaterlevelDifferenceFacet(final CallContext context, final String hash, final String id, final AbstractCalculationResult result, + final int index) { final String facetFlowDepthTkhFilteredDescription = Resources.getMsg(context.getMeta(), FACET_WATERLEVEL_DIFFERENCE_FILTERED_DESCRIPTION, FACET_WATERLEVEL_DIFFERENCE_FILTERED_DESCRIPTION, result.getLabel()); return new SInfoResultFacet(index, FACET_WATERLEVEL_DIFFERENCE_FILTERED, facetFlowDepthTkhFilteredDescription, SINFO_CHART_FLOW_DEPTH_DEVELOPMENT_YAXIS_LABEL, ComputeType.ADVANCE, id, hash); } - public static Facet createBedHeightDifferenceFacet(final CallContext context, final String hash, final String id, - final AbstractSInfoCalculationResult result, final int index) { + public static Facet createBedHeightDifferenceFacet(final CallContext context, final String hash, final String id, final AbstractCalculationResult result, + final int index) { final String facetFlowDepthFilteredDescription = Resources.getMsg(context.getMeta(), FACET_BEDHEIGHT_DIFFERENCE_FILTERED_DESCRIPTION, FACET_BEDHEIGHT_DIFFERENCE_FILTERED_DESCRIPTION, result.getLabel()); diff -r 5be112fba832 -r 23945061daec artifacts/src/main/java/org/dive4elements/river/artifacts/sinfo/common/FlowDepthProcessor.java --- a/artifacts/src/main/java/org/dive4elements/river/artifacts/sinfo/common/FlowDepthProcessor.java Thu Jun 14 15:12:25 2018 +0200 +++ b/artifacts/src/main/java/org/dive4elements/river/artifacts/sinfo/common/FlowDepthProcessor.java Thu Jun 14 16:56:31 2018 +0200 @@ -15,8 +15,9 @@ import org.dive4elements.artifactdatabase.state.Facet; import org.dive4elements.artifacts.CallContext; +import org.dive4elements.river.artifacts.common.AbstractCalculationResult; -public final class FlowDepthProcessor extends AbstractSInfoLineProcessor { +public final class FlowDepthProcessor extends AbstractSInfoLineProcessor { private static final String AXIS_LABEL = "sinfo.chart.flow_depth.section.yaxis.label"; @@ -102,7 +103,7 @@ } @Override - protected double[][] doGetPoints(final AbstractSInfoCalculationResult data, final String facetName) { + protected double[][] doGetPoints(final AbstractCalculationResult data, final String facetName) { if (FACET_FLOW_DEPTH_FILTERED.contentEquals(facetName)) return data.getStationPoints(SInfoResultType.flowdepth); @@ -138,74 +139,74 @@ throw new UnsupportedOperationException(error); } - public static Facet createFlowDepthFilteredFacet(final CallContext context, final String hash, final String id, final AbstractSInfoCalculationResult result, + public static Facet createFlowDepthFilteredFacet(final CallContext context, final String hash, final String id, final AbstractCalculationResult result, final int index) { return AbstractSInfoLineProcessor.createFacet(context, hash, id, result, index, SINFO_CHART_FLOW_DEPTH_YAXIS_LABEL, FACET_FLOW_DEPTH_FILTERED, FACET_FLOW_DEPTH_FILTERED_DESCRIPTION); } - public static Facet createFlowDepthRawFacet(final CallContext context, final String hash, final String id, final AbstractSInfoCalculationResult result, + public static Facet createFlowDepthRawFacet(final CallContext context, final String hash, final String id, final AbstractCalculationResult result, final int index) { return AbstractSInfoLineProcessor.createFacet(context, hash, id, result, index, SINFO_CHART_FLOW_DEPTH_YAXIS_LABEL, FACET_FLOW_DEPTH_RAW, FACET_FLOW_DEPTH_RAW_DESCRIPTION); } - public static Facet createFlowDepthTkhFilteredFacet(final CallContext context, final String hash, final String id, - final AbstractSInfoCalculationResult result, final int index) { + public static Facet createFlowDepthTkhFilteredFacet(final CallContext context, final String hash, final String id, final AbstractCalculationResult result, + final int index) { return AbstractSInfoLineProcessor.createFacet(context, hash, id, result, index, SINFO_CHART_FLOW_DEPTH_YAXIS_LABEL, FACET_FLOW_DEPTH_TKH_FILTERED, FACET_FLOW_DEPTH_TKH_FILTERED_DESCRIPTION); } - public static Facet createFlowDepthTkhRawFacet(final CallContext context, final String hash, final String id, final AbstractSInfoCalculationResult result, + public static Facet createFlowDepthTkhRawFacet(final CallContext context, final String hash, final String id, final AbstractCalculationResult result, final int index) { return AbstractSInfoLineProcessor.createFacet(context, hash, id, result, index, SINFO_CHART_FLOW_DEPTH_YAXIS_LABEL, FACET_FLOW_DEPTH_TKH_RAW, FACET_FLOW_DEPTH_TKH_RAW_DESCRIPTION); } - public static Facet createFlowDepthMinFilteredFacet(final CallContext context, final String hash, final String id, - final AbstractSInfoCalculationResult result, final int index) { + public static Facet createFlowDepthMinFilteredFacet(final CallContext context, final String hash, final String id, final AbstractCalculationResult result, + final int index) { return AbstractSInfoLineProcessor.createFacet(context, hash, id, result, index, SINFO_CHART_FLOW_DEPTH_YAXIS_LABEL, FACET_FLOW_DEPTH_MIN_FILTERED, FACET_FLOW_DEPTH_MIN_FILTERED_DESCRIPTION); } - public static Facet createFlowDepthMinRawFacet(final CallContext context, final String hash, final String id, final AbstractSInfoCalculationResult result, + public static Facet createFlowDepthMinRawFacet(final CallContext context, final String hash, final String id, final AbstractCalculationResult result, final int index) { return AbstractSInfoLineProcessor.createFacet(context, hash, id, result, index, SINFO_CHART_FLOW_DEPTH_YAXIS_LABEL, FACET_FLOW_DEPTH_MIN_RAW, FACET_FLOW_DEPTH_MIN_RAW_DESCRIPTION); } - public static Facet createFlowDepthMaxFilteredFacet(final CallContext context, final String hash, final String id, - final AbstractSInfoCalculationResult result, final int index) { + public static Facet createFlowDepthMaxFilteredFacet(final CallContext context, final String hash, final String id, final AbstractCalculationResult result, + final int index) { return AbstractSInfoLineProcessor.createFacet(context, hash, id, result, index, SINFO_CHART_FLOW_DEPTH_YAXIS_LABEL, FACET_FLOW_DEPTH_MAX_FILTERED, FACET_FLOW_DEPTH_MAX_FILTERED_DESCRIPTION); } - public static Facet createFlowDepthMaxRawFacet(final CallContext context, final String hash, final String id, final AbstractSInfoCalculationResult result, + public static Facet createFlowDepthMaxRawFacet(final CallContext context, final String hash, final String id, final AbstractCalculationResult result, final int index) { return AbstractSInfoLineProcessor.createFacet(context, hash, id, result, index, SINFO_CHART_FLOW_DEPTH_YAXIS_LABEL, FACET_FLOW_DEPTH_MAX_RAW, FACET_FLOW_DEPTH_MAX_RAW_DESCRIPTION); } public static Facet createFlowDepthCurrentFilteredFacet(final CallContext context, final String hash, final String id, - final AbstractSInfoCalculationResult result, final int index) { + final AbstractCalculationResult result, final int index) { return AbstractSInfoLineProcessor.createFacet(context, hash, id, result, index, SINFO_CHART_FLOW_DEPTH_YAXIS_LABEL, FACET_FLOW_DEPTH_CURRENT_FILTERED, FACET_FLOW_DEPTH_CURRENT_FILTERED_DESCRIPTION); } - public static Facet createFlowDepthCurrentRawFacet(final CallContext context, final String hash, final String id, - final AbstractSInfoCalculationResult result, final int index) { + public static Facet createFlowDepthCurrentRawFacet(final CallContext context, final String hash, final String id, final AbstractCalculationResult result, + final int index) { return AbstractSInfoLineProcessor.createFacet(context, hash, id, result, index, SINFO_CHART_FLOW_DEPTH_YAXIS_LABEL, FACET_FLOW_DEPTH_CURRENT_RAW, FACET_FLOW_DEPTH_CURRENT_RAW_DESCRIPTION); } public static Facet createFlowDepthHistoricalFilteredFacet(final CallContext context, final String hash, final String id, - final AbstractSInfoCalculationResult result, final int index) { + final AbstractCalculationResult result, final int index) { return AbstractSInfoLineProcessor.createFacet(context, hash, id, result, index, SINFO_CHART_FLOW_DEPTH_YAXIS_LABEL, FACET_FLOW_DEPTH_HISTORICAL_FILTERED, FACET_FLOW_DEPTH_HISTORICAL_FILTERED_DESCRIPTION); } - public static Facet createFlowDepthHistoricalRawFacet(final CallContext context, final String hash, final String id, - final AbstractSInfoCalculationResult result, final int index) { + public static Facet createFlowDepthHistoricalRawFacet(final CallContext context, final String hash, final String id, final AbstractCalculationResult result, + final int index) { return AbstractSInfoLineProcessor.createFacet(context, hash, id, result, index, SINFO_CHART_FLOW_DEPTH_YAXIS_LABEL, FACET_FLOW_DEPTH_HISTORICAL_RAW, FACET_FLOW_DEPTH_HISTORICAL_RAW_DESCRIPTION); } diff -r 5be112fba832 -r 23945061daec artifacts/src/main/java/org/dive4elements/river/artifacts/sinfo/common/SInfoI18NStrings.java --- a/artifacts/src/main/java/org/dive4elements/river/artifacts/sinfo/common/SInfoI18NStrings.java Thu Jun 14 15:12:25 2018 +0200 +++ b/artifacts/src/main/java/org/dive4elements/river/artifacts/sinfo/common/SInfoI18NStrings.java Thu Jun 14 16:56:31 2018 +0200 @@ -14,15 +14,13 @@ * * @author Gernot Belger */ -interface SInfoI18NStrings { - +public interface SInfoI18NStrings { + // TODO: MAKE interface package-visible again:-) // TODO: Strings werden nur einmal verwenden; direkte Verwendung auch denkbar. Liste ist nicht vollständig String CSV_META_HEADER_WATERLEVEL_GAUGE = "sinfo.export.flow_depth.csv.meta.header.waterlevel.gauge"; String CSV_META_HEADER_WATERLEVEL_YEAR = "sinfo.export.flow_depth.csv.meta.header.waterlevel.year"; - String CSV_META_HEADER_EVALUATOR = "sinfo.export.flow_depth.csv.meta.header.sounding.evaluator"; - String CSV_MEAN_BED_HEIGHT_HEADER = "sinfo.export.flow_depth.csv.header.mean_bed_height"; String CSV_MEAN_BED_HEIGHT_HEADER_SHORT = "sinfo.export.flow_depth.csv.header.mean_bed_height.short"; diff -r 5be112fba832 -r 23945061daec artifacts/src/main/java/org/dive4elements/river/artifacts/sinfo/common/TauProcessor.java --- a/artifacts/src/main/java/org/dive4elements/river/artifacts/sinfo/common/TauProcessor.java Thu Jun 14 15:12:25 2018 +0200 +++ b/artifacts/src/main/java/org/dive4elements/river/artifacts/sinfo/common/TauProcessor.java Thu Jun 14 16:56:31 2018 +0200 @@ -15,6 +15,7 @@ import org.dive4elements.artifactdatabase.state.Facet; import org.dive4elements.artifacts.CallContext; +import org.dive4elements.river.artifacts.common.AbstractCalculationResult; public final class TauProcessor extends AbstractSInfoLineProcessor { @@ -46,8 +47,7 @@ throw new UnsupportedOperationException(error); } - public static Facet createTauFacet(final CallContext context, final String hash, final String id, final AbstractSInfoCalculationResult result, - final int index) { + public static Facet createTauFacet(final CallContext context, final String hash, final String id, final AbstractCalculationResult result, final int index) { return AbstractSInfoLineProcessor.createFacet(context, hash, id, result, index, SINFO_CHART_TAU_YAXIS_LABEL, FACET_TKH_TAU_FILTERED, I18N_FACET_TKH_TAU_FILTERED_DESCRIPTION); } diff -r 5be112fba832 -r 23945061daec artifacts/src/main/java/org/dive4elements/river/artifacts/sinfo/common/TkhProcessor.java --- a/artifacts/src/main/java/org/dive4elements/river/artifacts/sinfo/common/TkhProcessor.java Thu Jun 14 15:12:25 2018 +0200 +++ b/artifacts/src/main/java/org/dive4elements/river/artifacts/sinfo/common/TkhProcessor.java Thu Jun 14 16:56:31 2018 +0200 @@ -16,6 +16,7 @@ import org.dive4elements.artifactdatabase.state.ArtifactAndFacet; import org.dive4elements.artifactdatabase.state.Facet; import org.dive4elements.artifacts.CallContext; +import org.dive4elements.river.artifacts.common.AbstractCalculationResult; import org.dive4elements.river.artifacts.resources.Resources; import org.dive4elements.river.artifacts.states.DefaultState.ComputeType; import org.dive4elements.river.exports.DiagramGenerator; @@ -75,8 +76,7 @@ return null; } - public static Facet createTkhFacet(final CallContext context, final String hash, final String id, final AbstractSInfoCalculationResult result, - final int index) { + public static Facet createTkhFacet(final CallContext context, final String hash, final String id, final AbstractCalculationResult result, final int index) { final String facetTkhDescription = Resources.getMsg(context.getMeta(), I18N_FACET_TKH_DESCRIPTION, I18N_FACET_TKH_DESCRIPTION, result.getLabel()); return new SInfoResultFacet(index, TkhProcessor.FACET_TKH, facetTkhDescription, TkhProcessor.SINFO_CHART_TKX_YAXIS_LABEL, ComputeType.ADVANCE, id, diff -r 5be112fba832 -r 23945061daec artifacts/src/main/java/org/dive4elements/river/artifacts/sinfo/common/VelocityProcessor.java --- a/artifacts/src/main/java/org/dive4elements/river/artifacts/sinfo/common/VelocityProcessor.java Thu Jun 14 15:12:25 2018 +0200 +++ b/artifacts/src/main/java/org/dive4elements/river/artifacts/sinfo/common/VelocityProcessor.java Thu Jun 14 16:56:31 2018 +0200 @@ -15,6 +15,7 @@ import org.dive4elements.artifactdatabase.state.Facet; import org.dive4elements.artifacts.CallContext; +import org.dive4elements.river.artifacts.common.AbstractCalculationResult; public final class VelocityProcessor extends AbstractSInfoLineProcessor { @@ -46,7 +47,7 @@ throw new UnsupportedOperationException(error); } - public static Facet createVelocityFacet(final CallContext context, final String hash, final String id, final AbstractSInfoCalculationResult result, + public static Facet createVelocityFacet(final CallContext context, final String hash, final String id, final AbstractCalculationResult result, final int index) { return AbstractSInfoLineProcessor.createFacet(context, hash, id, result, index, SINFO_CHART_VELOCITY_YAXIS_LABEL, FACET_TKH_VELOCITY_FILTERED, I18N_FACET_TKH_VELOCITY_FILTERED_DESCRIPTION); diff -r 5be112fba832 -r 23945061daec artifacts/src/main/java/org/dive4elements/river/artifacts/sinfo/flood_duration/FloodDurationCalculation.java --- a/artifacts/src/main/java/org/dive4elements/river/artifacts/sinfo/flood_duration/FloodDurationCalculation.java Thu Jun 14 15:12:25 2018 +0200 +++ b/artifacts/src/main/java/org/dive4elements/river/artifacts/sinfo/flood_duration/FloodDurationCalculation.java Thu Jun 14 16:56:31 2018 +0200 @@ -18,7 +18,6 @@ import org.dive4elements.river.artifacts.sinfo.common.RiverInfoProvider; import org.dive4elements.river.artifacts.sinfo.tkhstate.WinfoArtifactWrapper; import org.dive4elements.river.artifacts.sinfo.util.CalculationUtils; -import org.dive4elements.river.artifacts.sinfo.util.RiverInfo; import org.dive4elements.river.artifacts.sinfo.util.WstInfo; import org.dive4elements.river.model.River; @@ -39,7 +38,6 @@ /* access input data */ final FloodDurationAccess access = new FloodDurationAccess(sinfo); final River river = access.getRiver(); - final RiverInfo riverInfo = new RiverInfo(river); final DoubleRange calcRange = access.getRange(); @@ -50,15 +48,13 @@ final String calcModeLabel = Resources.getMsg(this.context.getMeta(), sinfo.getCalculationMode().name()); + // TODO: use enum for riverside final String riverside = access.getRiverside(); - final FloodDurationCalculationResults results = new FloodDurationCalculationResults(calcModeLabel, user, riverInfo, calcRange, riverside); // TODO: add - // more + // more // TODO: mis- ups.. re-use WINFO Artifact as in TkhState final WinfoArtifactWrapper winfo = new WinfoArtifactWrapper(sinfo); // winfo.computeWaterlevelData(); - final FloodDurationCalculationResult result = calculateResult(calcRange, infoProvider, problems); - - results.addResult(result, problems); + final FloodDurationCalculationResults results = calculateResult(calcModeLabel, riverside, calcRange, infoProvider, user, problems); return new CalculationResult(results, problems); } @@ -66,16 +62,20 @@ /** * Calculates FAKE Flood Duration * + * @param riverside + * @param calcModeLabel + * @param user + * * @param infoProvider */ - private FloodDurationCalculationResult calculateResult(final DoubleRange calcRange, final RiverInfoProvider riverInfoProvider, final Calculation problems) { + private FloodDurationCalculationResults calculateResult(final String calcModeLabel, final String riverside, final DoubleRange calcRange, + final RiverInfoProvider riverInfoProvider, final String user, final Calculation problems) { - final FloodDurationCalculator calculator = new FloodDurationCalculator(riverInfoProvider); + final FloodDurationCalculator calculator = new FloodDurationCalculator(this.context, riverInfoProvider); final String wspLabel = "WSP-Name";// wstKms.getName(); final int wspYear = 9999; // waterlevel.getYear(); final WstInfo wstInfo = new WstInfo(wspLabel, wspYear, riverInfoProvider.getReferenceGauge()); final String label = String.format("%s - %s", wspLabel, " soundingLabel"); - return calculator.execute(label, wstInfo, calcRange); + return calculator.execute(problems, label, wstInfo, calcModeLabel, calcRange, riverside, user); } - } \ No newline at end of file diff -r 5be112fba832 -r 23945061daec artifacts/src/main/java/org/dive4elements/river/artifacts/sinfo/flood_duration/FloodDurationCalculationResult.java --- a/artifacts/src/main/java/org/dive4elements/river/artifacts/sinfo/flood_duration/FloodDurationCalculationResult.java Thu Jun 14 15:12:25 2018 +0200 +++ b/artifacts/src/main/java/org/dive4elements/river/artifacts/sinfo/flood_duration/FloodDurationCalculationResult.java Thu Jun 14 16:56:31 2018 +0200 @@ -9,10 +9,19 @@ */ package org.dive4elements.river.artifacts.sinfo.flood_duration; +import java.text.NumberFormat; +import java.util.ArrayList; import java.util.Collection; +import java.util.List; +import org.dive4elements.river.artifacts.common.AbstractCalculationExportableResult; +import org.dive4elements.river.artifacts.common.AbstractCalculationResults; +import org.dive4elements.river.artifacts.common.ExportContextCSV; +import org.dive4elements.river.artifacts.common.GeneralResultType; +import org.dive4elements.river.artifacts.common.MetaAndTableJRDataSource; import org.dive4elements.river.artifacts.common.ResultRow; -import org.dive4elements.river.artifacts.sinfo.common.AbstractSInfoCalculationResult; +import org.dive4elements.river.artifacts.sinfo.common.SInfoResultType; +import org.dive4elements.river.artifacts.sinfo.util.RiverInfo; import org.dive4elements.river.artifacts.sinfo.util.WstInfo; /** @@ -20,19 +29,170 @@ * * @author Gernot Belger */ -final class FloodDurationCalculationResult extends AbstractSInfoCalculationResult { +final class FloodDurationCalculationResult extends AbstractCalculationExportableResult { private static final long serialVersionUID = 1L; - private final int waterlevelCount; + private final int waterlevelCount; // TODO: ggf 2 verschiedene Result-Klassen? + private final WstInfo wstInfo; + private final int maxWaterlevelPdf = 3; + + private enum ExportMode { + pdf, csv + } public FloodDurationCalculationResult(final String label, final WstInfo wstInfo, final Collection rows, final int waterlevelCount) { - super(label, wstInfo, rows); + super(label, rows); this.waterlevelCount = waterlevelCount; + this.wstInfo = wstInfo; + } + + @Override + public void writeCSVHeader(final ExportContextCSV exportContextCSV, final AbstractCalculationResults results, final RiverInfo river) { + + final Collection header = new ArrayList<>(99); + + header.add(exportContextCSV.formatCsvHeader(GeneralResultType.station)); + header.add(exportContextCSV.formatCsvHeader(SInfoResultType.riverside)); + header.add(exportContextCSV.formatCsvHeader(SInfoResultType.inundationduration)); + header.add(exportContextCSV.formatCsvHeader(SInfoResultType.inundationdurationq)); + header.add(exportContextCSV.formatCsvHeader(SInfoResultType.infrastructureHeight)); + header.add(exportContextCSV.formatCsvHeader(SInfoResultType.infrastructuretype)); + + // add dynamic headers + final int waterlevelCount = // results. + getWaterlevelCount(); + for (int i = 0; i < waterlevelCount; i++) { + final int naturalIndex = i + 1; + final String appendIndex = new StringBuilder().append("_").append(naturalIndex).toString(); + final Object[] args = new Object[] { appendIndex }; + // new StringBuilder().append('\u2081').toString(); // schlechter UTF-8-Support für subscript ints + header.add(exportContextCSV.msg(DurationWaterlevel.getHeaderW(), new Object[] { appendIndex, "results.getRiver().getWstUnit()" })); + header.add(exportContextCSV.msg(DurationWaterlevel.getHeaderFloodDurPerYear(), args)); + header.add(exportContextCSV.msg(DurationWaterlevel.getHeaderQ(), args)); + header.add(exportContextCSV.msg(DurationWaterlevel.getHeaderBezeichn(), args)); + } + + header.add(exportContextCSV.formatCsvHeader(SInfoResultType.gaugeLabel)); + header.add(exportContextCSV.formatCsvHeader(SInfoResultType.location)); + + exportContextCSV.writeCSVLine(header.toArray(new String[header.size()])); + } + + @Override + protected void writeCSVResultMetadata(final ExportContextCSV exportContextCSV, final AbstractCalculationResults results) { + + exportContextCSV.writeCSVWaterlevelMetadata(this.wstInfo); // TODO: Abweichend vom Allgemeinen werden hier andere Felder benötigt bei den + // Wasserspiegellagen + exportContextCSV.writeBlankLine(); + // writer.writeNext(new String[] { "" }); // break line } - public int getWaterlevelCount() { + @Override + protected String[] formatCSVRow(final ExportContextCSV exportContextCSV, final AbstractCalculationResults results, final ResultRow row) { + // TODO Auto-generated method stub + return formatRow(exportContextCSV, results, row, ExportMode.csv); + } + + @Override + protected String[] formatPDFRow(final ExportContextCSV exportContextCSV, final AbstractCalculationResults results, final ResultRow row) { + + return formatRow(exportContextCSV, results, row, ExportMode.pdf); + } + + @Override + protected String getJasperFile() { + if (this.waterlevelCount <= 1) + return "/jasper/templates/sinfo.floodduration.jrxml"; // TODO 2 different result-classes? + else + return "/jasper/templates/sinfo.floodduration2.jrxml"; + } + + @Override + protected void addJRTableHeader(final ExportContextCSV exportContextCSV, final MetaAndTableJRDataSource source, final AbstractCalculationResults results) { + /* column headings */ + exportContextCSV.addJRMetadata(source, "station_header", GeneralResultType.station); + exportContextCSV.addJRMetadata(source, "riverside_header", SInfoResultType.riverside); + exportContextCSV.addJRMetadata(source, "inundationduration_header", SInfoResultType.inundationduration); + exportContextCSV.addJRMetadata(source, "inundationduration_q_header", SInfoResultType.inundationdurationq); + exportContextCSV.addJRMetadata(source, "infrastructure_height_header", SInfoResultType.infrastructureHeightFloodDur); + exportContextCSV.addJRMetadata(source, "infrastructure_type_header", SInfoResultType.infrastructuretype); + + // add dynamic headers + + if (this.waterlevelCount == 0 || this.waterlevelCount == 2) { + source.addMetaData("dummy", "dummy"); + source.addMetaData("dummy", "dummy"); + source.addMetaData("dummy", "dummy"); + source.addMetaData("dummy", "dummy"); + } + + for (int i = 0; i < this.waterlevelCount; i++) { + final int naturalIndex = i + 1; + + final Object[] args = new String[] { new StringBuilder().append("_").append(naturalIndex).toString() }; + exportContextCSV.addJRMetadata(source, getPdfHeader("w", naturalIndex), exportContextCSV.msg(DurationWaterlevel.getHeaderW(), args)); + exportContextCSV.addJRMetadata(source, getPdfHeader("duration", naturalIndex), + exportContextCSV.msg(DurationWaterlevel.getHeaderFloodDurPerYear(), args)); + exportContextCSV.addJRMetadata(source, getPdfHeader("q", naturalIndex), exportContextCSV.msg(DurationWaterlevel.getHeaderQ(), args)); + exportContextCSV.addJRMetadata(source, getPdfHeader("bezeichnung", naturalIndex), + exportContextCSV.msg(DurationWaterlevel.getHeaderBezeichn(), args)); + + } + + exportContextCSV.addJRMetadata(source, "gauge_header", SInfoResultType.gaugeLabel); + exportContextCSV.addJRMetadata(source, "location_header", SInfoResultType.location); + + } + + public int getWaterlevelCount() { // der exporter muss daran, um spalten auszublenden return this.waterlevelCount; } + private String[] formatRow(final ExportContextCSV exportContextCSV, final AbstractCalculationResults results, final ResultRow row, final ExportMode mode) { + + final Collection lines = new ArrayList<>(99); + + lines.add(exportContextCSV.formatRowValue(row, GeneralResultType.station)); + lines.add(exportContextCSV.formatRowValue(row, SInfoResultType.riverside)); + lines.add(exportContextCSV.formatRowValue(row, SInfoResultType.inundationduration)); + lines.add(exportContextCSV.formatRowValue(row, SInfoResultType.inundationdurationq)); + lines.add(exportContextCSV.formatRowValue(row, SInfoResultType.infrastructureHeight)); + lines.add(exportContextCSV.formatRowValue(row, SInfoResultType.infrastructuretype)); + + final List waterlevelList = (List) row.getValue(SInfoResultType.customMultiRowColWaterlevel); + if (waterlevelList != null) { + final NumberFormat wFormatter = exportContextCSV.getFlowDepthFormatter(); + final NumberFormat qFormatter = exportContextCSV.getQFormatter(); + + for (int i = 0; i < waterlevelList.size(); i++) { + + if (i == this.maxWaterlevelPdf && mode == ExportMode.pdf) + break; + + final DurationWaterlevel item = waterlevelList.get(i); + lines.add(item.getWFormatted(wFormatter)); + lines.add(item.getFloodDurDaysPerYearFormatted()); + lines.add(item.getQFormatted(qFormatter)); + lines.add(item.getBezeichnung()); + } + } + + if ((this.waterlevelCount == 0 || this.waterlevelCount == 2) && mode == ExportMode.pdf) { + lines.add("dummy"); + lines.add("dummy"); + lines.add("dummy"); + lines.add("dummy"); + } + + lines.add(exportContextCSV.formatRowValue(row, SInfoResultType.gaugeLabel)); + lines.add(exportContextCSV.formatRowValue(row, SInfoResultType.location)); + return lines.toArray(new String[lines.size()]); + } + + private String getPdfHeader(final String rootStr, final int index) { + final String hd = "_header"; + final StringBuilder builder = new StringBuilder(); + return builder.append(rootStr).append("_").append(index).append(hd).toString(); + } } \ No newline at end of file diff -r 5be112fba832 -r 23945061daec artifacts/src/main/java/org/dive4elements/river/artifacts/sinfo/flood_duration/FloodDurationCalculationResults.java --- a/artifacts/src/main/java/org/dive4elements/river/artifacts/sinfo/flood_duration/FloodDurationCalculationResults.java Thu Jun 14 15:12:25 2018 +0200 +++ b/artifacts/src/main/java/org/dive4elements/river/artifacts/sinfo/flood_duration/FloodDurationCalculationResults.java Thu Jun 14 16:56:31 2018 +0200 @@ -10,13 +10,14 @@ package org.dive4elements.river.artifacts.sinfo.flood_duration; import org.apache.commons.lang.math.DoubleRange; -import org.dive4elements.river.artifacts.sinfo.common.AbstractSInfoCalculationResults; +import org.dive4elements.river.artifacts.common.AbstractCalculationExportableResult; +import org.dive4elements.river.artifacts.common.AbstractCalculationListResults; import org.dive4elements.river.artifacts.sinfo.util.RiverInfo; /** * @author Gernot Belger */ -final class FloodDurationCalculationResults extends AbstractSInfoCalculationResults { +final class FloodDurationCalculationResults extends AbstractCalculationListResults> { private static final long serialVersionUID = 1L; @@ -25,7 +26,7 @@ public FloodDurationCalculationResults(final String calcModeLabel, final String user, final RiverInfo river, final DoubleRange calcRange, final String riverside) { super(calcModeLabel, user, river, calcRange); - this.riverside = riverside; + this.riverside = riverside; // lieber in Result? } } \ No newline at end of file diff -r 5be112fba832 -r 23945061daec artifacts/src/main/java/org/dive4elements/river/artifacts/sinfo/flood_duration/FloodDurationCalculator.java --- a/artifacts/src/main/java/org/dive4elements/river/artifacts/sinfo/flood_duration/FloodDurationCalculator.java Thu Jun 14 15:12:25 2018 +0200 +++ b/artifacts/src/main/java/org/dive4elements/river/artifacts/sinfo/flood_duration/FloodDurationCalculator.java Thu Jun 14 16:56:31 2018 +0200 @@ -14,10 +14,13 @@ import java.util.List; import org.apache.commons.lang.math.DoubleRange; +import org.dive4elements.artifacts.CallContext; import org.dive4elements.river.artifacts.common.GeneralResultType; import org.dive4elements.river.artifacts.common.ResultRow; +import org.dive4elements.river.artifacts.model.Calculation; import org.dive4elements.river.artifacts.sinfo.common.RiverInfoProvider; import org.dive4elements.river.artifacts.sinfo.common.SInfoResultType; +import org.dive4elements.river.artifacts.sinfo.util.RiverInfo; import org.dive4elements.river.artifacts.sinfo.util.WstInfo; /** @@ -29,18 +32,27 @@ private final RiverInfoProvider riverInfoProvider; - public FloodDurationCalculator(final RiverInfoProvider riverInfoProvider) { + private final CallContext context; + public FloodDurationCalculator(final CallContext context, final RiverInfoProvider riverInfoProvider) { + this.context = context; this.riverInfoProvider = riverInfoProvider; - } - public FloodDurationCalculationResult execute(final String label, final WstInfo wstInfo, final DoubleRange calcRange) { + public FloodDurationCalculationResults execute(final Calculation problems, final String label, final WstInfo wstInfo, final String calcModeLabel, + final DoubleRange calcRange, final String riverside, final String user) { calculateResultRow(8888.888); calculateResultRow(99); calculateResultRow(77); - return new FloodDurationCalculationResult(label, wstInfo, this.rows, 4); + + final FloodDurationCalculationResult result = new FloodDurationCalculationResult(label, wstInfo, this.rows, 4); + + final RiverInfo riverInfo = new RiverInfo(this.riverInfoProvider.getRiver()); + + final FloodDurationCalculationResults results = new FloodDurationCalculationResults(calcModeLabel, user, riverInfo, calcRange, riverside); + results.addResult(result, problems); + return results; } private void calculateResultRow(final double station) { diff -r 5be112fba832 -r 23945061daec artifacts/src/main/java/org/dive4elements/river/artifacts/sinfo/flood_duration/FloodDurationExporter.java --- a/artifacts/src/main/java/org/dive4elements/river/artifacts/sinfo/flood_duration/FloodDurationExporter.java Thu Jun 14 15:12:25 2018 +0200 +++ b/artifacts/src/main/java/org/dive4elements/river/artifacts/sinfo/flood_duration/FloodDurationExporter.java Thu Jun 14 16:56:31 2018 +0200 @@ -9,21 +9,14 @@ package org.dive4elements.river.artifacts.sinfo.flood_duration; import java.io.OutputStream; -import java.text.NumberFormat; -import java.util.ArrayList; -import java.util.Collection; -import java.util.List; -import org.apache.log4j.Logger; -import org.dive4elements.river.artifacts.common.GeneralResultType; +import org.dive4elements.river.artifacts.common.AbstractCalculationExportableResult; +import org.dive4elements.river.artifacts.common.AbstractCommonExporter; +import org.dive4elements.river.artifacts.common.ExportContextCSV; import org.dive4elements.river.artifacts.common.JasperDesigner; import org.dive4elements.river.artifacts.common.JasperReporter; import org.dive4elements.river.artifacts.common.MetaAndTableJRDataSource; -import org.dive4elements.river.artifacts.common.ResultRow; -import org.dive4elements.river.artifacts.sinfo.common.AbstractSInfoExporter; -import org.dive4elements.river.artifacts.sinfo.common.SInfoResultType; import org.dive4elements.river.artifacts.sinfo.util.RiverInfo; -import org.dive4elements.river.artifacts.sinfo.util.WstInfo; import au.com.bytecode.opencsv.CSVWriter; import net.sf.jasperreports.engine.JRException; @@ -35,149 +28,31 @@ * @author Gernot Belger */ // REMARK: must be public because its registered in generators.xml -public class FloodDurationExporter extends AbstractSInfoExporter { - - /** The log used in this exporter. */ - private static Logger log = Logger.getLogger(FloodDurationExporter.class); - - private final String getJasperFile(final int waterlevelCount) { - if (waterlevelCount <= 1) - return "/jasper/templates/sinfo.floodduration.jrxml"; // TODO use jrxml-path all over the project - else - return "/jasper/templates/sinfo.floodduration2.jrxml"; - } - - private static final int maxPdfWspls = 3; - - @Override - protected Logger getLog() { - return log; - } - - @Override - protected void writeCSVGlobalMetadata(final CSVWriter writer, final FloodDurationCalculationResults results) { - log.info("FloodDurationExporter.writeCSVMeta"); - super.writeCSVGlobalMetadataDefaults(writer, results); - } +public class FloodDurationExporter extends AbstractCommonExporter { @Override - protected void writeCSVResultMetadata(final CSVWriter writer, final FloodDurationCalculationResults results, final FloodDurationCalculationResult result) { - - final WstInfo wst = result.getWst(); - super.writeCSVWaterlevelMetadata(writer, wst); // TODO: Abweichend vom Allgemeinen werden hier andere Felder benötigt bei den Wasserspiegellagen - - writer.writeNext(new String[] { "" }); // break line - - } - - /** - * Write the header, with different headings depending on whether at a - * gauge or at a location. - * - * @param river - * @param useTkh - */ - @Override - protected void writeCSVHeader(final CSVWriter writer, final FloodDurationCalculationResults results, final RiverInfo river) { - log.info("FloodDurationExporter.writeCSVHeader"); - - final Collection header = new ArrayList<>(99); - - header.add(msg(GeneralResultType.station.getCsvHeader())); - header.add(msg(SInfoResultType.riverside.getCsvHeader())); - header.add(msg(SInfoResultType.inundationduration.getCsvHeader())); - header.add(msg(SInfoResultType.inundationdurationq.getCsvHeader())); - header.add(msg(SInfoResultType.infrastructureHeight.getCsvHeader())); - header.add(msg(SInfoResultType.infrastructuretype.getCsvHeader())); - // add dynamic headers - final int waterlevelCount = getWaterlevelCount(); - for (int i = 0; i < waterlevelCount; i++) { - final int naturalIndex = i + 1; - final String appendIndex = new StringBuilder().append("_").append(naturalIndex).toString(); - final Object[] args = new Object[] { appendIndex }; - // new StringBuilder().append('\u2081').toString(); // schlechter UTF-8-Support für subscript ints - header.add(msg(DurationWaterlevel.getHeaderW(), new Object[] { appendIndex, "results.getRiver().getWstUnit()" })); - header.add(msg(DurationWaterlevel.getHeaderFloodDurPerYear(), args)); - header.add(msg(DurationWaterlevel.getHeaderQ(), args)); - header.add(msg(DurationWaterlevel.getHeaderBezeichn(), args)); - } - - header.add(msg(SInfoResultType.gaugeLabel.getCsvHeader())); - header.add(msg(SInfoResultType.location.getCsvHeader())); - - writer.writeNext(header.toArray(new String[header.size()])); - } + protected void doWritePdf(final OutputStream out, final FloodDurationCalculationResults results) { - private int getWaterlevelCount() { - final FloodDurationCalculationResults results = getData(); - if (results != null) { - final List list = results.getResults(); - if (list != null && list.size() > 0) { - final FloodDurationCalculationResult result = list.get(0); - return result.getWaterlevelCount(); - } - } - return 0; - } - - @Override - protected String[] formatRow(final FloodDurationCalculationResults results, final ResultRow row, final ExportMode mode) { - - final Collection lines = new ArrayList<>(99); - - lines.add(row.exportValue(this.context, GeneralResultType.station)); - lines.add(row.exportValue(this.context, SInfoResultType.riverside)); - lines.add(row.exportValue(this.context, SInfoResultType.inundationduration)); - lines.add(row.exportValue(this.context, SInfoResultType.inundationdurationq)); - lines.add(row.exportValue(this.context, SInfoResultType.infrastructureHeight)); - lines.add(row.exportValue(this.context, SInfoResultType.infrastructuretype)); - - final int waterlevelcount = this.getWaterlevelCount(); - - final List waterlevelList = (List) row.getValue(SInfoResultType.customMultiRowColWaterlevel); - if (waterlevelList != null) { - final NumberFormat wFormatter = getFlowDepthFormatter(); - final NumberFormat qFormatter = getQFormatter(); - - for (int i = 0; i < waterlevelList.size(); i++) { + // TODO: Move to super (hier ist aber spezieller code drin...) + try { + final ExportContextCSV exportContextCSV = new ExportContextCSV(this.context, null); - if (i == FloodDurationExporter.maxPdfWspls && mode == ExportMode.pdf) - break; - - final DurationWaterlevel item = waterlevelList.get(i); - lines.add(item.getWFormatted(wFormatter)); - lines.add(item.getFloodDurDaysPerYearFormatted()); - lines.add(item.getQFormatted(qFormatter)); - lines.add(item.getBezeichnung()); - } - } - - if ((waterlevelcount == 0 || waterlevelcount == 2) && mode == ExportMode.pdf) { - lines.add("dummy"); - lines.add("dummy"); - lines.add("dummy"); - lines.add("dummy"); - } + final JasperReporter reporter = new JasperReporter(); - lines.add(row.exportValue(this.context, SInfoResultType.gaugeLabel)); - lines.add(row.exportValue(this.context, SInfoResultType.location)); - return lines.toArray(new String[lines.size()]); - } - - @Override - protected void writePDF(final OutputStream out) { + for (final AbstractCalculationExportableResult result : results.getResults()) { + final MetaAndTableJRDataSource source = new MetaAndTableJRDataSource(); + getHelper().addJRMetaDataUSINFO(source, results); - try { - final MetaAndTableJRDataSource source = createJRData(this.data); - final JasperReporter reporter = new JasperReporter(); - final int waterlevelCount = getWaterlevelCount(); - final JasperDesigner design = reporter.addReport(getJasperFile(waterlevelCount), source); - - if (waterlevelCount == 0 || waterlevelCount == 2) { - design.removeColumn("wOpt"); - design.removeColumn("qOpt"); - design.removeColumn("bezOpt"); - design.removeColumn("durOpt"); + final JasperDesigner design = result.addReport(exportContextCSV, results, reporter, source); + if (result instanceof FloodDurationCalculationResult) { + final int wlCount = ((FloodDurationCalculationResult) result).getWaterlevelCount(); + if (wlCount == 0 || wlCount == 2) { + design.removeColumn("wOpt"); + design.removeColumn("qOpt"); + design.removeColumn("bezOpt"); + design.removeColumn("durOpt"); + } + } } reporter.exportPDF(out); @@ -185,53 +60,40 @@ catch (final JRException je) { getLog().warn("Error generating PDF Report!", je); } + } @Override - protected final void addJRMetaData(final MetaAndTableJRDataSource source, final FloodDurationCalculationResults results) { - - /* general metadata */ - super.addJRMetaData(source, results); - - /* column headings */ - source.addMetaData("station_header", GeneralResultType.station.getPdfHeader(this.context.getMeta())); - source.addMetaData("riverside_header", SInfoResultType.riverside.getPdfHeader(this.context.getMeta())); - source.addMetaData("inundationduration_header", SInfoResultType.inundationduration.getPdfHeader(this.context.getMeta())); - source.addMetaData("inundationduration_q_header", SInfoResultType.inundationdurationq.getPdfHeader(this.context.getMeta())); - source.addMetaData("infrastructure_height_header", SInfoResultType.infrastructureHeightFloodDur.getPdfHeader(this.context.getMeta())); - source.addMetaData("infrastructure_type_header", SInfoResultType.infrastructuretype.getPdfHeader(this.context.getMeta())); - - // add dynamic headers - - final int waterlevelCount = getWaterlevelCount() > FloodDurationExporter.maxPdfWspls ? FloodDurationExporter.maxPdfWspls : getWaterlevelCount(); + protected void doWriteCSVData(final CSVWriter writer, final FloodDurationCalculationResults results) { + // TODO: Diesen Ablauf in super? - if (waterlevelCount == 0 || waterlevelCount == 2) { - source.addMetaData("dummy", "dummy"); - source.addMetaData("dummy", "dummy"); - source.addMetaData("dummy", "dummy"); - source.addMetaData("dummy", "dummy"); - } - - for (int i = 0; i < waterlevelCount; i++) { - final int naturalIndex = i + 1; + // TODO: move results into context? + final ExportContextCSV exportContextCSV = new ExportContextCSV(this.context, writer); - final Object[] args = new String[] { new StringBuilder().append("_").append(naturalIndex).toString() }; - source.addMetaData(getPdfHeader("w", naturalIndex), msg(DurationWaterlevel.getHeaderW(), args)); - source.addMetaData(getPdfHeader("duration", naturalIndex), msg(DurationWaterlevel.getHeaderFloodDurPerYear(), args)); - source.addMetaData(getPdfHeader("q", naturalIndex), msg(DurationWaterlevel.getHeaderQ(), args)); - source.addMetaData(getPdfHeader("bezeichnung", naturalIndex), msg(DurationWaterlevel.getHeaderBezeichn(), args)); + getLog().info("writeCSVData"); - } + /* write as csv */ + exportContextCSV.writeCSVGlobalMetadataDefaults(results); // ggf auslagern innerhalb dieser Klasse - source.addMetaData("gauge_header", SInfoResultType.gaugeLabel.getPdfHeader(this.context.getMeta())); - source.addMetaData("location_header", SInfoResultType.location.getPdfHeader(this.context.getMeta())); + // writer.writeNext(new String[] { "" }); // break line HERE to avoid redundance + + final RiverInfo river = results.getRiver(); + + final Class lastResultType = null; + + for (final AbstractCalculationExportableResult result : results.getResults()) { + + final Class resultType = result.getClass(); + if (lastResultType == null || lastResultType != resultType) { + exportContextCSV.writeBlankLine(); + result.writeCSVHeader(exportContextCSV, results, river); + exportContextCSV.writeBlankLine(); + } else + exportContextCSV.writeCSVLine(new String[] { "#" }); + + result.writeCsv(exportContextCSV, results); + } } - private String getPdfHeader(final String rootStr, final int index) { - final String hd = "_header"; - final StringBuilder builder = new StringBuilder(); - return builder.append(rootStr).append("_").append(index).append(hd).toString(); - } - } \ No newline at end of file diff -r 5be112fba832 -r 23945061daec artifacts/src/main/java/org/dive4elements/river/artifacts/sinfo/flood_duration/FloodDurationState.java --- a/artifacts/src/main/java/org/dive4elements/river/artifacts/sinfo/flood_duration/FloodDurationState.java Thu Jun 14 15:12:25 2018 +0200 +++ b/artifacts/src/main/java/org/dive4elements/river/artifacts/sinfo/flood_duration/FloodDurationState.java Thu Jun 14 16:56:31 2018 +0200 @@ -14,6 +14,7 @@ import org.dive4elements.artifacts.CallContext; import org.dive4elements.river.artifacts.ChartArtifact; import org.dive4elements.river.artifacts.D4EArtifact; +import org.dive4elements.river.artifacts.common.AbstractCalculationExportableResult; import org.dive4elements.river.artifacts.model.CalculationResult; import org.dive4elements.river.artifacts.model.DataFacet; import org.dive4elements.river.artifacts.model.EmptyFacet; @@ -72,10 +73,10 @@ final FloodDurationCalculationResults results = (FloodDurationCalculationResults) res.getData(); /* add themes for chart, for each result */ - final List resultList = results.getResults(); + final List> resultList = results.getResults(); for (int index = 0; index < resultList.size(); index++) { - final FloodDurationCalculationResult result = resultList.get(index); + final AbstractCalculationExportableResult result = resultList.get(0); /* filtered (zoom dependent mean) flow depth TODO: */ // facets.add(FloodDurationProcessor.createFlowDepthFilteredFacet(context, hash, this.id, result, index)); diff -r 5be112fba832 -r 23945061daec artifacts/src/main/java/org/dive4elements/river/artifacts/sinfo/flowdepth/FlowDepthCalculationResult.java --- a/artifacts/src/main/java/org/dive4elements/river/artifacts/sinfo/flowdepth/FlowDepthCalculationResult.java Thu Jun 14 15:12:25 2018 +0200 +++ b/artifacts/src/main/java/org/dive4elements/river/artifacts/sinfo/flowdepth/FlowDepthCalculationResult.java Thu Jun 14 16:56:31 2018 +0200 @@ -9,11 +9,17 @@ */ package org.dive4elements.river.artifacts.sinfo.flowdepth; +import java.util.ArrayList; import java.util.Collection; +import org.dive4elements.river.artifacts.common.AbstractCalculationExportableResult; +import org.dive4elements.river.artifacts.common.ExportContextCSV; +import org.dive4elements.river.artifacts.common.GeneralResultType; +import org.dive4elements.river.artifacts.common.MetaAndTableJRDataSource; import org.dive4elements.river.artifacts.common.ResultRow; -import org.dive4elements.river.artifacts.sinfo.common.AbstractTkhCalculationResult; +import org.dive4elements.river.artifacts.sinfo.common.SInfoResultType; import org.dive4elements.river.artifacts.sinfo.util.BedHeightInfo; +import org.dive4elements.river.artifacts.sinfo.util.RiverInfo; import org.dive4elements.river.artifacts.sinfo.util.WstInfo; /** @@ -21,20 +27,130 @@ * * @author Gernot Belger */ -final class FlowDepthCalculationResult extends AbstractTkhCalculationResult { +final class FlowDepthCalculationResult extends AbstractCalculationExportableResult { private static final long serialVersionUID = 1L; + private enum ExportMode { // TODO; nicht ständig kopieren + pdf, csv + } + + private static final String JASPER_FILE = "/jasper/templates/sinfo.flowdepth.jrxml"; // TODO use jrxml-path all over the project + private final BedHeightInfo sounding; + private final WstInfo wst; + private final boolean hasTkh; public FlowDepthCalculationResult(final String label, final WstInfo wst, final BedHeightInfo sounding, final boolean hasTkh, final Collection rows) { - super(label, wst, hasTkh, rows); + super(label, rows); this.sounding = sounding; + this.wst = wst; + this.hasTkh = hasTkh; } public BedHeightInfo getSounding() { return this.sounding; } + + @Override + public void writeCSVHeader(final ExportContextCSV exportContextCSV, final FlowDepthCalculationResults results, final RiverInfo river) { + // getLog().info("FlowDepthExporter.writeCSVHeader"); + + final Collection header = new ArrayList<>(11); + + header.add(exportContextCSV.formatCsvHeader(GeneralResultType.station)); + header.add(exportContextCSV.msgUnitCSV(SInfoResultType.flowdepth)); + + if (this.hasTkh()) { + header.add(exportContextCSV.msgUnitCSV(SInfoResultType.flowdepthtkh)); + header.add(exportContextCSV.msgUnitCSV(SInfoResultType.tkh)); + } + + header.add(exportContextCSV.msgUnitCSV(SInfoResultType.waterlevel, river.getWstUnit())); + header.add(exportContextCSV.msgUnitCSV(SInfoResultType.discharge)); + header.add(exportContextCSV.formatCsvHeader(SInfoResultType.waterlevelLabel)); + header.add(exportContextCSV.formatCsvHeader(SInfoResultType.gaugeLabel)); + header.add(exportContextCSV.formatCsvHeader(SInfoResultType.meanBedHeight)); + header.add(exportContextCSV.formatCsvHeader(SInfoResultType.soundingLabel)); + header.add(exportContextCSV.formatCsvHeader(SInfoResultType.location)); + + exportContextCSV.writeCSVLine(header.toArray(new String[header.size()])); + + } + + @Override + protected void writeCSVResultMetadata(final ExportContextCSV exportContextCSV, final FlowDepthCalculationResults results) { + + exportContextCSV.writeCSVSoundingMetadata(this.sounding); + + exportContextCSV.writeBlankLine();// .writeNext(new String[] { "" }); // break line + + exportContextCSV.writeCSVWaterlevelMetadata(this.wst); + + exportContextCSV.writeBlankLine();// .writeNext(new String[] { "" }); // break line + + } + + @Override + protected String getJasperFile() { + return JASPER_FILE; + } + + @Override + protected String[] formatCSVRow(final ExportContextCSV exportContextCSV, final FlowDepthCalculationResults results, final ResultRow row) { + return formatRow(ExportMode.csv, exportContextCSV, results, row); + } + + @Override + protected String[] formatPDFRow(final ExportContextCSV exportContextPDF, final FlowDepthCalculationResults results, final ResultRow row) { + + return formatRow(ExportMode.pdf, exportContextPDF, results, row); + } + + @Override + protected void addJRTableHeader(final ExportContextCSV exportContextPDF, final MetaAndTableJRDataSource source, final FlowDepthCalculationResults results) { + + /* column headings */ + exportContextPDF.addJRMetadata(source, "station_header", GeneralResultType.station); + exportContextPDF.addJRMetadata(source, "flowdepth_header", SInfoResultType.flowdepth); + exportContextPDF.addJRMetadata(source, "flowdepth_tkh_header", SInfoResultType.flowdepthtkh); + exportContextPDF.addJRMetadata(source, "tkh_header", SInfoResultType.tkh); + exportContextPDF.addJRMetadata(source, "waterlevel_header", SInfoResultType.waterlevel); + exportContextPDF.addJRMetadata(source, "discharge_header", SInfoResultType.discharge); + exportContextPDF.addJRMetadata(source, "waterlevel_name_header", SInfoResultType.waterlevelLabel); + exportContextPDF.addJRMetadata(source, "gauge_header", SInfoResultType.gaugeLabel); + exportContextPDF.addJRMetadata(source, "bedheight_header", SInfoResultType.meanBedHeight); + exportContextPDF.addJRMetadata(source, "sounding_name_header", SInfoResultType.soundingLabel); + exportContextPDF.addJRMetadata(source, "location_header", SInfoResultType.location); + } + + public boolean hasTkh() { + return this.hasTkh; + } + + private String[] formatRow(final ExportMode mode, final ExportContextCSV exportContextCSV, final FlowDepthCalculationResults results, final ResultRow row) { + + final Collection lines = new ArrayList<>(11); + + lines.add(exportContextCSV.formatRowValue(row, GeneralResultType.station)); + lines.add(exportContextCSV.formatRowValue(row, SInfoResultType.flowdepth)); + + if (mode == ExportMode.pdf || results.isUseTkh()) { + lines.add(exportContextCSV.formatRowValue(row, SInfoResultType.flowdepthtkh)); + lines.add(exportContextCSV.formatRowValue(row, SInfoResultType.tkh)); + } + + lines.add(exportContextCSV.formatRowValue(row, SInfoResultType.waterlevel)); + lines.add(exportContextCSV.formatRowValue(row, SInfoResultType.discharge)); + lines.add(exportContextCSV.formatRowValue(row, SInfoResultType.waterlevelLabel)); + lines.add(exportContextCSV.formatRowValue(row, SInfoResultType.gaugeLabel)); + lines.add(exportContextCSV.formatRowValue(row, SInfoResultType.meanBedHeight)); + lines.add(exportContextCSV.formatRowValue(row, SInfoResultType.soundingLabel)); + lines.add(exportContextCSV.formatRowValue(row, SInfoResultType.location)); + + return lines.toArray(new String[lines.size()]); + } + } \ No newline at end of file diff -r 5be112fba832 -r 23945061daec artifacts/src/main/java/org/dive4elements/river/artifacts/sinfo/flowdepth/FlowDepthCalculationResults.java --- a/artifacts/src/main/java/org/dive4elements/river/artifacts/sinfo/flowdepth/FlowDepthCalculationResults.java Thu Jun 14 15:12:25 2018 +0200 +++ b/artifacts/src/main/java/org/dive4elements/river/artifacts/sinfo/flowdepth/FlowDepthCalculationResults.java Thu Jun 14 16:56:31 2018 +0200 @@ -10,13 +10,14 @@ package org.dive4elements.river.artifacts.sinfo.flowdepth; import org.apache.commons.lang.math.DoubleRange; -import org.dive4elements.river.artifacts.sinfo.common.AbstractSInfoCalculationResults; +import org.dive4elements.river.artifacts.common.AbstractCalculationExportableResult; +import org.dive4elements.river.artifacts.common.AbstractCalculationListResults; import org.dive4elements.river.artifacts.sinfo.util.RiverInfo; /** * @author Gernot Belger */ -final class FlowDepthCalculationResults extends AbstractSInfoCalculationResults { +final class FlowDepthCalculationResults extends AbstractCalculationListResults> { private static final long serialVersionUID = 1L; @@ -32,4 +33,5 @@ public boolean isUseTkh() { return this.useTkh; } + } \ No newline at end of file diff -r 5be112fba832 -r 23945061daec artifacts/src/main/java/org/dive4elements/river/artifacts/sinfo/flowdepth/FlowDepthExporter.java --- a/artifacts/src/main/java/org/dive4elements/river/artifacts/sinfo/flowdepth/FlowDepthExporter.java Thu Jun 14 15:12:25 2018 +0200 +++ b/artifacts/src/main/java/org/dive4elements/river/artifacts/sinfo/flowdepth/FlowDepthExporter.java Thu Jun 14 16:56:31 2018 +0200 @@ -9,20 +9,14 @@ package org.dive4elements.river.artifacts.sinfo.flowdepth; import java.io.OutputStream; -import java.util.ArrayList; -import java.util.Collection; -import org.apache.log4j.Logger; -import org.dive4elements.river.artifacts.common.GeneralResultType; +import org.dive4elements.river.artifacts.common.AbstractCalculationExportableResult; +import org.dive4elements.river.artifacts.common.AbstractCommonExporter; +import org.dive4elements.river.artifacts.common.ExportContextCSV; import org.dive4elements.river.artifacts.common.JasperDesigner; import org.dive4elements.river.artifacts.common.JasperReporter; import org.dive4elements.river.artifacts.common.MetaAndTableJRDataSource; -import org.dive4elements.river.artifacts.common.ResultRow; -import org.dive4elements.river.artifacts.sinfo.common.AbstractSInfoExporter; -import org.dive4elements.river.artifacts.sinfo.common.SInfoResultType; -import org.dive4elements.river.artifacts.sinfo.util.BedHeightInfo; import org.dive4elements.river.artifacts.sinfo.util.RiverInfo; -import org.dive4elements.river.artifacts.sinfo.util.WstInfo; import au.com.bytecode.opencsv.CSVWriter; import net.sf.jasperreports.engine.JRException; @@ -34,139 +28,67 @@ * @author Gernot Belger */ // REMARK: must be public because its registered in generators.xml -public class FlowDepthExporter extends AbstractSInfoExporter { - - /** The log used in this exporter. */ - private static Logger log = Logger.getLogger(FlowDepthExporter.class); - - private static final String JASPER_FILE = "/jasper/templates/sinfo.flowdepth.jrxml"; // TODO use jrxml-path all over the project +public class FlowDepthExporter extends AbstractCommonExporter { @Override - protected Logger getLog() { - return log; - } + protected void doWriteCSVData(final CSVWriter writer, final FlowDepthCalculationResults results) { + // TODO: Diesen Ablauf in super? - @Override - protected void writeCSVGlobalMetadata(final CSVWriter writer, final FlowDepthCalculationResults results) { - log.info("FlowDepthExporter.writeCSVMeta"); - super.writeCSVGlobalMetadataDefaults(writer, results); + // TODO: move results into context? + final ExportContextCSV exportContextCSV = new ExportContextCSV(this.context, writer); + + getLog().info("writeCSVData"); + + /* write as csv */ + exportContextCSV.writeCSVGlobalMetadataDefaults(results); // ggf auslagern innerhalb dieser Klasse + + // writer.writeNext(new String[] { "" }); // break line HERE to avoid redundance + + final RiverInfo river = results.getRiver(); + + final Class lastResultType = null; + + for (final AbstractCalculationExportableResult result : results.getResults()) { + + final Class resultType = result.getClass(); + if (lastResultType == null || lastResultType != resultType) { + exportContextCSV.writeBlankLine(); + result.writeCSVHeader(exportContextCSV, results, river); + exportContextCSV.writeBlankLine(); + } else + exportContextCSV.writeCSVLine(new String[] { "#" }); + + result.writeCsv(exportContextCSV, results); + } } @Override - protected void writeCSVResultMetadata(final CSVWriter writer, final FlowDepthCalculationResults results, final FlowDepthCalculationResult result) { - - final BedHeightInfo sounding = result.getSounding(); - super.writeCSVSoundingMetadata(writer, sounding); - - writer.writeNext(new String[] { "" }); // break line - - final WstInfo wst = result.getWst(); - super.writeCSVWaterlevelMetadata(writer, wst); - - writer.writeNext(new String[] { "" }); // break line - - } - - /** - * Write the header, with different headings depending on whether at a - * gauge or at a location. - * - * @param river - * @param useTkh - */ - @Override - protected void writeCSVHeader(final CSVWriter writer, final FlowDepthCalculationResults results, final RiverInfo river) { - log.info("FlowDepthExporter.writeCSVHeader"); - - final Collection header = new ArrayList<>(11); - - header.add(msg(GeneralResultType.station.getCsvHeader())); - header.add(msgUnit(SInfoResultType.flowdepth.getCsvHeader(), SInfoResultType.flowdepth.getUnit())); - - if (results.isUseTkh()) { - header.add(msgUnit(SInfoResultType.flowdepthtkh.getCsvHeader(), SInfoResultType.flowdepthtkh.getUnit())); - header.add(msgUnit(SInfoResultType.tkh.getCsvHeader(), SInfoResultType.tkh.getUnit())); - } - - header.add(msgUnit(SInfoResultType.waterlevel.getCsvHeader(), river.getWstUnit())); - header.add(msgUnit(SInfoResultType.discharge.getCsvHeader(), SInfoResultType.discharge.getUnit())); - header.add(msg(SInfoResultType.waterlevelLabel.getCsvHeader())); - header.add(msg(SInfoResultType.gaugeLabel.getCsvHeader())); - header.add(msgUnit(SInfoResultType.meanBedHeight.getCsvHeader(), river.getWstUnit())); - header.add(msg(SInfoResultType.soundingLabel.getCsvHeader())); - header.add(msg(SInfoResultType.location.getCsvHeader())); + protected void doWritePdf(final OutputStream out, final FlowDepthCalculationResults results) { - writer.writeNext(header.toArray(new String[header.size()])); - } - - /** - * Format a row of a flow depth result into an array of string, both used by csv and pdf - * - * @param pdf - * - * @param useTkh - */ - @Override - protected String[] formatRow(final FlowDepthCalculationResults results, final ResultRow row, final ExportMode mode) { - - final Collection lines = new ArrayList<>(11); - - lines.add(row.exportValue(this.context, GeneralResultType.station)); - lines.add(row.exportValue(this.context, SInfoResultType.flowdepth)); - - if (mode == ExportMode.pdf || getData().isUseTkh()) { - lines.add(row.exportValue(this.context, SInfoResultType.flowdepthtkh)); - lines.add(row.exportValue(this.context, SInfoResultType.tkh)); - } + // TODO: Move to super? Maybe not, hier gibt es unterschiede -> design remove columns + try { + final ExportContextCSV exportContextCSV = new ExportContextCSV(this.context, null); - lines.add(row.exportValue(this.context, SInfoResultType.waterlevel)); - lines.add(row.exportValue(this.context, SInfoResultType.discharge)); - lines.add(row.exportValue(this.context, SInfoResultType.waterlevelLabel)); - lines.add(row.exportValue(this.context, SInfoResultType.gaugeLabel)); - lines.add(row.exportValue(this.context, SInfoResultType.meanBedHeight)); - lines.add(row.exportValue(this.context, SInfoResultType.soundingLabel)); - lines.add(row.exportValue(this.context, SInfoResultType.location)); - - return lines.toArray(new String[lines.size()]); - } + final JasperReporter reporter = new JasperReporter(); - @Override - protected void writePDF(final OutputStream out) { + for (final AbstractCalculationExportableResult result : results.getResults()) { + final MetaAndTableJRDataSource source = new MetaAndTableJRDataSource(); + getHelper().addJRMetaDataUSINFO(source, results); - try { - final MetaAndTableJRDataSource source = createJRData(this.data); - final JasperReporter reporter = new JasperReporter(); - final JasperDesigner design = reporter.addReport(JASPER_FILE, source); - - if (!getData().isUseTkh()) { - design.removeColumn("tkh"); - design.removeColumn("flowdepthtkh"); + final JasperDesigner design = result.addReport(exportContextCSV, results, reporter, source); + if (result instanceof FlowDepthCalculationResult) { + if (!((FlowDepthCalculationResult) result).hasTkh()) { + design.removeColumn("tkh"); + design.removeColumn("flowdepthtkh"); + } + } + reporter.exportPDF(out); } - reporter.exportPDF(out); } catch (final JRException je) { getLog().warn("Error generating PDF Report!", je); } - } - - @Override - protected final void addJRMetaData(final MetaAndTableJRDataSource source, final FlowDepthCalculationResults results) { - - /* general metadata */ - super.addJRMetaData(source, results); - /* column headings */ - source.addMetaData("station_header", GeneralResultType.station.getPdfHeader(this.context.getMeta())); - source.addMetaData("flowdepth_header", SInfoResultType.flowdepth.getPdfHeader(this.context.getMeta())); - source.addMetaData("flowdepth_tkh_header", SInfoResultType.flowdepthtkh.getPdfHeader(this.context.getMeta())); - source.addMetaData("tkh_header", SInfoResultType.tkh.getPdfHeader(this.context.getMeta())); - source.addMetaData("waterlevel_header", SInfoResultType.waterlevel.getPdfHeader(this.context.getMeta())); - source.addMetaData("discharge_header", SInfoResultType.discharge.getPdfHeader(this.context.getMeta())); - source.addMetaData("waterlevel_name_header", SInfoResultType.waterlevelLabel.getPdfHeader(this.context.getMeta())); - source.addMetaData("gauge_header", SInfoResultType.gaugeLabel.getPdfHeader(this.context.getMeta())); - source.addMetaData("bedheight_header", SInfoResultType.meanBedHeight.getPdfHeader(this.context.getMeta())); - source.addMetaData("sounding_name_header", SInfoResultType.soundingLabel.getPdfHeader(this.context.getMeta())); - source.addMetaData("location_header", SInfoResultType.location.getPdfHeader(this.context.getMeta())); } } \ No newline at end of file diff -r 5be112fba832 -r 23945061daec artifacts/src/main/java/org/dive4elements/river/artifacts/sinfo/flowdepth/FlowDepthState.java --- a/artifacts/src/main/java/org/dive4elements/river/artifacts/sinfo/flowdepth/FlowDepthState.java Thu Jun 14 15:12:25 2018 +0200 +++ b/artifacts/src/main/java/org/dive4elements/river/artifacts/sinfo/flowdepth/FlowDepthState.java Thu Jun 14 16:56:31 2018 +0200 @@ -14,6 +14,7 @@ import org.dive4elements.artifacts.CallContext; import org.dive4elements.river.artifacts.ChartArtifact; import org.dive4elements.river.artifacts.D4EArtifact; +import org.dive4elements.river.artifacts.common.AbstractCalculationExportableResult; import org.dive4elements.river.artifacts.model.Calculation; import org.dive4elements.river.artifacts.model.CalculationResult; import org.dive4elements.river.artifacts.model.DataFacet; @@ -76,10 +77,10 @@ final FlowDepthCalculationResults results = (FlowDepthCalculationResults) res.getData(); /* add themes for chart, for each result */ - final List resultList = results.getResults(); + final List> resultList = results.getResults(); for (int index = 0; index < resultList.size(); index++) { - final FlowDepthCalculationResult result = resultList.get(index); + final FlowDepthCalculationResult result = (FlowDepthCalculationResult) resultList.get(index); /* filtered (zoom dependent mean) flow depth */ facets.add(FlowDepthProcessor.createFlowDepthFilteredFacet(context, hash, this.id, result, index)); diff -r 5be112fba832 -r 23945061daec artifacts/src/main/java/org/dive4elements/river/artifacts/sinfo/flowdepthdev/FlowDepthDevelopmentCalculationResult.java --- a/artifacts/src/main/java/org/dive4elements/river/artifacts/sinfo/flowdepthdev/FlowDepthDevelopmentCalculationResult.java Thu Jun 14 15:12:25 2018 +0200 +++ b/artifacts/src/main/java/org/dive4elements/river/artifacts/sinfo/flowdepthdev/FlowDepthDevelopmentCalculationResult.java Thu Jun 14 16:56:31 2018 +0200 @@ -9,11 +9,17 @@ */ package org.dive4elements.river.artifacts.sinfo.flowdepthdev; +import java.util.ArrayList; import java.util.Collection; +import org.dive4elements.river.artifacts.common.AbstractCalculationExportableResult; +import org.dive4elements.river.artifacts.common.ExportContextCSV; +import org.dive4elements.river.artifacts.common.GeneralResultType; +import org.dive4elements.river.artifacts.common.MetaAndTableJRDataSource; import org.dive4elements.river.artifacts.common.ResultRow; -import org.dive4elements.river.artifacts.sinfo.common.AbstractSInfoCalculationResult; +import org.dive4elements.river.artifacts.sinfo.common.SInfoResultType; import org.dive4elements.river.artifacts.sinfo.util.BedHeightInfo; +import org.dive4elements.river.artifacts.sinfo.util.RiverInfo; import org.dive4elements.river.artifacts.sinfo.util.WstInfo; /** @@ -21,10 +27,20 @@ * * @author Gernot Belger */ -final class FlowDepthDevelopmentCalculationResult extends AbstractSInfoCalculationResult { +final class FlowDepthDevelopmentCalculationResult extends AbstractCalculationExportableResult { private static final long serialVersionUID = 1L; + private static final String CSV_META_HEADER_SOUNDING_CURRENT = "sinfo.export.csv.meta.header.sounding.current"; + + private static final String CSV_META_HEADER_SOUNDING_HISTORICAL = "sinfo.export.csv.meta.header.sounding.historical"; + + private static final String CSV_META_HEADER_WATERLEVEL_CURRENT = "sinfo.export.csv.meta.header.waterlevel.current"; + + private static final String CSV_META_HEADER_WATERLEVEL_HISTORICAL = "sinfo.export.csv.meta.header.waterlevel.historical"; + + private static final String JASPER_FILE = "/jasper/templates/sinfo.flowdepthdevelopment.jrxml"; + private final BedHeightInfo currentSounding; private final BedHeightInfo historicalSounding; @@ -34,9 +50,8 @@ private final WstInfo currentWst; public FlowDepthDevelopmentCalculationResult(final String label, final WstInfo currentWst, final WstInfo historicalWst, final BedHeightInfo currentSounding, - final BedHeightInfo historicalSounding, final Collection< ResultRow> rows) { - // TODO: bad abstraction if we give null here... - super(label, null, rows); + final BedHeightInfo historicalSounding, final Collection rows) { + super(label, rows); this.currentWst = currentWst; this.historicalWst = historicalWst; @@ -92,4 +107,93 @@ append(this.historicalSounding.getDescription()). // toString(); } + + @Override + protected void writeCSVResultMetadata(final ExportContextCSV exportContextCSV, final FlowDepthDevelopmentCalculationResults results) { + + exportContextCSV.writeCSVSoundingMetadata(getCurrentSounding(), CSV_META_HEADER_SOUNDING_CURRENT); + exportContextCSV.writeBlankLine(); + exportContextCSV.writeCSVWaterlevelMetadata(getCurrentWst(), CSV_META_HEADER_WATERLEVEL_CURRENT); + exportContextCSV.writeBlankLine(); + exportContextCSV.writeCSVSoundingMetadata(getHistoricalSounding(), CSV_META_HEADER_SOUNDING_HISTORICAL); + exportContextCSV.writeBlankLine(); + exportContextCSV.writeCSVWaterlevelMetadata(getHistoricalWst(), CSV_META_HEADER_WATERLEVEL_HISTORICAL); + exportContextCSV.writeBlankLine(); + + } + + @Override + protected String getJasperFile() { + return JASPER_FILE; + } + + protected String[] formatRow(final ExportContextCSV exportContextCSV, final FlowDepthDevelopmentCalculationResults results, final ResultRow row) { + + final Collection lines = new ArrayList<>(10); + + lines.add(exportContextCSV.formatRowValue(row, GeneralResultType.station)); + lines.add(exportContextCSV.formatRowValue(row, SInfoResultType.flowdepthDevelopment)); + lines.add(exportContextCSV.formatRowValue(row, SInfoResultType.flowdepthDevelopmentPerYear)); + lines.add(exportContextCSV.formatRowValue(row, SInfoResultType.waterlevelDifference)); + lines.add(exportContextCSV.formatRowValue(row, SInfoResultType.bedHeightDifference)); + lines.add(exportContextCSV.formatRowValue(row, SInfoResultType.flowdepthCurrent)); + lines.add(exportContextCSV.formatRowValue(row, SInfoResultType.flowdepthHistorical)); + lines.add(exportContextCSV.formatRowValue(row, SInfoResultType.location)); + + return lines.toArray(new String[lines.size()]); + } + + @Override + public void writeCSVHeader(final ExportContextCSV exportContextCSV, final FlowDepthDevelopmentCalculationResults results, final RiverInfo river) { + + final Collection header = new ArrayList<>(11); + + header.add(exportContextCSV.formatCsvHeader(GeneralResultType.station)); + header.add(exportContextCSV.msgUnitCSV(SInfoResultType.flowdepthDevelopment, SInfoResultType.flowdepthDevelopment.getUnit())); + header.add(exportContextCSV.msgUnitCSV(SInfoResultType.flowdepthDevelopmentPerYear, SInfoResultType.flowdepthDevelopmentPerYear.getUnit())); + header.add(exportContextCSV.msgUnitLabel(SInfoResultType.waterlevelDifference, getWaterlevelDifferenceLabel())); + header.add(exportContextCSV.msgUnitLabel(SInfoResultType.bedHeightDifference, getBedHeightDifferenceLabel())); + header.add(exportContextCSV.msgUnitLabel(SInfoResultType.flowdepthCurrent, getFlowDepthCurrentLabel())); + header.add(exportContextCSV.msgUnitLabel(SInfoResultType.flowdepthHistorical, getFlowDepthHistoricalLabel())); + header.add(exportContextCSV.formatCsvHeader(SInfoResultType.location)); + + exportContextCSV.writeCSVLine(header.toArray(new String[header.size()])); + + } + + @Override + protected String[] formatCSVRow(final ExportContextCSV exportContextCSV, final FlowDepthDevelopmentCalculationResults results, final ResultRow row) { + + return this.formatRow(exportContextCSV, results, row); + } + + @Override + protected String[] formatPDFRow(final ExportContextCSV exportContextPDF, final FlowDepthDevelopmentCalculationResults results, final ResultRow row) { + + return this.formatRow(exportContextPDF, results, row); + } + + @Override + protected void addJRTableHeader(final ExportContextCSV exportContextPDF, final MetaAndTableJRDataSource source, + final FlowDepthDevelopmentCalculationResults results) { + /* column headings */ + exportContextPDF.addJRMetadata(source, "station_header", GeneralResultType.station); + exportContextPDF.addJRMetadata(source, "flowdepthdevelopment_header", SInfoResultType.flowdepthDevelopment); + exportContextPDF.addJRMetadata(source, "flowdepthdevelopmentperyear_header", SInfoResultType.flowdepthDevelopmentPerYear); + + exportContextPDF.addJRMetadata(source, "waterleveldifference_header", SInfoResultType.waterlevelDifference); + exportContextPDF.addJRMetadata(source, "waterleveldifference_header2", getWaterlevelDifferenceLabel()); + + exportContextPDF.addJRMetadata(source, "bedheightdifference_header", SInfoResultType.bedHeightDifference); + exportContextPDF.addJRMetadata(source, "bedheightdifference_header2", getBedHeightDifferenceLabel()); + + exportContextPDF.addJRMetadata(source, "flowdepthcurrent_header", SInfoResultType.flowdepthCurrent); + exportContextPDF.addJRMetadata(source, "flowdepthcurrent_header2", getFlowDepthCurrentLabel()); + + exportContextPDF.addJRMetadata(source, "flowdepthhistorical_header", SInfoResultType.flowdepthHistorical); + exportContextPDF.addJRMetadata(source, "flowdepthhistorical_header2", getFlowDepthHistoricalLabel()); + + exportContextPDF.addJRMetadata(source, "location_header", SInfoResultType.location); + + } } \ No newline at end of file diff -r 5be112fba832 -r 23945061daec artifacts/src/main/java/org/dive4elements/river/artifacts/sinfo/flowdepthdev/FlowDepthDevelopmentCalculationResults.java --- a/artifacts/src/main/java/org/dive4elements/river/artifacts/sinfo/flowdepthdev/FlowDepthDevelopmentCalculationResults.java Thu Jun 14 15:12:25 2018 +0200 +++ b/artifacts/src/main/java/org/dive4elements/river/artifacts/sinfo/flowdepthdev/FlowDepthDevelopmentCalculationResults.java Thu Jun 14 16:56:31 2018 +0200 @@ -12,13 +12,14 @@ import java.util.List; import org.apache.commons.lang.math.DoubleRange; -import org.dive4elements.river.artifacts.sinfo.common.AbstractSInfoCalculationResults; +import org.dive4elements.river.artifacts.common.AbstractCalculationExportableResult; +import org.dive4elements.river.artifacts.common.AbstractCalculationListResults; import org.dive4elements.river.artifacts.sinfo.util.RiverInfo; /** * @author Gernot Belger */ -final class FlowDepthDevelopmentCalculationResults extends AbstractSInfoCalculationResults { +final class FlowDepthDevelopmentCalculationResults extends AbstractCalculationListResults> { private static final long serialVersionUID = 1L; @@ -30,10 +31,10 @@ * We know that this type of results only has one result member, so we can directly access it. */ public FlowDepthDevelopmentCalculationResult getResult() { - final List results = getResults(); + final List> results = getResults(); if (results.size() < 1) return null; - return results.get(0); + return (FlowDepthDevelopmentCalculationResult) results.get(0); } } \ No newline at end of file diff -r 5be112fba832 -r 23945061daec artifacts/src/main/java/org/dive4elements/river/artifacts/sinfo/flowdepthdev/FlowDepthDevelopmentExporter.java --- a/artifacts/src/main/java/org/dive4elements/river/artifacts/sinfo/flowdepthdev/FlowDepthDevelopmentExporter.java Thu Jun 14 15:12:25 2018 +0200 +++ b/artifacts/src/main/java/org/dive4elements/river/artifacts/sinfo/flowdepthdev/FlowDepthDevelopmentExporter.java Thu Jun 14 16:56:31 2018 +0200 @@ -9,15 +9,12 @@ package org.dive4elements.river.artifacts.sinfo.flowdepthdev; import java.io.OutputStream; -import java.util.ArrayList; -import java.util.Collection; -import org.apache.log4j.Logger; -import org.dive4elements.river.artifacts.common.GeneralResultType; +import org.dive4elements.river.artifacts.common.AbstractCalculationExportableResult; +import org.dive4elements.river.artifacts.common.AbstractCommonExporter; +import org.dive4elements.river.artifacts.common.ExportContextCSV; import org.dive4elements.river.artifacts.common.JasperReporter; import org.dive4elements.river.artifacts.common.MetaAndTableJRDataSource; -import org.dive4elements.river.artifacts.common.ResultRow; -import org.dive4elements.river.artifacts.sinfo.common.AbstractSInfoExporter; import org.dive4elements.river.artifacts.sinfo.common.SInfoResultType; import org.dive4elements.river.artifacts.sinfo.util.RiverInfo; @@ -31,142 +28,63 @@ * @author Gernot Belger */ // REMARK: must be public because its registered in generators.xml -public class FlowDepthDevelopmentExporter extends AbstractSInfoExporter { - - private static final String CSV_META_HEADER_SOUNDING_CURRENT = "sinfo.export.csv.meta.header.sounding.current"; - - private static final String CSV_META_HEADER_SOUNDING_HISTORICAL = "sinfo.export.csv.meta.header.sounding.historical"; - - private static final String CSV_META_HEADER_WATERLEVEL_CURRENT = "sinfo.export.csv.meta.header.waterlevel.current"; - - private static final String CSV_META_HEADER_WATERLEVEL_HISTORICAL = "sinfo.export.csv.meta.header.waterlevel.historical"; - - /** The log used in this exporter. */ - private static Logger log = Logger.getLogger(FlowDepthDevelopmentExporter.class); - - private static final String JASPER_FILE = "/jasper/templates/sinfo.flowdepthdevelopment.jrxml"; +public class FlowDepthDevelopmentExporter extends AbstractCommonExporter { @Override - protected Logger getLog() { - return log; - } - - @Override - protected void writeCSVResultMetadata(final CSVWriter writer, final FlowDepthDevelopmentCalculationResults results, - final FlowDepthDevelopmentCalculationResult result) { + protected void doWriteCSVData(final CSVWriter writer, final FlowDepthDevelopmentCalculationResults results) { + // TODO: Diesen Ablauf in super? - writeCSVSoundingMetadata(writer, result.getCurrentSounding(), CSV_META_HEADER_SOUNDING_CURRENT); - writer.writeNext(new String[] { "" }); // break line - writeCSVWaterlevelMetadata(writer, result.getCurrentWst(), CSV_META_HEADER_WATERLEVEL_CURRENT); - writer.writeNext(new String[] { "" }); // break line - writeCSVSoundingMetadata(writer, result.getHistoricalSounding(), CSV_META_HEADER_SOUNDING_HISTORICAL); - writer.writeNext(new String[] { "" }); // break line - writeCSVWaterlevelMetadata(writer, result.getHistoricalWst(), CSV_META_HEADER_WATERLEVEL_HISTORICAL); - writer.writeNext(new String[] { "" }); // break line + // TODO: move results into context? + final ExportContextCSV exportContextCSV = new ExportContextCSV(this.context, writer); + + getLog().info("writeCSVData"); + + /* write as csv */ + exportContextCSV.writeCSVGlobalMetadataDefaults(results); // ggf auslagern innerhalb dieser Klasse + + // writer.writeNext(new String[] { "" }); // break line HERE to avoid redundance + + final RiverInfo river = results.getRiver(); + + final Class lastResultType = null; + + for (final AbstractCalculationExportableResult result : results.getResults()) { + + final Class resultType = result.getClass(); + if (lastResultType == null || lastResultType != resultType) { + exportContextCSV.writeBlankLine(); + result.writeCSVHeader(exportContextCSV, results, river); + exportContextCSV.writeBlankLine(); + } else + exportContextCSV.writeCSVLine(new String[] { "#" }); + + result.writeCsv(exportContextCSV, results); + } } @Override - protected void writeCSVGlobalMetadata(final CSVWriter writer, final FlowDepthDevelopmentCalculationResults results) { - super.writeCSVGlobalMetadataDefaults(writer, results); - } - - /** - * Write the header, with different headings depending on whether at a - * gauge or at a location. - * - * @param river - * @param useTkh - */ - @Override - protected void writeCSVHeader(final CSVWriter writer, final FlowDepthDevelopmentCalculationResults results, final RiverInfo river) { - log.info("FlowDepthExporter.writeCSVHeader"); - - final FlowDepthDevelopmentCalculationResult result = results.getResult(); - - final Collection header = new ArrayList<>(11); - - header.add(msg(GeneralResultType.station.getCsvHeader())); - header.add(msgUnit(SInfoResultType.flowdepthDevelopment.getCsvHeader(), SInfoResultType.flowdepthDevelopment.getUnit())); - header.add(msgUnit(SInfoResultType.flowdepthDevelopmentPerYear.getCsvHeader(), SInfoResultType.flowdepthDevelopmentPerYear.getUnit())); - header.add(msgUnitLabel(SInfoResultType.waterlevelDifference.getCsvHeader(), SInfoResultType.waterlevelDifference.getUnit(), - result.getWaterlevelDifferenceLabel())); - header.add(msgUnitLabel(SInfoResultType.bedHeightDifference.getCsvHeader(), SInfoResultType.bedHeightDifference.getUnit(), - result.getBedHeightDifferenceLabel())); - header.add( - msgUnitLabel(SInfoResultType.flowdepthCurrent.getCsvHeader(), SInfoResultType.flowdepthCurrent.getUnit(), result.getFlowDepthCurrentLabel())); - header.add(msgUnitLabel(SInfoResultType.flowdepthHistorical.getCsvHeader(), SInfoResultType.flowdepthHistorical.getUnit(), - result.getFlowDepthHistoricalLabel())); - header.add(msg(SInfoResultType.location.getCsvHeader())); - - writer.writeNext(header.toArray(new String[header.size()])); - } - - /** - * Format a row of a flow depth result into an array of string, both used by csv and pdf - * - * @param result - * - * @param useTkh - */ - @Override - protected String[] formatRow(final FlowDepthDevelopmentCalculationResults results, final ResultRow row, final ExportMode mode) { - - final Collection lines = new ArrayList<>(10); - - lines.add(row.exportValue(this.context, GeneralResultType.station)); - lines.add(row.exportValue(this.context, SInfoResultType.flowdepthDevelopment)); - lines.add(row.exportValue(this.context, SInfoResultType.flowdepthDevelopmentPerYear)); - lines.add(row.exportValue(this.context, SInfoResultType.waterlevelDifference)); - lines.add(row.exportValue(this.context, SInfoResultType.bedHeightDifference)); - lines.add(row.exportValue(this.context, SInfoResultType.flowdepthCurrent)); - lines.add(row.exportValue(this.context, SInfoResultType.flowdepthHistorical)); - lines.add(row.exportValue(this.context, SInfoResultType.location)); - - return lines.toArray(new String[lines.size()]); - } - - @Override - protected final void addJRMetaData(final MetaAndTableJRDataSource source, final FlowDepthDevelopmentCalculationResults results) { - - /* general metadata */ - super.addJRMetaData(source, results); - - final FlowDepthDevelopmentCalculationResult result = results.getResult(); - source.addMetaData("flowdepthdevelopment", result.getLabel()); - source.addMetaData("flowdepthdevelopment_header_label", SInfoResultType.flowdepthDevelopment.getCsvHeader(this.context.getMeta()));// (this.context.getMeta())); - - /* column headings */ - source.addMetaData("station_header", GeneralResultType.station.getPdfHeader(this.context.getMeta())); - source.addMetaData("flowdepthdevelopment_header", SInfoResultType.flowdepthDevelopment.getPdfHeader(this.context.getMeta())); - source.addMetaData("flowdepthdevelopmentperyear_header", SInfoResultType.flowdepthDevelopmentPerYear.getPdfHeader(this.context.getMeta())); - - source.addMetaData("waterleveldifference_header", SInfoResultType.waterlevelDifference.getPdfHeader(this.context.getMeta())); - source.addMetaData("waterleveldifference_header2", result.getWaterlevelDifferenceLabel()); - - source.addMetaData("bedheightdifference_header", SInfoResultType.bedHeightDifference.getPdfHeader(this.context.getMeta())); - source.addMetaData("bedheightdifference_header2", result.getBedHeightDifferenceLabel()); - - source.addMetaData("flowdepthcurrent_header", SInfoResultType.flowdepthCurrent.getPdfHeader(this.context.getMeta())); - source.addMetaData("flowdepthcurrent_header2", result.getFlowDepthCurrentLabel()); - - source.addMetaData("flowdepthhistorical_header", SInfoResultType.flowdepthHistorical.getPdfHeader(this.context.getMeta())); - source.addMetaData("flowdepthhistorical_header2", result.getFlowDepthHistoricalLabel()); - - source.addMetaData("location_header", SInfoResultType.location.getPdfHeader(this.context.getMeta())); - } - - @Override - protected void writePDF(final OutputStream out) { + protected void doWritePdf(final OutputStream out, final FlowDepthDevelopmentCalculationResults results) { + // TODO: Move to super //2 lines different try { - final MetaAndTableJRDataSource source = createJRData(this.data); + final ExportContextCSV exportContextCSV = new ExportContextCSV(this.context, null); final JasperReporter reporter = new JasperReporter(); - reporter.addReport(JASPER_FILE, source); + + for (final AbstractCalculationExportableResult result : results.getResults()) { + final MetaAndTableJRDataSource source = new MetaAndTableJRDataSource(); + getHelper().addJRMetaDataUSINFO(source, results); + + // move somewhere? global meta + source.addMetaData("flowdepthdevelopment", result.getLabel()); + source.addMetaData("flowdepthdevelopment_header_label", SInfoResultType.flowdepthDevelopment.getCsvHeader(this.context.getMeta()));// (this.context.getMeta())); + + result.addReport(exportContextCSV, results, reporter, source); + } + reporter.exportPDF(out); } catch (final JRException je) { getLog().warn("Error generating PDF Report!", je); } } - } \ No newline at end of file diff -r 5be112fba832 -r 23945061daec artifacts/src/main/java/org/dive4elements/river/artifacts/sinfo/flowdepthdev/FlowDepthDevelopmentState.java --- a/artifacts/src/main/java/org/dive4elements/river/artifacts/sinfo/flowdepthdev/FlowDepthDevelopmentState.java Thu Jun 14 15:12:25 2018 +0200 +++ b/artifacts/src/main/java/org/dive4elements/river/artifacts/sinfo/flowdepthdev/FlowDepthDevelopmentState.java Thu Jun 14 16:56:31 2018 +0200 @@ -78,6 +78,7 @@ final FlowDepthDevelopmentCalculationResults results = (FlowDepthDevelopmentCalculationResults) res.getData(); final FlowDepthDevelopmentCalculationResult result = results.getResult(); if (result != null) { + // final FlowDepthDevelopmentCalculationResult result = (FlowDepthDevelopmentCalculationResult) resultList.get(0); /* add themes for chart, for each result */ final int index = 0; diff -r 5be112fba832 -r 23945061daec artifacts/src/main/java/org/dive4elements/river/artifacts/sinfo/flowdepthminmax/FlowDepthMinMaxCalculationResult.java --- a/artifacts/src/main/java/org/dive4elements/river/artifacts/sinfo/flowdepthminmax/FlowDepthMinMaxCalculationResult.java Thu Jun 14 15:12:25 2018 +0200 +++ b/artifacts/src/main/java/org/dive4elements/river/artifacts/sinfo/flowdepthminmax/FlowDepthMinMaxCalculationResult.java Thu Jun 14 16:56:31 2018 +0200 @@ -9,11 +9,17 @@ */ package org.dive4elements.river.artifacts.sinfo.flowdepthminmax; +import java.util.ArrayList; import java.util.Collection; +import org.dive4elements.river.artifacts.common.AbstractCalculationExportableResult; +import org.dive4elements.river.artifacts.common.ExportContextCSV; +import org.dive4elements.river.artifacts.common.GeneralResultType; +import org.dive4elements.river.artifacts.common.MetaAndTableJRDataSource; import org.dive4elements.river.artifacts.common.ResultRow; -import org.dive4elements.river.artifacts.sinfo.common.AbstractSInfoCalculationResult; +import org.dive4elements.river.artifacts.sinfo.common.SInfoResultType; import org.dive4elements.river.artifacts.sinfo.util.BedHeightInfo; +import org.dive4elements.river.artifacts.sinfo.util.RiverInfo; import org.dive4elements.river.artifacts.sinfo.util.WstInfo; /** @@ -21,20 +27,112 @@ * * @author Gernot Belger */ -final class FlowDepthMinMaxCalculationResult extends AbstractSInfoCalculationResult { +final class FlowDepthMinMaxCalculationResult extends AbstractCalculationExportableResult { private static final long serialVersionUID = 1L; + private static final String JASPER_FILE = "/jasper/templates/sinfo.flowdepthminmax.jrxml"; private final BedHeightInfo sounding; + private final WstInfo wst; - public FlowDepthMinMaxCalculationResult(final String label, final WstInfo wst, final BedHeightInfo sounding, - final Collection rows) { - super(label, wst, rows); - + public FlowDepthMinMaxCalculationResult(final String label, final WstInfo wst, final BedHeightInfo sounding, final Collection rows) { + super(label, rows); + this.wst = wst; this.sounding = sounding; } public BedHeightInfo getSounding() { return this.sounding; } + + @Override + public void writeCSVHeader(final ExportContextCSV exportContextCSV, final FlowDepthMinMaxCalculationResults results, final RiverInfo river) { + + final Collection header = new ArrayList<>(11); + + header.add(exportContextCSV.formatCsvHeader(GeneralResultType.station)); + header.add(exportContextCSV.msgUnitCSV(SInfoResultType.flowdepthmin)); + header.add(exportContextCSV.msgUnitCSV(SInfoResultType.flowdepthmax)); + header.add(exportContextCSV.msgUnitCSV(SInfoResultType.waterlevel, river.getWstUnit())); + header.add(exportContextCSV.msgUnitCSV(SInfoResultType.discharge)); + header.add(exportContextCSV.formatCsvHeader(SInfoResultType.waterlevelLabel)); + header.add(exportContextCSV.formatCsvHeader(SInfoResultType.gaugeLabel)); + header.add(exportContextCSV.msgUnitCSV(SInfoResultType.meanBedHeight, river.getWstUnit())); + header.add(exportContextCSV.formatCsvHeader(SInfoResultType.soundingLabel)); + header.add(exportContextCSV.formatCsvHeader(SInfoResultType.location)); + + exportContextCSV.writeCSVLine(header.toArray(new String[header.size()])); + + } + + @Override + protected void writeCSVResultMetadata(final ExportContextCSV exportContextCSV, final FlowDepthMinMaxCalculationResults results) { + + exportContextCSV.writeCSVSoundingMetadata(this.sounding); + exportContextCSV.writeBlankLine(); + + exportContextCSV.writeCSVWaterlevelMetadata(this.wst); + exportContextCSV.writeBlankLine(); + + } + + @Override + protected String[] formatCSVRow(final ExportContextCSV exportContextCSV, final FlowDepthMinMaxCalculationResults results, final ResultRow row) { + + return formatRow(exportContextCSV, results, row); + } + + @Override + protected String[] formatPDFRow(final ExportContextCSV exportContextPDF, final FlowDepthMinMaxCalculationResults results, final ResultRow row) { + + return formatRow(exportContextPDF, results, row); + } + + @Override + protected String getJasperFile() { + return this.JASPER_FILE; + } + + @Override + protected void addJRTableHeader(final ExportContextCSV exportContextPDF, final MetaAndTableJRDataSource source, + final FlowDepthMinMaxCalculationResults results) { + + /* column headings */ + exportContextPDF.addJRMetadata(source, "station_header", GeneralResultType.station); + exportContextPDF.addJRMetadata(source, "flowdepthmin_header", SInfoResultType.flowdepthmin); + exportContextPDF.addJRMetadata(source, "flowdepthmax_header", SInfoResultType.flowdepthmax); + exportContextPDF.addJRMetadata(source, "waterlevel_header", SInfoResultType.waterlevel); + exportContextPDF.addJRMetadata(source, "discharge_header", SInfoResultType.discharge); + exportContextPDF.addJRMetadata(source, "waterlevel_name_header", SInfoResultType.waterlevelLabel); + exportContextPDF.addJRMetadata(source, "gauge_header", SInfoResultType.gaugeLabel); + exportContextPDF.addJRMetadata(source, "bedheight_header", SInfoResultType.meanBedHeight); + exportContextPDF.addJRMetadata(source, "sounding_name_header", SInfoResultType.soundingLabel); + exportContextPDF.addJRMetadata(source, "location_header", SInfoResultType.location); + + } + + protected String[] formatRow(final ExportContextCSV exportContextCSV, final FlowDepthMinMaxCalculationResults results, final ResultRow row) { + + final Collection lines = new ArrayList<>(10); + + lines.add(exportContextCSV.formatRowValue(row, GeneralResultType.station)); + + // REMARK: null check as pdf will call this with null and in that case we show all columns (to avoid multiple jasper + // FIXME: does not work like this: we may have several pairs of min/max; so we need to look at all of them? + // templates) + // if (result == null || result.getMinSounding() != null) + lines.add(exportContextCSV.formatRowValue(row, SInfoResultType.flowdepthmin)); + // if (result == null || result.getMaxSounding() != null) + lines.add(exportContextCSV.formatRowValue(row, SInfoResultType.flowdepthmax)); + + lines.add(exportContextCSV.formatRowValue(row, SInfoResultType.waterlevel)); + lines.add(exportContextCSV.formatRowValue(row, SInfoResultType.discharge)); + lines.add(exportContextCSV.formatRowValue(row, SInfoResultType.waterlevelLabel)); + lines.add(exportContextCSV.formatRowValue(row, SInfoResultType.gaugeLabel)); + lines.add(exportContextCSV.formatRowValue(row, SInfoResultType.meanBedHeight)); + lines.add(exportContextCSV.formatRowValue(row, SInfoResultType.soundingLabel)); + lines.add(exportContextCSV.formatRowValue(row, SInfoResultType.location)); + + return lines.toArray(new String[lines.size()]); + } } \ No newline at end of file diff -r 5be112fba832 -r 23945061daec artifacts/src/main/java/org/dive4elements/river/artifacts/sinfo/flowdepthminmax/FlowDepthMinMaxCalculationResults.java --- a/artifacts/src/main/java/org/dive4elements/river/artifacts/sinfo/flowdepthminmax/FlowDepthMinMaxCalculationResults.java Thu Jun 14 15:12:25 2018 +0200 +++ b/artifacts/src/main/java/org/dive4elements/river/artifacts/sinfo/flowdepthminmax/FlowDepthMinMaxCalculationResults.java Thu Jun 14 16:56:31 2018 +0200 @@ -10,13 +10,14 @@ package org.dive4elements.river.artifacts.sinfo.flowdepthminmax; import org.apache.commons.lang.math.DoubleRange; -import org.dive4elements.river.artifacts.sinfo.common.AbstractSInfoCalculationResults; +import org.dive4elements.river.artifacts.common.AbstractCalculationExportableResult; +import org.dive4elements.river.artifacts.common.AbstractCalculationListResults; import org.dive4elements.river.artifacts.sinfo.util.RiverInfo; /** * @author Gernot Belger */ -final class FlowDepthMinMaxCalculationResults extends AbstractSInfoCalculationResults { +final class FlowDepthMinMaxCalculationResults extends AbstractCalculationListResults> { private static final long serialVersionUID = 1L; diff -r 5be112fba832 -r 23945061daec artifacts/src/main/java/org/dive4elements/river/artifacts/sinfo/flowdepthminmax/FlowDepthMinMaxExporter.java --- a/artifacts/src/main/java/org/dive4elements/river/artifacts/sinfo/flowdepthminmax/FlowDepthMinMaxExporter.java Thu Jun 14 15:12:25 2018 +0200 +++ b/artifacts/src/main/java/org/dive4elements/river/artifacts/sinfo/flowdepthminmax/FlowDepthMinMaxExporter.java Thu Jun 14 16:56:31 2018 +0200 @@ -9,19 +9,13 @@ package org.dive4elements.river.artifacts.sinfo.flowdepthminmax; import java.io.OutputStream; -import java.util.ArrayList; -import java.util.Collection; -import org.apache.log4j.Logger; -import org.dive4elements.river.artifacts.common.GeneralResultType; +import org.dive4elements.river.artifacts.common.AbstractCalculationExportableResult; +import org.dive4elements.river.artifacts.common.AbstractCommonExporter; +import org.dive4elements.river.artifacts.common.ExportContextCSV; import org.dive4elements.river.artifacts.common.JasperReporter; import org.dive4elements.river.artifacts.common.MetaAndTableJRDataSource; -import org.dive4elements.river.artifacts.common.ResultRow; -import org.dive4elements.river.artifacts.sinfo.common.AbstractSInfoExporter; -import org.dive4elements.river.artifacts.sinfo.common.SInfoResultType; -import org.dive4elements.river.artifacts.sinfo.util.BedHeightInfo; import org.dive4elements.river.artifacts.sinfo.util.RiverInfo; -import org.dive4elements.river.artifacts.sinfo.util.WstInfo; import au.com.bytecode.opencsv.CSVWriter; import net.sf.jasperreports.engine.JRException; @@ -33,122 +27,23 @@ * @author Gernot Belger */ // REMARK: must be public because its registered in generators.xml -public class FlowDepthMinMaxExporter extends AbstractSInfoExporter { - - /** The log used in this exporter. */ - private static Logger log = Logger.getLogger(FlowDepthMinMaxExporter.class); - - private static final String JASPER_FILE = "/jasper/templates/sinfo.flowdepthminmax.jrxml"; - - @Override - protected Logger getLog() { - return log; - } - - @Override - protected void writeCSVResultMetadata(final CSVWriter writer, final FlowDepthMinMaxCalculationResults results, - final FlowDepthMinMaxCalculationResult result) { - - final BedHeightInfo sounding = result.getSounding(); - super.writeCSVSoundingMetadata(writer, sounding); - writer.writeNext(new String[] { "" }); // break line - final WstInfo wst = result.getWst(); - writeCSVWaterlevelMetadata(writer, wst); - writer.writeNext(new String[] { "" }); // break line - } +public class FlowDepthMinMaxExporter extends AbstractCommonExporter { @Override - protected void writeCSVGlobalMetadata(final CSVWriter writer, final FlowDepthMinMaxCalculationResults results) { - - super.writeCSVGlobalMetadataDefaults(writer, results); - } - - /** - * Write the header, with different headings depending on whether at a - * gauge or at a location. - * - * @param river - * @param useTkh - */ - @Override - protected void writeCSVHeader(final CSVWriter writer, final FlowDepthMinMaxCalculationResults results, final RiverInfo river) { - log.info("FlowDepthExporter.writeCSVHeader"); - - final Collection header = new ArrayList<>(11); - - header.add(msg(GeneralResultType.station.getCsvHeader())); - header.add(msgUnit(SInfoResultType.flowdepthmin.getCsvHeader(), SInfoResultType.flowdepthmin.getUnit())); - header.add(msgUnit(SInfoResultType.flowdepthmax.getCsvHeader(), SInfoResultType.flowdepthmax.getUnit())); - header.add(msgUnit(SInfoResultType.waterlevel.getCsvHeader(), river.getWstUnit())); - header.add(msgUnit(SInfoResultType.discharge.getCsvHeader(), SInfoResultType.discharge.getUnit())); - header.add(msg(SInfoResultType.waterlevelLabel.getCsvHeader())); - header.add(msg(SInfoResultType.gaugeLabel.getCsvHeader())); - header.add(msgUnit(SInfoResultType.meanBedHeight.getCsvHeader(), river.getWstUnit())); - header.add(msg(SInfoResultType.soundingLabel.getCsvHeader())); - header.add(msg(SInfoResultType.location.getCsvHeader())); - - writer.writeNext(header.toArray(new String[header.size()])); - } - - /** - * Format a row of a flow depth result into an array of string, both used by csv and pdf - * - * @param result - * - * @param useTkh - */ - @Override - protected String[] formatRow(final FlowDepthMinMaxCalculationResults results, final ResultRow row, final ExportMode mode) { - - final Collection lines = new ArrayList<>(10); - - lines.add(row.exportValue(this.context, GeneralResultType.station)); - - // REMARK: null check as pdf will call this with null and in that case we show all columns (to avoid multiple jasper - // FIXME: does not work like this: we may have several pairs of min/max; so we need to look at all of them? - // templates) - // if (result == null || result.getMinSounding() != null) - lines.add(row.exportValue(this.context, SInfoResultType.flowdepthmin)); - // if (result == null || result.getMaxSounding() != null) - lines.add(row.exportValue(this.context, SInfoResultType.flowdepthmax)); - - lines.add(row.exportValue(this.context, SInfoResultType.waterlevel)); - lines.add(row.exportValue(this.context, SInfoResultType.discharge)); - lines.add(row.exportValue(this.context, SInfoResultType.waterlevelLabel)); - lines.add(row.exportValue(this.context, SInfoResultType.gaugeLabel)); - lines.add(row.exportValue(this.context, SInfoResultType.meanBedHeight)); - lines.add(row.exportValue(this.context, SInfoResultType.soundingLabel)); - lines.add(row.exportValue(this.context, SInfoResultType.location)); - - return lines.toArray(new String[lines.size()]); - } - - @Override - protected final void addJRMetaData(final MetaAndTableJRDataSource source, final FlowDepthMinMaxCalculationResults results) { - - /* general metadata */ - super.addJRMetaData(source, results); - - /* column headings */ - source.addMetaData("station_header", GeneralResultType.station.getPdfHeader(this.context.getMeta())); - source.addMetaData("flowdepthmin_header", SInfoResultType.flowdepthmin.getPdfHeader(this.context.getMeta())); - source.addMetaData("flowdepthmax_header", SInfoResultType.flowdepthmax.getPdfHeader(this.context.getMeta())); - source.addMetaData("waterlevel_header", SInfoResultType.waterlevel.getPdfHeader(this.context.getMeta())); - source.addMetaData("discharge_header", SInfoResultType.discharge.getPdfHeader(this.context.getMeta())); - source.addMetaData("waterlevel_name_header", SInfoResultType.waterlevelLabel.getPdfHeader(this.context.getMeta())); - source.addMetaData("gauge_header", SInfoResultType.gaugeLabel.getPdfHeader(this.context.getMeta())); - source.addMetaData("bedheight_header", SInfoResultType.meanBedHeight.getPdfHeader(this.context.getMeta())); - source.addMetaData("sounding_name_header", SInfoResultType.soundingLabel.getPdfHeader(this.context.getMeta())); - source.addMetaData("location_header", SInfoResultType.location.getPdfHeader(this.context.getMeta())); - } - - @Override - protected void writePDF(final OutputStream out) { + protected void doWritePdf(final OutputStream out, final FlowDepthMinMaxCalculationResults results) { + // TODO: Move to super try { - final MetaAndTableJRDataSource source = createJRData(this.data); + final ExportContextCSV exportContextCSV = new ExportContextCSV(this.context, null); final JasperReporter reporter = new JasperReporter(); - reporter.addReport(JASPER_FILE, source); + + for (final AbstractCalculationExportableResult result : results.getResults()) { + final MetaAndTableJRDataSource source = new MetaAndTableJRDataSource(); + getHelper().addJRMetaDataUSINFO(source, results); + + result.addReport(exportContextCSV, results, reporter, source); + } + reporter.exportPDF(out); } catch (final JRException je) { @@ -156,4 +51,36 @@ } } + @Override + protected void doWriteCSVData(final CSVWriter writer, final FlowDepthMinMaxCalculationResults results) { + // TODO: Diesen Ablauf in super? + + // TODO: move results into context? + final ExportContextCSV exportContextCSV = new ExportContextCSV(this.context, writer); + + getLog().info("writeCSVData"); + + /* write as csv */ + exportContextCSV.writeCSVGlobalMetadataDefaults(results); // ggf auslagern innerhalb dieser Klasse + + // writer.writeNext(new String[] { "" }); // break line HERE to avoid redundance + + final RiverInfo river = results.getRiver(); + + final Class lastResultType = null; + + for (final AbstractCalculationExportableResult result : results.getResults()) { + + final Class resultType = result.getClass(); + if (lastResultType == null || lastResultType != resultType) { + exportContextCSV.writeBlankLine(); + result.writeCSVHeader(exportContextCSV, results, river); + exportContextCSV.writeBlankLine(); + } else + exportContextCSV.writeCSVLine(new String[] { "#" }); + + result.writeCsv(exportContextCSV, results); + } + + } } \ No newline at end of file diff -r 5be112fba832 -r 23945061daec artifacts/src/main/java/org/dive4elements/river/artifacts/sinfo/flowdepthminmax/FlowDepthMinMaxState.java --- a/artifacts/src/main/java/org/dive4elements/river/artifacts/sinfo/flowdepthminmax/FlowDepthMinMaxState.java Thu Jun 14 15:12:25 2018 +0200 +++ b/artifacts/src/main/java/org/dive4elements/river/artifacts/sinfo/flowdepthminmax/FlowDepthMinMaxState.java Thu Jun 14 16:56:31 2018 +0200 @@ -14,6 +14,7 @@ import org.dive4elements.artifacts.CallContext; import org.dive4elements.river.artifacts.ChartArtifact; import org.dive4elements.river.artifacts.D4EArtifact; +import org.dive4elements.river.artifacts.common.AbstractCalculationExportableResult; import org.dive4elements.river.artifacts.model.Calculation; import org.dive4elements.river.artifacts.model.CalculationResult; import org.dive4elements.river.artifacts.model.DataFacet; @@ -76,10 +77,10 @@ final FlowDepthMinMaxCalculationResults results = (FlowDepthMinMaxCalculationResults) res.getData(); /* add themes for chart, for each result */ - final List resultList = results.getResults(); + final List> resultList = results.getResults(); for (int index = 0; index < resultList.size(); index++) { - final FlowDepthMinMaxCalculationResult result = resultList.get(index); + final FlowDepthMinMaxCalculationResult result = (FlowDepthMinMaxCalculationResult) resultList.get(index); /* filtered (zoom dependent mean) flow depth */ facets.add(FlowDepthProcessor.createFlowDepthMinFilteredFacet(context, hash, this.id, result, index)); diff -r 5be112fba832 -r 23945061daec artifacts/src/main/java/org/dive4elements/river/artifacts/sinfo/tkhstate/TkhCalculationResult.java --- a/artifacts/src/main/java/org/dive4elements/river/artifacts/sinfo/tkhstate/TkhCalculationResult.java Thu Jun 14 15:12:25 2018 +0200 +++ b/artifacts/src/main/java/org/dive4elements/river/artifacts/sinfo/tkhstate/TkhCalculationResult.java Thu Jun 14 16:56:31 2018 +0200 @@ -9,10 +9,16 @@ */ package org.dive4elements.river.artifacts.sinfo.tkhstate; +import java.util.ArrayList; import java.util.Collection; +import org.dive4elements.river.artifacts.common.AbstractCalculationExportableResult; +import org.dive4elements.river.artifacts.common.ExportContextCSV; +import org.dive4elements.river.artifacts.common.GeneralResultType; +import org.dive4elements.river.artifacts.common.MetaAndTableJRDataSource; import org.dive4elements.river.artifacts.common.ResultRow; -import org.dive4elements.river.artifacts.sinfo.common.AbstractTkhCalculationResult; +import org.dive4elements.river.artifacts.sinfo.common.SInfoResultType; +import org.dive4elements.river.artifacts.sinfo.util.RiverInfo; import org.dive4elements.river.artifacts.sinfo.util.WstInfo; /** @@ -20,11 +26,109 @@ * * @author Gernot Belger */ -final class TkhCalculationResult extends AbstractTkhCalculationResult { +final class TkhCalculationResult extends AbstractCalculationExportableResult { private static final long serialVersionUID = 1L; + private static final String JASPER_FILE = "/jasper/templates/sinfo.tkh.jrxml"; + private final boolean hasTkh; + private final WstInfo wst; + + private enum ExportMode { + pdf, csv + } public TkhCalculationResult(final String label, final WstInfo wst, final boolean hasTkh, final Collection rows) { - super(label, wst, hasTkh, rows); + super(label, rows); + this.hasTkh = hasTkh; + this.wst = wst; } + + @Override + public void writeCSVHeader(final ExportContextCSV exportContextCSV, final TkhCalculationResults results, final RiverInfo river) { + + final Collection header = new ArrayList<>(11); + + header.add(exportContextCSV.formatCsvHeader(GeneralResultType.station)); + header.add(exportContextCSV.msgUnitCSV(SInfoResultType.tkh)); + header.add(exportContextCSV.formatCsvHeader(SInfoResultType.soilkind)); + header.add(exportContextCSV.msgUnitCSV(SInfoResultType.meanBedHeight, river.getWstUnit())); + header.add(exportContextCSV.msgUnitCSV(SInfoResultType.waterlevel, river.getWstUnit())); + header.add(exportContextCSV.msgUnitCSV(SInfoResultType.discharge)); + + final String descriptionHeader = results.getDescriptionHeader(); + if (descriptionHeader != null) + header.add(descriptionHeader); + + header.add(exportContextCSV.formatCsvHeader(SInfoResultType.gaugeLabel)); + header.add(exportContextCSV.formatCsvHeader(SInfoResultType.location)); + + exportContextCSV.writeCSVLine(header.toArray(new String[header.size()])); + + } + + @Override + protected void writeCSVResultMetadata(final ExportContextCSV exportContextCSV, final TkhCalculationResults results) { + exportContextCSV.writeCSVWaterlevelMetadata(this.wst); + exportContextCSV.writeBlankLine(); + } + + @Override + protected String[] formatCSVRow(final ExportContextCSV exportContextCSV, final TkhCalculationResults results, final ResultRow row) { + + return this.formatRow(exportContextCSV, results, row, ExportMode.csv); + } + + @Override + protected String[] formatPDFRow(final ExportContextCSV exportContextPDF, final TkhCalculationResults results, final ResultRow row) { + + return this.formatRow(exportContextPDF, results, row, ExportMode.pdf); + } + + @Override + protected String getJasperFile() { + return JASPER_FILE; + } + + @Override + protected void addJRTableHeader(final ExportContextCSV exportContextPDF, final MetaAndTableJRDataSource source, final TkhCalculationResults results) { + /* column headings */ + exportContextPDF.addJRMetadata(source, "station_header", GeneralResultType.station); + exportContextPDF.addJRMetadata(source, "tkh_header", SInfoResultType.tkh); + exportContextPDF.addJRMetadata(source, "tkhkind_header", SInfoResultType.soilkind); + exportContextPDF.addJRMetadata(source, "bedheight_header", SInfoResultType.meanBedHeight); + exportContextPDF.addJRMetadata(source, "waterlevel_header", SInfoResultType.waterlevel); + exportContextPDF.addJRMetadata(source, "discharge_header", SInfoResultType.discharge); + + // REMARK: actually the column makes no sense if description header is null. But (software symmetry...) WINFO also + // writes an empty column into the pdf in that case (most probably to avoid the need for two jasper templates). + final String descriptionHeader = results.getDescriptionHeader(); + final String waterlevelNameHeader = descriptionHeader == null ? exportContextPDF.msgPdf(SInfoResultType.waterlevelLabel) : descriptionHeader; + exportContextPDF.addJRMetadata(source, "waterlevel_name_header", waterlevelNameHeader); + + exportContextPDF.addJRMetadata(source, "gauge_header", SInfoResultType.gaugeLabel); + exportContextPDF.addJRMetadata(source, "location_header", SInfoResultType.location); + + } + + private String[] formatRow(final ExportContextCSV exportContext, final TkhCalculationResults results, final ResultRow row, final ExportMode mode) { + + final Collection lines = new ArrayList<>(11); + + lines.add(exportContext.formatRowValue(row, GeneralResultType.station)); + lines.add(exportContext.formatRowValue(row, SInfoResultType.tkh)); + lines.add(exportContext.formatRowValue(row, SInfoResultType.soilkind)); + lines.add(exportContext.formatRowValue(row, SInfoResultType.meanBedHeight)); + lines.add(exportContext.formatRowValue(row, SInfoResultType.waterlevel)); + lines.add(exportContext.formatRowValue(row, SInfoResultType.discharge)); + + // REMARK: always export this column in pdf-mode, because WInfo also does it (no need for two jasper-templates). + if (results.getDescriptionHeader() != null || mode == ExportMode.pdf) + lines.add(exportContext.formatRowValue(row, SInfoResultType.waterlevelLabel)); + + lines.add(exportContext.formatRowValue(row, SInfoResultType.gaugeLabel)); + lines.add(exportContext.formatRowValue(row, SInfoResultType.location)); + + return lines.toArray(new String[lines.size()]); + } + } \ No newline at end of file diff -r 5be112fba832 -r 23945061daec artifacts/src/main/java/org/dive4elements/river/artifacts/sinfo/tkhstate/TkhCalculationResults.java --- a/artifacts/src/main/java/org/dive4elements/river/artifacts/sinfo/tkhstate/TkhCalculationResults.java Thu Jun 14 15:12:25 2018 +0200 +++ b/artifacts/src/main/java/org/dive4elements/river/artifacts/sinfo/tkhstate/TkhCalculationResults.java Thu Jun 14 16:56:31 2018 +0200 @@ -10,13 +10,14 @@ package org.dive4elements.river.artifacts.sinfo.tkhstate; import org.apache.commons.lang.math.DoubleRange; -import org.dive4elements.river.artifacts.sinfo.common.AbstractSInfoCalculationResults; +import org.dive4elements.river.artifacts.common.AbstractCalculationExportableResult; +import org.dive4elements.river.artifacts.common.AbstractCalculationListResults; import org.dive4elements.river.artifacts.sinfo.util.RiverInfo; /** * @author Gernot Belger */ -final class TkhCalculationResults extends AbstractSInfoCalculationResults { +final class TkhCalculationResults extends AbstractCalculationListResults> { private static final long serialVersionUID = 1L; diff -r 5be112fba832 -r 23945061daec artifacts/src/main/java/org/dive4elements/river/artifacts/sinfo/tkhstate/TkhExporter.java --- a/artifacts/src/main/java/org/dive4elements/river/artifacts/sinfo/tkhstate/TkhExporter.java Thu Jun 14 15:12:25 2018 +0200 +++ b/artifacts/src/main/java/org/dive4elements/river/artifacts/sinfo/tkhstate/TkhExporter.java Thu Jun 14 16:56:31 2018 +0200 @@ -9,18 +9,13 @@ package org.dive4elements.river.artifacts.sinfo.tkhstate; import java.io.OutputStream; -import java.util.ArrayList; -import java.util.Collection; -import org.apache.log4j.Logger; -import org.dive4elements.river.artifacts.common.GeneralResultType; +import org.dive4elements.river.artifacts.common.AbstractCalculationExportableResult; +import org.dive4elements.river.artifacts.common.AbstractCommonExporter; +import org.dive4elements.river.artifacts.common.ExportContextCSV; import org.dive4elements.river.artifacts.common.JasperReporter; import org.dive4elements.river.artifacts.common.MetaAndTableJRDataSource; -import org.dive4elements.river.artifacts.common.ResultRow; -import org.dive4elements.river.artifacts.sinfo.common.AbstractSInfoExporter; -import org.dive4elements.river.artifacts.sinfo.common.SInfoResultType; import org.dive4elements.river.artifacts.sinfo.util.RiverInfo; -import org.dive4elements.river.artifacts.sinfo.util.WstInfo; import au.com.bytecode.opencsv.CSVWriter; import net.sf.jasperreports.engine.JRException; @@ -31,147 +26,67 @@ * @author Gernot Belger */ // REMARK: must be public because its registered in generators.xml -public class TkhExporter extends AbstractSInfoExporter { - - /** The log used in this exporter. */ - private static Logger log = Logger.getLogger(TkhExporter.class); +public class TkhExporter extends AbstractCommonExporter { private static final String CSV_META_CALCULATION_FORMULA = "sinfo.export.tkh.calculation.formula"; - private static final String JASPER_FILE = "/jasper/templates/sinfo.tkh.jrxml"; - - @Override - protected Logger getLog() { - return log; - } - - @Override - protected void writeCSVGlobalMetadata(final CSVWriter writer, final TkhCalculationResults results) { - log.info("TkhExporter.writeCSVMeta"); - - super.writeCSVGlobalMetadataDefaults(writer, results); - - // "# Berechnungsgrundlage: Gleichung nach GILL (1971)" - writeCSVMetaEntry(writer, CSV_META_CALCULATION_FORMULA); - } - - /** - * Write the header, with different headings depending on whether at a gauge or at a location. - */ - - @Override - protected void writeCSVHeader(final CSVWriter writer, final TkhCalculationResults results, final RiverInfo river) { - log.info("TkhExporter.writeCSVHeader"); - - final Collection header = new ArrayList<>(11); - - header.add(msg(GeneralResultType.station.getCsvHeader())); - header.add(msgUnit(SInfoResultType.tkh.getCsvHeader(), SInfoResultType.tkh.getUnit())); - header.add(msg(SInfoResultType.soilkind.getCsvHeader())); - header.add(msgUnit(SInfoResultType.meanBedHeight.getCsvHeader(), river.getWstUnit())); - header.add(msgUnit(SInfoResultType.waterlevel.getCsvHeader(), river.getWstUnit())); - header.add(msgUnit(SInfoResultType.discharge.getCsvHeader(), SInfoResultType.discharge.getUnit())); - - final String descriptionHeader = results.getDescriptionHeader(); - if (descriptionHeader != null) - header.add(msg(descriptionHeader)); - - header.add(msg(SInfoResultType.gaugeLabel.getCsvHeader())); - header.add(msg(SInfoResultType.location.getCsvHeader())); - - writer.writeNext(header.toArray(new String[header.size()])); - } - @Override - protected void writeCSVResultMetadata(final CSVWriter writer, final TkhCalculationResults results, final TkhCalculationResult result) { - - final WstInfo wst = result.getWst(); - super.writeCSVWaterlevelMetadata(writer, wst); - - // REAMRK: - // "# W/Pegel [cm]: " (nur bei Eingabe des Wasserstands am Pegel) - // "# Q (m³/s): " (nur bei Eingabe des Durchflusses) - // WaterlevelEXporter does this - // final WaterlevelDescriptionBuilder descBuilder = new WaterlevelDescriptionBuilder((D4EArtifact) this.master, - // this.context); - // final String metadata = descBuilder.getMetadata(); - // BUT: - // - the WINFO results do not contain this info per wst - // - the WaterlevelExporter prints this in the global header for all waterlevels, simply based on the input fields - // - instead we would want tis information per waterlevel - // - the metadata 'Bezeichnung WST' contains exactly the wanted data - - writer.writeNext(new String[] { "" }); // break line - } - - /** - * Format a row of a flow depth result into an array of string, both used by csv and pdf - * - * @param results - * - * @param useTkh - */ - @Override - protected String[] formatRow(final TkhCalculationResults results, final ResultRow row, final ExportMode mode) { - - final Collection lines = new ArrayList<>(11); - - lines.add(row.exportValue(this.context, GeneralResultType.station)); - lines.add(row.exportValue(this.context, SInfoResultType.tkh)); - lines.add(row.exportValue(this.context, SInfoResultType.soilkind)); - lines.add(row.exportValue(this.context, SInfoResultType.meanBedHeight)); - lines.add(row.exportValue(this.context, SInfoResultType.waterlevel)); - lines.add(row.exportValue(this.context, SInfoResultType.discharge)); - - // REMARK: always export this column in pdf-mode, because WInfo also does it (no need for two jasper-templates). - if (results.getDescriptionHeader() != null || mode == ExportMode.pdf) - lines.add(row.exportValue(this.context, SInfoResultType.waterlevelLabel)); - - lines.add(row.exportValue(this.context, SInfoResultType.gaugeLabel)); - lines.add(row.exportValue(this.context, SInfoResultType.location)); - - return lines.toArray(new String[lines.size()]); - } - - @Override - protected final void addJRMetaData(final MetaAndTableJRDataSource source, final TkhCalculationResults results) { - - /* general metadata */ - super.addJRMetaData(source, results); - - source.addMetaData("calculation_label", msg("sinfo.export.flow_depth.pdf.meta.calculation.label")); - source.addMetaData("calculation_name", msg("sinfo.export.flow_depth.pdf.meta.calculation.name")); - - /* column headings */ - source.addMetaData("station_header", GeneralResultType.station.getPdfHeader(this.context.getMeta())); - source.addMetaData("tkh_header", SInfoResultType.tkh.getPdfHeader(this.context.getMeta())); - source.addMetaData("tkhkind_header", SInfoResultType.soilkind.getPdfHeader(this.context.getMeta())); - source.addMetaData("bedheight_header", SInfoResultType.meanBedHeight.getPdfHeader(this.context.getMeta())); - source.addMetaData("waterlevel_header", SInfoResultType.waterlevel.getPdfHeader(this.context.getMeta())); - source.addMetaData("discharge_header", SInfoResultType.discharge.getPdfHeader(this.context.getMeta())); - - // REMARK: actually the column makes no sense if description header is null. But (software symmetry...) WINFO also - // writes an empty column into the pdf in that case (most probably to avoid the need for two jasper templates). - final String descriptionHeader = results.getDescriptionHeader(); - final String waterlevelNameHeader = descriptionHeader == null ? SInfoResultType.waterlevelLabel.getPdfHeader(this.context.getMeta()) - : descriptionHeader; - source.addMetaData("waterlevel_name_header", waterlevelNameHeader); - - source.addMetaData("gauge_header", SInfoResultType.gaugeLabel.getPdfHeader(this.context.getMeta())); - source.addMetaData("location_header", SInfoResultType.location.getPdfHeader(this.context.getMeta())); - } - - @Override - protected void writePDF(final OutputStream out) { + protected void doWritePdf(final OutputStream out, final TkhCalculationResults results) { + // TODO: Move to super try { - final MetaAndTableJRDataSource source = createJRData(this.data); + final ExportContextCSV exportContextCSV = new ExportContextCSV(this.context, null); final JasperReporter reporter = new JasperReporter(); - reporter.addReport(JASPER_FILE, source); + + for (final AbstractCalculationExportableResult result : results.getResults()) { + final MetaAndTableJRDataSource source = new MetaAndTableJRDataSource(); + getHelper().addJRMetaDataUSINFO(source, results); + + source.addMetaData("calculation_label", msg("sinfo.export.flow_depth.pdf.meta.calculation.label")); + source.addMetaData("calculation_name", msg("sinfo.export.flow_depth.pdf.meta.calculation.name")); + + result.addReport(exportContextCSV, results, reporter, source); + } + reporter.exportPDF(out); } catch (final JRException je) { getLog().warn("Error generating PDF Report!", je); } } + + @Override + protected void doWriteCSVData(final CSVWriter writer, final TkhCalculationResults results) { + // TODO: Diesen Ablauf in super? _WINZIGE ABWEICHUNG vom Standard... + + // TODO: move results into context? + final ExportContextCSV exportContextCSV = new ExportContextCSV(this.context, writer); + + getLog().info("writeCSVData"); + + /* write as csv */ + exportContextCSV.writeCSVGlobalMetadataDefaults(results); // ggf auslagern innerhalb dieser Klasse + + // "# Berechnungsgrundlage: Gleichung nach GILL (1971)" + exportContextCSV.writeCSVMetaEntry(CSV_META_CALCULATION_FORMULA); + + // writer.writeNext(new String[] { "" }); // break line HERE to avoid redundance + + final RiverInfo river = results.getRiver(); + + final Class lastResultType = null; + + for (final AbstractCalculationExportableResult result : results.getResults()) { + + final Class resultType = result.getClass(); + if (lastResultType == null || lastResultType != resultType) { + exportContextCSV.writeBlankLine(); + result.writeCSVHeader(exportContextCSV, results, river); + exportContextCSV.writeBlankLine(); + } else + exportContextCSV.writeCSVLine(new String[] { "#" }); + + result.writeCsv(exportContextCSV, results); + } + } } \ No newline at end of file diff -r 5be112fba832 -r 23945061daec artifacts/src/main/java/org/dive4elements/river/artifacts/sinfo/tkhstate/TkhState.java --- a/artifacts/src/main/java/org/dive4elements/river/artifacts/sinfo/tkhstate/TkhState.java Thu Jun 14 15:12:25 2018 +0200 +++ b/artifacts/src/main/java/org/dive4elements/river/artifacts/sinfo/tkhstate/TkhState.java Thu Jun 14 16:56:31 2018 +0200 @@ -14,6 +14,7 @@ import org.dive4elements.artifacts.CallContext; import org.dive4elements.river.artifacts.ChartArtifact; import org.dive4elements.river.artifacts.D4EArtifact; +import org.dive4elements.river.artifacts.common.AbstractCalculationExportableResult; import org.dive4elements.river.artifacts.model.Calculation; import org.dive4elements.river.artifacts.model.CalculationResult; import org.dive4elements.river.artifacts.model.DataFacet; @@ -80,10 +81,10 @@ final TkhCalculationResults results = (TkhCalculationResults) res.getData(); /* add themes for chart, for each result */ - final List resultList = results.getResults(); + final List> resultList = results.getResults(); for (int index = 0; index < resultList.size(); index++) { - final TkhCalculationResult result = resultList.get(index); + final TkhCalculationResult result = (TkhCalculationResult) resultList.get(index); facets.add(TkhProcessor.createTkhFacet(context, hash, this.id, result, index)); diff -r 5be112fba832 -r 23945061daec artifacts/src/main/java/org/dive4elements/river/artifacts/uinfo/commons/AbstractUInfoExporter.java --- a/artifacts/src/main/java/org/dive4elements/river/artifacts/uinfo/commons/AbstractUInfoExporter.java Thu Jun 14 15:12:25 2018 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,121 +0,0 @@ -/** Copyright (C) 2017 by Bundesanstalt für Gewässerkunde - * 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) - * and comes with ABSOLUTELY NO WARRANTY! Check out the - * documentation coming with Dive4Elements River for details. - */ -package org.dive4elements.river.artifacts.uinfo.commons; - -import java.text.DateFormat; -import java.text.NumberFormat; -import java.util.Date; -import java.util.Locale; - -import org.apache.commons.lang.math.DoubleRange; -import org.dive4elements.river.FLYS; -import org.dive4elements.river.artifacts.common.AbstractCalculationResult; -import org.dive4elements.river.artifacts.common.AbstractCalculationResults; -import org.dive4elements.river.artifacts.common.AbstractCommonExporter; -import org.dive4elements.river.artifacts.common.I18NStrings; -import org.dive4elements.river.artifacts.common.MetaAndTableJRDataSource; -import org.dive4elements.river.artifacts.resources.Resources; -import org.dive4elements.river.artifacts.sinfo.util.RiverInfo; - -import au.com.bytecode.opencsv.CSVWriter; - -/** - * @author Gernot Belger - */ -public abstract class AbstractUInfoExporter> extends AbstractCommonExporter { - - @Override - protected void addJRMetaData(final MetaAndTableJRDataSource source, final RESULTS results) { - - /* general metadata */ - this.addJRMetaDataDefaults(source, results); - - /* general metadata */ - this.addJRMetaDataDefaults(source, results); - - final RiverInfo river = results.getRiver(); - final String wstUnitName = river.getWstUnit(); - - source.addMetaData("river_label", msg(I18NStrings.CSV_META_RIVER_LABEL)); - source.addMetaData("river", river.getName()); - source.addMetaData("river_unit", wstUnitName); - - source.addMetaData("range_label", msg(I18NStrings.CSV_META_RANGE_LABEL)); - final DoubleRange calcRange = results.getCalcRange(); - final NumberFormat kmFormatter = getKmFormatter(); - if (calcRange != null) { - final String rangeValue = String.format("%s - %s", kmFormatter.format(calcRange.getMinimumDouble()), - kmFormatter.format(calcRange.getMaximumDouble())); - source.addMetaData("range", rangeValue); - } - - /* column headings */ - // source.addMetaData("station_header", GeneralResultType.station.getPdfHeader(this.context.getMeta())); // moved to - // super - - // TODO: move to subs - // source.addMetaData("flowdepth_header", SInfoResultType.flowdepth.getPdfHeader(this.context.getMeta())); - // source.addMetaData("flowdepth_tkh_header", SInfoResultType.flowdepthtkh.getPdfHeader(this.context.getMeta())); - // source.addMetaData("tkh_header", SInfoResultType.tkh.getPdfHeader(this.context.getMeta())); - // source.addMetaData("waterlevel_header", SInfoResultType.waterlevel.getPdfHeader(this.context.getMeta())); - // source.addMetaData("discharge_header", SInfoResultType.discharge.getPdfHeader(this.context.getMeta())); - - } - - @Override - protected void writeCSVGlobalMetadataDefaults(final CSVWriter writer, final RESULTS results) { - - final String calcModeLabel = results.getCalcModeLabel(); - final RiverInfo river = results.getRiver(); - final DoubleRange calcRange = results.getCalcRange(); - - writeCSVMetaEntry(writer, I18NStrings.CSV_META_HEADER_RESULT, msg(I18NStrings.CSV_META_HEADER_RESULT_LABEL), river.getName(), calcModeLabel); - - // "# FLYS-Version: " - writeCSVMetaEntry(writer, I18NStrings.CSV_META_VERSION, msg(I18NStrings.CSV_META_VERSION_LABEL), FLYS.VERSION); - - // "# Bearbeiter: " - writeCSVMetaEntry(writer, I18NStrings.CSV_META_USER, msg(I18NStrings.CSV_META_USER_LABEL), results.getUser()); - - // "# Datum der Erstellung: " - final Locale locale = Resources.getLocale(this.context.getMeta()); - final DateFormat df = DateFormat.getDateInstance(DateFormat.SHORT, locale); - writeCSVMetaEntry(writer, I18NStrings.CSV_META_CREATION, msg(I18NStrings.CSV_META_CREATION_LABEL), df.format(new Date())); - - // "# Gewässer: " - writeCSVMetaEntry(writer, I18NStrings.CSV_META_RIVER, msg(I18NStrings.CSV_META_RIVER_LABEL), river.getName()); - - if (calcRange != null) { - // "# Ort/Bereich (km): " - writeCSVMetaEntry(writer, I18NStrings.CSV_META_RANGE, msg(I18NStrings.CSV_META_RANGE_LABEL), getKmFormatter().format(calcRange.getMinimumDouble()), - getKmFormatter().format(calcRange.getMaximumDouble())); - } - } - - @Override - protected void addJRMetaDataDefaults(final MetaAndTableJRDataSource source, final RESULTS results) { - - source.addMetaData("header", msg(I18NStrings.CSV_META_HEADER_RESULT_LABEL)); - source.addMetaData("calcMode", results.getCalcModeLabel()); - - source.addMetaData("version_label", msg(I18NStrings.CSV_META_VERSION_LABEL)); - source.addMetaData("version", FLYS.VERSION); - - source.addMetaData("user_label", msg(I18NStrings.CSV_META_USER_LABEL)); - source.addMetaData("user", results.getUser()); - - final Locale locale = Resources.getLocale(this.context.getMeta()); - final DateFormat df = DateFormat.getDateInstance(DateFormat.SHORT, locale); - source.addMetaData("date_label", msg(I18NStrings.CSV_META_CREATION_LABEL)); - source.addMetaData("date", df.format(new Date())); - - } - -} \ No newline at end of file diff -r 5be112fba832 -r 23945061daec artifacts/src/main/java/org/dive4elements/river/artifacts/uinfo/inundationduration/InundationDurationCalculation.java --- a/artifacts/src/main/java/org/dive4elements/river/artifacts/uinfo/inundationduration/InundationDurationCalculation.java Thu Jun 14 15:12:25 2018 +0200 +++ b/artifacts/src/main/java/org/dive4elements/river/artifacts/uinfo/inundationduration/InundationDurationCalculation.java Thu Jun 14 16:56:31 2018 +0200 @@ -16,6 +16,7 @@ import org.apache.commons.lang.math.DoubleRange; import org.dive4elements.artifacts.CallContext; import org.dive4elements.river.artifacts.access.RiverAccess; +import org.dive4elements.river.artifacts.common.GeneralResultType; import org.dive4elements.river.artifacts.common.ResultRow; import org.dive4elements.river.artifacts.model.Calculation; import org.dive4elements.river.artifacts.model.CalculationResult; @@ -63,6 +64,7 @@ final Collection rows = new ArrayList<>(); final ResultRow row1 = ResultRow.create(). // + putValue(GeneralResultType.station, 88). // putValue(SInfoResultType.discharge, 100). // putValue(SInfoResultType.waterlevel, 2). // putValue(SInfoResultType.gaugeLabel, "Torgau"); diff -r 5be112fba832 -r 23945061daec artifacts/src/main/java/org/dive4elements/river/artifacts/uinfo/inundationduration/InundationDurationCalculationResult.java --- a/artifacts/src/main/java/org/dive4elements/river/artifacts/uinfo/inundationduration/InundationDurationCalculationResult.java Thu Jun 14 15:12:25 2018 +0200 +++ b/artifacts/src/main/java/org/dive4elements/river/artifacts/uinfo/inundationduration/InundationDurationCalculationResult.java Thu Jun 14 16:56:31 2018 +0200 @@ -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) @@ -9,21 +9,95 @@ */ package org.dive4elements.river.artifacts.uinfo.inundationduration; +import java.util.ArrayList; import java.util.Collection; -import org.dive4elements.river.artifacts.common.AbstractCalculationResult; +import org.dive4elements.river.artifacts.common.AbstractCalculationExportableResult; +import org.dive4elements.river.artifacts.common.ExportContextCSV; +import org.dive4elements.river.artifacts.common.GeneralResultType; +import org.dive4elements.river.artifacts.common.MetaAndTableJRDataSource; import org.dive4elements.river.artifacts.common.ResultRow; +import org.dive4elements.river.artifacts.sinfo.common.SInfoResultType; +import org.dive4elements.river.artifacts.sinfo.util.RiverInfo; import org.dive4elements.river.artifacts.sinfo.util.WstInfo; /** * @author Domenico Nardi Tironi */ -final class InundationDurationCalculationResult extends AbstractCalculationResult { +final class InundationDurationCalculationResult extends AbstractCalculationExportableResult { private static final long serialVersionUID = 1L; + private static final String JASPER_FILE = "/jasper/templates/uinfo.inundationduration.jrxml"; - public InundationDurationCalculationResult(final String label, final WstInfo wst, final Collection< ResultRow> rows) { - super(label, rows); + public InundationDurationCalculationResult(final String label, final WstInfo wst, final Collection rows) { + super(label, rows); } - + + @Override + public void writeCSVHeader(final ExportContextCSV exportContextCSV, final InundationDurationCalculationResults results, final RiverInfo river) { + + final Collection header = new ArrayList<>(11); + + header.add(exportContextCSV.formatCsvHeader(GeneralResultType.station)); + header.add(exportContextCSV.msgUnitCSV(SInfoResultType.flowdepth)); + + header.add(exportContextCSV.msgUnitCSV(SInfoResultType.waterlevel, river.getWstUnit())); + header.add(exportContextCSV.msgUnitCSV(SInfoResultType.discharge)); + header.add(exportContextCSV.formatCsvHeader(SInfoResultType.waterlevelLabel)); + header.add(exportContextCSV.formatCsvHeader(SInfoResultType.gaugeLabel)); + header.add(exportContextCSV.msgUnitCSV(SInfoResultType.meanBedHeight, river.getWstUnit())); + header.add(exportContextCSV.formatCsvHeader(SInfoResultType.soundingLabel)); + header.add(exportContextCSV.formatCsvHeader(SInfoResultType.location)); + + exportContextCSV.writeCSVLine(header.toArray(new String[header.size()])); + + } + + @Override + protected void writeCSVResultMetadata(final ExportContextCSV exportContextCSV, final InundationDurationCalculationResults results) { + // no Result metadata so far + } + + @Override + protected String[] formatCSVRow(final ExportContextCSV exportContextCSV, final InundationDurationCalculationResults results, final ResultRow row) { + return formatRow(exportContextCSV, results, row); + } + + @Override + protected String[] formatPDFRow(final ExportContextCSV exportContextPDF, final InundationDurationCalculationResults results, final ResultRow row) { + + return formatRow(exportContextPDF, results, row); + } + + @Override + protected String getJasperFile() { + + return JASPER_FILE; + } + + @Override + protected void addJRTableHeader(final ExportContextCSV exportContextPDF, final MetaAndTableJRDataSource source, + final InundationDurationCalculationResults results) { + + exportContextPDF.addJRMetadata(source, "station_header", GeneralResultType.station); + } + + protected String[] formatRow(final ExportContextCSV context, final InundationDurationCalculationResults results, final ResultRow row) { + + final Collection lines = new ArrayList<>(11); + + lines.add(context.formatRowValue(row, GeneralResultType.station)); + lines.add(context.formatRowValue(row, SInfoResultType.flowdepth)); + + lines.add(context.formatRowValue(row, SInfoResultType.waterlevel)); + lines.add(context.formatRowValue(row, SInfoResultType.discharge)); + lines.add(context.formatRowValue(row, SInfoResultType.waterlevelLabel)); + lines.add(context.formatRowValue(row, SInfoResultType.gaugeLabel)); + lines.add(context.formatRowValue(row, SInfoResultType.meanBedHeight)); + lines.add(context.formatRowValue(row, SInfoResultType.soundingLabel)); + lines.add(context.formatRowValue(row, SInfoResultType.location)); + + return lines.toArray(new String[lines.size()]); + } + } \ No newline at end of file diff -r 5be112fba832 -r 23945061daec artifacts/src/main/java/org/dive4elements/river/artifacts/uinfo/inundationduration/InundationDurationCalculationResults.java --- a/artifacts/src/main/java/org/dive4elements/river/artifacts/uinfo/inundationduration/InundationDurationCalculationResults.java Thu Jun 14 15:12:25 2018 +0200 +++ b/artifacts/src/main/java/org/dive4elements/river/artifacts/uinfo/inundationduration/InundationDurationCalculationResults.java Thu Jun 14 16:56:31 2018 +0200 @@ -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) @@ -10,14 +10,15 @@ package org.dive4elements.river.artifacts.uinfo.inundationduration; import org.apache.commons.lang.math.DoubleRange; -import org.dive4elements.river.artifacts.common.AbstractCalculationResults; +import org.dive4elements.river.artifacts.common.AbstractCalculationExportableResult; +import org.dive4elements.river.artifacts.common.AbstractCalculationListResults; import org.dive4elements.river.artifacts.sinfo.util.RiverInfo; /** * @author Domenico Nardi Tironi * */ -final class InundationDurationCalculationResults extends AbstractCalculationResults { +final class InundationDurationCalculationResults extends AbstractCalculationListResults> { private static final long serialVersionUID = 1L; diff -r 5be112fba832 -r 23945061daec artifacts/src/main/java/org/dive4elements/river/artifacts/uinfo/inundationduration/InundationDurationExporter.java --- a/artifacts/src/main/java/org/dive4elements/river/artifacts/uinfo/inundationduration/InundationDurationExporter.java Thu Jun 14 15:12:25 2018 +0200 +++ b/artifacts/src/main/java/org/dive4elements/river/artifacts/uinfo/inundationduration/InundationDurationExporter.java Thu Jun 14 16:56:31 2018 +0200 @@ -10,18 +10,14 @@ package org.dive4elements.river.artifacts.uinfo.inundationduration; import java.io.OutputStream; -import java.util.ArrayList; -import java.util.Collection; -import org.apache.log4j.Logger; -import org.dive4elements.river.artifacts.common.GeneralResultType; +import org.dive4elements.river.artifacts.common.AbstractCalculationExportableResult; +import org.dive4elements.river.artifacts.common.AbstractCommonExporter; +import org.dive4elements.river.artifacts.common.ExportContextCSV; import org.dive4elements.river.artifacts.common.I18NStrings; import org.dive4elements.river.artifacts.common.JasperReporter; import org.dive4elements.river.artifacts.common.MetaAndTableJRDataSource; -import org.dive4elements.river.artifacts.common.ResultRow; -import org.dive4elements.river.artifacts.sinfo.common.SInfoResultType; import org.dive4elements.river.artifacts.sinfo.util.RiverInfo; -import org.dive4elements.river.artifacts.uinfo.commons.AbstractUInfoExporter; import au.com.bytecode.opencsv.CSVWriter; import net.sf.jasperreports.engine.JRException; @@ -30,113 +26,23 @@ * @author Domenico Nardi Tironi * */ -public class InundationDurationExporter extends AbstractUInfoExporter { - - /** The log used in this exporter. */ - private static Logger log = Logger.getLogger(InundationDurationExporter.class); - - private static final String JASPER_FILE = "/jasper/templates/uinfo.inundationduration.jrxml"; - - @Override - protected Logger getLog() { - return log; - } - - @Override - protected void writeCSVGlobalMetadata(final CSVWriter writer, final InundationDurationCalculationResults results) { - log.info("SalixLineExporter.writeCSVMeta"); - - super.writeCSVGlobalMetadataDefaults(writer, results); - - // "# Höhensystem des Flusses: " - writeCSVMetaEntry(writer, I18NStrings.CSV_META_HEIGHT_UNIT_RIVER, results.getRiver().getWstUnit()); - - writer.writeNext(new String[] { "" }); // break line - } +public class InundationDurationExporter extends AbstractCommonExporter { @Override - protected void writeCSVResultMetadata(final CSVWriter writer, final InundationDurationCalculationResults results, - final InundationDurationCalculationResult result) { - - /* - * final BedHeightInfo sounding = result.getSounding(); - * super.writeCSVSoundingMetadata(writer, sounding); - * final WstInfo wst = result.getWst(); - * super.writeCSVWaterlevelMetadata(writer, wst); - */ - } - - /** - * Write the header, with different headings depending on whether at a - * gauge or at a location. - * - * @param river - * @param useTkh - */ - @Override - protected void writeCSVHeader(final CSVWriter writer, final InundationDurationCalculationResults results, final RiverInfo river) { - log.info("FlowDepthExporter.writeCSVHeader"); - - final Collection header = new ArrayList<>(11); - - header.add(msg(GeneralResultType.station.getCsvHeader())); - header.add(msgUnit(SInfoResultType.flowdepth.getCsvHeader(), SInfoResultType.flowdepth.getUnit())); - - header.add(msgUnit(SInfoResultType.waterlevel.getCsvHeader(), river.getWstUnit())); - header.add(msgUnit(SInfoResultType.discharge.getCsvHeader(), SInfoResultType.discharge.getUnit())); - header.add(msg(SInfoResultType.waterlevelLabel.getCsvHeader())); - header.add(msg(SInfoResultType.gaugeLabel.getCsvHeader())); - header.add(msgUnit(SInfoResultType.meanBedHeight.getCsvHeader(), river.getWstUnit())); - header.add(msg(SInfoResultType.soundingLabel.getCsvHeader())); - header.add(msg(SInfoResultType.location.getCsvHeader())); - - writer.writeNext(header.toArray(new String[header.size()])); - } - - /** - * Format a row of a flow depth result into an array of string, both used by csv and pdf - * - * @param pdf - * - * @param useTkh - */ - @Override - protected String[] formatRow(final InundationDurationCalculationResults results, final ResultRow row, final ExportMode mode) { - - final Collection lines = new ArrayList<>(11); - - lines.add(row.exportValue(this.context, GeneralResultType.station)); - lines.add(row.exportValue(this.context, SInfoResultType.flowdepth)); - - lines.add(row.exportValue(this.context, SInfoResultType.waterlevel)); - lines.add(row.exportValue(this.context, SInfoResultType.discharge)); - lines.add(row.exportValue(this.context, SInfoResultType.waterlevelLabel)); - lines.add(row.exportValue(this.context, SInfoResultType.gaugeLabel)); - lines.add(row.exportValue(this.context, SInfoResultType.meanBedHeight)); - lines.add(row.exportValue(this.context, SInfoResultType.soundingLabel)); - lines.add(row.exportValue(this.context, SInfoResultType.location)); - - return lines.toArray(new String[lines.size()]); - } - - @Override - protected final void addJRMetaData(final MetaAndTableJRDataSource source, final InundationDurationCalculationResults results) { - - /* general metadata */ - super.addJRMetaData(source, results); - - /* column headings */ - source.addMetaData("station_header", GeneralResultType.station.getPdfHeader(this.context.getMeta())); - - } - - @Override - protected void writePDF(final OutputStream out) { + protected void doWritePdf(final OutputStream out, final InundationDurationCalculationResults results) { + // TODO: Move to super try { - final MetaAndTableJRDataSource source = createJRData(this.data); + final ExportContextCSV exportContextCSV = new ExportContextCSV(this.context, null); final JasperReporter reporter = new JasperReporter(); - reporter.addReport(JASPER_FILE, source); + + for (final AbstractCalculationExportableResult result : results.getResults()) { + final MetaAndTableJRDataSource source = new MetaAndTableJRDataSource(); + getHelper().addJRMetaDataUSINFO(source, results); + + result.addReport(exportContextCSV, results, reporter, source); + } + reporter.exportPDF(out); } catch (final JRException je) { @@ -144,4 +50,36 @@ } } + @Override + protected void doWriteCSVData(final CSVWriter writer, final InundationDurationCalculationResults results) { + // TODO: Diesen Ablauf in super? -> leichte abweichung + + // TODO: move results into context? + final ExportContextCSV exportContextCSV = new ExportContextCSV(this.context, writer); + + getLog().info("writeCSVData"); + + final RiverInfo river = results.getRiver(); + + /* write as csv */ + exportContextCSV.writeCSVGlobalMetadataDefaults(results); // ggf auslagern innerhalb dieser Klasse + exportContextCSV.writeCSVMetaEntry(I18NStrings.CSV_META_HEIGHT_UNIT_RIVER, river.getWstUnit()); + // writer.writeNext(new String[] { "" }); // break line HERE to avoid redundance + + final Class lastResultType = null; + + for (final AbstractCalculationExportableResult result : results.getResults()) { + + final Class resultType = result.getClass(); + if (lastResultType == null || lastResultType != resultType) { + exportContextCSV.writeBlankLine(); + result.writeCSVHeader(exportContextCSV, results, river); + exportContextCSV.writeBlankLine(); + } else + exportContextCSV.writeCSVLine(new String[] { "#" }); + + result.writeCsv(exportContextCSV, results); + } + + } } \ No newline at end of file diff -r 5be112fba832 -r 23945061daec artifacts/src/main/java/org/dive4elements/river/artifacts/uinfo/inundationduration/InundationDurationState.java --- a/artifacts/src/main/java/org/dive4elements/river/artifacts/uinfo/inundationduration/InundationDurationState.java Thu Jun 14 15:12:25 2018 +0200 +++ b/artifacts/src/main/java/org/dive4elements/river/artifacts/uinfo/inundationduration/InundationDurationState.java Thu Jun 14 16:56:31 2018 +0200 @@ -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) @@ -15,6 +15,7 @@ import org.dive4elements.artifacts.CallContext; import org.dive4elements.river.artifacts.ChartArtifact; import org.dive4elements.river.artifacts.D4EArtifact; +import org.dive4elements.river.artifacts.common.AbstractCalculationExportableResult; import org.dive4elements.river.artifacts.model.Calculation; import org.dive4elements.river.artifacts.model.CalculationResult; import org.dive4elements.river.artifacts.model.DataFacet; @@ -77,7 +78,7 @@ final InundationDurationCalculationResults results = (InundationDurationCalculationResults) res.getData(); - List resultList = results.getResults(); + final List> resultList = results.getResults(); if (!resultList.isEmpty()) { final Facet csv = new DataFacet(FacetTypes.CSV, "CSV data", ComputeType.ADVANCE, hash, this.id); diff -r 5be112fba832 -r 23945061daec artifacts/src/main/java/org/dive4elements/river/artifacts/uinfo/salix/SalixLineCalculationResult.java --- a/artifacts/src/main/java/org/dive4elements/river/artifacts/uinfo/salix/SalixLineCalculationResult.java Thu Jun 14 15:12:25 2018 +0200 +++ b/artifacts/src/main/java/org/dive4elements/river/artifacts/uinfo/salix/SalixLineCalculationResult.java Thu Jun 14 16:56:31 2018 +0200 @@ -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) @@ -9,21 +9,143 @@ */ package org.dive4elements.river.artifacts.uinfo.salix; +import java.util.ArrayList; import java.util.Collection; -import org.dive4elements.river.artifacts.common.AbstractCalculationResult; +import org.dive4elements.river.artifacts.common.AbstractCalculationExportableResult; +import org.dive4elements.river.artifacts.common.ExportContextCSV; +import org.dive4elements.river.artifacts.common.GeneralResultType; +import org.dive4elements.river.artifacts.common.MetaAndTableJRDataSource; import org.dive4elements.river.artifacts.common.ResultRow; +import org.dive4elements.river.artifacts.sinfo.util.RiverInfo; import org.dive4elements.river.artifacts.sinfo.util.WstInfo; +import org.dive4elements.river.artifacts.uinfo.commons.UInfoResultType; /** * @author Domenico Nardi Tironi */ -final class SalixLineCalculationResult extends AbstractCalculationResult { +final class SalixLineCalculationResult extends AbstractCalculationExportableResult { private static final long serialVersionUID = 1L; + private static final String JASPER_FILE = "/jasper/templates/uinfo.salixline.jrxml"; - public SalixLineCalculationResult(final String label, final WstInfo wst, final Collection< ResultRow> rows) { - super(label, rows); + public SalixLineCalculationResult(final String label, final WstInfo wst, final Collection rows) { + super(label, rows); } - + + @Override + public void writeCSVHeader(final ExportContextCSV exportContextCSV, final SalixLineCalculationResults results, final RiverInfo river) { + + final Collection header = new ArrayList<>(4); + + header.add(exportContextCSV.formatCsvHeader(GeneralResultType.station)); + // header.add(msgUnit(SInfoResultType.flowdepth, SInfoResultType.flowdepth.getUnit())); + + header.add(exportContextCSV.formatCsvHeader(UInfoResultType.salixline)); + // wenn "historisch" gewählt wurde, nur "historisch" anzeigen; sonst für jeden scen-wert ne neue Spalte und "hist" + // ausblenden!...!..!! + header.add(exportContextCSV.formatCsvHeader(UInfoResultType.salixlinehist)); + header.add(exportContextCSV.formatCsvHeader(UInfoResultType.salixlinescen)); + exportContextCSV.writeCSVLine(header.toArray(new String[header.size()])); + + } + + @Override + protected void writeCSVResultMetadata(final ExportContextCSV exportContextCSV, final SalixLineCalculationResults results) { + writeRegionalEffectsCSVMetadata(exportContextCSV); + exportContextCSV.writeBlankLine();// writer.writeNext(new String[] { "" }); // break line + writeExtendedRegionalEffectsCSVMetadata(exportContextCSV); + exportContextCSV.writeBlankLine(); + writeHistoricalViewCSVMetadata(exportContextCSV); + exportContextCSV.writeBlankLine(); + + } + + @Override + protected String[] formatCSVRow(final ExportContextCSV exportContextCSV, final SalixLineCalculationResults results, final ResultRow row) { + + return formatRow(exportContextCSV, results, row); + } + + @Override + protected String[] formatPDFRow(final ExportContextCSV exportContextPDF, final SalixLineCalculationResults results, final ResultRow row) { + + return formatRow(exportContextPDF, results, row); + } + + @Override + protected String getJasperFile() { + + return this.JASPER_FILE; + } + + @Override + protected void addJRTableHeader(final ExportContextCSV exportContextPDF, final MetaAndTableJRDataSource source, final SalixLineCalculationResults results) { + + /* additional column headings */ + exportContextPDF.addJRMetadata(source, "station_header", GeneralResultType.station); + + exportContextPDF.addJRMetadata(source, "salix_line", UInfoResultType.salixline); + // wenn "historisch" gewählt wurde, nur "historisch" anzeigen; sonst für jeden scen-wert ne neue Spalte und "hist" + // ausblenden!...!..!! + exportContextPDF.addJRMetadata(source, "salix_line_hist", UInfoResultType.salixlinehist); + exportContextPDF.addJRMetadata(source, "salix_line_scen", UInfoResultType.salixlinescen); + + } + + private String[] formatRow(final ExportContextCSV context, final SalixLineCalculationResults results, final ResultRow row) { + + final Collection lines = new ArrayList<>(3); + + lines.add(context.formatRowValue(row, GeneralResultType.station)); + lines.add(context.formatRowValue(row, UInfoResultType.salixline)); + + // wenn "historisch" gewählt wurde, nur "historisch" anzeigen; sonst für jeden scen-wert ne neue Spalte und "hist" + // ausblenden!...!..!! + lines.add(context.formatRowValue(row, UInfoResultType.salixlinehist)); + lines.add(context.formatRowValue(row, UInfoResultType.salixlinescen)); + return lines.toArray(new String[lines.size()]); + } + + private void writeRegionalEffectsCSVMetadata(final ExportContextCSV exportContextCSV) { + final String main = "uinfo.export.csv.meta.header.salix.regional"; + // "##Regional wirkende Eingriffe" + exportContextCSV.writeCSVMetaEntry(main); + writeRegionalCommonCSVMeta(exportContextCSV); + } + + private void writeRegionalCommonCSVMeta(final ExportContextCSV exportContextCSV) { + final String main = "uinfo.export.csv.meta.header.salix"; + // "# Szenariotyp: " + exportContextCSV.writeCSVMetaEntry(main + ".szenariotyp"); + // "# Teilabschnitt: " + exportContextCSV.writeCSVMetaEntry(main + ".teilabschnitt"); + // "# Mittelwasserspiegellagenänderung: " + exportContextCSV.writeCSVMetaEntry(main + ".mwspiegellaenderung"); + } + + private void writeExtendedRegionalEffectsCSVMetadata(final ExportContextCSV exportContextCSV) { + final String main = "uinfo.export.csv.meta.header.salix.regionalextended"; + // "##Ãœberregional wirkende Eingriffe" + exportContextCSV.writeCSVMetaEntry(main); + + writeRegionalCommonCSVMeta(exportContextCSV); + } + + private void writeHistoricalViewCSVMetadata(final ExportContextCSV exportContextCSV) { + final String main = "uinfo.export.csv.meta.header.salix.historical"; + // "##Historische Betrachtung" + exportContextCSV.writeCSVMetaEntry(main); + + final String mainSub = "uinfo.export.csv.meta.header.salix"; + // "# Szenariotyp: " + exportContextCSV.writeCSVMetaEntry(mainSub + ".szenariotyp"); + // "# Teilabschnitt: " + exportContextCSV.writeCSVMetaEntry(mainSub + ".teilabschnitt"); + + // "# Art des Zeitraums: " + exportContextCSV.writeCSVMetaEntry(main + ".zeitart"); + // "# Historischer Zeitpunkt: " + exportContextCSV.writeCSVMetaEntry(main + ".zeitpunkt"); + } } \ No newline at end of file diff -r 5be112fba832 -r 23945061daec artifacts/src/main/java/org/dive4elements/river/artifacts/uinfo/salix/SalixLineCalculationResults.java --- a/artifacts/src/main/java/org/dive4elements/river/artifacts/uinfo/salix/SalixLineCalculationResults.java Thu Jun 14 15:12:25 2018 +0200 +++ b/artifacts/src/main/java/org/dive4elements/river/artifacts/uinfo/salix/SalixLineCalculationResults.java Thu Jun 14 16:56:31 2018 +0200 @@ -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) @@ -10,14 +10,15 @@ package org.dive4elements.river.artifacts.uinfo.salix; import org.apache.commons.lang.math.DoubleRange; -import org.dive4elements.river.artifacts.common.AbstractCalculationResults; +import org.dive4elements.river.artifacts.common.AbstractCalculationExportableResult; +import org.dive4elements.river.artifacts.common.AbstractCalculationListResults; import org.dive4elements.river.artifacts.sinfo.util.RiverInfo; /** * @author Domenico Nardi Tironi * */ -final class SalixLineCalculationResults extends AbstractCalculationResults { +final class SalixLineCalculationResults extends AbstractCalculationListResults> { private static final long serialVersionUID = 1L; diff -r 5be112fba832 -r 23945061daec artifacts/src/main/java/org/dive4elements/river/artifacts/uinfo/salix/SalixLineExporter.java --- a/artifacts/src/main/java/org/dive4elements/river/artifacts/uinfo/salix/SalixLineExporter.java Thu Jun 14 15:12:25 2018 +0200 +++ b/artifacts/src/main/java/org/dive4elements/river/artifacts/uinfo/salix/SalixLineExporter.java Thu Jun 14 16:56:31 2018 +0200 @@ -10,18 +10,14 @@ package org.dive4elements.river.artifacts.uinfo.salix; import java.io.OutputStream; -import java.util.ArrayList; -import java.util.Collection; -import org.apache.log4j.Logger; -import org.dive4elements.river.artifacts.common.GeneralResultType; +import org.dive4elements.river.artifacts.common.AbstractCalculationExportableResult; +import org.dive4elements.river.artifacts.common.AbstractCommonExporter; +import org.dive4elements.river.artifacts.common.ExportContextCSV; import org.dive4elements.river.artifacts.common.I18NStrings; import org.dive4elements.river.artifacts.common.JasperReporter; import org.dive4elements.river.artifacts.common.MetaAndTableJRDataSource; -import org.dive4elements.river.artifacts.common.ResultRow; import org.dive4elements.river.artifacts.sinfo.util.RiverInfo; -import org.dive4elements.river.artifacts.uinfo.commons.AbstractUInfoExporter; -import org.dive4elements.river.artifacts.uinfo.commons.UInfoResultType; import au.com.bytecode.opencsv.CSVWriter; import net.sf.jasperreports.engine.JRException; @@ -30,166 +26,75 @@ * @author Domenico Nardi Tironi * */ -public class SalixLineExporter extends AbstractUInfoExporter { - - /** The log used in this exporter. */ - private static Logger log = Logger.getLogger(SalixLineExporter.class); - - private static final String JASPER_FILE = "/jasper/templates/uinfo.salixline.jrxml"; - - @Override - protected Logger getLog() { - return log; - } +public class SalixLineExporter extends AbstractCommonExporter { @Override - protected void writeCSVGlobalMetadata(final CSVWriter writer, final SalixLineCalculationResults results) { - log.info("SalixLineExporter.writeCSVMeta"); - - super.writeCSVGlobalMetadataDefaults(writer, results); - - // "# Höhensystem des Flusses: " - writeCSVMetaEntry(writer, I18NStrings.CSV_META_HEIGHT_UNIT_RIVER, results.getRiver().getWstUnit()); - - // Add Auswerter, Bezugspegel, Jahr/Zeitraum der Wasserspiegellage - - // "# Auswerter: " - writeCSVMetaEntry(writer, "uinfo.export.salix_line.csv.meta.header.evaluator", "sounding.getEvaluationBy()"); - // "# Bezugspegel: " - writeCSVMetaEntry(writer, "uinfo.export.salix_line.csv.meta.header.waterlevel.gauge", "wst.getGauge()"); - - // "# Jahr/Zeitraum der Wasserspiegellage: " - // final int year = wst.getYear(); - // if (year > 0) - writeCSVMetaEntry(writer, "uinfo.export.salix_line.csv.meta.header.waterlevel.year", "Integer.toString(year)"); - - } - - private void writeRegionalEffectsCSVMetadata(final CSVWriter writer) { - final String main = "uinfo.export.csv.meta.header.salix.regional"; - // "##Regional wirkende Eingriffe" - writeCSVMetaEntry(writer, main); - writeRegionalCommonCSVMeta(writer); - } - - private void writeRegionalCommonCSVMeta(final CSVWriter writer) { - final String main = "uinfo.export.csv.meta.header.salix"; - // "# Szenariotyp: " - writeCSVMetaEntry(writer, main + ".szenariotyp"); - // "# Teilabschnitt: " - writeCSVMetaEntry(writer, main + ".teilabschnitt"); - // "# Mittelwasserspiegellagenänderung: " - writeCSVMetaEntry(writer, main + ".mwspiegellaenderung"); - } - - private void writeExtendedRegionalEffectsCSVMetadata(final CSVWriter writer) { - final String main = "uinfo.export.csv.meta.header.salix.regionalextended"; - // "##Ãœberregional wirkende Eingriffe" - writeCSVMetaEntry(writer, main); - - writeRegionalCommonCSVMeta(writer); - } - - private void writeHistoricalViewCSVMetadata(final CSVWriter writer) { - final String main = "uinfo.export.csv.meta.header.salix.historical"; - // "##Historische Betrachtung" - writeCSVMetaEntry(writer, main); - - final String mainSub = "uinfo.export.csv.meta.header.salix"; - // "# Szenariotyp: " - writeCSVMetaEntry(writer, mainSub + ".szenariotyp"); - // "# Teilabschnitt: " - writeCSVMetaEntry(writer, mainSub + ".teilabschnitt"); - - // "# Art des Zeitraums: " - writeCSVMetaEntry(writer, main + ".zeitart"); - // "# Historischer Zeitpunkt: " - writeCSVMetaEntry(writer, main + ".zeitpunkt"); - } - - @Override - protected void writeCSVResultMetadata(final CSVWriter writer, final SalixLineCalculationResults results, final SalixLineCalculationResult result) { - writeRegionalEffectsCSVMetadata(writer); - writer.writeNext(new String[] { "" }); // break line - writeExtendedRegionalEffectsCSVMetadata(writer); - writer.writeNext(new String[] { "" }); // break line - writeHistoricalViewCSVMetadata(writer); - } - - /** - * Write the header, with different headings depending on whether at a - * gauge or at a location. - * - * @param river - * @param useTkh - */ - @Override - protected void writeCSVHeader(final CSVWriter writer, final SalixLineCalculationResults results, final RiverInfo river) { - log.info("FlowDepthExporter.writeCSVHeader"); - - final Collection header = new ArrayList<>(4); - - header.add(msg(GeneralResultType.station.getCsvHeader())); - // header.add(msgUnit(SInfoResultType.flowdepth.getCsvHeader(), SInfoResultType.flowdepth.getUnit())); - - header.add(msg(UInfoResultType.salixline.getCsvHeader())); - // wenn "historisch" gewählt wurde, nur "historisch" anzeigen; sonst für jeden scen-wert ne neue Spalte und "hist" - // ausblenden!...!..!! - header.add(msg(UInfoResultType.salixlinehist.getCsvHeader())); - header.add(msg(UInfoResultType.salixlinescen.getCsvHeader())); - writer.writeNext(header.toArray(new String[header.size()])); - } - - /** - * Format a row of a flow depth result into an array of string, both used by csv and pdf - * - * @param pdf - * - * @param useTkh - */ - @Override - protected String[] formatRow(final SalixLineCalculationResults results, final ResultRow row, final ExportMode mode) { - - final Collection lines = new ArrayList<>(3); - - lines.add(row.exportValue(this.context, GeneralResultType.station)); - lines.add(row.exportValue(this.context, UInfoResultType.salixline)); - - // wenn "historisch" gewählt wurde, nur "historisch" anzeigen; sonst für jeden scen-wert ne neue Spalte und "hist" - // ausblenden!...!..!! - lines.add(row.exportValue(this.context, UInfoResultType.salixlinehist)); - lines.add(row.exportValue(this.context, UInfoResultType.salixlinescen)); - return lines.toArray(new String[lines.size()]); - } - - @Override - protected final void addJRMetaData(final MetaAndTableJRDataSource source, final SalixLineCalculationResults results) { - - super.addJRMetaData(source, results); - - /* additional column headings */ - source.addMetaData("station_header", GeneralResultType.station.getPdfHeader(this.context.getMeta())); - - source.addMetaData("salix_line", UInfoResultType.salixline.getPdfHeader(this.context.getMeta())); - // wenn "historisch" gewählt wurde, nur "historisch" anzeigen; sonst für jeden scen-wert ne neue Spalte und "hist" - // ausblenden!...!..!! - source.addMetaData("salix_line_hist", UInfoResultType.salixlinehist.getPdfHeader(this.context.getMeta())); - source.addMetaData("salix_line_scen", UInfoResultType.salixlinescen.getPdfHeader(this.context.getMeta())); - } - - @Override - protected void writePDF(final OutputStream out) { + protected void doWritePdf(final OutputStream out, final SalixLineCalculationResults results) { + // TODO: Move to super try { - final MetaAndTableJRDataSource source = createJRData(this.data); + final ExportContextCSV exportContextCSV = new ExportContextCSV(this.context, null); final JasperReporter reporter = new JasperReporter(); - reporter.addReport(JASPER_FILE, source); + + for (final AbstractCalculationExportableResult result : results.getResults()) { + final MetaAndTableJRDataSource source = new MetaAndTableJRDataSource(); + getHelper().addJRMetaDataUSINFO(source, results); + + result.addReport(exportContextCSV, results, reporter, source); + } + reporter.exportPDF(out); } catch (final JRException je) { getLog().warn("Error generating PDF Report!", je); } + } + @Override + protected void doWriteCSVData(final CSVWriter writer, final SalixLineCalculationResults results) { + // TODO: Diesen Ablauf in super? - ist etwas anders bei den globalen metadaten + + // TODO: move results into context? + final ExportContextCSV exportContextCSV = new ExportContextCSV(this.context, writer); + + getLog().info("writeCSVData"); + + /* write as csv */ + exportContextCSV.writeCSVGlobalMetadataDefaults(results); // ggf auslagern innerhalb dieser Klasse + + // writer.writeNext(new String[] { "" }); // break line HERE to avoid redundance + + // "# Höhensystem des Flusses: " + exportContextCSV.writeCSVMetaEntry(I18NStrings.CSV_META_HEIGHT_UNIT_RIVER, results.getRiver().getWstUnit()); + + // Add Auswerter, Bezugspegel, Jahr/Zeitraum der Wasserspiegellage + + // "# Auswerter: " + exportContextCSV.writeCSVMetaEntry("uinfo.export.salix_line.csv.meta.header.evaluator", "sounding.getEvaluationBy()"); + // "# Bezugspegel: " + exportContextCSV.writeCSVMetaEntry("uinfo.export.salix_line.csv.meta.header.waterlevel.gauge", "wst.getGauge()"); + + // "# Jahr/Zeitraum der Wasserspiegellage: " + // final int year = wst.getYear(); + // if (year > 0) + exportContextCSV.writeCSVMetaEntry("uinfo.export.salix_line.csv.meta.header.waterlevel.year", "Integer.toString(year)"); + + final RiverInfo river = results.getRiver(); + + final Class lastResultType = null; + + for (final AbstractCalculationExportableResult result : results.getResults()) { + + final Class resultType = result.getClass(); + if (lastResultType == null || lastResultType != resultType) { + exportContextCSV.writeBlankLine(); + result.writeCSVHeader(exportContextCSV, results, river); + exportContextCSV.writeBlankLine(); + } else + exportContextCSV.writeCSVLine(new String[] { "#" }); + + result.writeCsv(exportContextCSV, results); + } } } \ No newline at end of file diff -r 5be112fba832 -r 23945061daec artifacts/src/main/java/org/dive4elements/river/artifacts/uinfo/salix/SalixLineState.java --- a/artifacts/src/main/java/org/dive4elements/river/artifacts/uinfo/salix/SalixLineState.java Thu Jun 14 15:12:25 2018 +0200 +++ b/artifacts/src/main/java/org/dive4elements/river/artifacts/uinfo/salix/SalixLineState.java Thu Jun 14 16:56:31 2018 +0200 @@ -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) @@ -15,6 +15,7 @@ import org.dive4elements.artifacts.CallContext; import org.dive4elements.river.artifacts.ChartArtifact; import org.dive4elements.river.artifacts.D4EArtifact; +import org.dive4elements.river.artifacts.common.AbstractCalculationExportableResult; import org.dive4elements.river.artifacts.model.Calculation; import org.dive4elements.river.artifacts.model.CalculationResult; import org.dive4elements.river.artifacts.model.DataFacet; @@ -77,7 +78,7 @@ final SalixLineCalculationResults results = (SalixLineCalculationResults) res.getData(); - List resultList = results.getResults(); + final List> resultList = results.getResults(); if (!resultList.isEmpty()) { final Facet csv = new DataFacet(FacetTypes.CSV, "CSV data", ComputeType.ADVANCE, hash, this.id); diff -r 5be112fba832 -r 23945061daec artifacts/src/main/java/org/dive4elements/river/artifacts/uinfo/vegetationzones/VegetationZonesCalculationResult.java --- a/artifacts/src/main/java/org/dive4elements/river/artifacts/uinfo/vegetationzones/VegetationZonesCalculationResult.java Thu Jun 14 15:12:25 2018 +0200 +++ b/artifacts/src/main/java/org/dive4elements/river/artifacts/uinfo/vegetationzones/VegetationZonesCalculationResult.java Thu Jun 14 16:56:31 2018 +0200 @@ -9,20 +9,82 @@ */ package org.dive4elements.river.artifacts.uinfo.vegetationzones; +import java.util.ArrayList; import java.util.Collection; -import org.dive4elements.river.artifacts.common.AbstractCalculationResult; +import org.dive4elements.river.artifacts.common.AbstractCalculationExportableResult; +import org.dive4elements.river.artifacts.common.ExportContextCSV; +import org.dive4elements.river.artifacts.common.MetaAndTableJRDataSource; import org.dive4elements.river.artifacts.common.ResultRow; +import org.dive4elements.river.artifacts.sinfo.util.RiverInfo; +import org.dive4elements.river.artifacts.uinfo.commons.UInfoResultType; /** * @author Domenico Nardi Tironi */ -final class VegetationZonesCalculationResult extends AbstractCalculationResult { +final class VegetationZonesCalculationResult extends AbstractCalculationExportableResult { + private static final long serialVersionUID = 1L; - private static final long serialVersionUID = 1L; + private static final String JASPER_FILE = "/jasper/templates/uinfo.vegetationzones.jrxml"; public VegetationZonesCalculationResult(final String label, final Collection rows) { super(label, rows); } + @Override + public void writeCSVHeader(final ExportContextCSV exportContextCSV, final VegetationZonesCalculationResults results, final RiverInfo river) { + + final Collection header = new ArrayList<>(11); + + header.add(exportContextCSV.formatCsvHeader(UInfoResultType.vegname)); + header.add(exportContextCSV.formatCsvHeader(UInfoResultType.vegdauervon)); + header.add(exportContextCSV.formatCsvHeader(UInfoResultType.vegdauerbis)); + + exportContextCSV.writeCSVLine(header.toArray(new String[header.size()])); + } + + @Override + protected void writeCSVResultMetadata(final ExportContextCSV exportContextCSV, final VegetationZonesCalculationResults results) { + // no metadata + + } + + @Override + protected String[] formatCSVRow(final ExportContextCSV exportContextCSV, final VegetationZonesCalculationResults results, final ResultRow row) { + return formatRow(exportContextCSV, results, row); + } + + @Override + protected String[] formatPDFRow(final ExportContextCSV exportContextPDF, final VegetationZonesCalculationResults results, final ResultRow row) { + + return formatRow(exportContextPDF, results, row); + } + + @Override + protected String getJasperFile() { + + return JASPER_FILE; + } + + @Override + protected void addJRTableHeader(final ExportContextCSV exportContextPDF, final MetaAndTableJRDataSource source, + final VegetationZonesCalculationResults results) { + /* additional column headings */ + exportContextPDF.addJRMetadata(source, "veg_name", UInfoResultType.vegname); + exportContextPDF.addJRMetadata(source, "veg_dauervon", UInfoResultType.vegdauervon); + exportContextPDF.addJRMetadata(source, "veg_dauerbis", UInfoResultType.vegdauerbis); + + } + + protected String[] formatRow(final ExportContextCSV context, final VegetationZonesCalculationResults results, final ResultRow row) { + + final Collection lines = new ArrayList<>(11); + + lines.add(context.formatRowValue(row, UInfoResultType.vegname)); + lines.add(context.formatRowValue(row, UInfoResultType.vegdauervon)); + lines.add(context.formatRowValue(row, UInfoResultType.vegdauerbis)); + + return lines.toArray(new String[lines.size()]); + } + } \ No newline at end of file diff -r 5be112fba832 -r 23945061daec artifacts/src/main/java/org/dive4elements/river/artifacts/uinfo/vegetationzones/VegetationZonesCalculationResults.java --- a/artifacts/src/main/java/org/dive4elements/river/artifacts/uinfo/vegetationzones/VegetationZonesCalculationResults.java Thu Jun 14 15:12:25 2018 +0200 +++ b/artifacts/src/main/java/org/dive4elements/river/artifacts/uinfo/vegetationzones/VegetationZonesCalculationResults.java Thu Jun 14 16:56:31 2018 +0200 @@ -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) @@ -10,14 +10,15 @@ package org.dive4elements.river.artifacts.uinfo.vegetationzones; import org.apache.commons.lang.math.DoubleRange; -import org.dive4elements.river.artifacts.common.AbstractCalculationResults; +import org.dive4elements.river.artifacts.common.AbstractCalculationExportableResult; +import org.dive4elements.river.artifacts.common.AbstractCalculationListResults; import org.dive4elements.river.artifacts.sinfo.util.RiverInfo; /** * @author Domenico Nardi Tironi * */ -final class VegetationZonesCalculationResults extends AbstractCalculationResults { +final class VegetationZonesCalculationResults extends AbstractCalculationListResults> { private static final long serialVersionUID = 1L; diff -r 5be112fba832 -r 23945061daec artifacts/src/main/java/org/dive4elements/river/artifacts/uinfo/vegetationzones/VegetationZonesExporter.java --- a/artifacts/src/main/java/org/dive4elements/river/artifacts/uinfo/vegetationzones/VegetationZonesExporter.java Thu Jun 14 15:12:25 2018 +0200 +++ b/artifacts/src/main/java/org/dive4elements/river/artifacts/uinfo/vegetationzones/VegetationZonesExporter.java Thu Jun 14 16:56:31 2018 +0200 @@ -10,18 +10,13 @@ package org.dive4elements.river.artifacts.uinfo.vegetationzones; import java.io.OutputStream; -import java.util.ArrayList; -import java.util.Collection; -import org.apache.commons.lang.math.DoubleRange; -import org.apache.log4j.Logger; -import org.dive4elements.river.artifacts.common.I18NStrings; +import org.dive4elements.river.artifacts.common.AbstractCalculationExportableResult; +import org.dive4elements.river.artifacts.common.AbstractCommonExporter; +import org.dive4elements.river.artifacts.common.ExportContextCSV; import org.dive4elements.river.artifacts.common.JasperReporter; import org.dive4elements.river.artifacts.common.MetaAndTableJRDataSource; -import org.dive4elements.river.artifacts.common.ResultRow; import org.dive4elements.river.artifacts.sinfo.util.RiverInfo; -import org.dive4elements.river.artifacts.uinfo.commons.AbstractUInfoExporter; -import org.dive4elements.river.artifacts.uinfo.commons.UInfoResultType; import au.com.bytecode.opencsv.CSVWriter; import net.sf.jasperreports.engine.JRException; @@ -30,94 +25,23 @@ * @author Domenico Nardi Tironi * */ -public class VegetationZonesExporter extends AbstractUInfoExporter { - - /** The log used in this exporter. */ - private static Logger log = Logger.getLogger(VegetationZonesExporter.class); - - private static final String JASPER_FILE = "/jasper/templates/uinfo.vegetationzones.jrxml"; - - @Override - protected Logger getLog() { - return log; - } +public class VegetationZonesExporter extends AbstractCommonExporter { @Override - protected void writeCSVGlobalMetadata(final CSVWriter writer, final VegetationZonesCalculationResults results) { - log.info("SalixLineExporter.writeCSVMeta"); - super.writeCSVGlobalMetadataDefaults(writer, results); - - final DoubleRange calcRange = results.getCalcRange(); - if (calcRange != null) { - // "# Ort/Bereich (km): " - writeCSVMetaEntry(writer, I18NStrings.CSV_META_RANGE, msg(I18NStrings.CSV_META_RANGE_LABEL), getKmFormatter().format(calcRange.getMinimumDouble()), - getKmFormatter().format(calcRange.getMaximumDouble())); - } - } - - /** - * Write the header, with different headings depending on whether at a - * gauge or at a location. - * - * @param river - * @param useTkh - */ - @Override - protected void writeCSVHeader(final CSVWriter writer, final VegetationZonesCalculationResults results, final RiverInfo river) { - log.info("FlowDepthExporter.writeCSVHeader"); - - final Collection header = new ArrayList<>(11); - - header.add(msg(UInfoResultType.vegname.getCsvHeader())); - header.add(msg(UInfoResultType.vegdauervon.getCsvHeader())); - header.add(msg(UInfoResultType.vegdauerbis.getCsvHeader())); - - writer.writeNext(header.toArray(new String[header.size()])); - } - - /** - * Format a row of a flow depth result into an array of string, both used by csv and pdf - * - * @param pdf - * - * @param useTkh - */ - @Override - protected String[] formatRow(final VegetationZonesCalculationResults results, final ResultRow row, final ExportMode mode) { - - final Collection lines = new ArrayList<>(11); - - lines.add(row.exportValue(this.context, UInfoResultType.vegname)); - lines.add(row.exportValue(this.context, UInfoResultType.vegdauervon)); - lines.add(row.exportValue(this.context, UInfoResultType.vegdauerbis)); - - return lines.toArray(new String[lines.size()]); - } - - @Override - protected void writeCSVResultMetadata(final CSVWriter writer, final VegetationZonesCalculationResults results, - final VegetationZonesCalculationResult result) { - - } - - @Override - protected final void addJRMetaData(final MetaAndTableJRDataSource source, final VegetationZonesCalculationResults results) { - - super.addJRMetaData(source, results); - - /* additional column headings */ - source.addMetaData("veg_name", UInfoResultType.vegname.getPdfHeader(this.context.getMeta())); - source.addMetaData("veg_dauervon", UInfoResultType.vegdauervon.getPdfHeader(this.context.getMeta())); - source.addMetaData("veg_dauerbis", UInfoResultType.vegdauerbis.getPdfHeader(this.context.getMeta())); - } - - @Override - protected void writePDF(final OutputStream out) { + protected void doWritePdf(final OutputStream out, final VegetationZonesCalculationResults results) { + // TODO: Move to super try { - final MetaAndTableJRDataSource source = createJRData(this.data); + final ExportContextCSV exportContextCSV = new ExportContextCSV(this.context, null); final JasperReporter reporter = new JasperReporter(); - reporter.addReport(JASPER_FILE, source); + + for (final AbstractCalculationExportableResult result : results.getResults()) { + final MetaAndTableJRDataSource source = new MetaAndTableJRDataSource(); + getHelper().addJRMetaDataUSINFO(source, results); + + result.addReport(exportContextCSV, results, reporter, source); + } + reporter.exportPDF(out); } catch (final JRException je) { @@ -125,4 +49,35 @@ } } + @Override + protected void doWriteCSVData(final CSVWriter writer, final VegetationZonesCalculationResults results) { + // TODO: Diesen Ablauf in super? + + // TODO: move results into context? + final ExportContextCSV exportContextCSV = new ExportContextCSV(this.context, writer); + + getLog().info("writeCSVData"); + + /* write as csv */ + exportContextCSV.writeCSVGlobalMetadataDefaults(results); // ggf auslagern innerhalb dieser Klasse + + // writer.writeNext(new String[] { "" }); // break line HERE to avoid redundance + + final RiverInfo river = results.getRiver(); + + final Class lastResultType = null; + + for (final AbstractCalculationExportableResult result : results.getResults()) { + + final Class resultType = result.getClass(); + if (lastResultType == null || lastResultType != resultType) { + exportContextCSV.writeBlankLine(); + result.writeCSVHeader(exportContextCSV, results, river); + exportContextCSV.writeBlankLine(); + } else + exportContextCSV.writeCSVLine(new String[] { "#" }); + + result.writeCsv(exportContextCSV, results); + } + } } \ No newline at end of file diff -r 5be112fba832 -r 23945061daec artifacts/src/main/java/org/dive4elements/river/artifacts/uinfo/vegetationzones/VegetationZonesState.java --- a/artifacts/src/main/java/org/dive4elements/river/artifacts/uinfo/vegetationzones/VegetationZonesState.java Thu Jun 14 15:12:25 2018 +0200 +++ b/artifacts/src/main/java/org/dive4elements/river/artifacts/uinfo/vegetationzones/VegetationZonesState.java Thu Jun 14 16:56:31 2018 +0200 @@ -15,6 +15,7 @@ import org.dive4elements.artifacts.CallContext; import org.dive4elements.river.artifacts.ChartArtifact; import org.dive4elements.river.artifacts.D4EArtifact; +import org.dive4elements.river.artifacts.common.AbstractCalculationExportableResult; import org.dive4elements.river.artifacts.model.Calculation; import org.dive4elements.river.artifacts.model.CalculationResult; import org.dive4elements.river.artifacts.model.DataFacet; @@ -76,7 +77,7 @@ final VegetationZonesCalculationResults results = (VegetationZonesCalculationResults) res.getData(); - final List resultList = results.getResults(); + final List> resultList = results.getResults(); if (!resultList.isEmpty()) { final Facet csv = new DataFacet(FacetTypes.CSV, "CSV data", ComputeType.ADVANCE, hash, this.id); diff -r 5be112fba832 -r 23945061daec artifacts/src/main/java/org/dive4elements/river/exports/AbstractExporter.java --- a/artifacts/src/main/java/org/dive4elements/river/exports/AbstractExporter.java Thu Jun 14 15:12:25 2018 +0200 +++ b/artifacts/src/main/java/org/dive4elements/river/exports/AbstractExporter.java Thu Jun 14 16:56:31 2018 +0200 @@ -11,30 +11,22 @@ import java.io.IOException; import java.io.OutputStream; import java.io.OutputStreamWriter; - import java.text.NumberFormat; -import org.w3c.dom.Document; - import org.apache.log4j.Logger; - -import au.com.bytecode.opencsv.CSVWriter; - +import org.dive4elements.artifactdatabase.state.ArtifactAndFacet; +import org.dive4elements.artifactdatabase.state.Settings; import org.dive4elements.artifacts.Artifact; import org.dive4elements.artifacts.CallContext; - -import org.dive4elements.artifactdatabase.state.ArtifactAndFacet; -import org.dive4elements.artifactdatabase.state.Settings; - import org.dive4elements.artifacts.common.ArtifactNamespaceContext; import org.dive4elements.artifacts.common.utils.XMLUtils; - import org.dive4elements.river.artifacts.resources.Resources; import org.dive4elements.river.collections.D4EArtifactCollection; - import org.dive4elements.river.themes.ThemeDocument; import org.dive4elements.river.utils.Formatter; +import org.w3c.dom.Document; +import au.com.bytecode.opencsv.CSVWriter; /** * Abstract exporter that implements some basic methods for exporting data of @@ -44,7 +36,7 @@ */ public abstract class AbstractExporter implements OutGenerator { - /** The log used in this exporter.*/ + /** The log used in this exporter. */ private static Logger log = Logger.getLogger(AbstractExporter.class); /* XXX: Why does AbstractExporter do not implement FacetTypes? */ @@ -82,7 +74,7 @@ /** The selected facet. */ protected String facet; - /** The collection.*/ + /** The collection. */ protected D4EArtifactCollection collection; /** The master artifact. */ @@ -106,24 +98,26 @@ * Concrete subclasses need to use this method to write their special data * objects into the CSV document. * - * @param writer The CSVWriter. + * @param writer + * The CSVWriter. */ protected abstract void writeCSVData(CSVWriter writer) throws IOException; - /** * Write lines of informative content to CSV file. * Usually this will be done above the column headers from within * the implementation of writeCSVData in concret subclasses. * - * @param writer The CSVWriter - * @param infolines Array of Strings with informative content. - * Each will be written to a separate line prefixed with START_META_CHAR. + * @param writer + * The CSVWriter + * @param infolines + * Array of Strings with informative content. + * Each will be written to a separate line prefixed with START_META_CHAR. */ - protected void writeCSVInfo(CSVWriter writer, String[] infolines) { - String[] metaline = new String[1]; + protected void writeCSVInfo(final CSVWriter writer, final String[] infolines) { + final String[] metaline = new String[1]; - for (String infoline: infolines) { + for (final String infoline : infolines) { metaline[0] = START_META_CHAR + " " + infoline; writer.writeNext(metaline); } @@ -136,74 +130,66 @@ */ protected abstract void writePDF(OutputStream out); - /** * This method enables concrete subclasses to collected its own special * data. * - * @param data The artifact that stores the data that has to be - * exported. + * @param data + * The artifact that stores the data that has to be + * exported. */ protected abstract void addData(Object data); - public void setup(Object config) { + @Override + public void setup(final Object config) { log.debug("AbstractExporter.setup"); } - @Override - public void init( - String outName, - Document request, - OutputStream out, - CallContext context - ) { + public void init(final String outName, final Document request, final OutputStream out, final CallContext context) { log.debug("AbstractExporter.init"); this.outName = outName; this.request = request; - this.out = out; + this.out = out; this.context = context; } - @Override - public void setMasterArtifact(Artifact master) { + public void setMasterArtifact(final Artifact master) { this.master = master; } - /** Get the callcontext that this exporter has been initialized - * with. */ + /** + * Get the callcontext that this exporter has been initialized + * with. + */ public CallContext getCallContext() { return this.context; } - @Override - public void setCollection(D4EArtifactCollection collection) { + public void setCollection(final D4EArtifactCollection collection) { this.collection = collection; } - /** * This doOut() just collects the data of multiple artifacts. Therefore, it * makes use of the addData() method which enables concrete subclasses to * store its data on its own. The real output creation takes place in the * concrete generate() methods. * - * @param artifactFacet The artifact and facet. - * The facet to add - NOTE: the facet needs to fit to the first - * facet inserted into this exporter. Otherwise this artifact/facet is - * skipped. - * @param attr The attr document. + * @param artifactFacet + * The artifact and facet. + * The facet to add - NOTE: the facet needs to fit to the first + * facet inserted into this exporter. Otherwise this artifact/facet is + * skipped. + * @param attr + * The attr document. */ @Override - public void doOut( - ArtifactAndFacet artifactFacet, - ThemeDocument attr, - boolean visible - ) { - String name = artifactFacet.getFacetName(); + public void doOut(final ArtifactAndFacet artifactFacet, final ThemeDocument attr, final boolean visible) { + final String name = artifactFacet.getFacetName(); log.debug("AbstractExporter.doOut: " + name); @@ -212,109 +198,98 @@ return; } - addData(artifactFacet.getData(context)); + addData(artifactFacet.getData(this.context)); } - /** * Generates an export based on a specified facet. */ @Override - public void generate() - throws IOException - { + public void generate() throws IOException { log.debug("AbstractExporter.generate"); - if (facet == null) { + if (this.facet == null) { throw new IOException("invalid (null) facet for exporter"); } - if (facet.equals(FACET_CSV)) { + if (this.facet.equals(FACET_CSV)) { generateCSV(); - } - else if (facet.equals(FACET_PDF)) { + } else if (this.facet.equals(FACET_PDF)) { generatePDF(); - } - else { - throw new IOException( - "invalid facet for exporter: '" + facet + "'"); + } else { + throw new IOException("invalid facet for exporter: '" + this.facet + "'"); } } - /** * Determines if the desired facet is valid for this exporter. If no facet * is currently set, facet is set. * - * @param facet The desired facet. + * @param facet + * The desired facet. * * @return true, if facet is valid, otherwise false. */ - protected boolean isFacetValid(String facet) { - log.debug("AbstractExporter.isFacetValid : " - + facet + " (" + getFacet() + ")" ); + protected boolean isFacetValid(final String facet) { + log.debug("AbstractExporter.isFacetValid : " + facet + " (" + getFacet() + ")"); - String thisFacet = getFacet(); + final String thisFacet = getFacet(); if (thisFacet == null || thisFacet.length() == 0) { return false; - } - else if (facet == null || facet.length() == 0) { + } else if (facet == null || facet.length() == 0) { return false; - } - else { + } else { return thisFacet.equals(facet); } } - /** * Returns the name of the desired facet. * * @return the name of the desired facet. */ protected String getFacet() { - if (facet == null) { - facet = getFacetFromRequest(); + if (this.facet == null) { + this.facet = getFacetFromRequest(); } - return facet; + return this.facet; } - /** * Extracts the name of the requested facet from request document. * * @return the name of the requested facet. */ protected String getFacetFromRequest() { - return XMLUtils.xpathString( - request, XPATH_FACET, ArtifactNamespaceContext.INSTANCE); + return XMLUtils.xpathString(this.request, XPATH_FACET, ArtifactNamespaceContext.INSTANCE); } protected String msg(final String key) { - return Resources.getMsg(context.getMeta(), key, key); + return Resources.getMsg(this.context.getMeta(), key, key); } - protected String msg(String key, final String def) { - return Resources.getMsg(context.getMeta(), key, def); + protected String msg(final String key, final String def) { + return Resources.getMsg(this.context.getMeta(), key, def); } - protected String msg(String key, Object[] args) { - return Resources.getMsg(context.getMeta(), key, key, args); + protected String msg(final String key, final Object[] args) { + return Resources.getMsg(this.context.getMeta(), key, key, args); } - protected String msg(String key, String def, Object[] args) { - return Resources.getMsg(context.getMeta(), key, def, args); + protected String msg(final String key, final String def, final Object[] args) { + return Resources.getMsg(this.context.getMeta(), key, def, args); } protected String msgVarg(final String key, final Object... args) { - return Resources.getMsg(context.getMeta(), key, key, args); + return Resources.getMsg(this.context.getMeta(), key, key, args); } /** * Formats header with unit: msg [unit] */ + // TODO: REMOVE, because it has moved to ExportContextCSV protected final String msgUnit(final String key, final String unit) { final String msg = msg(key); return String.format("%s [%s]", msg, unit); @@ -324,116 +299,104 @@ * This method starts CSV creation. It makes use of writeCSVData() which has * to be implemented by concrete subclasses. */ - protected void generateCSV() - throws IOException - { + protected void generateCSV() throws IOException { log.info("AbstractExporter.generateCSV"); - char quote = '"'; - char escape = '\\'; + final char quote = '"'; + final char escape = '\\'; - CSVWriter writer = new CSVWriter( - new OutputStreamWriter( - out, - DEFAULT_CSV_CHARSET), - DEFAULT_CSV_SEPARATOR, quote, escape, "\r\n"); + final CSVWriter writer = new CSVWriter(new OutputStreamWriter(this.out, DEFAULT_CSV_CHARSET), DEFAULT_CSV_SEPARATOR, quote, escape, "\r\n"); writeCSVData(writer); writer.close(); } - /** * This method starts PDF creation. */ - protected void generatePDF() - throws IOException - { + protected void generatePDF() throws IOException { log.info("AbstractExporter.generatePDF"); writePDF(this.out); } - /** * Returns an instance of EmptySettings currently! * * @return an instance of EmptySettings. */ + @Override public Settings getSettings() { return new EmptySettings(); } - /** * This method is not implemented. Override it in subclasses if those need a * Settings object. */ - public void setSettings(Settings settings) { + @Override + public void setSettings(final Settings settings) { // do nothing } - /** * Returns the number formatter for kilometer values. * * @return the number formatter for kilometer values. */ protected NumberFormat getKmFormatter() { - if (kmFormat == null) { - kmFormat = Formatter.getWaterlevelKM(context); + if (this.kmFormat == null) { + this.kmFormat = Formatter.getWaterlevelKM(this.context); } - return kmFormat; + return this.kmFormat; } - /** * Returns the number formatter for W values. * * @return the number formatter for W values. */ protected NumberFormat getWFormatter() { - if (wFormat == null) { - wFormat = Formatter.getWaterlevelW(context); + if (this.wFormat == null) { + this.wFormat = Formatter.getWaterlevelW(this.context); } - return wFormat; + return this.wFormat; } - /** * Returns the number formatter for Q values. * * @return the number formatter for Q values. */ protected NumberFormat getQFormatter() { - if (qFormat == null) { - qFormat = Formatter.getWaterlevelQ(context); + if (this.qFormat == null) { + this.qFormat = Formatter.getWaterlevelQ(this.context); } - return qFormat; + return this.qFormat; } - + protected final NumberFormat getMeanBedHeighFormatter() { - if( meanBedHeightFormat == null ) - meanBedHeightFormat = Formatter.getMeanBedHeight(context); - return meanBedHeightFormat; + if (this.meanBedHeightFormat == null) + this.meanBedHeightFormat = Formatter.getMeanBedHeight(this.context); + return this.meanBedHeightFormat; } protected final NumberFormat getTkhFormatter() { - if( tkhFormat == null ) - tkhFormat = Formatter.getTkh(context); - return tkhFormat; + if (this.tkhFormat == null) + this.tkhFormat = Formatter.getTkh(this.context); + return this.tkhFormat; } protected final NumberFormat getFlowDepthFormatter() { - if( flowDepthFormat == null ) - flowDepthFormat = Formatter.getFlowDepth(context); - return flowDepthFormat; + if (this.flowDepthFormat == null) + this.flowDepthFormat = Formatter.getFlowDepth(this.context); + return this.flowDepthFormat; } protected final NumberFormat getW2Formatter() { - if( w2Format == null ) - w2Format = Formatter.getFlowDepth(context); - return w2Format; + if (this.w2Format == null) + this.w2Format = Formatter.getFlowDepth(this.context); + return this.w2Format; } } // vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 : diff -r 5be112fba832 -r 23945061daec gwt-client/src/main/java/org/dive4elements/river/client/client/ui/CollectionView.java --- a/gwt-client/src/main/java/org/dive4elements/river/client/client/ui/CollectionView.java Thu Jun 14 15:12:25 2018 +0200 +++ b/gwt-client/src/main/java/org/dive4elements/river/client/client/ui/CollectionView.java Thu Jun 14 16:56:31 2018 +0200 @@ -8,28 +8,16 @@ package org.dive4elements.river.client.client.ui; -import com.google.gwt.core.client.GWT; - -import com.google.gwt.user.client.rpc.AsyncCallback; - -import com.smartgwt.client.util.SC; - -import com.smartgwt.client.widgets.Window; - -import com.smartgwt.client.widgets.events.CloseClickEvent; -import com.smartgwt.client.widgets.events.CloseClickHandler; - -import com.smartgwt.client.widgets.layout.Layout; -import com.smartgwt.client.widgets.layout.VLayout; - -import com.smartgwt.client.widgets.tab.TabSet; - -import com.smartgwt.client.widgets.tab.events.TabSelectedHandler; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.Set; +import java.util.Stack; import org.dive4elements.river.client.client.Config; import org.dive4elements.river.client.client.FLYS; import org.dive4elements.river.client.client.FLYSConstants; - import org.dive4elements.river.client.client.event.CollectionChangeEvent; import org.dive4elements.river.client.client.event.CollectionChangeHandler; import org.dive4elements.river.client.client.event.HasCollectionChangeHandlers; @@ -38,7 +26,6 @@ import org.dive4elements.river.client.client.event.OutputModesChangeHandler; import org.dive4elements.river.client.client.event.ParameterChangeEvent; import org.dive4elements.river.client.client.event.ParameterChangeHandler; - import org.dive4elements.river.client.client.services.AddArtifactService; import org.dive4elements.river.client.client.services.AddArtifactServiceAsync; import org.dive4elements.river.client.client.services.ArtifactService; @@ -51,7 +38,6 @@ import org.dive4elements.river.client.client.services.DescribeCollectionServiceAsync; import org.dive4elements.river.client.client.services.LoadArtifactService; import org.dive4elements.river.client.client.services.LoadArtifactServiceAsync; - import org.dive4elements.river.client.shared.model.Artifact; import org.dive4elements.river.client.shared.model.ArtifactDescription; import org.dive4elements.river.client.shared.model.Collection; @@ -61,45 +47,37 @@ import org.dive4elements.river.client.shared.model.ReportMode; import org.dive4elements.river.client.shared.model.User; -import java.util.ArrayList; -import java.util.HashMap; -import java.util.List; -import java.util.Map; -import java.util.Set; -import java.util.Stack; - +import com.google.gwt.core.client.GWT; +import com.google.gwt.user.client.rpc.AsyncCallback; +import com.smartgwt.client.util.SC; +import com.smartgwt.client.widgets.Window; +import com.smartgwt.client.widgets.events.CloseClickEvent; +import com.smartgwt.client.widgets.events.CloseClickHandler; +import com.smartgwt.client.widgets.layout.Layout; +import com.smartgwt.client.widgets.layout.VLayout; +import com.smartgwt.client.widgets.tab.TabSet; +import com.smartgwt.client.widgets.tab.events.TabSelectedHandler; /** * @author Ingo Weinzierl */ -public class CollectionView -extends Window -implements CollectionChangeHandler, HasCollectionChangeHandlers, - OutputModesChangeHandler, HasOutputModesChangeHandlers, - ParameterChangeHandler, CloseClickHandler -{ +public class CollectionView extends Window implements CollectionChangeHandler, HasCollectionChangeHandlers, OutputModesChangeHandler, HasOutputModesChangeHandlers, ParameterChangeHandler, CloseClickHandler { /** The ArtifactService used to communicate with the Artifact server. */ - protected CreateCollectionServiceAsync createCollectionService = - GWT.create(CreateCollectionService.class); + protected CreateCollectionServiceAsync createCollectionService = GWT.create(CreateCollectionService.class); /** The ArtifactService used to communicate with the Artifact server. */ - protected ArtifactServiceAsync createArtifactService = - GWT.create(ArtifactService.class); + protected ArtifactServiceAsync createArtifactService = GWT.create(ArtifactService.class); /** The AddArtifactService used to add an artifact to a collection. */ - protected AddArtifactServiceAsync addArtifactService = - GWT.create(AddArtifactService.class); + protected AddArtifactServiceAsync addArtifactService = GWT.create(AddArtifactService.class); /** The DescribeCollectionService used to update the existing collection. */ - protected DescribeCollectionServiceAsync describeCollectionService = - GWT.create(DescribeCollectionService.class); + protected DescribeCollectionServiceAsync describeCollectionService = GWT.create(DescribeCollectionService.class); - protected CollectionAttributeServiceAsync updater = - GWT.create(CollectionAttributeService.class); + protected CollectionAttributeServiceAsync updater = GWT.create(CollectionAttributeService.class); - /** The LoadArtifactService used to load recommendations*/ - protected LoadArtifactServiceAsync loadArtifactService = - GWT.create(LoadArtifactService.class); + /** The LoadArtifactService used to load recommendations */ + protected LoadArtifactServiceAsync loadArtifactService = GWT.create(LoadArtifactService.class); /** The message class that provides i18n strings. */ protected FLYSConstants messages = GWT.create(FLYSConstants.class); @@ -137,7 +115,7 @@ protected int recommendationQueue; protected Stack newRecommendations; - /** Values for fix analysis charts*/ + /** Values for fix analysis charts */ protected double currentKm; protected double minKm; protected double maxKm; @@ -147,18 +125,17 @@ * This constructor creates a new CollectionView that is used to display the * collection. */ - public CollectionView(FLYS flys) { - this.flys = flys; - this.tabs = new TabSet(); - this.outputTabs = new HashMap(); - this.handlers = new ArrayList(); - this.outHandlers = new ArrayList(); - this.layout = new VLayout(); - this.parameterList = new ParameterList( - flys, this, messages.new_project()); - this.artifactsQueue = 0; + public CollectionView(final FLYS flys) { + this.flys = flys; + this.tabs = new TabSet(); + this.outputTabs = new HashMap(); + this.handlers = new ArrayList(); + this.outHandlers = new ArrayList(); + this.layout = new VLayout(); + this.parameterList = new ParameterList(flys, this, this.messages.new_project()); + this.artifactsQueue = 0; this.recommendationQueue = 0; - this.newRecommendations = new Stack(); + this.newRecommendations = new Stack(); this.currentKm = -1d; this.minKm = -1d; @@ -166,29 +143,30 @@ this.steps = -1d; addCollectionChangeHandler(this); - addCollectionChangeHandler(parameterList); + addCollectionChangeHandler(this.parameterList); addCollectionChangeHandler(flys); addOutputModesChangeHandler(this); - addOutputModesChangeHandler(parameterList); + addOutputModesChangeHandler(this.parameterList); addCloseClickHandler(this); - parameterList.addParameterChangeHandler(this); + this.parameterList.addParameterChangeHandler(this); init(); } /** - * @param collection The collection to be displayed. + * @param collection + * The collection to be displayed. */ - public CollectionView(FLYS flys, Collection collection, Artifact artifact) { - this.flys = flys; - this.artifact = artifact; - this.collection = collection; - this.tabs = new TabSet(); - this.outputTabs = new HashMap(); - this.handlers = new ArrayList(); - this.outHandlers = new ArrayList(); - this.layout = new VLayout(); + public CollectionView(final FLYS flys, final Collection collection, final Artifact artifact) { + this.flys = flys; + this.artifact = artifact; + this.collection = collection; + this.tabs = new TabSet(); + this.outputTabs = new HashMap(); + this.handlers = new ArrayList(); + this.outHandlers = new ArrayList(); + this.layout = new VLayout(); this.currentKm = -1d; this.minKm = -1d; @@ -196,31 +174,27 @@ this.steps = -1d; if (artifact != null) { - this.parameterList = new ParameterList( - flys, - this, - // FIXME: literally every information about the artifact is transported from the server side - // but... the international name is resolved client-side.... Instead also transport the description of the artifact and use it! - // FIXME: the same holds for a very few other international strings (e.g. names of facets used in Tabs) - messages.getString(artifact.getName()), - artifact); - } - else { - this.parameterList = new ParameterList( - flys, this, messages.new_project()); + this.parameterList = new ParameterList(flys, this, + // FIXME: literally every information about the artifact is transported from the server side + // but... the international name is resolved client-side.... Instead also transport the description of the artifact and + // use it! + // FIXME: the same holds for a very few other international strings (e.g. names of facets used in Tabs) + this.messages.getString(artifact.getName()), artifact); + } else { + this.parameterList = new ParameterList(flys, this, this.messages.new_project()); } - this.artifactsQueue = 0; + this.artifactsQueue = 0; this.newRecommendations = new Stack(); addCollectionChangeHandler(this); - addCollectionChangeHandler(parameterList); + addCollectionChangeHandler(this.parameterList); addCollectionChangeHandler(flys); addOutputModesChangeHandler(this); - addOutputModesChangeHandler(parameterList); + addOutputModesChangeHandler(this.parameterList); addCloseClickHandler(this); - parameterList.addParameterChangeHandler(this); + this.parameterList.addParameterChangeHandler(this); init(); @@ -231,7 +205,6 @@ } } - /** * This method handles the initial layout stuff. */ @@ -241,7 +214,7 @@ setMaximized(true); - layout.setWidth100(); + this.layout.setWidth100(); setCanDragReposition(true); setCanDragResize(true); @@ -250,79 +223,72 @@ setTitle(""); - addItem(layout); + addItem(this.layout); - layout.addMember(tabs); - tabs.addTab(parameterList); + this.layout.addMember(this.tabs); + this.tabs.addTab(this.parameterList); } protected FLYS getFlys() { - return flys; + return this.flys; } - /** * This method registers a new CollectionChangeHandler. * - * @param handler The new CollectionChangeHandler. + * @param handler + * The new CollectionChangeHandler. */ @Override - public void addCollectionChangeHandler(CollectionChangeHandler handler) { + public void addCollectionChangeHandler(final CollectionChangeHandler handler) { if (handler != null) { - handlers.add(handler); + this.handlers.add(handler); } } - /** * This method registers a new OutputModesChangeHandler. * - * @param handler The new OutputModesChangeHandler. + * @param handler + * The new OutputModesChangeHandler. */ @Override - public void addOutputModesChangeHandler(OutputModesChangeHandler handler) { + public void addOutputModesChangeHandler(final OutputModesChangeHandler handler) { if (handler != null) { - outHandlers.add(handler); + this.outHandlers.add(handler); } } - /** * This method calls the onValueChange() method of all * registered ValueChangeHanders. */ - protected void fireCollectionChangeEvent( - Collection old, Collection newCol) - { - for (CollectionChangeHandler handler: handlers) { + protected void fireCollectionChangeEvent(final Collection old, final Collection newCol) { + for (final CollectionChangeHandler handler : this.handlers) { handler.onCollectionChange(new CollectionChangeEvent(old, newCol)); } } - - protected void fireOutputModesChangeEvent(OutputMode[] outputs) { - if (collection == null) { + protected void fireOutputModesChangeEvent(final OutputMode[] outputs) { + if (this.collection == null) { return; } - for (OutputModesChangeHandler handler: outHandlers) { + for (final OutputModesChangeHandler handler : this.outHandlers) { handler.onOutputModesChange(new OutputModesChangeEvent(outputs)); } } - /** Disables input, grey out, show spinning wheel of joy. */ public void lockUI() { - lockScreen = ScreenLock.lockUI(layout, lockScreen); + this.lockScreen = ScreenLock.lockUI(this.layout, this.lockScreen); } - /** Enable input, remove grey, remove spinning wheel of joy. */ public void unlockUI() { - ScreenLock.unlockUI(layout, lockScreen); + ScreenLock.unlockUI(this.layout, this.lockScreen); } - /** * This method returns true, if the Collection is new and no plugins has * been chosen. @@ -330,67 +296,62 @@ * @return true, if the Collection is new. */ public boolean isNew() { - return collection.hasItems(); + return this.collection.hasItems(); } - /** * Returns the artifact that is used for the parameterization. * * @return the artifact that is used for the parameterization. */ public Artifact getArtifact() { - return artifact; + return this.artifact; } - public User getUser() { return getFlys().getCurrentUser(); } - /** * Set the current artifact that is the master of the parameterization. * - * @param artifact The new artifact. + * @param artifact + * The new artifact. */ - public void setArtifact(Artifact artifact) { + public void setArtifact(final Artifact artifact) { this.artifact = artifact; onArtifactChanged(artifact); } - - public void onArtifactChanged(Artifact artifact) { + public void onArtifactChanged(final Artifact artifact) { artifactChanged(); if (artifact.isInBackground()) { - LoadingPanel p = new LoadingPanel(this, artifact); - p.addStepBackHandler(parameterList); + final LoadingPanel p = new LoadingPanel(this, artifact); + p.addStepBackHandler(this.parameterList); } } - /** * Implements the onCollectionChange() method to do update the GUI after the * parameterization has changed. * - * @param event The ParameterChangeEvent. + * @param event + * The ParameterChangeEvent. */ @Override - public void onParameterChange(ParameterChangeEvent event) { + public void onParameterChange(final ParameterChangeEvent event) { GWT.log("CollectionView.onParameterChange"); setArtifact(event.getNewValue()); } - protected void artifactChanged() { - Collection c = getCollection(); + final Collection c = getCollection(); if (c != null) { loadCollection(c); - } - else { + } else { updateView(); } } @@ -398,70 +359,68 @@ /** * Loads all information of a collection. * If 'recommendations' present, load these. - * @param c the Collection + * + * @param c + * the Collection */ - private void loadCollection(Collection c) { - ArtifactDescription desc = getArtifact().getArtifactDescription(); + private void loadCollection(final Collection c) { + final ArtifactDescription desc = getArtifact().getArtifactDescription(); final Recommendation[] recom = desc.getRecommendations(); - Config config = Config.getInstance(); - String locale = config.getLocale(); + final Config config = Config.getInstance(); + final String locale = config.getLocale(); - describeCollectionService.describe(c.identifier(), locale, - new AsyncCallback() { - @Override - public void onFailure(Throwable caught) { - GWT.log("Could not DESCRIBE collection."); - SC.warn(FLYS.getExceptionString(messages, caught)); - } + this.describeCollectionService.describe(c.identifier(), locale, new AsyncCallback() { + @Override + public void onFailure(final Throwable caught) { + GWT.log("Could not DESCRIBE collection."); + SC.warn(FLYS.getExceptionString(CollectionView.this.messages, caught)); + } - @Override - public void onSuccess(Collection newCollection) { - GWT.log("Successfully DESCRIBED collection."); - boolean loaded = true; - for (Recommendation r: recom) { - if(!newCollection.loadedRecommendation(r)) { - loaded = false; - } - } - if (!loaded) { - loadRecommendedArtifacts(recom); - } - else { - setCollection(newCollection); + @Override + public void onSuccess(final Collection newCollection) { + GWT.log("Successfully DESCRIBED collection."); + boolean loaded = true; + for (final Recommendation r : recom) { + if (!newCollection.loadedRecommendation(r)) { + loaded = false; } } + if (!loaded) { + loadRecommendedArtifacts(recom); + } else { + setCollection(newCollection); + } } - ); + }); } - /** * Returns the collection of displayed by this view. * * @return the collection of this view. */ public Collection getCollection() { - return collection; + return this.collection; } - - protected void setCollection(Collection collection) { + protected void setCollection(final Collection collection) { setCollection(collection, false); } - /** * Set the current collection. * - * @param collection The new collection. - * @param suppress Whether to fire a collectionchangeevent. + * @param collection + * The new collection. + * @param suppress + * Whether to fire a collectionchangeevent. */ - protected void setCollection(Collection collection, boolean suppress) { + protected void setCollection(final Collection collection, final boolean suppress) { if (collection != null && this.collection == null) { - flys.getWorkspace().addView(collection.identifier(), this); + this.flys.getWorkspace().addView(collection.identifier(), this); } - Collection tmp = this.collection; + final Collection tmp = this.collection; this.collection = collection; setTitle(collection.getDisplayName()); @@ -471,23 +430,22 @@ } } - @Override - public void onCollectionChange(CollectionChangeEvent event) { - if (artifactsQueue > 0) { + public void onCollectionChange(final CollectionChangeEvent event) { + if (this.artifactsQueue > 0) { GWT.log("Do not update UI because we are still loading Artifacts."); return; } - Collection newCol = event.getNewValue(); + final Collection newCol = event.getNewValue(); - Map outs = newCol.getOutputModes(); + final Map outs = newCol.getOutputModes(); - Set keys = outs.keySet(); - OutputMode[] prepared = new OutputMode[outs.size()]; + final Set keys = outs.keySet(); + final OutputMode[] prepared = new OutputMode[outs.size()]; int idx = 0; - for (String outname: keys) { + for (final String outname : keys) { prepared[idx++] = outs.get(outname); } @@ -496,11 +454,10 @@ updateView(); } - @Override - public void onOutputModesChange(OutputModesChangeEvent event) { + public void onOutputModesChange(final OutputModesChangeEvent event) { clearOutputTabs(); - OutputMode[] outs = event.getOutputModes(); + final OutputMode[] outs = event.getOutputModes(); if (outs == null) { return; @@ -508,11 +465,11 @@ boolean hasCSV = false; - for (OutputMode out: outs) { + for (final OutputMode out : outs) { addOutputTab(out.getName(), out); if (out instanceof ExportMode) { - ExportMode export = (ExportMode) out; + final ExportMode export = (ExportMode) out; if (export.getFacet("csv") != null) { hasCSV = true; @@ -521,25 +478,25 @@ } if (!hasCSV) { - parameterList.removeTable(); + this.parameterList.removeTable(); } } - /** * Adds a new tab for the OutputMode out. * - * @param name The name and title of the output. + * @param name + * The name and title of the output. */ - protected void addOutputTab(String name, OutputMode out) { + protected void addOutputTab(final String name, final OutputMode out) { if (out instanceof ExportMode) { - ExportMode export = (ExportMode) out; + final ExportMode export = (ExportMode) out; - if (export.getFacet("csv") != null && !parameterList.hasTable()) { - TableDataPanel p = new TableDataPanel(); - p.setUuid(collection.identifier()); + if (export.getFacet("csv") != null && !this.parameterList.hasTable()) { + final TableDataPanel p = new TableDataPanel(); + p.setUuid(this.collection.identifier()); p.setName(out.getName()); - parameterList.setTable(p); + this.parameterList.setTable(p); } return; @@ -552,31 +509,29 @@ GWT.log("Add new output tab for '" + name + "'"); - String title = messages.getString(name); - OutputTab tab = out.createOutputTab(title, getCollection(), this); + final String title = this.messages.getString(name); + final OutputTab tab = out.createOutputTab(title, getCollection(), this); if (tab != null) { - outputTabs.put(name, tab); + this.outputTabs.put(name, tab); } } - /** * Removes all output mode tabs from tab bar. */ protected void clearOutputTabs() { GWT.log("Clear OutputTabs."); - int num = tabs.getNumTabs(); + final int num = this.tabs.getNumTabs(); - for (int i = num-1; i >= 1; i--) { - tabs.removeTab(i); + for (int i = num - 1; i >= 1; i--) { + this.tabs.removeTab(i); } - outputTabs.clear(); + this.outputTabs.clear(); } - /** * Update the view (refresh the list of old and current data). */ @@ -585,189 +540,158 @@ updateOutputTabs(); } - /** * This method is used to update the tabs to show specific output modes. */ protected void updateOutputTabs() { GWT.log("Update output tabs."); - if (outputTabs != null) { - Set keys = outputTabs.keySet(); + if (this.outputTabs != null) { + final Set keys = this.outputTabs.keySet(); - for (String key: keys) { - tabs.addTab(outputTabs.get(key)); + for (final String key : keys) { + this.tabs.addTab(this.outputTabs.get(key)); } } } - @Override - public void onCloseClick(CloseClickEvent event) { - if (collection != null) { - if(artifact != null) { - flys.closeProject(collection.identifier()); + public void onCloseClick(final CloseClickEvent event) { + if (this.collection != null) { + if (this.artifact != null) { + this.flys.closeProject(this.collection.identifier()); + } else { + this.flys.getProjectList().deleteCollection(this.collection); } - else { - flys.getProjectList().deleteCollection(collection); - } - } - else { + } else { hide(); destroy(); } } - - public void addArtifactToCollection(Artifact artifact) { - Config config = Config.getInstance(); - final String locale = config.getLocale(); + public void addArtifactToCollection(final Artifact artifact) { + final Config config = Config.getInstance(); + final String locale = config.getLocale(); final Collection collection = getCollection(); GWT.log("CollectionView.addArtifactToCollection " + collection); if (collection != null) { - addArtifactService.add( - collection, artifact, locale, - new AsyncCallback() { - @Override - public void onFailure(Throwable caught) { - GWT.log("An error occured while adding artifact."); - SC.warn(FLYS.getExceptionString(messages, caught)); - } + this.addArtifactService.add(collection, artifact, locale, new AsyncCallback() { + @Override + public void onFailure(final Throwable caught) { + GWT.log("An error occured while adding artifact."); + SC.warn(FLYS.getExceptionString(CollectionView.this.messages, caught)); + } - @Override - public void onSuccess(Collection newCollection) { - GWT.log("Successfully added artifacts."); - setCollection(newCollection); - } + @Override + public void onSuccess(final Collection newCollection) { + GWT.log("Successfully added artifacts."); + setCollection(newCollection); } - ); - } - else { + }); + } else { // Create new collection and add artifact. final Artifact art = artifact; - createCollectionService.create( - locale, - flys.getCurrentUser().identifier(), - new AsyncCallback() { - @Override - public void onFailure(Throwable caught) { - GWT.log("Could not create the new collection."); - SC.warn(FLYS.getExceptionString(messages, caught)); - } + this.createCollectionService.create(locale, this.flys.getCurrentUser().identifier(), new AsyncCallback() { + @Override + public void onFailure(final Throwable caught) { + GWT.log("Could not create the new collection."); + SC.warn(FLYS.getExceptionString(CollectionView.this.messages, caught)); + } - @Override - public void onSuccess(Collection collection) { - GWT.log("Successfully created a new collection."); - addArtifactService.add( - collection, art, locale, - new AsyncCallback() { - @Override - public void onFailure(Throwable caught) { - GWT.log("An error occured while " - + "adding artifact."); - SC.warn(FLYS.getExceptionString( - messages, caught)); - } + @Override + public void onSuccess(final Collection collection) { + GWT.log("Successfully created a new collection."); + CollectionView.this.addArtifactService.add(collection, art, locale, new AsyncCallback() { + @Override + public void onFailure(final Throwable caught) { + GWT.log("An error occured while " + "adding artifact."); + SC.warn(FLYS.getExceptionString(CollectionView.this.messages, caught)); + } - @Override - public void onSuccess( - Collection newCollection) { - GWT.log("Successfully added artifacts."); - setCollection(newCollection); - } - } - ); - } + @Override + public void onSuccess(final Collection newCollection) { + GWT.log("Successfully added artifacts."); + setCollection(newCollection); + } + }); } - ); + }); } } - protected void addRecommendationsToCollection() { - Config config = Config.getInstance(); - final String locale = config.getLocale(); + final Config config = Config.getInstance(); + final String locale = config.getLocale(); final Collection collection = getCollection(); - collection.addRecommendations(newRecommendations); - - updater.update(collection, locale, - new AsyncCallback() { - @Override - public void onFailure(Throwable caught) { - newRecommendations.removeAllElements(); - setCollection(collection); + collection.addRecommendations(this.newRecommendations); - GWT.log("An error occured while saving recommendations."); - SC.warn(FLYS.getExceptionString(messages, caught)); - } + this.updater.update(collection, locale, new AsyncCallback() { + @Override + public void onFailure(final Throwable caught) { + CollectionView.this.newRecommendations.removeAllElements(); + setCollection(collection); - @Override - public void onSuccess(Collection newCol) { - GWT.log("Successfully saved recommendations."); - newRecommendations.removeAllElements(); - setCollection(newCol); - } + GWT.log("An error occured while saving recommendations."); + SC.warn(FLYS.getExceptionString(CollectionView.this.messages, caught)); } - ); + + @Override + public void onSuccess(final Collection newCol) { + GWT.log("Successfully saved recommendations."); + CollectionView.this.newRecommendations.removeAllElements(); + setCollection(newCol); + } + }); } - - protected void loadRecommendedArtifacts(Recommendation[] recommendations) { - Config config = Config.getInstance(); - final String locale = config.getLocale(); + protected void loadRecommendedArtifacts(final Recommendation[] recommendations) { + final Config config = Config.getInstance(); + final String locale = config.getLocale(); final Collection collection = getCollection(); - Artifact masterArtifact = getArtifact(); + final Artifact masterArtifact = getArtifact(); if (recommendations == null) { GWT.log("WARNING: Currently no recommendations."); return; } - for (final Recommendation recommendation: recommendations) { + for (final Recommendation recommendation : recommendations) { if (collection.loadedRecommendation(recommendation)) { continue; } - newRecommendations.push(recommendation); + this.newRecommendations.push(recommendation); // XXX: UGLY! If no reference artifact given use uuid of - // current artifact as reference. + // current artifact as reference. if (recommendation.getMasterArtifact() == null) { recommendation.setMasterArtifact(masterArtifact.getUuid()); } } - loadArtifactService.loadMany( - collection, - recommendations, - null, - locale, - new AsyncCallback() { - @Override - public void onFailure(Throwable caught) { - GWT.log("Error loading recommendations: " + - caught.getMessage()); - SC.warn(FLYS.getExceptionString(messages, caught)); - } + this.loadArtifactService.loadMany(collection, recommendations, null, locale, new AsyncCallback() { + @Override + public void onFailure(final Throwable caught) { + GWT.log("Error loading recommendations: " + caught.getMessage()); + SC.warn(FLYS.getExceptionString(CollectionView.this.messages, caught)); + } - @Override - public void onSuccess(Artifact[] artifacts) { - GWT.log("Loaded artifacts: " + artifacts.length); - addRecommendationsToCollection(); - } + @Override + public void onSuccess(final Artifact[] artifacts) { + GWT.log("Loaded artifacts: " + artifacts.length); + addRecommendationsToCollection(); + } }); } - - public void registerTabHandler(TabSelectedHandler tse) { - tabs.addTabSelectedHandler(tse); + public void registerTabHandler(final TabSelectedHandler tse) { + this.tabs.addTabSelectedHandler(tse); } - - public void setCurrentKm(double currentKm) { + public void setCurrentKm(final double currentKm) { this.currentKm = currentKm; } @@ -775,7 +699,7 @@ return this.currentKm; } - public void setMinKm(double km) { + public void setMinKm(final double km) { this.minKm = km; } @@ -783,7 +707,7 @@ return this.minKm; } - public void setMaxKm(double km) { + public void setMaxKm(final double km) { this.maxKm = km; } @@ -791,7 +715,7 @@ return this.maxKm; } - public void setSteps(double step) { + public void setSteps(final double step) { this.steps = step; } diff -r 5be112fba832 -r 23945061daec gwt-client/src/test/java/test/SinfoTkhRunner.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gwt-client/src/test/java/test/SinfoTkhRunner.java Thu Jun 14 16:56:31 2018 +0200 @@ -0,0 +1,70 @@ +/** Copyright (C) 2017 by Bundesanstalt für Gewässerkunde + * 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) + * and comes with ABSOLUTELY NO WARRANTY! Check out the + * documentation coming with Dive4Elements River for details. + */ +package test; + +import java.io.IOException; + +import org.dive4elements.artifacts.httpclient.exceptions.ConnectionException; +import org.dive4elements.river.client.shared.exceptions.ServerException; +import org.dive4elements.river.client.shared.model.Data; +import org.dive4elements.river.client.shared.model.DataItem; +import org.dive4elements.river.client.shared.model.DefaultDataItem; +import org.dive4elements.river.client.shared.model.StringOptionsData; + +import test.BerechnungsartenTester.CalcMode; +import test.BerechnungsartenTester.FilenameMapper; +import test.BerechnungsartenTester.River; + +/** + * @author Domenico Nardi Tironi + * + */ +public class SinfoTkhRunner extends AbstractModuleRunner { + + public SinfoTkhRunner(final String username, final String password, final CalcMode sinfoCalcFlowDepth, final FilenameMapper file, final double from, + final double to, final River river) throws ConnectionException, ServerException { + super(username, password, AbstractModuleRunner.Infotype.sinfo, sinfoCalcFlowDepth, file, from, to, river); + + } + + @Override + public void runTest(final boolean exportToFile) throws ServerException, IOException { + /* Select River */ + super.selectRiver(); + + /* Select CalcMode */ + super.selectCalcMode(); + + /* Select Range */ + super.selectMaxRange(); + + /* Select TRANSPORTKÖRPERHÖHHEN - einziger Unterschied zu FlowdepthMinMax */ + // + // + // + // + // + // + // + // + + feedAndGo(new Data[] { + + new StringOptionsData("wq_isq", "wq_isq", new DataItem[] { new DefaultDataItem("false", "false", "false") }), + new StringOptionsData("wq_isfree", "wq_isfree", new DataItem[] { new DefaultDataItem("false", "false", "false") }), + new StringOptionsData("wq_isrange", "wq_isrange", new DataItem[] { new DefaultDataItem("false", "false", "false") }), + + new StringOptionsData("wq_single", "wq_single", new DataItem[] { new DefaultDataItem("1059.446", "1059.446", "1059.446") }) }, 0); + + describeCollection(); + + super.export(exportToFile); + } +} diff -r 5be112fba832 -r 23945061daec gwt-client/src/test/resources/sinfo/tkh/sinfo_tkh_export.csv --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gwt-client/src/test/resources/sinfo/tkh/sinfo_tkh_export.csv Thu Jun 14 16:56:31 2018 +0200 @@ -0,0 +1,1797 @@ +"##Ergebnisausgabe - Beispielfluss - Transportkörperhöhen" +"# FLYS-Version: 3.3.0" +"# Bearbeiter: belger" +"# Datum der Erstellung: 12.06.18" +"# Gewässer: Beispielfluss" +"# Höhensystem des Flusses: NHN + m " +"# Bereich (km): 0,000 - 182,400" +"# Berechnungsgrundlage: Gleichung nach GILL (1971)" +"" +"Fluss-km";"Transportkörperhöhe [cm]";"Einteilung der Gewässersohle";"Mittlere Sohlhöhe [NHN + m]";"Wasserstand [NHN + m]";"Q [m³/s]";"Bezeichnung";"Bezugspegel";"Lage" +"" +"##METADATEN WASSERSPIEGELLAGE" +"# Bezeichnung der Wasserspiegellage: Q=1059.446 " +"# Bezugspegel: Torgau" +"" +"1,600";"0,0";"Starr";"87,83";"94,28";"1.075";"1.059,45";"Torgau";"" +"1,700";"0,0";"Starr";"87,76";"94,26";"1.075";"1.059,45";"Torgau";"" +"1,800";"0,0";"Starr";"87,78";"94,24";"1.075";"1.059,45";"Torgau";"" +"1,900";"0,0";"Starr";"87,78";"94,22";"1.075";"1.059,45";"Torgau";"" +"2,000";"0,0";"Starr";"87,75";"94,19";"1.075";"1.059,45";"Torgau";"" +"2,100";"0,0";"Starr";"87,72";"94,17";"1.075";"1.059,45";"Torgau";"" +"2,200";"0,6";"Starr";"87,67";"94,14";"1.075";"1.059,45";"Torgau";"" +"2,300";"1,7";"Starr";"87,62";"94,11";"1.075";"1.059,45";"Torgau";"" +"2,400";"0,9";"Starr";"87,25";"94,08";"1.075";"1.059,45";"Torgau";"" +"2,500";"0,0";"Starr";"87,02";"94,06";"1.075";"1.059,45";"Torgau";"" +"2,600";"0,0";"Starr";"86,94";"94,03";"1.075";"1.059,45";"Torgau";"Gemeinde: Forberge" +"2,700";"0,0";"Starr";"86,83";"94,01";"1.075";"1.059,45";"Torgau";"" +"2,800";"0,0";"Starr";"86,68";"93,98";"1.075";"1.059,45";"Torgau";"" +"2,900";"0,0";"Starr";"86,85";"93,97";"1.075";"1.059,45";"Torgau";"" +"3,000";"0,0";"Starr";"87,00";"93,96";"1.075";"1.059,45";"Torgau";"" +"3,100";"0,0";"Starr";"86,89";"93,93";"1.075";"1.059,45";"Torgau";"" +"3,200";"0,0";"Starr";"87,09";"93,90";"1.075";"1.059,45";"Torgau";"" +"3,300";"0,0";"Starr";"87,12";"93,88";"1.075";"1.059,45";"Torgau";"" +"3,400";"0,0";"Starr";"87,12";"93,85";"1.075";"1.059,45";"Torgau";"" +"3,500";"3,0";"Starr";"87,18";"93,83";"1.075";"1.059,45";"Torgau";"" +"3,600";"2,2";"Starr";"87,23";"93,80";"1.075";"1.059,45";"Torgau";"" +"3,700";"1,4";"Starr";"87,22";"93,78";"1.075";"1.059,45";"Torgau";"" +"3,800";"2,7";"Starr";"87,22";"93,75";"1.075";"1.059,45";"Torgau";"" +"3,900";"4,0";"Starr";"87,29";"93,73";"1.075";"1.059,45";"Torgau";"" +"4,000";"0,0";"Starr";"87,33";"93,70";"1.075";"1.059,45";"Torgau";"" +"4,100";"0,0";"Starr";"87,32";"93,68";"1.075";"1.059,45";"Torgau";"" +"4,200";"0,0";"Starr";"87,29";"93,66";"1.075";"1.059,45";"Torgau";"" +"4,300";"0,0";"Starr";"87,28";"93,64";"1.075";"1.059,45";"Torgau";"" +"4,400";"0,0";"Starr";"87,32";"93,61";"1.075";"1.059,45";"Torgau";"" +"4,500";"1,3";"Starr";"87,28";"93,58";"1.075";"1.059,45";"Torgau";"" +"4,600";"3,0";"Starr";"87,19";"93,55";"1.075";"1.059,45";"Torgau";"Gemeinde: Klein-Zschepa" +"4,700";"4,8";"Starr";"87,07";"93,52";"1.075";"1.059,45";"Torgau";"" +"4,800";"6,8";"Starr";"86,96";"93,49";"1.075";"1.059,45";"Torgau";"" +"4,900";"8,9";"Starr";"86,78";"93,46";"1.075";"1.059,45";"Torgau";"" +"5,000";"14,3";"Starr";"86,45";"93,43";"1.075";"1.059,45";"Torgau";"" +"5,100";"18,4";"Starr";"86,46";"93,40";"1.075";"1.059,45";"Torgau";"" +"5,200";"17,6";"Starr";"86,55";"93,36";"1.075";"1.059,45";"Torgau";"" +"5,300";"17,1";"Starr";"86,50";"93,34";"1.075";"1.059,45";"Torgau";"" +"5,400";"17,2";"Starr";"86,58";"93,31";"1.075";"1.059,45";"Torgau";"" +"5,500";"17,3";"Starr";"86,63";"93,29";"1.075";"1.059,45";"Torgau";"" +"5,600";"16,3";"Starr";"86,65";"93,27";"1.075";"1.059,45";"Torgau";"Gemeinde: Groß-Zschepa" +"5,700";"14,4";"Starr";"86,71";"93,25";"1.075";"1.059,45";"Torgau";"" +"5,800";"12,8";"Starr";"86,74";"93,23";"1.075";"1.059,45";"Torgau";"" +"5,900";"11,2";"Starr";"86,72";"93,22";"1.075";"1.059,45";"Torgau";"" +"6,000";"13,0";"Starr";"86,64";"93,20";"1.075";"1.059,45";"Torgau";"" +"6,100";"14,7";"Starr";"86,56";"93,18";"1.075";"1.059,45";"Torgau";"" +"6,200";"15,5";"Starr";"86,55";"93,15";"1.075";"1.059,45";"Torgau";"" +"6,300";"16,2";"Starr";"86,52";"93,12";"1.075";"1.059,45";"Torgau";"" +"6,400";"15,3";"Starr";"86,53";"93,09";"1.075";"1.059,45";"Torgau";"" +"6,500";"14,4";"Starr";"86,47";"93,06";"1.075";"1.059,45";"Torgau";"" +"6,600";"16,3";"Starr";"86,10";"93,03";"1.075";"1.059,45";"Torgau";"Gemeinde: Strehla" +"6,700";"18,1";"Starr";"85,78";"93,01";"1.075";"1.059,45";"Torgau";"" +"6,800";"10,9";"Starr";"86,24";"92,98";"1.075";"1.059,45";"Torgau";"" +"6,900";"3,3";"Starr";"86,19";"92,98";"1.075";"1.059,45";"Torgau";"" +"7,000";"0,3";"Starr";"86,21";"92,97";"1.075";"1.059,45";"Torgau";"" +"7,100";"0,0";"Starr";"86,10";"92,96";"1.075";"1.059,45";"Torgau";"" +"7,200";"5,1";"Starr";"86,06";"92,94";"1.075";"1.059,45";"Torgau";"" +"7,300";"11,3";"Starr";"86,20";"92,91";"1.075";"1.059,45";"Torgau";"" +"7,400";"11,5";"Starr";"86,27";"92,88";"1.075";"1.059,45";"Torgau";"" +"7,500";"11,9";"Starr";"86,25";"92,86";"1.075";"1.059,45";"Torgau";"" +"7,600";"10,6";"Starr";"86,21";"92,83";"1.075";"1.059,45";"Torgau";"" +"7,700";"9,3";"Starr";"86,15";"92,81";"1.075";"1.059,45";"Torgau";"" +"7,800";"19,8";"Starr";"86,16";"92,79";"1.075";"1.059,45";"Torgau";"" +"7,900";"26,2";"Starr";"86,18";"92,73";"1.075";"1.059,45";"Torgau";"" +"8,000";"28,0";"Starr";"86,14";"92,67";"1.075";"1.059,45";"Torgau";"" +"8,100";"29,6";"Starr";"86,09";"92,62";"1.075";"1.059,45";"Torgau";"" +"8,200";"32,2";"Starr";"86,07";"92,57";"1.075";"1.059,45";"Torgau";"" +"8,300";"34,5";"Starr";"85,94";"92,50";"1.075";"1.059,45";"Torgau";"" +"8,400";"30,5";"Starr";"85,54";"92,43";"1.075";"1.059,45";"Torgau";"" +"8,500";"15,7";"Starr";"85,56";"92,47";"1.075";"1.059,45";"Torgau";"" +"8,600";"21,5";"Starr";"85,65";"92,50";"1.075";"1.059,45";"Torgau";"Gemeinde: Nixstein" +"8,700";"25,8";"Starr";"85,65";"92,45";"1.075";"1.059,45";"Torgau";"" +"8,800";"25,9";"Starr";"85,61";"92,39";"1.075";"1.059,45";"Torgau";"" +"8,900";"25,3";"Starr";"85,72";"92,36";"1.075";"1.059,45";"Torgau";"" +"9,000";"25,9";"Starr";"85,69";"92,33";"1.075";"1.059,45";"Torgau";"" +"9,100";"26,3";"Starr";"85,69";"92,31";"1.075";"1.059,45";"Torgau";"" +"9,200";"29,2";"Starr";"85,68";"92,29";"1.075";"1.059,45";"Torgau";"" +"9,300";"31,1";"Starr";"85,73";"92,25";"1.075";"1.059,45";"Torgau";"" +"9,400";"31,5";"Starr";"85,55";"92,21";"1.075";"1.059,45";"Torgau";"" +"9,500";"34,0";"Starr";"85,00";"92,18";"1.075";"1.059,45";"Torgau";"" +"9,600";"33,8";"Starr";"85,04";"92,14";"1.075";"1.059,45";"Torgau";"Gemeinde: Görzig,Trebnitz" +"9,700";"32,0";"Starr";"85,35";"92,11";"1.075";"1.059,45";"Torgau";"" +"9,800";"25,9";"Starr";"85,76";"92,08";"1.075";"1.059,45";"Torgau";"" +"9,900";"20,0";"Starr";"85,88";"92,07";"1.075";"1.059,45";"Torgau";"" +"10,000";"20,9";"Starr";"85,50";"92,05";"1.075";"1.059,45";"Torgau";"" +"10,100";"20,5";"Starr";"85,41";"92,03";"1.075";"1.059,45";"Torgau";"" +"10,200";"22,1";"Starr";"85,29";"92,00";"1.075";"1.059,45";"Torgau";"" +"10,300";"23,6";"Starr";"85,20";"91,98";"1.075";"1.059,45";"Torgau";"" +"10,400";"27,9";"Starr";"85,20";"91,95";"1.075";"1.059,45";"Torgau";"" +"10,500";"30,9";"Starr";"85,21";"91,92";"1.075";"1.059,45";"Torgau";"" +"10,600";"27,8";"Starr";"85,25";"91,89";"1.075";"1.059,45";"Torgau";"" +"10,700";"23,9";"Starr";"85,32";"91,88";"1.075";"1.059,45";"Torgau";"" +"10,800";"22,9";"Starr";"85,38";"91,86";"1.075";"1.059,45";"Torgau";"Gemeinde: Kreinitz" +"10,900";"22,1";"Starr";"85,39";"91,83";"1.075";"1.059,45";"Torgau";"" +"11,000";"19,9";"Starr";"85,39";"91,80";"1.075";"1.059,45";"Torgau";"" +"11,100";"18,0";"Starr";"85,23";"91,77";"1.075";"1.059,45";"Torgau";"" +"11,200";"20,3";"Starr";"85,17";"91,74";"1.075";"1.059,45";"Torgau";"" +"11,300";"21,7";"Starr";"85,27";"91,71";"1.075";"1.059,45";"Torgau";"" +"11,400";"22,8";"Starr";"85,28";"91,68";"1.075";"1.059,45";"Torgau";"" +"11,500";"23,9";"Starr";"85,28";"91,66";"1.075";"1.059,45";"Torgau";"" +"11,600";"23,5";"Starr";"85,27";"91,63";"1.075";"1.059,45";"Torgau";"" +"11,700";"23,2";"Starr";"85,24";"91,60";"1.075";"1.059,45";"Torgau";"" +"11,800";"23,4";"Starr";"85,22";"91,57";"1.075";"1.059,45";"Torgau";"" +"11,900";"23,9";"Starr";"85,12";"91,54";"1.075";"1.059,45";"Torgau";"" +"12,000";"23,6";"Starr";"85,02";"91,51";"1.075";"1.059,45";"Torgau";"" +"12,100";"23,0";"Starr";"84,98";"91,49";"1.075";"1.059,45";"Torgau";"" +"12,200";"21,8";"Starr";"85,05";"91,46";"1.075";"1.059,45";"Torgau";"" +"12,300";"21,0";"Starr";"85,04";"91,44";"1.075";"1.059,45";"Torgau";"" +"12,400";"24,7";"Starr";"84,88";"91,42";"1.075";"1.059,45";"Torgau";"" +"12,500";"27,1";"Starr";"84,89";"91,38";"1.075";"1.059,45";"Torgau";"" +"12,600";"27,7";"Starr";"84,93";"91,34";"1.075";"1.059,45";"Torgau";"" +"12,700";"32,3";"Starr";"84,20";"91,32";"1.075";"1.059,45";"Torgau";"" +"12,800";"32,4";"Starr";"84,32";"91,30";"1.075";"1.059,45";"Torgau";"" +"12,900";"33,7";"Starr";"84,22";"91,27";"1.075";"1.059,45";"Torgau";"" +"13,000";"27,3";"Starr";"84,18";"91,24";"1.075";"1.059,45";"Torgau";"" +"13,100";"31,1";"Starr";"83,97";"91,19";"1.075";"1.059,45";"Torgau";"" +"13,200";"33,1";"Starr";"83,94";"91,14";"1.075";"1.059,45";"Torgau";"" +"13,300";"35,0";"Starr";"83,88";"91,10";"1.075";"1.059,45";"Torgau";"" +"13,400";"33,1";"Starr";"83,81";"91,06";"1.075";"1.059,45";"Torgau";"" +"13,500";"30,1";"Starr";"83,80";"90,95";"1.075";"1.059,45";"Torgau";"" +"13,600";"30,7";"Starr";"83,86";"90,84";"1.075";"1.059,45";"Torgau";"" +"13,700";"31,9";"Starr";"83,82";"90,73";"1.075";"1.059,45";"Torgau";"" +"13,800";"29,2";"Starr";"83,90";"90,62";"1.075";"1.059,45";"Torgau";"" +"13,900";"27,0";"Starr";"83,89";"90,59";"1.075";"1.059,45";"Torgau";"" +"14,000";"26,4";"Starr";"83,84";"90,56";"1.075";"1.059,45";"Torgau";"" +"14,100";"26,0";"Starr";"83,74";"90,55";"1.075";"1.059,45";"Torgau";"" +"14,200";"29,0";"Starr";"83,67";"90,53";"1.075";"1.059,45";"Torgau";"" +"14,300";"31,1";"Starr";"83,68";"90,49";"1.075";"1.059,45";"Torgau";"" +"14,400";"29,4";"Starr";"83,74";"90,44";"1.075";"1.059,45";"Torgau";"" +"14,500";"27,4";"Starr";"83,83";"90,42";"1.075";"1.059,45";"Torgau";"" +"14,600";"30,3";"Starr";"83,72";"90,39";"1.075";"1.059,45";"Torgau";"" +"14,700";"34,5";"Starr";"83,31";"90,35";"1.075";"1.059,45";"Torgau";"" +"14,800";"40,7";"Starr";"82,68";"90,31";"1.075";"1.059,45";"Torgau";"" +"14,900";"43,4";"Starr";"82,55";"90,26";"1.075";"1.059,45";"Torgau";"" +"15,000";"40,1";"Starr";"82,88";"90,21";"1.075";"1.059,45";"Torgau";"" +"15,100";"36,8";"Starr";"83,23";"90,19";"1.075";"1.059,45";"Torgau";"" +"15,200";"33,5";"Starr";"83,48";"90,17";"1.075";"1.059,45";"Torgau";"" +"15,300";"31,5";"Starr";"83,44";"90,16";"1.075";"1.059,45";"Torgau";"" +"15,400";"34,6";"Starr";"83,29";"90,15";"1.075";"1.059,45";"Torgau";"" +"15,500";"36,6";"Starr";"83,24";"90,11";"1.075";"1.059,45";"Torgau";"" +"15,600";"36,7";"Starr";"83,11";"90,07";"1.075";"1.059,45";"Torgau";"" +"15,700";"36,3";"Starr";"83,09";"90,05";"1.075";"1.059,45";"Torgau";"" +"15,800";"37,1";"Starr";"83,12";"90,02";"1.075";"1.059,45";"Torgau";"" +"15,900";"37,9";"Starr";"83,13";"89,99";"1.075";"1.059,45";"Torgau";"" +"16,000";"36,1";"Starr";"83,24";"89,95";"1.075";"1.059,45";"Torgau";"" +"16,100";"35,7";"Starr";"83,12";"89,93";"1.075";"1.059,45";"Torgau";"" +"16,200";"37,8";"Starr";"82,84";"89,90";"1.075";"1.059,45";"Torgau";"" +"16,300";"37,9";"Starr";"82,86";"89,87";"1.075";"1.059,45";"Torgau";"" +"16,400";"39,4";"Starr";"82,92";"89,84";"1.075";"1.059,45";"Torgau";"" +"16,500";"41,9";"Starr";"82,78";"89,81";"1.075";"1.059,45";"Torgau";"" +"16,600";"43,7";"Starr";"82,72";"89,78";"1.075";"1.059,45";"Torgau";"" +"16,700";"44,2";"Starr";"82,78";"89,75";"1.075";"1.059,45";"Torgau";"" +"16,800";"43,3";"Starr";"82,89";"89,71";"1.075";"1.059,45";"Torgau";"" +"16,900";"43,0";"Starr";"82,93";"89,68";"1.075";"1.059,45";"Torgau";"" +"17,000";"42,6";"Starr";"82,92";"89,64";"1.075";"1.059,45";"Torgau";"" +"17,100";"42,9";"Starr";"82,83";"89,61";"1.075";"1.059,45";"Torgau";"" +"17,200";"43,8";"Starr";"82,74";"89,57";"1.075";"1.059,45";"Torgau";"" +"17,300";"44,2";"Starr";"82,72";"89,54";"1.075";"1.059,45";"Torgau";"" +"17,400";"45,9";"Starr";"82,56";"89,51";"1.075";"1.059,45";"Torgau";"" +"17,500";"48,8";"Starr";"82,24";"89,47";"1.075";"1.059,45";"Torgau";"" +"17,600";"45,5";"Starr";"82,56";"89,43";"1.075";"1.059,45";"Torgau";"" +"17,700";"44,1";"Starr";"82,66";"89,40";"1.075";"1.059,45";"Torgau";"" +"17,800";"42,1";"Starr";"82,89";"89,37";"1.075";"1.059,45";"Torgau";"" +"17,900";"46,5";"Starr";"82,33";"89,34";"1.075";"1.059,45";"Torgau";"" +"18,000";"49,3";"Starr";"81,93";"89,31";"1.075";"1.059,45";"Torgau";"" +"18,100";"48,9";"Starr";"81,92";"89,28";"1.075";"1.059,45";"Torgau";"" +"18,200";"48,1";"Starr";"82,15";"89,25";"1.075";"1.059,45";"Torgau";"Geschiebemessstelle: Mühlberg" +"18,300";"47,2";"Starr";"82,27";"89,21";"1.075";"1.059,45";"Torgau";"" +"18,400";"46,8";"Starr";"82,19";"89,17";"1.075";"1.059,45";"Torgau";"" +"18,500";"47,7";"Starr";"81,95";"89,15";"1.075";"1.059,45";"Torgau";"" +"18,600";"48,8";"Starr";"81,69";"89,12";"1.075";"1.059,45";"Torgau";"" +"18,700";"49,7";"Starr";"81,44";"89,11";"1.075";"1.059,45";"Torgau";"Hafen: Mühlberg -Schutz- und Sicherheitshafen" +"18,800";"45,9";"Starr";"81,27";"89,10";"1.075";"1.059,45";"Torgau";"" +"18,900";"36,8";"Starr";"81,44";"89,10";"1.075";"1.059,45";"Torgau";"" +"19,000";"43,3";"Starr";"81,47";"89,09";"1.075";"1.059,45";"Torgau";"" +"19,100";"44,2";"Starr";"81,88";"89,06";"1.075";"1.059,45";"Torgau";"" +"19,200";"42,1";"Starr";"82,06";"89,03";"1.075";"1.059,45";"Torgau";"" +"19,300";"42,6";"Starr";"81,87";"89,01";"1.075";"1.059,45";"Torgau";"" +"19,400";"41,1";"Starr";"81,76";"88,98";"1.075";"1.059,45";"Torgau";"" +"19,500";"39,6";"Starr";"81,58";"88,96";"1.075";"1.059,45";"Torgau";"Fähre: Köttlitz -Gierseilfähre" +"19,600";"42,8";"Starr";"81,18";"88,94";"1.075";"1.059,45";"Torgau";"Zufluss: Lukke" +"19,700";"43,5";"Starr";"81,14";"88,89";"1.075";"1.059,45";"Torgau";"" +"19,800";"42,8";"Starr";"81,50";"88,84";"1.068";"1.059,45";"Torgau";"" +"19,900";"42,4";"Starr";"81,73";"88,81";"1.068";"1.059,45";"Torgau";"" +"20,000";"41,1";"Starr";"81,91";"88,77";"1.068";"1.059,45";"Torgau";"" +"20,100";"40,5";"Starr";"81,98";"88,74";"1.068";"1.059,45";"Torgau";"" +"20,200";"40,3";"Starr";"81,94";"88,70";"1.068";"1.059,45";"Torgau";"" +"20,300";"40,1";"Starr";"81,90";"88,67";"1.068";"1.059,45";"Torgau";"" +"20,400";"39,1";"Starr";"81,96";"88,64";"1.068";"1.059,45";"Torgau";"" +"20,500";"39,5";"Starr";"81,82";"88,61";"1.068";"1.059,45";"Torgau";"" +"20,600";"39,8";"Starr";"81,91";"88,58";"1.068";"1.059,45";"Torgau";"" +"20,700";"40,8";"Starr";"81,83";"88,54";"1.068";"1.059,45";"Torgau";"" +"20,800";"40,8";"Starr";"81,60";"88,50";"1.068";"1.059,45";"Torgau";"" +"20,900";"40,0";"Starr";"81,39";"88,48";"1.068";"1.059,45";"Torgau";"" +"21,000";"42,3";"Starr";"81,00";"88,45";"1.068";"1.059,45";"Torgau";"" +"21,100";"43,4";"Starr";"80,80";"88,42";"1.068";"1.059,45";"Torgau";"" +"21,200";"42,2";"Starr";"80,90";"88,39";"1.068";"1.059,45";"Torgau";"" +"21,300";"40,4";"Starr";"81,09";"88,36";"1.068";"1.059,45";"Torgau";"" +"21,400";"38,4";"Starr";"81,28";"88,32";"1.068";"1.059,45";"Torgau";"" +"21,500";"40,0";"Starr";"80,94";"88,28";"1.068";"1.059,45";"Torgau";"" +"21,600";"39,8";"Starr";"81,13";"88,24";"1.068";"1.059,45";"Torgau";"" +"21,700";"39,6";"Starr";"81,25";"88,20";"1.068";"1.059,45";"Torgau";"" +"21,800";"38,9";"Starr";"81,28";"88,16";"1.064";"1.059,45";"Torgau";"" +"21,900";"38,6";"Starr";"81,26";"88,13";"1.064";"1.059,45";"Torgau";"" +"22,000";"37,1";"Starr";"81,29";"88,09";"1.064";"1.059,45";"Torgau";"" +"22,100";"35,5";"Starr";"81,30";"88,07";"1.064";"1.059,45";"Torgau";"" +"22,200";"36,1";"Starr";"80,90";"88,04";"1.064";"1.059,45";"Torgau";"" +"22,300";"33,4";"Starr";"80,98";"88,02";"1.064";"1.059,45";"Torgau";"" +"22,400";"35,2";"Starr";"80,94";"87,99";"1.064";"1.059,45";"Torgau";"" +"22,500";"36,5";"Starr";"80,91";"87,95";"1.064";"1.059,45";"Torgau";"" +"22,600";"34,1";"Starr";"81,11";"87,91";"1.064";"1.059,45";"Torgau";"" +"22,700";"32,9";"Starr";"81,09";"87,88";"1.064";"1.059,45";"Torgau";"" +"22,800";"30,8";"Starr";"81,10";"87,84";"1.064";"1.059,45";"Torgau";"" +"22,900";"28,9";"Starr";"81,02";"87,82";"1.064";"1.059,45";"Torgau";"" +"23,000";"28,7";"Starr";"81,11";"87,79";"1.064";"1.059,45";"Torgau";"" +"23,100";"30,2";"Starr";"80,86";"87,75";"1.064";"1.059,45";"Torgau";"" +"23,200";"28,8";"Starr";"80,82";"87,70";"1.064";"1.059,45";"Torgau";"" +"23,300";"27,4";"Starr";"80,78";"87,68";"1.064";"1.059,45";"Torgau";"" +"23,400";"25,2";"Starr";"80,80";"87,65";"1.064";"1.059,45";"Torgau";"" +"23,500";"23,0";"Starr";"80,78";"87,64";"1.064";"1.059,45";"Torgau";"" +"23,600";"29,3";"Starr";"80,74";"87,62";"1.064";"1.059,45";"Torgau";"" +"23,700";"33,6";"Starr";"80,70";"87,58";"1.064";"1.059,45";"Torgau";"" +"23,800";"32,7";"Starr";"80,70";"87,53";"1.064";"1.059,45";"Torgau";"" +"23,900";"32,2";"Starr";"80,64";"87,50";"1.064";"1.059,45";"Torgau";"" +"24,000";"32,9";"Starr";"80,52";"87,47";"1.064";"1.059,45";"Torgau";"" +"24,100";"33,7";"Starr";"80,38";"87,44";"1.064";"1.059,45";"Torgau";"" +"24,200";"35,0";"Starr";"80,16";"87,41";"1.064";"1.059,45";"Torgau";"" +"24,300";"36,3";"Starr";"79,94";"87,39";"1.064";"1.059,45";"Torgau";"" +"24,400";"35,2";"Starr";"80,02";"87,36";"1.064";"1.059,45";"Torgau";"" +"24,500";"33,2";"Starr";"80,24";"87,34";"1.064";"1.059,45";"Torgau";"" +"24,600";"33,7";"Starr";"80,44";"87,31";"1.064";"1.059,45";"Torgau";"" +"24,700";"34,5";"Starr";"80,53";"87,28";"1.064";"1.059,45";"Torgau";"" +"24,800";"35,8";"Starr";"80,50";"87,25";"1.064";"1.059,45";"Torgau";"" +"24,900";"37,9";"Starr";"80,32";"87,21";"1.064";"1.059,45";"Torgau";"" +"25,000";"37,6";"Starr";"80,34";"87,17";"1.064";"1.059,45";"Torgau";"" +"25,100";"37,2";"Starr";"80,36";"87,14";"1.064";"1.059,45";"Torgau";"" +"25,200";"37,2";"Starr";"80,31";"87,11";"1.064";"1.059,45";"Torgau";"" +"25,300";"36,3";"Starr";"80,41";"87,09";"1.064";"1.059,45";"Torgau";"" +"25,400";"35,8";"Starr";"80,36";"87,06";"1.064";"1.059,45";"Torgau";"" +"25,500";"36,5";"Starr";"80,11";"87,04";"1.064";"1.059,45";"Torgau";"" +"25,600";"39,1";"Starr";"79,87";"87,02";"1.064";"1.059,45";"Torgau";"" +"25,700";"40,2";"Starr";"79,79";"86,99";"1.064";"1.059,45";"Torgau";"" +"25,800";"40,0";"Starr";"79,82";"86,95";"1.064";"1.059,45";"Torgau";"" +"25,900";"40,4";"Starr";"79,78";"86,92";"1.064";"1.059,45";"Torgau";"" +"26,000";"41,2";"Starr";"79,52";"86,88";"1.064";"1.059,45";"Torgau";"" +"26,100";"40,3";"Starr";"79,52";"86,86";"1.064";"1.059,45";"Torgau";"" +"26,200";"40,4";"Starr";"79,53";"86,83";"1.064";"1.059,45";"Torgau";"" +"26,300";"40,7";"Starr";"79,52";"86,79";"1.064";"1.059,45";"Torgau";"" +"26,400";"42,0";"Starr";"79,39";"86,75";"1.064";"1.059,45";"Torgau";"" +"26,500";"42,1";"Starr";"79,43";"86,72";"1.064";"1.059,45";"Torgau";"" +"26,600";"38,8";"Starr";"79,75";"86,68";"1.064";"1.059,45";"Torgau";"Bundesland: Freistaat Sachsen" +"26,700";"36,6";"Starr";"79,90";"86,67";"1.064";"1.059,45";"Torgau";"" +"26,800";"36,9";"Starr";"79,94";"86,65";"1.064";"1.059,45";"Torgau";"" +"26,900";"37,2";"Starr";"79,94";"86,61";"1.064";"1.059,45";"Torgau";"" +"27,000";"37,8";"Starr";"79,91";"86,57";"1.064";"1.059,45";"Torgau";"" +"27,100";"40,2";"Starr";"79,61";"86,53";"1.064";"1.059,45";"Torgau";"" +"27,200";"39,9";"Starr";"79,59";"86,49";"1.064";"1.059,45";"Torgau";"" +"27,300";"38,9";"Starr";"79,68";"86,47";"1.064";"1.059,45";"Torgau";"" +"27,400";"38,2";"Starr";"79,66";"86,45";"1.064";"1.059,45";"Torgau";"" +"27,500";"36,7";"Starr";"79,76";"86,43";"1.064";"1.059,45";"Torgau";"" +"27,600";"34,0";"Starr";"79,89";"86,41";"1.064";"1.059,45";"Torgau";"" +"27,700";"31,0";"Starr";"80,05";"86,39";"1.064";"1.059,45";"Torgau";"" +"27,800";"33,3";"Starr";"79,83";"86,37";"1.064";"1.059,45";"Torgau";"" +"27,900";"36,0";"Starr";"79,52";"86,33";"1.064";"1.059,45";"Torgau";"" +"28,000";"38,4";"Starr";"79,49";"86,29";"1.064";"1.059,45";"Torgau";"" +"28,100";"39,9";"Starr";"79,51";"86,24";"1.064";"1.059,45";"Torgau";"" +"28,200";"38,6";"Starr";"79,52";"86,18";"1.064";"1.059,45";"Torgau";"" +"28,300";"37,6";"Starr";"79,49";"86,17";"1.064";"1.059,45";"Torgau";"" +"28,400";"38,4";"Starr";"79,45";"86,15";"1.064";"1.059,45";"Torgau";"" +"28,500";"38,8";"Starr";"79,44";"86,11";"1.064";"1.059,45";"Torgau";"" +"28,600";"38,5";"Starr";"79,44";"86,07";"1.064";"1.059,45";"Torgau";"" +"28,700";"38,8";"Starr";"79,35";"86,04";"1.064";"1.059,45";"Torgau";"" +"28,800";"39,5";"Starr";"79,27";"86,00";"1.064";"1.059,45";"Torgau";"" +"28,900";"40,1";"Starr";"79,18";"85,97";"1.064";"1.059,45";"Torgau";"" +"29,000";"42,4";"Starr";"78,96";"85,93";"1.064";"1.059,45";"Torgau";"" +"29,100";"42,2";"Starr";"79,04";"85,89";"1.064";"1.059,45";"Torgau";"" +"29,200";"41,0";"Starr";"79,13";"85,84";"1.064";"1.059,45";"Torgau";"" +"29,300";"40,2";"Starr";"79,15";"85,82";"1.064";"1.059,45";"Torgau";"" +"29,400";"39,8";"Starr";"79,16";"85,80";"1.064";"1.059,45";"Torgau";"" +"29,500";"40,0";"Starr";"79,07";"85,77";"1.064";"1.059,45";"Torgau";"" +"29,600";"41,4";"Starr";"78,94";"85,73";"1.064";"1.059,45";"Torgau";"" +"29,700";"42,0";"Starr";"78,91";"85,69";"1.064";"1.059,45";"Torgau";"" +"29,800";"40,2";"Starr";"78,95";"85,64";"1.064";"1.059,45";"Torgau";"" +"29,900";"38,7";"Starr";"78,95";"85,63";"1.064";"1.059,45";"Torgau";"" +"30,000";"43,5";"Starr";"78,45";"85,62";"1.064";"1.059,45";"Torgau";"" +"30,100";"46,0";"Starr";"78,25";"85,59";"1.064";"1.059,45";"Torgau";"" +"30,200";"45,5";"Starr";"78,09";"85,55";"1.064";"1.059,45";"Torgau";"" +"30,300";"43,7";"Starr";"78,07";"85,54";"1.064";"1.059,45";"Torgau";"" +"30,400";"44,8";"Starr";"78,04";"85,52";"1.064";"1.059,45";"Torgau";"" +"30,500";"43,7";"Starr";"78,30";"85,48";"1.064";"1.059,45";"Torgau";"" +"30,600";"44,0";"Starr";"78,27";"85,44";"1.064";"1.059,45";"Torgau";"" +"30,700";"44,6";"Starr";"78,22";"85,42";"1.064";"1.059,45";"Torgau";"" +"30,800";"43,3";"Starr";"78,30";"85,39";"1.062";"1.059,45";"Torgau";"" +"30,900";"42,7";"Starr";"78,26";"85,37";"1.062";"1.059,45";"Torgau";"" +"31,000";"43,9";"Starr";"78,19";"85,34";"1.062";"1.059,45";"Torgau";"" +"31,100";"44,2";"Starr";"78,19";"85,29";"1.062";"1.059,45";"Torgau";"" +"31,200";"46,7";"Starr";"78,03";"85,24";"1.062";"1.059,45";"Torgau";"" +"31,300";"50,3";"Starr";"77,69";"85,19";"1.062";"1.059,45";"Torgau";"" +"31,400";"47,7";"Starr";"77,98";"85,14";"1.062";"1.059,45";"Torgau";"" +"31,500";"45,8";"Starr";"78,14";"85,09";"1.062";"1.059,45";"Torgau";"" +"31,600";"45,6";"Starr";"78,05";"85,03";"1.062";"1.059,45";"Torgau";"" +"32,200";"43,3";"Starr";"77,85";"85,01";"1.062";"1.059,45";"Torgau";"" +"32,300";"42,8";"Starr";"77,84";"85,00";"1.062";"1.059,45";"Torgau";"" +"32,400";"44,5";"Starr";"77,69";"84,98";"1.062";"1.059,45";"Torgau";"" +"32,500";"45,1";"Starr";"77,68";"84,95";"1.062";"1.059,45";"Torgau";"" +"32,600";"45,1";"Starr";"77,75";"84,92";"1.062";"1.059,45";"Torgau";"" +"32,700";"45,9";"Starr";"77,70";"84,89";"1.062";"1.059,45";"Torgau";"" +"32,800";"46,3";"Starr";"77,59";"84,85";"1.062";"1.059,45";"Torgau";"" +"32,900";"44,9";"Starr";"77,74";"84,83";"1.062";"1.059,45";"Torgau";"" +"33,000";"47,0";"Starr";"77,45";"84,80";"1.062";"1.059,45";"Torgau";"" +"33,100";"47,6";"Starr";"77,35";"84,78";"1.062";"1.059,45";"Torgau";"" +"33,200";"47,2";"Starr";"77,40";"84,76";"1.062";"1.059,45";"Torgau";"" +"33,300";"46,1";"Starr";"77,55";"84,74";"1.062";"1.059,45";"Torgau";"" +"33,400";"45,9";"Starr";"77,57";"84,71";"1.062";"1.059,45";"Torgau";"" +"33,500";"46,1";"Starr";"77,54";"84,69";"1.062";"1.059,45";"Torgau";"" +"33,600";"47,7";"Starr";"77,42";"84,67";"1.062";"1.059,45";"Torgau";"" +"33,700";"48,4";"Starr";"77,39";"84,64";"1.062";"1.059,45";"Torgau";"" +"33,800";"49,6";"Starr";"77,24";"84,61";"1.062";"1.059,45";"Torgau";"" +"33,900";"50,9";"Starr";"77,08";"84,59";"1.062";"1.059,45";"Torgau";"" +"34,000";"50,0";"Starr";"77,04";"84,56";"1.062";"1.059,45";"Torgau";"" +"34,100";"50,3";"Starr";"76,80";"84,54";"1.062";"1.059,45";"Torgau";"" +"34,200";"50,4";"Starr";"76,77";"84,52";"1.062";"1.059,45";"Torgau";"" +"34,300";"48,9";"Starr";"76,95";"84,50";"1.062";"1.059,45";"Torgau";"" +"34,400";"49,2";"Starr";"77,08";"84,47";"1.062";"1.059,45";"Torgau";"" +"34,500";"49,4";"Starr";"77,19";"84,45";"1.062";"1.059,45";"Torgau";"" +"34,600";"48,6";"Starr";"77,31";"84,42";"1.062";"1.059,45";"Torgau";"" +"34,700";"48,2";"Starr";"77,36";"84,39";"1.062";"1.059,45";"Torgau";"" +"34,800";"50,8";"Starr";"77,05";"84,36";"1.062";"1.059,45";"Torgau";"" +"34,900";"52,9";"Starr";"76,83";"84,35";"1.062";"1.059,45";"Torgau";"" +"35,000";"51,5";"Starr";"76,88";"84,33";"1.062";"1.059,45";"Torgau";"" +"35,100";"52,6";"Mobil";"76,55";"84,31";"1.062";"1.059,45";"Torgau";"" +"35,200";"53,8";"Mobil";"76,52";"84,28";"1.062";"1.059,45";"Torgau";"" +"35,300";"53,6";"Starr";"76,62";"84,25";"1.062";"1.059,45";"Torgau";"" +"35,400";"53,4";"Starr";"76,63";"84,21";"1.062";"1.059,45";"Torgau";"" +"35,500";"54,3";"Starr";"76,52";"84,19";"1.062";"1.059,45";"Torgau";"" +"35,600";"57,6";"Starr";"76,11";"84,16";"1.062";"1.059,45";"Torgau";"" +"35,700";"59,8";"Starr";"75,83";"84,13";"1.062";"1.059,45";"Torgau";"" +"35,800";"60,1";"Starr";"75,82";"84,10";"1.062";"1.059,45";"Torgau";"" +"35,900";"59,7";"Starr";"75,88";"84,07";"1.062";"1.059,45";"Torgau";"" +"36,000";"59,6";"Starr";"75,87";"84,03";"1.062";"1.059,45";"Torgau";"" +"36,100";"58,5";"Starr";"75,98";"84,00";"1.062";"1.059,45";"Torgau";"" +"36,200";"57,9";"Starr";"75,83";"83,97";"1.062";"1.059,45";"Torgau";"" +"36,300";"56,8";"Starr";"75,71";"83,96";"1.062";"1.059,45";"Torgau";"" +"36,400";"57,3";"Starr";"75,97";"83,94";"1.062";"1.059,45";"Torgau";"" +"36,500";"56,3";"Starr";"76,21";"83,90";"1.062";"1.059,45";"Torgau";"" +"36,600";"57,5";"Starr";"76,00";"83,86";"1.062";"1.059,45";"Torgau";"" +"36,700";"55,3";"Starr";"76,19";"83,84";"1.062";"1.059,45";"Torgau";"" +"36,800";"55,7";"Starr";"76,17";"83,81";"1.062";"1.059,45";"Torgau";"" +"36,900";"55,0";"Starr";"76,25";"83,78";"1.062";"1.059,45";"Torgau";"" +"37,000";"55,1";"Starr";"76,21";"83,74";"1.062";"1.059,45";"Torgau";"" +"37,100";"56,0";"Starr";"76,08";"83,71";"1.062";"1.059,45";"Torgau";"" +"37,200";"55,6";"Starr";"76,03";"83,68";"1.062";"1.059,45";"Torgau";"" +"37,300";"55,2";"Starr";"75,99";"83,66";"1.062";"1.059,45";"Torgau";"" +"37,400";"52,7";"Starr";"76,20";"83,64";"1.062";"1.059,45";"Torgau";"" +"37,500";"50,8";"Starr";"76,34";"83,63";"1.062";"1.059,45";"Torgau";"" +"37,600";"52,1";"Starr";"76,23";"83,61";"1.062";"1.059,45";"Torgau";"" +"37,700";"52,1";"Starr";"76,25";"83,58";"1.062";"1.059,45";"Torgau";"" +"37,800";"51,3";"Starr";"75,97";"83,55";"1.062";"1.059,45";"Torgau";"" +"37,900";"46,1";"Starr";"75,94";"83,56";"1.062";"1.059,45";"Torgau";"" +"38,000";"46,6";"Starr";"76,03";"83,56";"1.062";"1.059,45";"Torgau";"" +"38,100";"46,7";"Starr";"76,14";"83,54";"1.062";"1.059,45";"Torgau";"" +"38,200";"48,6";"Starr";"76,17";"83,52";"1.062";"1.059,45";"Torgau";"" +"38,300";"50,7";"Starr";"76,05";"83,47";"1.062";"1.059,45";"Torgau";"" +"38,400";"48,9";"Starr";"76,12";"83,42";"1.062";"1.059,45";"Torgau";"" +"38,500";"47,5";"Starr";"76,14";"83,40";"1.062";"1.059,45";"Torgau";"" +"38,600";"48,0";"Starr";"76,22";"83,37";"1.062";"1.059,45";"Torgau";"" +"38,700";"49,2";"Starr";"76,15";"83,33";"1.062";"1.059,45";"Torgau";"" +"38,800";"48,7";"Starr";"76,22";"83,29";"1.062";"1.059,45";"Torgau";"" +"38,900";"48,2";"Starr";"76,29";"83,26";"1.062";"1.059,45";"Torgau";"" +"39,000";"46,1";"Starr";"76,29";"83,23";"1.062";"1.059,45";"Torgau";"" +"39,100";"44,6";"Starr";"76,10";"83,22";"1.062";"1.059,45";"Torgau";"" +"39,200";"45,6";"Starr";"76,13";"83,21";"1.062";"1.059,45";"Torgau";"" +"39,300";"45,9";"Starr";"76,20";"83,18";"1.062";"1.059,45";"Torgau";"" +"39,400";"47,3";"Starr";"75,99";"83,14";"1.062";"1.059,45";"Torgau";"" +"39,500";"47,6";"Starr";"75,94";"83,12";"1.062";"1.059,45";"Torgau";"" +"39,600";"49,1";"Starr";"75,74";"83,09";"1.062";"1.059,45";"Torgau";"" +"39,700";"49,8";"Starr";"75,63";"83,06";"1.062";"1.059,45";"Torgau";"" +"39,800";"50,7";"Starr";"75,41";"83,02";"1.062";"1.059,45";"Torgau";"" +"39,900";"51,5";"Starr";"75,20";"83,01";"1.062";"1.059,45";"Torgau";"" +"40,000";"51,8";"Starr";"75,08";"82,99";"1.062";"1.059,45";"Torgau";"" +"40,100";"51,2";"Starr";"75,07";"82,98";"1.062";"1.059,45";"Torgau";"" +"40,200";"50,1";"Starr";"75,00";"82,96";"1.062";"1.059,45";"Torgau";"" +"40,300";"47,8";"Starr";"75,04";"82,94";"1.062";"1.059,45";"Torgau";"" +"40,400";"47,9";"Starr";"74,99";"82,92";"1.062";"1.059,45";"Torgau";"" +"40,500";"48,8";"Starr";"74,83";"82,90";"1.062";"1.059,45";"Torgau";"" +"40,600";"46,1";"Starr";"75,04";"82,87";"1.062";"1.059,45";"Torgau";"" +"40,700";"42,7";"Starr";"75,37";"82,85";"1.062";"1.059,45";"Torgau";"" +"40,800";"39,3";"Starr";"75,44";"82,83";"1.059";"1.059,45";"Torgau";"" +"40,900";"36,1";"Starr";"75,39";"82,82";"1.059";"1.059,45";"Torgau";"" +"41,000";"38,1";"Starr";"75,40";"82,81";"1.059";"1.059,45";"Torgau";"" +"41,100";"39,2";"Starr";"75,49";"82,78";"1.059";"1.059,45";"Torgau";"" +"41,200";"41,9";"Starr";"75,40";"82,75";"1.059";"1.059,45";"Torgau";"" +"41,300";"46,9";"Starr";"74,89";"82,71";"1.059";"1.059,45";"Torgau";"" +"41,400";"48,9";"Starr";"74,60";"82,67";"1.059";"1.059,45";"Torgau";"" +"41,500";"48,9";"Starr";"74,63";"82,66";"1.059";"1.059,45";"Torgau";"" +"41,600";"47,3";"Starr";"74,75";"82,65";"1.059";"1.059,45";"Torgau";"" +"41,700";"47,8";"Starr";"74,71";"82,63";"1.059";"1.059,45";"Torgau";"" +"41,800";"46,4";"Starr";"74,91";"82,61";"1.059";"1.059,45";"Torgau";"" +"41,900";"45,3";"Starr";"75,05";"82,59";"1.059";"1.059,45";"Torgau";"" +"42,000";"47,6";"Starr";"75,07";"82,56";"1.059";"1.059,45";"Torgau";"" +"42,100";"49,7";"Starr";"75,05";"82,53";"1.059";"1.059,45";"Torgau";"" +"42,200";"49,2";"Starr";"74,97";"82,50";"1.059";"1.059,45";"Torgau";"" +"42,300";"49,6";"Starr";"74,74";"82,49";"1.059";"1.059,45";"Torgau";"" +"42,400";"51,0";"Starr";"74,68";"82,48";"1.059";"1.059,45";"Torgau";"" +"42,500";"52,9";"Starr";"74,52";"82,46";"1.059";"1.059,45";"Torgau";"" +"42,600";"53,0";"Starr";"74,49";"82,43";"1.059";"1.059,45";"Torgau";"" +"42,700";"53,7";"Starr";"74,39";"82,42";"1.059";"1.059,45";"Torgau";"" +"42,800";"55,1";"Starr";"74,34";"82,40";"1.059";"1.059,45";"Torgau";"" +"42,900";"57,7";"Starr";"74,13";"82,38";"1.059";"1.059,45";"Torgau";"" +"43,000";"58,6";"Starr";"74,10";"82,36";"1.059";"1.059,45";"Torgau";"" +"43,100";"56,2";"Starr";"74,47";"82,34";"1.059";"1.059,45";"Torgau";"" +"43,200";"58,1";"Starr";"74,35";"82,32";"1.059";"1.059,45";"Torgau";"" +"43,300";"57,8";"Starr";"74,48";"82,30";"1.059";"1.059,45";"Torgau";"" +"43,400";"58,2";"Starr";"74,58";"82,28";"1.059";"1.059,45";"Torgau";"" +"43,500";"60,7";"Starr";"74,40";"82,26";"1.059";"1.059,45";"Torgau";"" +"43,600";"60,6";"Starr";"74,43";"82,24";"1.059";"1.059,45";"Torgau";"" +"43,700";"59,5";"Starr";"74,57";"82,23";"1.059";"1.059,45";"Torgau";"" +"43,800";"60,2";"Starr";"74,35";"82,22";"1.059";"1.059,45";"Torgau";"" +"43,900";"60,0";"Starr";"74,18";"82,22";"1.059";"1.059,45";"Torgau";"" +"44,000";"61,4";"Starr";"74,41";"82,21";"1.059";"1.059,45";"Torgau";"" +"44,100";"62,9";"Starr";"74,47";"82,17";"1.059";"1.059,45";"Torgau";"" +"44,200";"64,4";"Starr";"74,30";"82,13";"1.059";"1.059,45";"Torgau";"" +"44,300";"65,7";"Starr";"74,17";"82,13";"1.059";"1.059,45";"Torgau";"" +"44,400";"68,0";"Starr";"74,08";"82,13";"1.059";"1.059,45";"Torgau";"" +"44,500";"72,2";"Starr";"73,75";"82,11";"1.059";"1.059,45";"Torgau";"" +"44,600";"74,3";"Starr";"73,66";"82,08";"1.059";"1.059,45";"Torgau";"" +"44,700";"75,3";"Starr";"73,65";"82,05";"1.059";"1.059,45";"Torgau";"" +"44,800";"76,0";"Starr";"73,62";"82,02";"1.059";"1.059,45";"Torgau";"" +"44,900";"77,6";"Starr";"73,52";"82,00";"1.059";"1.059,45";"Torgau";"" +"45,000";"79,8";"Starr";"73,35";"81,98";"1.059";"1.059,45";"Torgau";"" +"45,100";"80,2";"Starr";"73,36";"81,97";"1.059";"1.059,45";"Torgau";"" +"45,200";"80,4";"Starr";"73,46";"81,96";"1.059";"1.059,45";"Torgau";"" +"45,300";"80,7";"Starr";"73,47";"81,93";"1.059";"1.059,45";"Torgau";"" +"45,400";"82,1";"Starr";"73,39";"81,89";"1.059";"1.059,45";"Torgau";"" +"45,500";"82,8";"Mobil";"73,39";"81,89";"1.059";"1.059,45";"Torgau";"" +"45,600";"83,0";"Mobil";"73,45";"81,88";"1.059";"1.059,45";"Torgau";"" +"45,700";"79,7";"Mobil";"73,58";"81,84";"1.059";"1.059,45";"Torgau";"" +"45,800";"76,5";"Mobil";"73,73";"81,80";"1.059";"1.059,45";"Torgau";"Hafen: Torgau" +"45,900";"77,8";"Starr";"73,47";"81,80";"1.059";"1.059,45";"Torgau";"" +"46,000";"75,4";"Starr";"73,56";"81,79";"1.059";"1.059,45";"Torgau";"" +"46,100";"71,9";"Starr";"73,76";"81,77";"1.059";"1.059,45";"Torgau";"Brücke: Torgau -Straße B87" +"46,200";"64,2";"Starr";"74,44";"81,75";"1.059";"1.059,45";"Torgau";"" +"46,300";"65,9";"Starr";"74,17";"81,72";"1.059";"1.059,45";"Torgau";"" +"46,400";"65,5";"Starr";"74,07";"81,69";"1.059";"1.059,45";"Torgau";"" +"46,500";"62,8";"Starr";"74,20";"81,66";"1.059";"1.059,45";"Torgau";"" +"46,600";"61,5";"Starr";"74,18";"81,63";"1.059";"1.059,45";"Torgau";"" +"46,700";"60,8";"Starr";"74,09";"81,61";"1.059";"1.059,45";"Torgau";"" +"46,800";"63,0";"Starr";"73,58";"81,59";"1.059";"1.059,45";"Torgau";"Geschiebemessstelle: Torgau" +"46,900";"62,0";"Starr";"73,51";"81,58";"1.059";"1.059,45";"Torgau";"" +"47,000";"62,6";"Starr";"73,62";"81,57";"1.059";"1.059,45";"Torgau";"" +"47,100";"61,6";"Starr";"73,80";"81,53";"1.059";"1.059,45";"Torgau";"" +"47,200";"60,3";"Starr";"73,81";"81,48";"1.059";"1.059,45";"Torgau";"" +"47,300";"65,5";"Starr";"73,09";"81,48";"1.059";"1.059,45";"Torgau";"" +"47,400";"65,1";"Starr";"72,85";"81,47";"1.059";"1.059,45";"Torgau";"" +"47,500";"61,3";"Starr";"72,84";"81,47";"1.059";"1.059,45";"Torgau";"" +"47,600";"61,6";"Starr";"72,92";"81,46";"1.059";"1.059,45";"Torgau";"" +"47,700";"58,2";"Starr";"73,43";"81,44";"1.059";"1.059,45";"Torgau";"" +"47,800";"58,4";"Starr";"73,35";"81,41";"1.059";"1.059,45";"Torgau";"" +"47,900";"58,5";"Starr";"73,29";"81,40";"1.059";"1.059,45";"Torgau";"" +"48,000";"57,9";"Starr";"73,58";"81,38";"1.059";"1.059,45";"Torgau";"" +"48,100";"59,0";"Starr";"73,56";"81,35";"1.059";"1.059,45";"Torgau";"" +"48,200";"60,0";"Starr";"73,51";"81,32";"1.059";"1.059,45";"Torgau";"" +"48,300";"60,3";"Starr";"73,52";"81,30";"1.059";"1.059,45";"Torgau";"" +"48,400";"60,2";"Starr";"73,47";"81,27";"1.059";"1.059,45";"Torgau";"" +"48,500";"58,7";"Starr";"73,57";"81,25";"1.059";"1.059,45";"Torgau";"" +"48,600";"58,7";"Starr";"73,51";"81,22";"1.059";"1.059,45";"Torgau";"" +"48,700";"59,3";"Starr";"73,40";"81,20";"1.059";"1.059,45";"Torgau";"" +"48,800";"58,8";"Starr";"73,36";"81,17";"1.059";"1.059,45";"Torgau";"" +"48,900";"58,0";"Starr";"73,38";"81,16";"1.059";"1.059,45";"Torgau";"" +"49,000";"59,1";"Starr";"73,28";"81,15";"1.059";"1.059,45";"Torgau";"" +"49,100";"56,6";"Starr";"73,56";"81,12";"1.059";"1.059,45";"Torgau";"" +"49,200";"56,0";"Starr";"73,66";"81,08";"1.059";"1.059,45";"Torgau";"" +"49,300";"56,6";"Starr";"73,62";"81,06";"1.059";"1.059,45";"Torgau";"" +"49,400";"57,8";"Starr";"73,35";"81,04";"1.059";"1.059,45";"Torgau";"" +"49,500";"57,8";"Starr";"73,17";"81,03";"1.059";"1.059,45";"Torgau";"" +"49,600";"56,6";"Starr";"73,27";"81,01";"1.059";"1.059,45";"Torgau";"" +"49,700";"57,1";"Starr";"73,16";"80,99";"1.059";"1.059,45";"Torgau";"" +"49,800";"58,3";"Starr";"72,93";"80,96";"1.059";"1.059,45";"Torgau";"" +"49,900";"58,0";"Starr";"72,90";"80,94";"1.059";"1.059,45";"Torgau";"" +"50,000";"57,4";"Starr";"73,21";"80,92";"1.059";"1.059,45";"Torgau";"" +"50,100";"58,0";"Starr";"73,23";"80,87";"1.059";"1.059,45";"Torgau";"" +"50,200";"57,6";"Starr";"73,12";"80,82";"1.059";"1.059,45";"Torgau";"" +"50,300";"59,3";"Starr";"72,76";"80,81";"1.059";"1.059,45";"Torgau";"" +"50,400";"55,6";"Starr";"73,07";"80,79";"1.059";"1.059,45";"Torgau";"" +"50,500";"52,0";"Starr";"73,36";"80,78";"1.059";"1.059,45";"Torgau";"" +"50,600";"51,8";"Starr";"73,34";"80,76";"1.059";"1.059,45";"Torgau";"" +"50,700";"51,8";"Starr";"73,30";"80,74";"1.059";"1.059,45";"Torgau";"" +"50,800";"52,7";"Starr";"73,23";"80,72";"1.059";"1.059,45";"Torgau";"" +"50,900";"53,9";"Starr";"73,11";"80,70";"1.059";"1.059,45";"Torgau";"" +"51,000";"54,2";"Starr";"73,12";"80,67";"1.059";"1.059,45";"Torgau";"" +"51,100";"57,2";"Starr";"72,77";"80,64";"1.059";"1.059,45";"Torgau";"" +"51,200";"57,6";"Starr";"72,70";"80,61";"1.059";"1.059,45";"Torgau";"" +"51,300";"57,8";"Starr";"72,64";"80,58";"1.059";"1.059,45";"Torgau";"" +"51,400";"58,2";"Starr";"72,55";"80,55";"1.059";"1.059,45";"Torgau";"" +"51,500";"56,1";"Starr";"72,78";"80,53";"1.059";"1.059,45";"Torgau";"" +"51,600";"56,3";"Starr";"72,75";"80,50";"1.059";"1.059,45";"Torgau";"" +"51,700";"56,5";"Starr";"72,71";"80,48";"1.059";"1.059,45";"Torgau";"" +"51,800";"57,1";"Starr";"72,66";"80,45";"1.059";"1.059,45";"Torgau";"" +"51,900";"55,8";"Starr";"72,82";"80,42";"1.059";"1.059,45";"Torgau";"" +"52,000";"54,1";"Starr";"72,92";"80,39";"1.059";"1.059,45";"Torgau";"" +"52,100";"57,7";"Starr";"72,40";"80,37";"1.059";"1.059,45";"Torgau";"" +"52,200";"59,4";"Starr";"72,19";"80,34";"1.059";"1.059,45";"Torgau";"" +"52,300";"60,4";"Starr";"72,07";"80,32";"1.059";"1.059,45";"Torgau";"" +"52,400";"60,6";"Starr";"72,00";"80,29";"1.059";"1.059,45";"Torgau";"" +"52,500";"60,9";"Starr";"71,90";"80,28";"1.059";"1.059,45";"Torgau";"" +"52,600";"62,6";"Starr";"71,75";"80,27";"1.059";"1.059,45";"Torgau";"" +"52,700";"60,8";"Starr";"72,02";"80,26";"1.059";"1.059,45";"Torgau";"" +"52,800";"62,4";"Starr";"72,01";"80,24";"1.059";"1.059,45";"Torgau";"" +"52,900";"59,8";"Starr";"72,42";"80,20";"1.059";"1.059,45";"Torgau";"" +"53,000";"60,2";"Starr";"72,39";"80,16";"1.059";"1.059,45";"Torgau";"" +"53,100";"62,4";"Starr";"72,18";"80,14";"1.059";"1.059,45";"Torgau";"" +"53,200";"63,2";"Starr";"72,18";"80,12";"1.059";"1.059,45";"Torgau";"" +"53,300";"63,5";"Starr";"72,21";"80,09";"1.059";"1.059,45";"Torgau";"" +"53,400";"63,2";"Starr";"72,22";"80,05";"1.059";"1.059,45";"Torgau";"" +"53,500";"66,8";"Starr";"71,83";"80,03";"1.059";"1.059,45";"Torgau";"" +"53,600";"64,7";"Starr";"72,06";"80,00";"1.059";"1.059,45";"Torgau";"" +"53,700";"66,0";"Starr";"71,92";"79,99";"1.059";"1.059,45";"Torgau";"" +"53,800";"66,3";"Starr";"71,92";"79,97";"1.059";"1.059,45";"Torgau";"" +"53,900";"65,1";"Starr";"72,06";"79,96";"1.059";"1.059,45";"Torgau";"" +"54,000";"64,8";"Starr";"72,18";"79,94";"1.059";"1.059,45";"Torgau";"" +"54,100";"66,0";"Starr";"72,13";"79,92";"1.059";"1.059,45";"Torgau";"" +"54,200";"65,3";"Starr";"72,19";"79,90";"1.059";"1.059,45";"Torgau";"" +"54,300";"66,3";"Starr";"72,10";"79,89";"1.059";"1.059,45";"Torgau";"" +"54,400";"68,4";"Starr";"71,94";"79,88";"1.059";"1.059,45";"Torgau";"" +"54,500";"66,4";"Starr";"72,20";"79,86";"1.059";"1.059,45";"Torgau";"" +"54,600";"66,0";"Starr";"72,30";"79,84";"1.059";"1.059,45";"Torgau";"" +"54,700";"67,2";"Mobil";"72,21";"79,81";"1.059";"1.059,45";"Torgau";"" +"54,800";"73,0";"Mobil";"71,64";"79,77";"1.059";"1.059,45";"Torgau";"" +"54,900";"76,4";"Mobil";"71,34";"79,77";"1.059";"1.059,45";"Torgau";"" +"55,000";"77,4";"Mobil";"71,34";"79,76";"1.059";"1.059,45";"Torgau";"" +"55,100";"71,1";"Mobil";"71,85";"79,73";"1.059";"1.059,45";"Torgau";"" +"55,200";"73,4";"Mobil";"71,53";"79,69";"1.059";"1.059,45";"Torgau";"" +"55,300";"69,6";"Mobil";"71,82";"79,67";"1.059";"1.059,45";"Torgau";"" +"55,400";"68,4";"Starr";"71,84";"79,64";"1.059";"1.059,45";"Torgau";"" +"55,500";"67,1";"Starr";"71,88";"79,62";"1.059";"1.059,45";"Torgau";"" +"55,600";"62,9";"Starr";"72,21";"79,60";"1.059";"1.059,45";"Torgau";"" +"55,700";"63,3";"Starr";"72,07";"79,59";"1.059";"1.059,45";"Torgau";"" +"55,800";"63,0";"Starr";"72,07";"79,57";"1.059";"1.059,45";"Torgau";"" +"55,900";"64,0";"Starr";"71,91";"79,54";"1.059";"1.059,45";"Torgau";"" +"56,000";"65,5";"Starr";"71,57";"79,51";"1.059";"1.059,45";"Torgau";"" +"56,100";"64,2";"Starr";"71,47";"79,50";"1.059";"1.059,45";"Torgau";"" +"56,200";"60,4";"Starr";"71,75";"79,49";"1.059";"1.059,45";"Torgau";"" +"56,300";"58,4";"Starr";"71,82";"79,48";"1.059";"1.059,45";"Torgau";"" +"56,400";"59,7";"Starr";"71,64";"79,46";"1.059";"1.059,45";"Torgau";"" +"56,500";"57,3";"Starr";"71,88";"79,44";"1.059";"1.059,45";"Torgau";"" +"56,600";"56,2";"Starr";"71,80";"79,41";"1.059";"1.059,45";"Torgau";"" +"56,700";"56,9";"Starr";"71,48";"79,39";"1.059";"1.059,45";"Torgau";"" +"56,800";"56,6";"Starr";"71,38";"79,37";"1.059";"1.059,45";"Torgau";"" +"56,900";"55,5";"Starr";"71,38";"79,35";"1.059";"1.059,45";"Torgau";"" +"57,000";"54,5";"Starr";"71,43";"79,33";"1.059";"1.059,45";"Torgau";"" +"57,100";"52,8";"Starr";"71,57";"79,31";"1.059";"1.059,45";"Torgau";"" +"57,200";"49,5";"Starr";"72,00";"79,28";"1.059";"1.059,45";"Torgau";"" +"57,300";"52,3";"Starr";"71,64";"79,26";"1.059";"1.059,45";"Torgau";"" +"57,400";"57,0";"Starr";"70,98";"79,23";"1.059";"1.059,45";"Torgau";"" +"57,500";"56,6";"Starr";"70,97";"79,20";"1.059";"1.059,45";"Torgau";"" +"57,600";"54,7";"Starr";"71,21";"79,17";"1.059";"1.059,45";"Torgau";"" +"57,700";"52,9";"Starr";"71,41";"79,13";"1.059";"1.059,45";"Torgau";"" +"57,800";"52,6";"Starr";"71,21";"79,09";"1.059";"1.059,45";"Torgau";"" +"57,900";"51,6";"Starr";"71,08";"79,07";"1.059";"1.059,45";"Torgau";"" +"58,000";"50,7";"Starr";"71,20";"79,05";"1.059";"1.059,45";"Torgau";"" +"58,100";"49,7";"Starr";"71,34";"79,03";"1.059";"1.059,45";"Torgau";"" +"58,200";"45,8";"Starr";"71,58";"79,01";"1.059";"1.059,45";"Torgau";"" +"58,300";"43,1";"Starr";"71,62";"79,00";"1.059";"1.059,45";"Torgau";"" +"58,400";"41,0";"Starr";"71,70";"78,98";"1.059";"1.059,45";"Torgau";"" +"58,500";"42,4";"Starr";"71,18";"78,96";"1.059";"1.059,45";"Torgau";"" +"58,600";"44,2";"Starr";"70,75";"78,94";"1.059";"1.059,45";"Torgau";"" +"58,700";"41,6";"Starr";"71,06";"78,92";"1.059";"1.059,45";"Torgau";"" +"58,800";"36,5";"Starr";"71,38";"78,90";"1.059";"1.059,45";"Torgau";"" +"58,900";"31,2";"Starr";"71,71";"78,88";"1.059";"1.059,45";"Torgau";"" +"59,000";"33,0";"Starr";"71,54";"78,86";"1.059";"1.059,45";"Torgau";"" +"59,100";"34,2";"Starr";"71,49";"78,84";"1.059";"1.059,45";"Torgau";"" +"59,200";"25,3";"Starr";"71,31";"78,81";"1.059";"1.059,45";"Torgau";"" +"59,300";"9,8";"Starr";"71,07";"78,82";"1.059";"1.059,45";"Torgau";"" +"59,400";"22,2";"Starr";"70,97";"78,82";"1.059";"1.059,45";"Torgau";"" +"59,500";"32,1";"Mobil";"70,79";"78,80";"1.059";"1.059,45";"Torgau";"" +"59,600";"31,8";"Mobil";"70,95";"78,77";"1.059";"1.059,45";"Torgau";"" +"59,700";"31,3";"Mobil";"71,15";"78,75";"1.059";"1.059,45";"Torgau";"" +"59,800";"30,6";"Mobil";"71,37";"78,73";"1.059";"1.059,45";"Torgau";"" +"59,900";"30,6";"Mobil";"71,44";"78,72";"1.059";"1.059,45";"Torgau";"" +"60,000";"30,5";"Mobil";"71,49";"78,70";"1.059";"1.059,45";"Torgau";"" +"60,100";"30,1";"Mobil";"71,59";"78,69";"1.059";"1.059,45";"Torgau";"" +"60,200";"36,0";"Mobil";"71,53";"78,67";"1.059";"1.059,45";"Torgau";"HW-Schutz: Prettiner-Deich" +"60,300";"40,1";"Mobil";"71,52";"78,63";"1.059";"1.059,45";"Torgau";"" +"60,400";"40,1";"Mobil";"71,41";"78,59";"1.059";"1.059,45";"Torgau";"" +"60,500";"39,3";"Mobil";"71,43";"78,58";"1.059";"1.059,45";"Torgau";"" +"60,600";"38,8";"Mobil";"71,44";"78,57";"1.059";"1.059,45";"Torgau";"" +"60,700";"39,4";"Mobil";"71,25";"78,56";"1.059";"1.059,45";"Torgau";"" +"60,800";"41,8";"Mobil";"71,18";"78,54";"1.059";"1.059,45";"Torgau";"" +"60,900";"44,0";"Mobil";"71,12";"78,52";"1.059";"1.059,45";"Torgau";"" +"61,000";"45,0";"Mobil";"70,93";"78,50";"1.059";"1.059,45";"Torgau";"" +"61,100";"45,1";"Mobil";"70,88";"78,49";"1.059";"1.059,45";"Torgau";"" +"61,200";"49,4";"Mobil";"70,83";"78,47";"1.059";"1.059,45";"Torgau";"" +"61,300";"51,9";"Mobil";"70,88";"78,45";"1.059";"1.059,45";"Torgau";"" +"61,400";"52,9";"Mobil";"70,77";"78,42";"1.059";"1.059,45";"Torgau";"" +"61,500";"51,2";"Mobil";"71,01";"78,41";"1.059";"1.059,45";"Torgau";"" +"61,600";"53,8";"Mobil";"70,81";"78,39";"1.059";"1.059,45";"Torgau";"" +"61,700";"57,2";"Mobil";"70,52";"78,37";"1.059";"1.059,45";"Torgau";"" +"61,800";"58,6";"Mobil";"70,39";"78,35";"1.059";"1.059,45";"Torgau";"" +"61,900";"59,2";"Mobil";"70,36";"78,34";"1.059";"1.059,45";"Torgau";"" +"62,000";"60,8";"Mobil";"70,41";"78,32";"1.059";"1.059,45";"Torgau";"" +"62,100";"65,4";"Mobil";"70,07";"78,30";"1.059";"1.059,45";"Torgau";"" +"62,200";"62,1";"Mobil";"70,53";"78,28";"1.059";"1.059,45";"Torgau";"" +"62,300";"59,3";"Mobil";"70,94";"78,26";"1.059";"1.059,45";"Torgau";"" +"62,400";"58,9";"Starr";"71,11";"78,24";"1.059";"1.059,45";"Torgau";"" +"62,500";"59,0";"Starr";"71,23";"78,23";"1.059";"1.059,45";"Torgau";"" +"62,600";"61,4";"Starr";"71,06";"78,21";"1.059";"1.059,45";"Torgau";"" +"62,700";"62,5";"Starr";"70,89";"78,20";"1.059";"1.059,45";"Torgau";"" +"62,800";"63,4";"Starr";"70,83";"78,18";"1.059";"1.059,45";"Torgau";"" +"62,900";"65,4";"Mobil";"70,62";"78,15";"1.059";"1.059,45";"Torgau";"" +"63,000";"64,6";"Mobil";"70,66";"78,12";"1.059";"1.059,45";"Torgau";"" +"63,100";"62,7";"Mobil";"70,83";"78,10";"1.059";"1.059,45";"Torgau";"" +"63,200";"63,5";"Mobil";"70,73";"78,08";"1.059";"1.059,45";"Torgau";"" +"63,300";"64,5";"Mobil";"70,62";"78,05";"1.059";"1.059,45";"Torgau";"" +"63,400";"65,2";"Mobil";"70,49";"78,02";"1.059";"1.059,45";"Torgau";"" +"63,500";"64,9";"Mobil";"70,47";"78,00";"1.059";"1.059,45";"Torgau";"" +"63,600";"65,2";"Mobil";"70,40";"77,98";"1.059";"1.059,45";"Torgau";"Fähre: Prettin -Gierseilfähre" +"63,700";"67,8";"Mobil";"70,09";"77,96";"1.059";"1.059,45";"Torgau";"" +"63,800";"70,9";"Mobil";"69,85";"77,94";"1.059";"1.059,45";"Torgau";"" +"63,900";"68,6";"Mobil";"70,08";"77,91";"1.059";"1.059,45";"Torgau";"" +"64,000";"63,1";"Mobil";"70,59";"77,87";"1.059";"1.059,45";"Torgau";"" +"64,100";"62,6";"Mobil";"70,60";"77,85";"1.059";"1.059,45";"Torgau";"HW-Schutz: Axiener-Deich" +"64,200";"64,6";"Mobil";"70,38";"77,82";"1.059";"1.059,45";"Torgau";"" +"64,300";"67,0";"Mobil";"70,12";"77,80";"1.059";"1.059,45";"Torgau";"" +"64,400";"67,3";"Mobil";"70,07";"77,78";"1.059";"1.059,45";"Torgau";"" +"64,500";"66,8";"Mobil";"70,09";"77,75";"1.059";"1.059,45";"Torgau";"" +"64,600";"65,2";"Mobil";"70,20";"77,71";"1.059";"1.059,45";"Torgau";"" +"64,700";"65,1";"Mobil";"70,17";"77,69";"1.059";"1.059,45";"Torgau";"" +"64,800";"63,7";"Mobil";"70,27";"77,67";"1.059";"1.059,45";"Torgau";"" +"64,900";"62,2";"Mobil";"70,37";"77,66";"1.059";"1.059,45";"Torgau";"" +"65,000";"62,4";"Mobil";"70,30";"77,65";"1.059";"1.059,45";"Torgau";"" +"65,100";"63,5";"Mobil";"70,10";"77,63";"1.059";"1.059,45";"Torgau";"" +"65,200";"64,8";"Mobil";"69,85";"77,61";"1.059";"1.059,45";"Torgau";"" +"65,300";"61,2";"Mobil";"70,10";"77,60";"1.059";"1.059,45";"Torgau";"" +"65,400";"62,6";"Mobil";"70,15";"77,59";"1.059";"1.059,45";"Torgau";"" +"65,500";"64,9";"Mobil";"69,99";"77,56";"1.059";"1.059,45";"Torgau";"" +"65,600";"64,6";"Mobil";"69,96";"77,52";"1.059";"1.059,45";"Torgau";"" +"65,700";"56,7";"Mobil";"70,14";"77,50";"1.059";"1.059,45";"Torgau";"" +"65,800";"51,2";"Mobil";"70,11";"77,47";"1.059";"1.059,45";"Torgau";"" +"65,900";"47,0";"Mobil";"69,92";"77,44";"1.059";"1.059,45";"Torgau";"" +"66,000";"42,5";"Mobil";"69,95";"77,41";"1.059";"1.059,45";"Torgau";"" +"66,100";"38,9";"Mobil";"69,92";"77,38";"1.059";"1.059,45";"Torgau";"" +"66,200";"34,8";"Mobil";"69,93";"77,35";"1.059";"1.059,45";"Torgau";"" +"66,300";"31,6";"Mobil";"69,83";"77,32";"1.059";"1.059,45";"Torgau";"" +"66,400";"24,1";"Starr";"69,83";"77,29";"1.059";"1.059,45";"Torgau";"" +"66,500";"15,6";"Starr";"69,78";"77,27";"1.059";"1.059,45";"Torgau";"" +"66,600";"10,6";"Starr";"69,89";"77,25";"1.059";"1.059,45";"Torgau";"" +"66,700";"16,1";"Starr";"69,93";"77,23";"1.059";"1.059,45";"Torgau";"" +"66,800";"21,8";"Starr";"69,93";"77,20";"1.059";"1.059,45";"Torgau";"" +"66,900";"27,8";"Mobil";"69,78";"77,17";"1.059";"1.059,45";"Torgau";"" +"67,000";"33,2";"Mobil";"69,69";"77,14";"1.059";"1.059,45";"Torgau";"" +"67,100";"38,0";"Mobil";"69,69";"77,11";"1.059";"1.059,45";"Torgau";"" +"67,200";"43,7";"Mobil";"69,57";"77,08";"1.059";"1.059,45";"Torgau";"" +"67,300";"47,8";"Mobil";"69,65";"77,05";"1.059";"1.059,45";"Torgau";"" +"67,400";"51,4";"Mobil";"69,65";"77,02";"1.059";"1.059,45";"Torgau";"" +"67,500";"56,7";"Mobil";"69,52";"77,01";"1.059";"1.059,45";"Torgau";"" +"67,600";"55,9";"Mobil";"69,45";"76,99";"1.059";"1.059,45";"Torgau";"" +"67,700";"53,9";"Mobil";"69,63";"76,97";"1.059";"1.059,45";"Torgau";"" +"67,800";"57,0";"Mobil";"69,32";"76,95";"1.059";"1.059,45";"Torgau";"" +"67,900";"60,6";"Mobil";"68,97";"76,93";"1.059";"1.059,45";"Torgau";"" +"68,000";"60,8";"Mobil";"69,00";"76,90";"1.059";"1.059,45";"Torgau";"" +"68,100";"60,3";"Mobil";"69,07";"76,86";"1.059";"1.059,45";"Torgau";"" +"68,200";"59,0";"Mobil";"69,20";"76,82";"1.059";"1.059,45";"Torgau";"" +"68,300";"57,4";"Mobil";"69,37";"76,79";"1.059";"1.059,45";"Torgau";"" +"68,400";"57,7";"Mobil";"69,26";"76,76";"1.059";"1.059,45";"Torgau";"" +"68,500";"56,1";"Mobil";"69,39";"76,75";"1.059";"1.059,45";"Torgau";"" +"68,600";"55,4";"Mobil";"69,45";"76,73";"1.059";"1.059,45";"Torgau";"" +"68,700";"56,0";"Mobil";"69,37";"76,72";"1.059";"1.059,45";"Torgau";"" +"68,800";"53,7";"Mobil";"69,49";"76,70";"1.059";"1.059,45";"Torgau";"" +"68,900";"53,9";"Mobil";"69,23";"76,68";"1.059";"1.059,45";"Torgau";"" +"69,000";"56,5";"Mobil";"69,05";"76,66";"1.059";"1.059,45";"Torgau";"" +"69,100";"59,2";"Mobil";"68,84";"76,64";"1.059";"1.059,45";"Torgau";"" +"69,200";"58,7";"Mobil";"68,90";"76,61";"1.059";"1.059,45";"Torgau";"" +"69,300";"58,4";"Mobil";"68,94";"76,59";"1.059";"1.059,45";"Torgau";"" +"69,400";"56,6";"Mobil";"69,09";"76,57";"1.059";"1.059,45";"Torgau";"" +"69,500";"58,1";"Mobil";"68,85";"76,56";"1.059";"1.059,45";"Torgau";"" +"69,600";"59,2";"Mobil";"68,82";"76,54";"1.059";"1.059,45";"Torgau";"" +"69,700";"60,4";"Mobil";"68,77";"76,52";"1.059";"1.059,45";"Torgau";"" +"69,800";"59,4";"Mobil";"68,74";"76,50";"1.059";"1.059,45";"Torgau";"" +"69,900";"56,3";"Mobil";"68,94";"76,49";"1.059";"1.059,45";"Torgau";"" +"70,000";"59,4";"Mobil";"68,84";"76,47";"1.059";"1.059,45";"Torgau";"" +"70,100";"59,9";"Mobil";"68,92";"76,43";"1.059";"1.059,45";"Torgau";"" +"70,200";"58,5";"Mobil";"69,00";"76,39";"1.059";"1.059,45";"Torgau";"" +"70,300";"59,5";"Mobil";"68,82";"76,38";"1.059";"1.059,45";"Torgau";"" +"70,400";"58,5";"Mobil";"68,96";"76,36";"1.059";"1.059,45";"Torgau";"" +"70,500";"59,3";"Mobil";"68,88";"76,34";"1.059";"1.059,45";"Torgau";"" +"70,600";"59,9";"Mobil";"68,80";"76,32";"1.059";"1.059,45";"Torgau";"" +"70,700";"60,3";"Mobil";"68,74";"76,31";"1.059";"1.059,45";"Torgau";"" +"70,800";"59,4";"Mobil";"68,80";"76,29";"1.059";"1.059,45";"Torgau";"" +"70,900";"58,6";"Mobil";"68,84";"76,27";"1.059";"1.059,45";"Torgau";"" +"71,000";"57,9";"Mobil";"68,97";"76,25";"1.059";"1.059,45";"Torgau";"" +"71,100";"58,8";"Mobil";"68,92";"76,23";"1.059";"1.059,45";"Torgau";"" +"71,200";"60,2";"Mobil";"68,73";"76,20";"1.059";"1.059,45";"Torgau";"" +"71,300";"57,3";"Mobil";"69,01";"76,18";"1.059";"1.059,45";"Torgau";"" +"71,400";"59,6";"Mobil";"68,78";"76,15";"1.059";"1.059,45";"Torgau";"" +"71,500";"61,1";"Mobil";"68,65";"76,14";"1.059";"1.059,45";"Torgau";"" +"71,600";"60,0";"Mobil";"68,80";"76,12";"1.059";"1.059,45";"Torgau";"Bundesland: Sachsen-Anhalt" +"71,700";"61,2";"Mobil";"68,68";"76,10";"1.059";"1.059,45";"Torgau";"" +"71,800";"59,4";"Mobil";"68,80";"76,08";"1.059";"1.059,45";"Torgau";"" +"71,900";"60,2";"Mobil";"68,59";"76,06";"1.059";"1.059,45";"Torgau";"" +"72,000";"63,3";"Mobil";"68,30";"76,04";"1.059";"1.059,45";"Torgau";"" +"72,100";"62,9";"Mobil";"68,37";"76,01";"1.059";"1.059,45";"Torgau";"" +"72,200";"61,7";"Mobil";"68,52";"75,98";"1.059";"1.059,45";"Torgau";"" +"72,300";"60,9";"Mobil";"68,60";"75,95";"1.059";"1.059,45";"Torgau";"" +"72,400";"62,6";"Mobil";"68,35";"75,91";"1.059";"1.059,45";"Torgau";"" +"72,500";"58,2";"Mobil";"68,73";"75,89";"1.059";"1.059,45";"Torgau";"HW-Schutz: Maukener-Deich" +"72,600";"61,8";"Mobil";"68,21";"75,87";"1.059";"1.059,45";"Torgau";"" +"72,700";"57,6";"Mobil";"68,54";"75,86";"1.059";"1.059,45";"Torgau";"" +"72,800";"57,3";"Mobil";"68,58";"75,85";"1.059";"1.059,45";"Torgau";"" +"72,900";"57,0";"Mobil";"68,64";"75,84";"1.059";"1.059,45";"Torgau";"" +"73,000";"57,4";"Mobil";"68,66";"75,82";"1.059";"1.059,45";"Torgau";"" +"73,100";"59,2";"Mobil";"68,51";"75,79";"1.059";"1.059,45";"Torgau";"" +"73,200";"61,7";"Mobil";"68,16";"75,76";"1.059";"1.059,45";"Torgau";"" +"73,300";"60,9";"Mobil";"68,17";"75,75";"1.059";"1.059,45";"Torgau";"" +"73,400";"60,9";"Mobil";"68,23";"75,73";"1.059";"1.059,45";"Torgau";"" +"73,500";"60,0";"Mobil";"68,35";"75,70";"1.059";"1.059,45";"Torgau";"" +"73,600";"60,4";"Mobil";"68,28";"75,67";"1.059";"1.059,45";"Torgau";"" +"73,700";"58,8";"Mobil";"68,44";"75,65";"1.059";"1.059,45";"Torgau";"" +"73,800";"60,6";"Mobil";"68,23";"75,63";"1.059";"1.059,45";"Torgau";"" +"73,900";"58,7";"Mobil";"68,43";"75,61";"1.059";"1.059,45";"Torgau";"" +"74,000";"59,9";"Mobil";"68,27";"75,58";"1.059";"1.059,45";"Torgau";"" +"74,100";"62,3";"Mobil";"68,00";"75,56";"1.059";"1.059,45";"Torgau";"" +"74,200";"61,3";"Mobil";"68,11";"75,53";"1.059";"1.059,45";"Torgau";"" +"74,300";"62,1";"Mobil";"68,02";"75,50";"1.059";"1.059,45";"Torgau";"" +"74,400";"63,7";"Mobil";"67,80";"75,46";"1.059";"1.059,45";"Torgau";"" +"74,500";"63,0";"Mobil";"67,83";"75,43";"1.059";"1.059,45";"Torgau";"" +"74,600";"60,6";"Mobil";"68,06";"75,40";"1.059";"1.059,45";"Torgau";"" +"74,700";"62,4";"Mobil";"67,85";"75,37";"1.059";"1.059,45";"Torgau";"" +"74,800";"62,4";"Mobil";"67,81";"75,34";"1.059";"1.059,45";"Torgau";"" +"74,900";"59,4";"Mobil";"68,07";"75,33";"1.059";"1.059,45";"Torgau";"" +"75,000";"60,2";"Mobil";"67,97";"75,32";"1.059";"1.059,45";"Torgau";"" +"75,100";"59,1";"Mobil";"68,05";"75,30";"1.059";"1.059,45";"Torgau";"" +"75,200";"56,8";"Mobil";"68,27";"75,27";"1.059";"1.059,45";"Torgau";"" +"75,300";"55,4";"Mobil";"68,41";"75,26";"1.059";"1.059,45";"Torgau";"" +"75,400";"57,3";"Mobil";"68,20";"75,24";"1.059";"1.059,45";"Torgau";"" +"75,500";"58,3";"Mobil";"68,06";"75,22";"1.059";"1.059,45";"Torgau";"" +"75,600";"61,2";"Mobil";"67,76";"75,19";"1.059";"1.059,45";"Torgau";"" +"75,700";"60,6";"Mobil";"67,81";"75,16";"1.059";"1.059,45";"Torgau";"" +"75,800";"59,7";"Mobil";"67,87";"75,12";"1.059";"1.059,45";"Torgau";"" +"75,900";"60,5";"Mobil";"67,76";"75,10";"1.059";"1.059,45";"Torgau";"" +"76,000";"59,7";"Mobil";"67,84";"75,08";"1.059";"1.059,45";"Torgau";"" +"76,100";"59,9";"Mobil";"67,80";"75,06";"1.059";"1.059,45";"Torgau";"" +"76,200";"58,9";"Mobil";"67,86";"75,03";"1.059";"1.059,45";"Torgau";"" +"76,300";"54,5";"Mobil";"68,27";"75,01";"1.059";"1.059,45";"Torgau";"" +"76,400";"54,2";"Mobil";"68,22";"74,99";"1.059";"1.059,45";"Torgau";"HW-Schutz: Kloedener-Deich" +"76,500";"59,7";"Mobil";"67,46";"74,98";"1.059";"1.059,45";"Torgau";"" +"76,600";"62,3";"Mobil";"67,38";"74,96";"1.059";"1.059,45";"Torgau";"Geschiebemessstelle: Pretsch-Mauken" +"76,700";"62,6";"Mobil";"67,43";"74,93";"1.059";"1.059,45";"Torgau";"" +"76,800";"61,4";"Mobil";"67,54";"74,90";"1.059";"1.059,45";"Torgau";"" +"76,900";"61,9";"Mobil";"67,46";"74,88";"1.059";"1.059,45";"Torgau";"" +"77,000";"63,0";"Mobil";"67,32";"74,85";"1.059";"1.059,45";"Torgau";"" +"77,100";"62,1";"Mobil";"67,40";"74,84";"1.059";"1.059,45";"Torgau";"" +"77,200";"56,8";"Mobil";"68,02";"74,82";"1.059";"1.059,45";"Torgau";"" +"77,300";"60,0";"Mobil";"67,71";"74,79";"1.059";"1.059,45";"Torgau";"" +"77,400";"57,3";"Mobil";"67,97";"74,76";"1.059";"1.059,45";"Torgau";"" +"77,500";"58,2";"Mobil";"67,86";"74,73";"1.059";"1.059,45";"Torgau";"" +"77,600";"59,5";"Mobil";"67,71";"74,69";"1.059";"1.059,45";"Torgau";"" +"77,700";"59,4";"Mobil";"67,72";"74,68";"1.059";"1.059,45";"Torgau";"" +"77,800";"60,5";"Mobil";"67,62";"74,66";"1.059";"1.059,45";"Torgau";"" +"77,900";"60,6";"Mobil";"67,61";"74,65";"1.059";"1.059,45";"Torgau";"" +"78,000";"60,3";"Mobil";"67,64";"74,63";"1.059";"1.059,45";"Torgau";"" +"78,100";"57,7";"Mobil";"67,90";"74,62";"1.059";"1.059,45";"Torgau";"" +"78,200";"59,6";"Mobil";"67,74";"74,60";"1.059";"1.059,45";"Torgau";"" +"78,300";"59,1";"Mobil";"67,79";"74,58";"1.059";"1.059,45";"Torgau";"" +"78,400";"59,1";"Mobil";"67,79";"74,55";"1.059";"1.059,45";"Torgau";"" +"78,500";"61,5";"Mobil";"67,55";"74,52";"1.059";"1.059,45";"Torgau";"" +"78,600";"61,4";"Mobil";"67,54";"74,49";"1.059";"1.059,45";"Torgau";"" +"78,700";"59,9";"Mobil";"67,67";"74,47";"1.059";"1.059,45";"Torgau";"" +"78,800";"59,0";"Mobil";"67,76";"74,44";"1.059";"1.059,45";"Torgau";"" +"78,900";"62,8";"Mobil";"67,42";"74,42";"1.059";"1.059,45";"Torgau";"" +"79,000";"62,1";"Mobil";"67,46";"74,39";"1.059";"1.059,45";"Torgau";"" +"79,100";"63,9";"Mobil";"67,26";"74,37";"1.059";"1.059,45";"Torgau";"" +"79,200";"60,8";"Mobil";"67,56";"74,34";"1.059";"1.059,45";"Torgau";"" +"79,300";"60,4";"Mobil";"67,61";"74,31";"1.059";"1.059,45";"Torgau";"" +"79,400";"61,7";"Mobil";"67,50";"74,28";"1.059";"1.059,45";"Torgau";"" +"79,500";"60,9";"Mobil";"67,58";"74,27";"1.059";"1.059,45";"Torgau";"" +"79,600";"61,1";"Mobil";"67,59";"74,25";"1.059";"1.059,45";"Torgau";"" +"79,700";"62,5";"Mobil";"67,45";"74,24";"1.059";"1.059,45";"Torgau";"" +"79,800";"61,7";"Mobil";"67,54";"74,22";"1.059";"1.059,45";"Torgau";"" +"79,900";"63,6";"Mobil";"67,29";"74,19";"1.059";"1.059,45";"Torgau";"" +"80,000";"63,7";"Mobil";"67,30";"74,16";"1.059";"1.059,45";"Torgau";"" +"80,100";"63,9";"Mobil";"67,30";"74,14";"1.059";"1.059,45";"Torgau";"" +"80,200";"62,7";"Mobil";"67,39";"74,11";"1.059";"1.059,45";"Torgau";"" +"80,300";"64,0";"Mobil";"67,24";"74,09";"1.059";"1.059,45";"Torgau";"" +"80,400";"64,5";"Mobil";"67,18";"74,06";"1.059";"1.059,45";"Torgau";"" +"80,500";"64,1";"Mobil";"67,20";"74,04";"1.059";"1.059,45";"Torgau";"" +"80,600";"60,4";"Mobil";"67,43";"74,01";"1.059";"1.059,45";"Torgau";"" +"80,700";"59,9";"Mobil";"67,33";"73,98";"1.059";"1.059,45";"Torgau";"" +"80,800";"61,5";"Mobil";"67,19";"73,94";"1.059";"1.059,45";"Torgau";"" +"80,900";"61,7";"Mobil";"67,17";"73,91";"1.059";"1.059,45";"Torgau";"" +"81,000";"61,5";"Mobil";"67,11";"73,87";"1.055";"1.059,45";"Torgau";"" +"81,100";"60,1";"Mobil";"67,15";"73,84";"1.055";"1.059,45";"Torgau";"" +"81,200";"59,4";"Mobil";"67,18";"73,80";"1.055";"1.059,45";"Torgau";"" +"81,300";"58,9";"Mobil";"67,18";"73,77";"1.055";"1.059,45";"Torgau";"" +"81,400";"60,1";"Mobil";"67,05";"73,73";"1.055";"1.059,45";"Torgau";"" +"81,500";"59,0";"Mobil";"67,12";"73,70";"1.055";"1.059,45";"Torgau";"" +"81,600";"59,6";"Mobil";"67,04";"73,66";"1.055";"1.059,45";"Torgau";"" +"81,700";"59,3";"Mobil";"67,04";"73,63";"1.055";"1.059,45";"Torgau";"" +"81,800";"59,6";"Mobil";"67,12";"73,59";"1.055";"1.059,45";"Torgau";"" +"81,900";"59,1";"Mobil";"67,27";"73,57";"1.055";"1.059,45";"Torgau";"" +"82,000";"64,4";"Mobil";"66,79";"73,54";"1.055";"1.059,45";"Torgau";"" +"82,100";"64,7";"Mobil";"66,74";"73,51";"1.055";"1.059,45";"Torgau";"" +"82,200";"65,2";"Mobil";"66,65";"73,48";"1.055";"1.059,45";"Torgau";"" +"82,300";"66,9";"Mobil";"66,45";"73,45";"1.055";"1.059,45";"Torgau";"" +"82,400";"66,0";"Mobil";"66,59";"73,41";"1.055";"1.059,45";"Torgau";"" +"82,500";"66,9";"Mobil";"66,58";"73,40";"1.055";"1.059,45";"Torgau";"" +"82,600";"67,4";"Mobil";"66,56";"73,38";"1.055";"1.059,45";"Torgau";"" +"82,700";"68,8";"Mobil";"66,45";"73,36";"1.055";"1.059,45";"Torgau";"" +"82,800";"66,8";"Mobil";"66,50";"73,33";"1.055";"1.059,45";"Torgau";"" +"82,900";"65,3";"Mobil";"66,50";"73,30";"1.055";"1.059,45";"Torgau";"" +"83,000";"67,1";"Mobil";"66,32";"73,27";"1.055";"1.059,45";"Torgau";"" +"83,100";"66,0";"Mobil";"66,40";"73,25";"1.055";"1.059,45";"Torgau";"" +"83,200";"67,2";"Mobil";"66,36";"73,22";"1.055";"1.059,45";"Torgau";"" +"83,300";"66,0";"Mobil";"66,52";"73,21";"1.055";"1.059,45";"Torgau";"" +"83,400";"66,8";"Mobil";"66,37";"73,19";"1.055";"1.059,45";"Torgau";"" +"83,500";"66,8";"Mobil";"66,25";"73,16";"1.055";"1.059,45";"Torgau";"" +"83,600";"63,8";"Mobil";"66,48";"73,12";"1.055";"1.059,45";"Torgau";"" +"83,700";"63,3";"Mobil";"66,48";"73,09";"1.055";"1.059,45";"Torgau";"" +"83,800";"62,6";"Mobil";"66,53";"73,06";"1.055";"1.059,45";"Torgau";"" +"83,900";"61,4";"Mobil";"66,64";"73,04";"1.055";"1.059,45";"Torgau";"" +"84,000";"63,3";"Mobil";"66,47";"73,02";"1.055";"1.059,45";"Torgau";"" +"84,100";"64,7";"Mobil";"66,33";"73,00";"1.055";"1.059,45";"Torgau";"" +"84,200";"64,5";"Mobil";"66,28";"72,97";"1.055";"1.059,45";"Torgau";"" +"84,300";"65,6";"Mobil";"66,11";"72,95";"1.055";"1.059,45";"Torgau";"" +"84,400";"66,7";"Mobil";"66,04";"72,92";"1.055";"1.059,45";"Torgau";"" +"84,500";"68,3";"Mobil";"65,91";"72,90";"1.055";"1.059,45";"Torgau";"" +"84,600";"69,0";"Mobil";"65,83";"72,88";"1.055";"1.059,45";"Torgau";"HW-Schutz: Schuetzberger-Deich" +"84,700";"65,7";"Mobil";"66,10";"72,86";"1.055";"1.059,45";"Torgau";"" +"84,800";"65,7";"Mobil";"66,07";"72,84";"1.055";"1.059,45";"Torgau";"" +"84,900";"64,8";"Mobil";"66,12";"72,82";"1.055";"1.059,45";"Torgau";"" +"85,000";"65,4";"Mobil";"66,05";"72,80";"1.055";"1.059,45";"Torgau";"" +"85,100";"66,0";"Mobil";"65,99";"72,79";"1.055";"1.059,45";"Torgau";"" +"85,200";"67,3";"Mobil";"65,85";"72,77";"1.055";"1.059,45";"Torgau";"" +"85,300";"66,2";"Mobil";"65,93";"72,75";"1.055";"1.059,45";"Torgau";"" +"85,400";"64,8";"Mobil";"66,02";"72,73";"1.055";"1.059,45";"Torgau";"" +"85,500";"64,2";"Mobil";"66,03";"72,71";"1.055";"1.059,45";"Torgau";"" +"85,600";"62,6";"Mobil";"66,12";"72,68";"1.050";"1.059,45";"Torgau";"" +"85,700";"60,4";"Mobil";"66,26";"72,66";"1.050";"1.059,45";"Torgau";"" +"85,800";"59,1";"Mobil";"66,33";"72,63";"1.050";"1.059,45";"Torgau";"" +"85,900";"62,6";"Mobil";"65,98";"72,61";"1.050";"1.059,45";"Torgau";"" +"86,000";"60,3";"Mobil";"66,17";"72,58";"1.050";"1.059,45";"Torgau";"" +"86,100";"60,5";"Mobil";"66,15";"72,56";"1.050";"1.059,45";"Torgau";"" +"86,200";"60,3";"Mobil";"66,15";"72,53";"1.050";"1.059,45";"Torgau";"" +"86,300";"62,4";"Mobil";"65,95";"72,51";"1.050";"1.059,45";"Torgau";"" +"86,400";"61,8";"Mobil";"66,00";"72,49";"1.050";"1.059,45";"Torgau";"" +"86,500";"61,5";"Mobil";"66,00";"72,48";"1.050";"1.059,45";"Torgau";"" +"86,600";"62,0";"Mobil";"65,94";"72,46";"1.050";"1.059,45";"Torgau";"" +"86,700";"62,3";"Mobil";"65,88";"72,45";"1.050";"1.059,45";"Torgau";"" +"86,800";"62,7";"Mobil";"65,81";"72,43";"1.050";"1.059,45";"Torgau";"" +"86,900";"62,7";"Mobil";"65,77";"72,42";"1.050";"1.059,45";"Torgau";"" +"87,000";"62,5";"Mobil";"65,77";"72,40";"1.050";"1.059,45";"Torgau";"" +"87,100";"61,7";"Mobil";"65,82";"72,39";"1.050";"1.059,45";"Torgau";"" +"87,200";"63,9";"Mobil";"65,61";"72,37";"1.050";"1.059,45";"Torgau";"" +"87,300";"64,3";"Mobil";"65,53";"72,35";"1.050";"1.059,45";"Torgau";"" +"87,400";"64,4";"Mobil";"65,50";"72,32";"1.050";"1.059,45";"Torgau";"" +"87,500";"64,7";"Mobil";"65,43";"72,32";"1.050";"1.059,45";"Torgau";"" +"87,600";"63,5";"Mobil";"65,53";"72,31";"1.050";"1.059,45";"Torgau";"" +"87,700";"62,6";"Mobil";"65,59";"72,30";"1.050";"1.059,45";"Torgau";"" +"87,800";"62,2";"Mobil";"65,59";"72,28";"1.050";"1.059,45";"Torgau";"" +"87,900";"63,2";"Mobil";"65,47";"72,27";"1.050";"1.059,45";"Torgau";"" +"88,000";"62,5";"Mobil";"65,53";"72,25";"1.050";"1.059,45";"Torgau";"" +"88,100";"62,4";"Mobil";"65,53";"72,24";"1.050";"1.059,45";"Torgau";"" +"88,200";"62,8";"Mobil";"65,43";"72,22";"1.050";"1.059,45";"Torgau";"" +"88,300";"62,8";"Mobil";"65,36";"72,21";"1.050";"1.059,45";"Torgau";"" +"88,400";"60,7";"Mobil";"65,50";"72,20";"1.050";"1.059,45";"Torgau";"" +"88,500";"60,4";"Mobil";"65,45";"72,19";"1.050";"1.059,45";"Torgau";"" +"88,600";"62,5";"Mobil";"65,36";"72,17";"1.050";"1.059,45";"Torgau";"" +"88,700";"62,3";"Mobil";"65,41";"72,15";"1.050";"1.059,45";"Torgau";"" +"88,800";"63,3";"Mobil";"65,28";"72,12";"1.050";"1.059,45";"Torgau";"" +"88,900";"63,3";"Mobil";"65,26";"72,11";"1.050";"1.059,45";"Torgau";"" +"89,000";"61,7";"Mobil";"65,36";"72,09";"1.050";"1.059,45";"Torgau";"" +"89,100";"61,0";"Mobil";"65,32";"72,08";"1.050";"1.059,45";"Torgau";"" +"89,200";"61,4";"Mobil";"65,28";"72,06";"1.050";"1.059,45";"Torgau";"" +"89,300";"62,1";"Mobil";"65,20";"72,05";"1.050";"1.059,45";"Torgau";"" +"89,400";"63,1";"Mobil";"65,05";"72,03";"1.050";"1.059,45";"Torgau";"" +"89,500";"61,9";"Mobil";"65,12";"72,02";"1.050";"1.059,45";"Torgau";"" +"89,600";"63,9";"Mobil";"65,02";"72,01";"1.050";"1.059,45";"Torgau";"" +"89,700";"63,8";"Mobil";"65,05";"71,98";"1.050";"1.059,45";"Torgau";"" +"89,800";"64,6";"Mobil";"64,95";"71,95";"1.050";"1.059,45";"Torgau";"" +"89,900";"63,2";"Mobil";"65,05";"71,92";"1.050";"1.059,45";"Torgau";"" +"90,000";"63,6";"Mobil";"64,98";"71,89";"1.050";"1.059,45";"Torgau";"" +"90,100";"66,4";"Mobil";"64,95";"71,85";"1.050";"1.059,45";"Torgau";"" +"90,200";"69,4";"Mobil";"64,94";"71,81";"1.050";"1.059,45";"Torgau";"Zufluss: Schwarze Elster" +"90,300";"71,0";"Mobil";"64,79";"71,80";"1.050";"1.059,45";"außerh. d. Bez.pegels";"" +"90,400";"69,9";"Mobil";"64,79";"71,78";"1.119";"1.059,45";"außerh. d. Bez.pegels";"" +"90,500";"68,3";"Mobil";"64,85";"71,76";"1.119";"1.059,45";"außerh. d. Bez.pegels";"" +"90,600";"68,4";"Mobil";"64,74";"71,73";"1.119";"1.059,45";"außerh. d. Bez.pegels";"" +"90,700";"66,9";"Mobil";"64,78";"71,71";"1.119";"1.059,45";"außerh. d. Bez.pegels";"" +"90,800";"66,6";"Mobil";"64,69";"71,68";"1.119";"1.059,45";"außerh. d. Bez.pegels";"" +"90,900";"64,6";"Mobil";"64,76";"71,64";"1.119";"1.059,45";"außerh. d. Bez.pegels";"" +"91,000";"63,9";"Mobil";"64,71";"71,60";"1.119";"1.059,45";"außerh. d. Bez.pegels";"" +"91,100";"63,5";"Mobil";"64,67";"71,58";"1.119";"1.059,45";"außerh. d. Bez.pegels";"" +"91,200";"60,1";"Mobil";"64,92";"71,55";"1.119";"1.059,45";"außerh. d. Bez.pegels";"" +"91,300";"60,5";"Mobil";"64,80";"71,54";"1.119";"1.059,45";"außerh. d. Bez.pegels";"" +"91,400";"60,7";"Mobil";"64,69";"71,52";"1.119";"1.059,45";"außerh. d. Bez.pegels";"" +"91,500";"57,6";"Starr";"64,88";"71,49";"1.119";"1.059,45";"außerh. d. Bez.pegels";"" +"91,600";"55,6";"Starr";"64,99";"71,45";"1.119";"1.059,45";"außerh. d. Bez.pegels";"" +"91,700";"54,4";"Starr";"65,02";"71,44";"1.119";"1.059,45";"außerh. d. Bez.pegels";"" +"91,800";"53,3";"Starr";"65,06";"71,42";"1.119";"1.059,45";"außerh. d. Bez.pegels";"" +"91,900";"53,3";"Starr";"64,97";"71,39";"1.119";"1.059,45";"außerh. d. Bez.pegels";"" +"92,000";"53,0";"Starr";"64,90";"71,36";"1.119";"1.059,45";"außerh. d. Bez.pegels";"" +"92,100";"52,5";"Starr";"64,86";"71,34";"1.119";"1.059,45";"außerh. d. Bez.pegels";"" +"92,200";"52,2";"Starr";"64,81";"71,32";"1.119";"1.059,45";"außerh. d. Bez.pegels";"" +"92,300";"50,9";"Mobil";"64,84";"71,30";"1.119";"1.059,45";"außerh. d. Bez.pegels";"" +"92,400";"51,0";"Mobil";"64,73";"71,27";"1.119";"1.059,45";"außerh. d. Bez.pegels";"" +"92,500";"50,9";"Mobil";"64,64";"71,25";"1.119";"1.059,45";"außerh. d. Bez.pegels";"" +"92,600";"51,3";"Mobil";"64,48";"71,23";"1.119";"1.059,45";"außerh. d. Bez.pegels";"" +"92,700";"50,7";"Mobil";"64,46";"71,22";"1.119";"1.059,45";"außerh. d. Bez.pegels";"" +"92,800";"49,4";"Mobil";"64,53";"71,20";"1.119";"1.059,45";"außerh. d. Bez.pegels";"" +"92,900";"48,8";"Mobil";"64,54";"71,18";"1.119";"1.059,45";"außerh. d. Bez.pegels";"" +"93,000";"47,4";"Mobil";"64,56";"71,16";"1.119";"1.059,45";"außerh. d. Bez.pegels";"" +"93,100";"47,3";"Mobil";"64,42";"71,14";"1.119";"1.059,45";"außerh. d. Bez.pegels";"" +"93,200";"46,0";"Mobil";"64,51";"71,11";"1.119";"1.059,45";"außerh. d. Bez.pegels";"" +"93,300";"45,5";"Mobil";"64,51";"71,09";"1.119";"1.059,45";"außerh. d. Bez.pegels";"" +"93,400";"41,9";"Mobil";"64,79";"71,06";"1.119";"1.059,45";"außerh. d. Bez.pegels";"" +"93,500";"41,9";"Mobil";"64,62";"71,05";"1.119";"1.059,45";"außerh. d. Bez.pegels";"" +"93,600";"39,8";"Mobil";"64,71";"71,03";"1.119";"1.059,45";"außerh. d. Bez.pegels";"" +"93,700";"37,8";"Mobil";"64,80";"71,01";"1.119";"1.059,45";"außerh. d. Bez.pegels";"" +"93,800";"38,5";"Mobil";"64,69";"70,99";"1.119";"1.059,45";"außerh. d. Bez.pegels";"" +"93,900";"37,7";"Mobil";"64,77";"70,97";"1.119";"1.059,45";"außerh. d. Bez.pegels";"" +"94,000";"38,8";"Mobil";"64,55";"70,95";"1.119";"1.059,45";"außerh. d. Bez.pegels";"Zufluss: Zugbach" +"94,100";"38,6";"Mobil";"64,52";"70,93";"1.119";"1.059,45";"außerh. d. Bez.pegels";"" +"94,200";"38,1";"Mobil";"64,51";"70,91";"1.119";"1.059,45";"außerh. d. Bez.pegels";"" +"94,300";"37,9";"Mobil";"64,46";"70,89";"1.119";"1.059,45";"außerh. d. Bez.pegels";"" +"94,400";"36,6";"Mobil";"64,55";"70,86";"1.119";"1.059,45";"außerh. d. Bez.pegels";"" +"94,500";"35,8";"Mobil";"64,56";"70,84";"1.119";"1.059,45";"außerh. d. Bez.pegels";"" +"94,600";"34,0";"Mobil";"64,60";"70,82";"1.119";"1.059,45";"außerh. d. Bez.pegels";"HW-Schutz: Galliner-Deich" +"94,700";"32,8";"Mobil";"64,64";"70,81";"1.119";"1.059,45";"außerh. d. Bez.pegels";"" +"94,800";"33,2";"Mobil";"64,59";"70,79";"1.119";"1.059,45";"außerh. d. Bez.pegels";"" +"94,900";"34,0";"Mobil";"64,45";"70,77";"1.119";"1.059,45";"außerh. d. Bez.pegels";"" +"95,000";"33,0";"Mobil";"64,47";"70,74";"1.119";"1.059,45";"außerh. d. Bez.pegels";"" +"95,100";"33,2";"Mobil";"64,26";"70,73";"1.119";"1.059,45";"außerh. d. Bez.pegels";"" +"95,200";"32,4";"Mobil";"64,35";"70,71";"1.119";"1.059,45";"außerh. d. Bez.pegels";"" +"95,300";"32,0";"Mobil";"64,36";"70,69";"1.119";"1.059,45";"außerh. d. Bez.pegels";"" +"95,400";"27,8";"Mobil";"64,51";"70,67";"1.119";"1.059,45";"außerh. d. Bez.pegels";"" +"95,500";"23,6";"Mobil";"64,50";"70,66";"1.119";"1.059,45";"außerh. d. Bez.pegels";"" +"95,600";"22,3";"Mobil";"64,48";"70,65";"1.119";"1.059,45";"außerh. d. Bez.pegels";"" +"95,700";"21,2";"Mobil";"64,39";"70,64";"1.119";"1.059,45";"außerh. d. Bez.pegels";"" +"95,800";"31,3";"Mobil";"64,22";"70,63";"1.119";"1.059,45";"außerh. d. Bez.pegels";"" +"95,900";"36,6";"Mobil";"64,21";"70,59";"1.119";"1.059,45";"außerh. d. Bez.pegels";"" +"96,000";"42,2";"Mobil";"64,01";"70,55";"1.119";"1.059,45";"außerh. d. Bez.pegels";"" +"96,100";"44,8";"Mobil";"63,91";"70,49";"1.119";"1.059,45";"außerh. d. Bez.pegels";"" +"96,200";"44,9";"Mobil";"63,81";"70,43";"1.119";"1.059,45";"außerh. d. Bez.pegels";"" +"96,300";"43,2";"Mobil";"63,95";"70,41";"1.119";"1.059,45";"außerh. d. Bez.pegels";"" +"96,400";"42,4";"Mobil";"64,09";"70,38";"1.119";"1.059,45";"außerh. d. Bez.pegels";"" +"96,500";"42,9";"Mobil";"64,06";"70,35";"1.119";"1.059,45";"außerh. d. Bez.pegels";"" +"96,600";"43,7";"Mobil";"63,87";"70,32";"1.119";"1.059,45";"außerh. d. Bez.pegels";"" +"96,700";"42,3";"Mobil";"63,92";"70,31";"1.119";"1.059,45";"außerh. d. Bez.pegels";"" +"96,800";"37,7";"Mobil";"63,90";"70,29";"1.119";"1.059,45";"außerh. d. Bez.pegels";"" +"96,900";"26,3";"Mobil";"63,92";"70,30";"1.119";"1.059,45";"außerh. d. Bez.pegels";"" +"97,000";"39,5";"Mobil";"64,12";"70,31";"1.119";"1.059,45";"außerh. d. Bez.pegels";"" +"97,100";"42,6";"Mobil";"64,17";"70,25";"1.119";"1.059,45";"außerh. d. Bez.pegels";"Zufluss: Alte Elbe" +"97,200";"42,8";"Mobil";"64,02";"70,18";"1.119";"1.059,45";"außerh. d. Bez.pegels";"" +"97,300";"44,7";"Mobil";"63,66";"70,17";"1.119";"1.059,45";"außerh. d. Bez.pegels";"" +"97,400";"45,5";"Mobil";"63,55";"70,15";"1.119";"1.059,45";"außerh. d. Bez.pegels";"" +"97,500";"46,1";"Mobil";"63,47";"70,13";"1.119";"1.059,45";"außerh. d. Bez.pegels";"" +"97,600";"44,4";"Mobil";"63,45";"70,10";"1.119";"1.059,45";"außerh. d. Bez.pegels";"" +"97,700";"40,9";"Mobil";"63,56";"70,10";"1.119";"1.059,45";"außerh. d. Bez.pegels";"" +"97,800";"44,1";"Mobil";"63,48";"70,09";"1.119";"1.059,45";"außerh. d. Bez.pegels";"" +"97,900";"46,5";"Mobil";"63,39";"70,06";"1.119";"1.059,45";"außerh. d. Bez.pegels";"" +"98,000";"46,1";"Mobil";"63,40";"70,03";"1.119";"1.059,45";"außerh. d. Bez.pegels";"" +"98,100";"44,5";"Mobil";"63,57";"70,01";"1.119";"1.059,45";"außerh. d. Bez.pegels";"" +"98,200";"44,9";"Mobil";"63,54";"69,99";"1.119";"1.059,45";"außerh. d. Bez.pegels";"" +"98,300";"43,8";"Mobil";"63,70";"69,97";"1.119";"1.059,45";"außerh. d. Bez.pegels";"" +"98,400";"41,4";"Mobil";"63,86";"69,95";"1.119";"1.059,45";"außerh. d. Bez.pegels";"" +"98,500";"40,2";"Mobil";"63,83";"69,94";"1.119";"1.059,45";"außerh. d. Bez.pegels";"" +"98,600";"41,2";"Mobil";"63,90";"69,92";"1.119";"1.059,45";"außerh. d. Bez.pegels";"" +"98,700";"44,3";"Mobil";"63,64";"69,90";"1.119";"1.059,45";"außerh. d. Bez.pegels";"" +"98,800";"47,2";"Mobil";"63,43";"69,87";"1.119";"1.059,45";"außerh. d. Bez.pegels";"" +"98,900";"49,8";"Mobil";"63,21";"69,84";"1.119";"1.059,45";"außerh. d. Bez.pegels";"" +"99,000";"52,5";"Mobil";"62,85";"69,81";"1.119";"1.059,45";"außerh. d. Bez.pegels";"" +"99,100";"51,1";"Mobil";"62,95";"69,79";"1.119";"1.059,45";"außerh. d. Bez.pegels";"" +"99,200";"51,8";"Mobil";"62,94";"69,76";"1.119";"1.059,45";"außerh. d. Bez.pegels";"" +"99,300";"51,6";"Mobil";"63,03";"69,74";"1.119";"1.059,45";"außerh. d. Bez.pegels";"" +"99,400";"49,1";"Mobil";"63,25";"69,72";"1.119";"1.059,45";"außerh. d. Bez.pegels";"" +"99,500";"48,1";"Mobil";"63,32";"69,71";"1.119";"1.059,45";"außerh. d. Bez.pegels";"" +"99,600";"46,0";"Mobil";"63,45";"69,69";"1.119";"1.059,45";"außerh. d. Bez.pegels";"" +"99,700";"44,5";"Mobil";"63,46";"69,68";"1.119";"1.059,45";"außerh. d. Bez.pegels";"" +"99,800";"45,9";"Mobil";"63,40";"69,66";"1.119";"1.059,45";"außerh. d. Bez.pegels";"" +"99,900";"47,1";"Mobil";"63,35";"69,64";"1.119";"1.059,45";"außerh. d. Bez.pegels";"" +"100,000";"48,6";"Mobil";"63,40";"69,62";"1.119";"1.059,45";"außerh. d. Bez.pegels";"" +"100,100";"49,9";"Mobil";"63,32";"69,58";"1.119";"1.059,45";"außerh. d. Bez.pegels";"" +"100,200";"50,1";"Mobil";"63,26";"69,54";"1.119";"1.059,45";"außerh. d. Bez.pegels";"" +"100,300";"52,4";"Mobil";"62,98";"69,52";"1.119";"1.059,45";"außerh. d. Bez.pegels";"" +"100,400";"51,6";"Mobil";"62,93";"69,50";"1.119";"1.059,45";"außerh. d. Bez.pegels";"" +"100,500";"50,7";"Mobil";"62,79";"69,49";"1.119";"1.059,45";"außerh. d. Bez.pegels";"" +"100,600";"48,1";"Mobil";"62,81";"69,48";"1.119";"1.059,45";"außerh. d. Bez.pegels";"" +"100,700";"43,7";"Mobil";"62,89";"69,48";"1.119";"1.059,45";"außerh. d. Bez.pegels";"" +"100,800";"46,5";"Mobil";"62,84";"69,47";"1.119";"1.059,45";"außerh. d. Bez.pegels";"" +"100,900";"48,7";"Mobil";"62,81";"69,45";"1.119";"1.059,45";"außerh. d. Bez.pegels";"" +"101,000";"49,6";"Mobil";"62,94";"69,43";"1.119";"1.059,45";"außerh. d. Bez.pegels";"" +"101,100";"51,9";"Mobil";"62,82";"69,41";"1.119";"1.059,45";"außerh. d. Bez.pegels";"" +"101,200";"53,4";"Mobil";"62,73";"69,39";"1.119";"1.059,45";"außerh. d. Bez.pegels";"" +"101,300";"53,4";"Mobil";"62,77";"69,37";"1.119";"1.059,45";"außerh. d. Bez.pegels";"" +"101,400";"53,3";"Mobil";"62,77";"69,34";"1.119";"1.059,45";"außerh. d. Bez.pegels";"" +"101,500";"53,0";"Mobil";"62,80";"69,32";"1.119";"1.059,45";"außerh. d. Bez.pegels";"" +"101,600";"51,2";"Mobil";"63,01";"69,30";"1.119";"1.059,45";"außerh. d. Bez.pegels";"" +"101,700";"49,9";"Mobil";"63,16";"69,28";"1.119";"1.059,45";"außerh. d. Bez.pegels";"" +"101,800";"49,6";"Mobil";"63,05";"69,26";"1.119";"1.059,45";"außerh. d. Bez.pegels";"" +"101,900";"47,1";"Mobil";"63,10";"69,25";"1.119";"1.059,45";"außerh. d. Bez.pegels";"" +"102,000";"45,8";"Mobil";"63,11";"69,23";"1.119";"1.059,45";"außerh. d. Bez.pegels";"" +"102,100";"44,7";"Mobil";"63,08";"69,22";"1.119";"1.059,45";"außerh. d. Bez.pegels";"" +"102,200";"45,9";"Mobil";"62,90";"69,20";"1.119";"1.059,45";"außerh. d. Bez.pegels";"" +"102,300";"47,1";"Mobil";"62,75";"69,19";"1.119";"1.059,45";"außerh. d. Bez.pegels";"" +"102,400";"51,9";"Mobil";"62,67";"69,18";"1.119";"1.059,45";"außerh. d. Bez.pegels";"" +"102,500";"54,3";"Mobil";"62,63";"69,16";"1.119";"1.059,45";"außerh. d. Bez.pegels";"" +"102,600";"52,8";"Mobil";"62,71";"69,13";"1.119";"1.059,45";"außerh. d. Bez.pegels";"" +"102,700";"51,3";"Mobil";"62,78";"69,12";"1.119";"1.059,45";"außerh. d. Bez.pegels";"" +"102,800";"51,8";"Mobil";"62,75";"69,10";"1.119";"1.059,45";"außerh. d. Bez.pegels";"" +"102,900";"52,6";"Mobil";"62,68";"69,08";"1.119";"1.059,45";"außerh. d. Bez.pegels";"" +"103,000";"50,8";"Mobil";"62,85";"69,06";"1.119";"1.059,45";"außerh. d. Bez.pegels";"" +"103,100";"51,0";"Mobil";"62,80";"69,05";"1.119";"1.059,45";"außerh. d. Bez.pegels";"" +"103,200";"51,0";"Mobil";"62,83";"69,03";"1.119";"1.059,45";"außerh. d. Bez.pegels";"" +"103,300";"51,0";"Mobil";"62,84";"69,01";"1.119";"1.059,45";"außerh. d. Bez.pegels";"" +"103,400";"51,1";"Mobil";"62,92";"68,99";"1.119";"1.059,45";"außerh. d. Bez.pegels";"" +"103,500";"51,4";"Mobil";"62,94";"68,97";"1.119";"1.059,45";"außerh. d. Bez.pegels";"" +"103,600";"55,0";"Mobil";"62,62";"68,95";"1.119";"1.059,45";"außerh. d. Bez.pegels";"" +"103,700";"58,5";"Mobil";"62,28";"68,92";"1.119";"1.059,45";"außerh. d. Bez.pegels";"" +"103,800";"56,6";"Mobil";"62,44";"68,88";"1.119";"1.059,45";"außerh. d. Bez.pegels";"" +"103,900";"55,6";"Mobil";"62,53";"68,86";"1.119";"1.059,45";"außerh. d. Bez.pegels";"" +"104,000";"56,2";"Mobil";"62,44";"68,83";"1.119";"1.059,45";"außerh. d. Bez.pegels";"" +"104,100";"58,4";"Mobil";"62,21";"68,82";"1.119";"1.059,45";"außerh. d. Bez.pegels";"" +"104,200";"56,5";"Mobil";"62,41";"68,80";"1.119";"1.059,45";"außerh. d. Bez.pegels";"" +"104,300";"55,1";"Mobil";"62,53";"68,78";"1.119";"1.059,45";"außerh. d. Bez.pegels";"" +"104,400";"54,5";"Mobil";"62,59";"68,75";"1.119";"1.059,45";"außerh. d. Bez.pegels";"" +"104,500";"54,5";"Mobil";"62,59";"68,73";"1.119";"1.059,45";"außerh. d. Bez.pegels";"" +"104,600";"55,9";"Mobil";"62,43";"68,70";"1.119";"1.059,45";"außerh. d. Bez.pegels";"" +"104,700";"54,6";"Mobil";"62,54";"68,69";"1.119";"1.059,45";"außerh. d. Bez.pegels";"" +"104,800";"55,6";"Mobil";"62,46";"68,67";"1.119";"1.059,45";"außerh. d. Bez.pegels";"" +"104,900";"56,4";"Mobil";"62,37";"68,64";"1.119";"1.059,45";"außerh. d. Bez.pegels";"" +"105,000";"58,2";"Mobil";"62,19";"68,61";"1.119";"1.059,45";"außerh. d. Bez.pegels";"" +"105,100";"60,1";"Mobil";"61,98";"68,59";"1.119";"1.059,45";"außerh. d. Bez.pegels";"" +"105,200";"61,7";"Mobil";"61,82";"68,57";"1.119";"1.059,45";"außerh. d. Bez.pegels";"" +"105,300";"62,1";"Mobil";"61,77";"68,55";"1.119";"1.059,45";"außerh. d. Bez.pegels";"" +"105,400";"60,8";"Mobil";"61,90";"68,53";"1.119";"1.059,45";"außerh. d. Bez.pegels";"" +"105,500";"61,8";"Mobil";"61,80";"68,51";"1.119";"1.059,45";"außerh. d. Bez.pegels";"" +"105,600";"63,9";"Mobil";"61,59";"68,48";"1.119";"1.059,45";"außerh. d. Bez.pegels";"" +"105,700";"60,9";"Mobil";"61,77";"68,44";"1.119";"1.059,45";"außerh. d. Bez.pegels";"" +"105,800";"62,2";"Mobil";"61,61";"68,39";"1.119";"1.059,45";"außerh. d. Bez.pegels";"" +"105,900";"61,4";"Mobil";"61,66";"68,37";"1.119";"1.059,45";"außerh. d. Bez.pegels";"" +"106,000";"61,7";"Mobil";"61,66";"68,34";"1.119";"1.059,45";"außerh. d. Bez.pegels";"" +"106,100";"60,3";"Mobil";"61,83";"68,32";"1.119";"1.059,45";"außerh. d. Bez.pegels";"" +"106,200";"59,1";"Mobil";"61,95";"68,30";"1.119";"1.059,45";"außerh. d. Bez.pegels";"" +"106,300";"57,8";"Mobil";"62,08";"68,28";"1.119";"1.059,45";"außerh. d. Bez.pegels";"" +"106,400";"58,1";"Mobil";"62,05";"68,26";"1.119";"1.059,45";"außerh. d. Bez.pegels";"Schwebstoffmessstelle: Wittenberg" +"106,500";"59,0";"Mobil";"61,94";"68,24";"1.119";"1.059,45";"außerh. d. Bez.pegels";"" +"106,600";"60,1";"Mobil";"61,80";"68,22";"1.119";"1.059,45";"außerh. d. Bez.pegels";"" +"106,700";"60,4";"Mobil";"61,74";"68,20";"1.119";"1.059,45";"außerh. d. Bez.pegels";"" +"106,800";"60,4";"Mobil";"61,70";"68,17";"1.119";"1.059,45";"außerh. d. Bez.pegels";"" +"106,900";"58,3";"Mobil";"61,85";"68,15";"1.119";"1.059,45";"außerh. d. Bez.pegels";"" +"107,000";"57,4";"Mobil";"61,91";"68,12";"1.119";"1.059,45";"außerh. d. Bez.pegels";"" +"107,100";"59,4";"Mobil";"61,70";"68,10";"1.119";"1.059,45";"außerh. d. Bez.pegels";"" +"107,200";"59,4";"Mobil";"61,65";"68,08";"1.119";"1.059,45";"außerh. d. Bez.pegels";"" +"107,300";"57,8";"Starr";"61,76";"68,06";"1.119";"1.059,45";"außerh. d. Bez.pegels";"" +"107,400";"57,7";"Starr";"61,75";"68,04";"1.119";"1.059,45";"außerh. d. Bez.pegels";"" +"107,500";"57,9";"Starr";"61,70";"68,02";"1.119";"1.059,45";"außerh. d. Bez.pegels";"" +"107,600";"57,9";"Starr";"61,64";"67,99";"1.119";"1.059,45";"außerh. d. Bez.pegels";"" +"107,700";"56,4";"Starr";"61,72";"67,97";"1.119";"1.059,45";"außerh. d. Bez.pegels";"" +"107,800";"58,4";"Starr";"61,52";"67,94";"1.119";"1.059,45";"außerh. d. Bez.pegels";"" +"107,900";"57,3";"Starr";"61,61";"67,92";"1.119";"1.059,45";"außerh. d. Bez.pegels";"" +"108,000";"55,5";"Starr";"61,76";"67,90";"1.119";"1.059,45";"außerh. d. Bez.pegels";"Hafen: Wittenberg -Schutz- und Sicherheitshafen" +"108,100";"54,0";"Starr";"61,87";"67,88";"1.119";"1.059,45";"außerh. d. Bez.pegels";"" +"108,200";"55,8";"Starr";"61,67";"67,85";"1.119";"1.059,45";"außerh. d. Bez.pegels";"" +"108,300";"56,0";"Starr";"61,62";"67,83";"1.119";"1.059,45";"außerh. d. Bez.pegels";"" +"108,400";"54,2";"Mobil";"61,78";"67,81";"1.119";"1.059,45";"außerh. d. Bez.pegels";"" +"108,500";"53,5";"Mobil";"61,82";"67,79";"1.119";"1.059,45";"außerh. d. Bez.pegels";"" +"108,600";"53,8";"Mobil";"61,76";"67,77";"1.119";"1.059,45";"außerh. d. Bez.pegels";"" +"108,700";"52,2";"Mobil";"61,88";"67,75";"1.119";"1.059,45";"außerh. d. Bez.pegels";"" +"108,800";"51,3";"Mobil";"61,93";"67,72";"1.119";"1.059,45";"außerh. d. Bez.pegels";"" +"108,900";"49,6";"Mobil";"62,06";"67,70";"1.119";"1.059,45";"außerh. d. Bez.pegels";"" +"109,000";"48,8";"Mobil";"62,11";"67,67";"1.119";"1.059,45";"außerh. d. Bez.pegels";"" +"109,100";"51,4";"Mobil";"61,82";"67,65";"1.119";"1.059,45";"außerh. d. Bez.pegels";"" +"109,200";"52,2";"Mobil";"61,70";"67,62";"1.119";"1.059,45";"außerh. d. Bez.pegels";"" +"109,300";"51,0";"Mobil";"61,76";"67,59";"1.119";"1.059,45";"außerh. d. Bez.pegels";"" +"109,400";"48,8";"Mobil";"61,91";"67,56";"1.119";"1.059,45";"außerh. d. Bez.pegels";"" +"109,500";"51,7";"Mobil";"61,56";"67,53";"1.119";"1.059,45";"außerh. d. Bez.pegels";"" +"109,600";"56,0";"Mobil";"61,20";"67,49";"1.119";"1.059,45";"außerh. d. Bez.pegels";"" +"109,700";"56,4";"Mobil";"61,17";"67,47";"1.119";"1.059,45";"außerh. d. Bez.pegels";"" +"109,800";"58,6";"Mobil";"60,92";"67,45";"1.119";"1.059,45";"außerh. d. Bez.pegels";"" +"109,900";"59,2";"Mobil";"60,82";"67,44";"1.119";"1.059,45";"außerh. d. Bez.pegels";"" +"110,000";"59,3";"Mobil";"60,86";"67,42";"1.119";"1.059,45";"außerh. d. Bez.pegels";"" +"110,100";"60,0";"Mobil";"60,78";"67,39";"1.119";"1.059,45";"außerh. d. Bez.pegels";"" +"110,200";"57,9";"Mobil";"60,95";"67,35";"1.119";"1.059,45";"außerh. d. Bez.pegels";"" +"110,300";"58,3";"Mobil";"60,87";"67,34";"1.119";"1.059,45";"außerh. d. Bez.pegels";"" +"110,400";"59,2";"Mobil";"60,77";"67,32";"1.119";"1.059,45";"außerh. d. Bez.pegels";"" +"110,500";"60,2";"Mobil";"60,65";"67,30";"1.119";"1.059,45";"außerh. d. Bez.pegels";"" +"110,600";"59,6";"Mobil";"60,68";"67,28";"1.118";"1.059,45";"außerh. d. Bez.pegels";"" +"110,700";"57,8";"Mobil";"60,83";"67,27";"1.118";"1.059,45";"außerh. d. Bez.pegels";"" +"110,800";"55,5";"Mobil";"61,07";"67,25";"1.118";"1.059,45";"außerh. d. Bez.pegels";"" +"110,900";"54,1";"Mobil";"61,21";"67,23";"1.118";"1.059,45";"außerh. d. Bez.pegels";"" +"111,000";"52,6";"Mobil";"61,34";"67,21";"1.118";"1.059,45";"außerh. d. Bez.pegels";"" +"111,100";"52,5";"Mobil";"61,34";"67,19";"1.118";"1.059,45";"außerh. d. Bez.pegels";"" +"111,200";"58,6";"Mobil";"60,72";"67,17";"1.118";"1.059,45";"außerh. d. Bez.pegels";"" +"111,300";"62,1";"Mobil";"60,37";"67,16";"1.118";"1.059,45";"außerh. d. Bez.pegels";"" +"111,400";"61,0";"Mobil";"60,50";"67,14";"1.118";"1.059,45";"außerh. d. Bez.pegels";"" +"111,500";"58,4";"Mobil";"60,74";"67,12";"1.118";"1.059,45";"außerh. d. Bez.pegels";"" +"111,600";"59,3";"Mobil";"60,64";"67,09";"1.118";"1.059,45";"außerh. d. Bez.pegels";"" +"111,700";"59,1";"Mobil";"60,65";"67,08";"1.118";"1.059,45";"außerh. d. Bez.pegels";"" +"111,800";"59,5";"Mobil";"60,59";"67,06";"1.118";"1.059,45";"außerh. d. Bez.pegels";"" +"111,900";"58,8";"Mobil";"60,64";"67,05";"1.118";"1.059,45";"außerh. d. Bez.pegels";"" +"112,000";"57,3";"Mobil";"60,79";"67,03";"1.118";"1.059,45";"außerh. d. Bez.pegels";"" +"112,100";"56,8";"Mobil";"60,83";"67,01";"1.118";"1.059,45";"außerh. d. Bez.pegels";"" +"112,200";"55,3";"Mobil";"60,95";"66,99";"1.118";"1.059,45";"außerh. d. Bez.pegels";"" +"112,300";"55,5";"Mobil";"60,91";"66,98";"1.118";"1.059,45";"außerh. d. Bez.pegels";"" +"112,400";"54,1";"Mobil";"61,06";"66,96";"1.118";"1.059,45";"außerh. d. Bez.pegels";"" +"112,500";"53,3";"Mobil";"61,15";"66,94";"1.118";"1.059,45";"außerh. d. Bez.pegels";"" +"112,600";"52,7";"Mobil";"61,20";"66,92";"1.118";"1.059,45";"außerh. d. Bez.pegels";"" +"112,700";"52,4";"Mobil";"61,21";"66,90";"1.118";"1.059,45";"außerh. d. Bez.pegels";"" +"112,800";"51,9";"Mobil";"61,26";"66,88";"1.118";"1.059,45";"außerh. d. Bez.pegels";"" +"112,900";"54,2";"Mobil";"61,03";"66,86";"1.118";"1.059,45";"außerh. d. Bez.pegels";"" +"113,000";"53,7";"Mobil";"61,06";"66,84";"1.118";"1.059,45";"außerh. d. Bez.pegels";"" +"113,100";"53,1";"Mobil";"61,11";"66,82";"1.118";"1.059,45";"außerh. d. Bez.pegels";"" +"113,200";"52,7";"Mobil";"61,11";"66,80";"1.118";"1.059,45";"außerh. d. Bez.pegels";"" +"113,300";"52,8";"Mobil";"61,07";"66,79";"1.118";"1.059,45";"außerh. d. Bez.pegels";"" +"113,400";"51,5";"Mobil";"61,18";"66,78";"1.118";"1.059,45";"außerh. d. Bez.pegels";"" +"113,500";"51,6";"Mobil";"61,15";"66,77";"1.118";"1.059,45";"außerh. d. Bez.pegels";"" +"113,600";"54,2";"Mobil";"60,82";"66,75";"1.118";"1.059,45";"außerh. d. Bez.pegels";"" +"113,700";"55,3";"Mobil";"60,59";"66,74";"1.118";"1.059,45";"außerh. d. Bez.pegels";"" +"113,800";"58,3";"Mobil";"60,35";"66,73";"1.118";"1.059,45";"außerh. d. Bez.pegels";"" +"113,900";"61,4";"Mobil";"60,08";"66,72";"1.118";"1.059,45";"außerh. d. Bez.pegels";"" +"114,000";"62,3";"Mobil";"60,01";"66,70";"1.118";"1.059,45";"außerh. d. Bez.pegels";"" +"114,100";"61,3";"Mobil";"60,11";"66,69";"1.118";"1.059,45";"außerh. d. Bez.pegels";"" +"114,200";"58,7";"Mobil";"60,24";"66,68";"1.118";"1.059,45";"außerh. d. Bez.pegels";"" +"114,300";"54,3";"Mobil";"60,44";"66,67";"1.118";"1.059,45";"außerh. d. Bez.pegels";"" +"114,400";"54,8";"Mobil";"60,44";"66,66";"1.118";"1.059,45";"außerh. d. Bez.pegels";"" +"114,500";"55,3";"Mobil";"60,42";"66,65";"1.118";"1.059,45";"außerh. d. Bez.pegels";"" +"114,600";"50,3";"Mobil";"60,50";"66,64";"1.118";"1.059,45";"außerh. d. Bez.pegels";"" +"114,700";"40,5";"Mobil";"60,59";"66,64";"1.118";"1.059,45";"außerh. d. Bez.pegels";"" +"114,800";"52,3";"Mobil";"60,32";"66,64";"1.118";"1.059,45";"außerh. d. Bez.pegels";"" +"114,900";"56,2";"Mobil";"60,32";"66,63";"1.118";"1.059,45";"außerh. d. Bez.pegels";"" +"115,000";"56,6";"Mobil";"60,28";"66,61";"1.118";"1.059,45";"außerh. d. Bez.pegels";"" +"115,100";"56,9";"Mobil";"60,26";"66,61";"1.118";"1.059,45";"außerh. d. Bez.pegels";"" +"115,200";"58,7";"Mobil";"60,13";"66,60";"1.118";"1.059,45";"außerh. d. Bez.pegels";"" +"115,300";"62,1";"Mobil";"59,81";"66,59";"1.118";"1.059,45";"außerh. d. Bez.pegels";"" +"115,400";"63,0";"Mobil";"59,79";"66,57";"1.118";"1.059,45";"außerh. d. Bez.pegels";"" +"115,500";"61,4";"Mobil";"59,99";"66,56";"1.118";"1.059,45";"außerh. d. Bez.pegels";"" +"115,600";"59,2";"Mobil";"60,21";"66,55";"1.118";"1.059,45";"außerh. d. Bez.pegels";"" +"115,700";"57,9";"Mobil";"60,34";"66,54";"1.118";"1.059,45";"außerh. d. Bez.pegels";"" +"115,800";"60,1";"Mobil";"60,11";"66,53";"1.118";"1.059,45";"außerh. d. Bez.pegels";"" +"115,900";"63,1";"Mobil";"59,78";"66,52";"1.118";"1.059,45";"außerh. d. Bez.pegels";"" +"116,000";"61,5";"Mobil";"59,92";"66,51";"1.118";"1.059,45";"außerh. d. Bez.pegels";"" +"116,100";"57,7";"Mobil";"60,28";"66,51";"1.118";"1.059,45";"außerh. d. Bez.pegels";"" +"116,200";"54,4";"Mobil";"60,54";"66,50";"1.118";"1.059,45";"außerh. d. Bez.pegels";"" +"116,300";"52,5";"Mobil";"60,62";"66,50";"1.118";"1.059,45";"außerh. d. Bez.pegels";"" +"116,400";"55,4";"Mobil";"60,41";"66,49";"1.118";"1.059,45";"außerh. d. Bez.pegels";"" +"116,500";"59,1";"Mobil";"60,11";"66,48";"1.118";"1.059,45";"außerh. d. Bez.pegels";"" +"116,600";"57,5";"Mobil";"60,29";"66,47";"1.118";"1.059,45";"außerh. d. Bez.pegels";"" +"116,700";"57,8";"Mobil";"60,28";"66,46";"1.118";"1.059,45";"außerh. d. Bez.pegels";"" +"116,800";"56,7";"Mobil";"60,36";"66,44";"1.118";"1.059,45";"außerh. d. Bez.pegels";"" +"116,900";"56,8";"Mobil";"60,33";"66,43";"1.118";"1.059,45";"außerh. d. Bez.pegels";"" +"117,000";"57,7";"Mobil";"60,29";"66,42";"1.118";"1.059,45";"außerh. d. Bez.pegels";"" +"117,100";"57,5";"Mobil";"60,27";"66,40";"1.118";"1.059,45";"außerh. d. Bez.pegels";"" +"117,200";"60,6";"Mobil";"59,98";"66,38";"1.118";"1.059,45";"außerh. d. Bez.pegels";"" +"117,300";"59,5";"Mobil";"60,06";"66,35";"1.118";"1.059,45";"außerh. d. Bez.pegels";"" +"117,400";"60,6";"Mobil";"59,92";"66,31";"1.118";"1.059,45";"außerh. d. Bez.pegels";"" +"117,500";"63,9";"Mobil";"59,60";"66,30";"1.118";"1.059,45";"außerh. d. Bez.pegels";"" +"117,600";"69,4";"Mobil";"59,08";"66,29";"1.118";"1.059,45";"außerh. d. Bez.pegels";"" +"117,700";"70,3";"Mobil";"58,95";"66,27";"1.118";"1.059,45";"außerh. d. Bez.pegels";"" +"117,800";"72,4";"Mobil";"58,76";"66,24";"1.118";"1.059,45";"außerh. d. Bez.pegels";"" +"117,900";"69,9";"Mobil";"58,98";"66,22";"1.118";"1.059,45";"außerh. d. Bez.pegels";"" +"118,000";"68,7";"Mobil";"59,06";"66,20";"1.118";"1.059,45";"außerh. d. Bez.pegels";"" +"118,100";"70,3";"Mobil";"58,89";"66,18";"1.118";"1.059,45";"außerh. d. Bez.pegels";"" +"118,200";"68,9";"Mobil";"58,99";"66,15";"1.118";"1.059,45";"außerh. d. Bez.pegels";"" +"118,300";"64,8";"Mobil";"59,34";"66,13";"1.118";"1.059,45";"außerh. d. Bez.pegels";"" +"118,400";"63,3";"Mobil";"59,44";"66,11";"1.118";"1.059,45";"außerh. d. Bez.pegels";"" +"118,500";"63,4";"Mobil";"59,38";"66,08";"1.118";"1.059,45";"außerh. d. Bez.pegels";"" +"118,600";"64,3";"Mobil";"59,28";"66,05";"1.118";"1.059,45";"außerh. d. Bez.pegels";"" +"118,700";"63,2";"Mobil";"59,38";"66,04";"1.118";"1.059,45";"außerh. d. Bez.pegels";"" +"118,800";"62,4";"Mobil";"59,44";"66,03";"1.118";"1.059,45";"außerh. d. Bez.pegels";"" +"118,900";"61,9";"Mobil";"59,45";"66,01";"1.118";"1.059,45";"außerh. d. Bez.pegels";"" +"119,000";"62,0";"Mobil";"59,41";"65,98";"1.118";"1.059,45";"außerh. d. Bez.pegels";"" +"119,100";"60,9";"Mobil";"59,47";"65,95";"1.118";"1.059,45";"außerh. d. Bez.pegels";"" +"119,200";"60,9";"Mobil";"59,43";"65,92";"1.118";"1.059,45";"außerh. d. Bez.pegels";"" +"119,300";"61,8";"Mobil";"59,33";"65,90";"1.118";"1.059,45";"außerh. d. Bez.pegels";"" +"119,400";"60,5";"Mobil";"59,44";"65,87";"1.118";"1.059,45";"außerh. d. Bez.pegels";"" +"119,500";"60,0";"Mobil";"59,49";"65,85";"1.118";"1.059,45";"außerh. d. Bez.pegels";"" +"119,600";"62,7";"Mobil";"59,25";"65,83";"1.118";"1.059,45";"außerh. d. Bez.pegels";"" +"119,700";"63,4";"Mobil";"59,15";"65,83";"1.118";"1.059,45";"außerh. d. Bez.pegels";"" +"119,800";"64,6";"Mobil";"58,99";"65,82";"1.118";"1.059,45";"außerh. d. Bez.pegels";"" +"119,900";"65,6";"Mobil";"58,84";"65,81";"1.118";"1.059,45";"außerh. d. Bez.pegels";"" +"120,000";"67,7";"Mobil";"58,56";"65,79";"1.118";"1.059,45";"außerh. d. Bez.pegels";"" +"120,100";"65,7";"Mobil";"58,66";"65,78";"1.118";"1.059,45";"außerh. d. Bez.pegels";"" +"120,200";"66,1";"Mobil";"58,59";"65,77";"1.118";"1.059,45";"außerh. d. Bez.pegels";"" +"120,300";"62,5";"Mobil";"58,92";"65,75";"1.118";"1.059,45";"außerh. d. Bez.pegels";"" +"120,400";"64,9";"Mobil";"58,60";"65,73";"1.118";"1.059,45";"außerh. d. Bez.pegels";"" +"120,500";"60,8";"Mobil";"58,93";"65,71";"1.118";"1.059,45";"außerh. d. Bez.pegels";"" +"120,600";"59,4";"Mobil";"59,02";"65,68";"1.118";"1.059,45";"außerh. d. Bez.pegels";"" +"120,700";"58,3";"Mobil";"59,09";"65,66";"1.118";"1.059,45";"außerh. d. Bez.pegels";"" +"120,800";"61,1";"Mobil";"58,76";"65,64";"1.118";"1.059,45";"außerh. d. Bez.pegels";"" +"120,900";"62,9";"Mobil";"58,51";"65,61";"1.118";"1.059,45";"außerh. d. Bez.pegels";"" +"121,000";"60,8";"Mobil";"58,69";"65,57";"1.118";"1.059,45";"außerh. d. Bez.pegels";"" +"121,100";"57,1";"Mobil";"59,01";"65,54";"1.118";"1.059,45";"außerh. d. Bez.pegels";"" +"121,200";"56,3";"Mobil";"59,01";"65,50";"1.118";"1.059,45";"außerh. d. Bez.pegels";"" +"121,300";"55,4";"Mobil";"59,03";"65,49";"1.118";"1.059,45";"außerh. d. Bez.pegels";"" +"121,400";"54,5";"Mobil";"59,07";"65,48";"1.118";"1.059,45";"außerh. d. Bez.pegels";"" +"121,500";"54,5";"Mobil";"59,00";"65,46";"1.118";"1.059,45";"außerh. d. Bez.pegels";"" +"121,600";"56,0";"Mobil";"58,82";"65,44";"1.118";"1.059,45";"außerh. d. Bez.pegels";"" +"121,700";"58,2";"Mobil";"58,55";"65,41";"1.118";"1.059,45";"außerh. d. Bez.pegels";"" +"121,800";"56,5";"Mobil";"58,67";"65,38";"1.118";"1.059,45";"außerh. d. Bez.pegels";"" +"121,900";"53,4";"Mobil";"58,94";"65,36";"1.118";"1.059,45";"außerh. d. Bez.pegels";"" +"122,000";"51,2";"Mobil";"59,13";"65,33";"1.118";"1.059,45";"außerh. d. Bez.pegels";"" +"122,100";"49,9";"Mobil";"59,22";"65,31";"1.118";"1.059,45";"außerh. d. Bez.pegels";"" +"122,200";"50,1";"Mobil";"59,15";"65,28";"1.118";"1.059,45";"außerh. d. Bez.pegels";"" +"122,300";"53,4";"Mobil";"58,77";"65,25";"1.118";"1.059,45";"außerh. d. Bez.pegels";"" +"122,400";"53,1";"Mobil";"58,70";"65,22";"1.118";"1.059,45";"außerh. d. Bez.pegels";"" +"122,500";"50,0";"Mobil";"58,93";"65,21";"1.118";"1.059,45";"außerh. d. Bez.pegels";"" +"122,600";"50,4";"Mobil";"58,80";"65,20";"1.118";"1.059,45";"außerh. d. Bez.pegels";"" +"122,700";"49,8";"Mobil";"58,74";"65,19";"1.118";"1.059,45";"außerh. d. Bez.pegels";"" +"122,800";"47,5";"Mobil";"58,94";"65,17";"1.118";"1.059,45";"außerh. d. Bez.pegels";"" +"122,900";"49,2";"Mobil";"58,67";"65,15";"1.118";"1.059,45";"außerh. d. Bez.pegels";"" +"123,000";"49,3";"Mobil";"58,69";"65,13";"1.118";"1.059,45";"außerh. d. Bez.pegels";"" +"123,100";"49,2";"Mobil";"58,71";"65,11";"1.118";"1.059,45";"außerh. d. Bez.pegels";"" +"123,200";"47,7";"Mobil";"58,84";"65,08";"1.118";"1.059,45";"außerh. d. Bez.pegels";"" +"123,300";"48,4";"Mobil";"58,71";"65,05";"1.118";"1.059,45";"außerh. d. Bez.pegels";"" +"123,400";"48,7";"Mobil";"58,61";"65,02";"1.118";"1.059,45";"außerh. d. Bez.pegels";"" +"123,500";"49,4";"Mobil";"58,46";"65,00";"1.118";"1.059,45";"außerh. d. Bez.pegels";"" +"123,600";"51,5";"Mobil";"58,11";"64,98";"1.118";"1.059,45";"außerh. d. Bez.pegels";"" +"123,700";"49,8";"Mobil";"58,18";"64,96";"1.118";"1.059,45";"außerh. d. Bez.pegels";"" +"123,800";"49,8";"Mobil";"58,09";"64,93";"1.118";"1.059,45";"außerh. d. Bez.pegels";"" +"123,900";"47,7";"Mobil";"58,26";"64,92";"1.118";"1.059,45";"außerh. d. Bez.pegels";"" +"124,000";"50,6";"Mobil";"57,92";"64,90";"1.118";"1.059,45";"außerh. d. Bez.pegels";"" +"124,100";"54,2";"Mobil";"57,49";"64,88";"1.118";"1.059,45";"außerh. d. Bez.pegels";"" +"124,200";"52,7";"Mobil";"57,58";"64,85";"1.118";"1.059,45";"außerh. d. Bez.pegels";"" +"124,300";"50,7";"Mobil";"57,74";"64,83";"1.118";"1.059,45";"außerh. d. Bez.pegels";"" +"124,400";"48,1";"Mobil";"58,04";"64,80";"1.118";"1.059,45";"außerh. d. Bez.pegels";"" +"124,500";"45,5";"Mobil";"58,34";"64,78";"1.118";"1.059,45";"außerh. d. Bez.pegels";"" +"124,600";"40,9";"Mobil";"58,78";"64,75";"1.118";"1.059,45";"außerh. d. Bez.pegels";"" +"124,700";"40,9";"Mobil";"58,69";"64,73";"1.118";"1.059,45";"außerh. d. Bez.pegels";"" +"124,800";"41,6";"Mobil";"58,53";"64,70";"1.118";"1.059,45";"außerh. d. Bez.pegels";"" +"124,900";"42,1";"Mobil";"58,37";"64,68";"1.118";"1.059,45";"außerh. d. Bez.pegels";"" +"125,000";"43,4";"Mobil";"58,25";"64,66";"1.118";"1.059,45";"außerh. d. Bez.pegels";"" +"125,100";"43,2";"Mobil";"58,32";"64,64";"1.118";"1.059,45";"außerh. d. Bez.pegels";"" +"125,200";"42,3";"Mobil";"58,47";"64,62";"1.118";"1.059,45";"außerh. d. Bez.pegels";"" +"125,300";"42,3";"Mobil";"58,50";"64,60";"1.118";"1.059,45";"außerh. d. Bez.pegels";"" +"125,400";"41,2";"Mobil";"58,56";"64,58";"1.118";"1.059,45";"außerh. d. Bez.pegels";"" +"125,500";"40,7";"Mobil";"58,53";"64,56";"1.118";"1.059,45";"außerh. d. Bez.pegels";"" +"125,600";"40,2";"Mobil";"58,51";"64,54";"1.118";"1.059,45";"außerh. d. Bez.pegels";"" +"125,700";"40,6";"Mobil";"58,37";"64,52";"1.118";"1.059,45";"außerh. d. Bez.pegels";"" +"125,800";"43,2";"Mobil";"58,24";"64,50";"1.118";"1.059,45";"außerh. d. Bez.pegels";"" +"125,900";"44,5";"Mobil";"58,24";"64,48";"1.118";"1.059,45";"außerh. d. Bez.pegels";"" +"126,000";"44,9";"Mobil";"58,21";"64,46";"1.118";"1.059,45";"außerh. d. Bez.pegels";"" +"126,100";"44,5";"Mobil";"58,27";"64,44";"1.118";"1.059,45";"außerh. d. Bez.pegels";"" +"126,200";"43,9";"Mobil";"58,28";"64,41";"1.118";"1.059,45";"außerh. d. Bez.pegels";"" +"126,300";"42,6";"Mobil";"58,37";"64,39";"1.118";"1.059,45";"außerh. d. Bez.pegels";"" +"126,400";"44,3";"Mobil";"58,18";"64,37";"1.118";"1.059,45";"außerh. d. Bez.pegels";"" +"126,500";"43,9";"Mobil";"58,26";"64,35";"1.118";"1.059,45";"außerh. d. Bez.pegels";"" +"126,600";"41,0";"Mobil";"58,44";"64,33";"1.118";"1.059,45";"außerh. d. Bez.pegels";"" +"126,700";"40,1";"Mobil";"58,32";"64,32";"1.118";"1.059,45";"außerh. d. Bez.pegels";"" +"126,800";"41,0";"Mobil";"58,23";"64,30";"1.118";"1.059,45";"außerh. d. Bez.pegels";"" +"126,900";"41,0";"Mobil";"58,25";"64,29";"1.118";"1.059,45";"außerh. d. Bez.pegels";"" +"127,000";"43,1";"Mobil";"58,02";"64,27";"1.118";"1.059,45";"außerh. d. Bez.pegels";"" +"127,100";"42,7";"Mobil";"58,12";"64,25";"1.118";"1.059,45";"außerh. d. Bez.pegels";"" +"127,200";"43,4";"Mobil";"58,12";"64,23";"1.118";"1.059,45";"außerh. d. Bez.pegels";"" +"127,300";"45,8";"Mobil";"57,90";"64,21";"1.118";"1.059,45";"außerh. d. Bez.pegels";"" +"127,400";"46,8";"Mobil";"57,74";"64,18";"1.118";"1.059,45";"außerh. d. Bez.pegels";"" +"127,500";"45,2";"Mobil";"57,92";"64,17";"1.118";"1.059,45";"außerh. d. Bez.pegels";"" +"127,600";"46,3";"Mobil";"57,90";"64,15";"1.118";"1.059,45";"außerh. d. Bez.pegels";"" +"127,700";"49,3";"Mobil";"57,62";"64,12";"1.118";"1.059,45";"außerh. d. Bez.pegels";"" +"127,800";"49,7";"Mobil";"57,59";"64,08";"1.118";"1.059,45";"außerh. d. Bez.pegels";"" +"127,900";"50,0";"Mobil";"57,58";"64,05";"1.118";"1.059,45";"außerh. d. Bez.pegels";"Fähre: Coswig -Gierseilfähre" +"128,000";"51,5";"Mobil";"57,47";"64,02";"1.118";"1.059,45";"außerh. d. Bez.pegels";"" +"128,100";"51,5";"Mobil";"57,49";"63,99";"1.118";"1.059,45";"außerh. d. Bez.pegels";"" +"128,200";"53,1";"Mobil";"57,30";"63,95";"1.118";"1.059,45";"außerh. d. Bez.pegels";"" +"128,300";"54,0";"Mobil";"57,18";"63,93";"1.118";"1.059,45";"außerh. d. Bez.pegels";"" +"128,400";"54,2";"Mobil";"57,17";"63,90";"1.118";"1.059,45";"außerh. d. Bez.pegels";"" +"128,500";"53,2";"Mobil";"57,27";"63,86";"1.118";"1.059,45";"außerh. d. Bez.pegels";"" +"128,600";"53,1";"Mobil";"57,24";"63,82";"1.118";"1.059,45";"außerh. d. Bez.pegels";"" +"128,700";"51,7";"Mobil";"57,35";"63,79";"1.118";"1.059,45";"außerh. d. Bez.pegels";"" +"128,800";"52,8";"Mobil";"57,24";"63,75";"1.118";"1.059,45";"außerh. d. Bez.pegels";"" +"128,900";"53,2";"Mobil";"57,19";"63,72";"1.118";"1.059,45";"außerh. d. Bez.pegels";"" +"129,000";"53,8";"Mobil";"57,11";"63,69";"1.118";"1.059,45";"außerh. d. Bez.pegels";"" +"129,100";"52,9";"Mobil";"57,19";"63,67";"1.118";"1.059,45";"außerh. d. Bez.pegels";"" +"129,200";"53,9";"Mobil";"57,07";"63,65";"1.118";"1.059,45";"außerh. d. Bez.pegels";"" +"129,300";"54,6";"Mobil";"56,99";"63,63";"1.118";"1.059,45";"außerh. d. Bez.pegels";"" +"129,400";"50,4";"Mobil";"57,39";"63,60";"1.118";"1.059,45";"außerh. d. Bez.pegels";"" +"129,500";"52,9";"Mobil";"57,10";"63,59";"1.118";"1.059,45";"außerh. d. Bez.pegels";"" +"129,600";"54,0";"Mobil";"56,98";"63,58";"1.118";"1.059,45";"außerh. d. Bez.pegels";"" +"129,700";"54,2";"Mobil";"56,96";"63,57";"1.118";"1.059,45";"außerh. d. Bez.pegels";"" +"129,800";"54,8";"Mobil";"56,89";"63,55";"1.118";"1.059,45";"außerh. d. Bez.pegels";"" +"129,900";"54,4";"Mobil";"56,91";"63,53";"1.118";"1.059,45";"außerh. d. Bez.pegels";"" +"130,000";"55,1";"Mobil";"56,83";"63,51";"1.118";"1.059,45";"außerh. d. Bez.pegels";"" +"130,100";"54,0";"Mobil";"56,92";"63,49";"1.118";"1.059,45";"außerh. d. Bez.pegels";"" +"130,200";"53,3";"Mobil";"56,97";"63,47";"1.118";"1.059,45";"außerh. d. Bez.pegels";"" +"130,300";"53,0";"Mobil";"56,98";"63,46";"1.118";"1.059,45";"außerh. d. Bez.pegels";"" +"130,400";"51,0";"Mobil";"57,20";"63,44";"1.118";"1.059,45";"außerh. d. Bez.pegels";"HW-Schutz: Buroer-Deich" +"130,500";"51,4";"Mobil";"57,14";"63,43";"1.118";"1.059,45";"außerh. d. Bez.pegels";"" +"130,600";"52,2";"Mobil";"57,05";"63,42";"1.118";"1.059,45";"außerh. d. Bez.pegels";"" +"130,700";"51,7";"Mobil";"57,08";"63,41";"1.118";"1.059,45";"außerh. d. Bez.pegels";"" +"130,800";"51,9";"Mobil";"57,12";"63,39";"1.118";"1.059,45";"außerh. d. Bez.pegels";"" +"130,900";"52,4";"Mobil";"57,12";"63,37";"1.118";"1.059,45";"außerh. d. Bez.pegels";"" +"131,000";"52,5";"Mobil";"57,12";"63,34";"1.118";"1.059,45";"außerh. d. Bez.pegels";"" +"131,100";"52,6";"Mobil";"57,11";"63,32";"1.118";"1.059,45";"außerh. d. Bez.pegels";"" +"131,200";"53,6";"Mobil";"56,98";"63,29";"1.118";"1.059,45";"außerh. d. Bez.pegels";"" +"131,300";"53,1";"Mobil";"57,00";"63,28";"1.118";"1.059,45";"außerh. d. Bez.pegels";"" +"131,400";"52,8";"Mobil";"57,04";"63,26";"1.118";"1.059,45";"außerh. d. Bez.pegels";"" +"131,500";"54,6";"Mobil";"56,86";"63,25";"1.118";"1.059,45";"außerh. d. Bez.pegels";"" +"131,600";"57,9";"Mobil";"56,53";"63,23";"1.118";"1.059,45";"außerh. d. Bez.pegels";"" +"131,700";"57,7";"Mobil";"56,57";"63,22";"1.118";"1.059,45";"außerh. d. Bez.pegels";"" +"131,800";"57,2";"Mobil";"56,65";"63,20";"1.118";"1.059,45";"außerh. d. Bez.pegels";"" +"131,900";"59,1";"Mobil";"56,48";"63,18";"1.118";"1.059,45";"außerh. d. Bez.pegels";"" +"132,000";"60,0";"Mobil";"56,43";"63,15";"1.118";"1.059,45";"außerh. d. Bez.pegels";"" +"132,100";"61,2";"Mobil";"56,31";"63,11";"1.118";"1.059,45";"außerh. d. Bez.pegels";"" +"132,200";"61,4";"Mobil";"56,28";"63,06";"1.118";"1.059,45";"außerh. d. Bez.pegels";"" +"132,300";"63,9";"Mobil";"56,04";"63,04";"1.118";"1.059,45";"außerh. d. Bez.pegels";"" +"132,400";"65,0";"Mobil";"55,94";"63,01";"1.118";"1.059,45";"außerh. d. Bez.pegels";"" +"132,500";"62,8";"Mobil";"56,14";"62,99";"1.118";"1.059,45";"außerh. d. Bez.pegels";"" +"132,600";"59,6";"Mobil";"56,41";"62,96";"1.118";"1.059,45";"außerh. d. Bez.pegels";"" +"132,700";"56,0";"Mobil";"56,64";"62,92";"1.118";"1.059,45";"außerh. d. Bez.pegels";"" +"132,800";"58,7";"Mobil";"56,43";"62,87";"1.118";"1.059,45";"außerh. d. Bez.pegels";"" +"132,900";"63,2";"Mobil";"56,06";"62,86";"1.118";"1.059,45";"außerh. d. Bez.pegels";"" +"133,000";"62,5";"Mobil";"56,15";"62,85";"1.118";"1.059,45";"außerh. d. Bez.pegels";"" +"133,100";"59,6";"Mobil";"56,44";"62,84";"1.118";"1.059,45";"außerh. d. Bez.pegels";"" +"133,200";"57,6";"Mobil";"56,63";"62,83";"1.118";"1.059,45";"außerh. d. Bez.pegels";"" +"133,300";"57,0";"Mobil";"56,70";"62,82";"1.118";"1.059,45";"außerh. d. Bez.pegels";"" +"133,400";"58,3";"Mobil";"56,58";"62,81";"1.118";"1.059,45";"außerh. d. Bez.pegels";"" +"133,500";"60,0";"Mobil";"56,43";"62,80";"1.118";"1.059,45";"außerh. d. Bez.pegels";"" +"133,600";"59,8";"Mobil";"56,46";"62,78";"1.118";"1.059,45";"außerh. d. Bez.pegels";"" +"133,700";"61,6";"Mobil";"56,29";"62,77";"1.118";"1.059,45";"außerh. d. Bez.pegels";"" +"133,800";"65,4";"Mobil";"55,95";"62,75";"1.118";"1.059,45";"außerh. d. Bez.pegels";"" +"133,900";"67,8";"Mobil";"55,73";"62,73";"1.118";"1.059,45";"außerh. d. Bez.pegels";"" +"134,000";"69,8";"Mobil";"55,56";"62,71";"1.118";"1.059,45";"außerh. d. Bez.pegels";"" +"134,100";"69,6";"Mobil";"55,59";"62,70";"1.118";"1.059,45";"außerh. d. Bez.pegels";"" +"134,200";"67,3";"Mobil";"55,76";"62,68";"1.118";"1.059,45";"außerh. d. Bez.pegels";"" +"134,300";"63,7";"Mobil";"55,99";"62,68";"1.118";"1.059,45";"außerh. d. Bez.pegels";"" +"134,400";"61,9";"Mobil";"56,24";"62,67";"1.118";"1.059,45";"außerh. d. Bez.pegels";"" +"134,500";"61,0";"Mobil";"56,39";"62,66";"1.118";"1.059,45";"außerh. d. Bez.pegels";"" +"134,600";"62,7";"Mobil";"56,31";"62,65";"1.118";"1.059,45";"außerh. d. Bez.pegels";"" +"134,700";"61,7";"Mobil";"56,39";"62,63";"1.118";"1.059,45";"außerh. d. Bez.pegels";"" +"134,800";"62,7";"Mobil";"56,28";"62,60";"1.118";"1.059,45";"außerh. d. Bez.pegels";"" +"134,900";"64,5";"Mobil";"56,10";"62,58";"1.118";"1.059,45";"außerh. d. Bez.pegels";"" +"135,000";"66,3";"Mobil";"55,92";"62,56";"1.118";"1.059,45";"außerh. d. Bez.pegels";"" +"135,100";"64,9";"Mobil";"56,04";"62,55";"1.118";"1.059,45";"außerh. d. Bez.pegels";"" +"135,200";"69,4";"Mobil";"55,63";"62,53";"1.118";"1.059,45";"außerh. d. Bez.pegels";"" +"135,300";"72,1";"Mobil";"55,40";"62,52";"1.118";"1.059,45";"außerh. d. Bez.pegels";"" +"135,400";"72,8";"Mobil";"55,31";"62,50";"1.118";"1.059,45";"außerh. d. Bez.pegels";"" +"135,500";"74,1";"Mobil";"55,12";"62,47";"1.118";"1.059,45";"außerh. d. Bez.pegels";"" +"135,600";"71,4";"Mobil";"55,36";"62,43";"1.118";"1.059,45";"außerh. d. Bez.pegels";"" +"135,700";"70,4";"Mobil";"55,47";"62,42";"1.118";"1.059,45";"außerh. d. Bez.pegels";"" +"135,800";"69,6";"Mobil";"55,48";"62,40";"1.118";"1.059,45";"außerh. d. Bez.pegels";"" +"135,900";"66,6";"Mobil";"55,67";"62,37";"1.118";"1.059,45";"außerh. d. Bez.pegels";"" +"136,000";"64,3";"Mobil";"55,84";"62,33";"1.118";"1.059,45";"außerh. d. Bez.pegels";"" +"136,100";"62,0";"Mobil";"56,04";"62,32";"1.118";"1.059,45";"außerh. d. Bez.pegels";"" +"136,200";"62,5";"Mobil";"56,00";"62,30";"1.118";"1.059,45";"außerh. d. Bez.pegels";"" +"136,300";"62,3";"Mobil";"56,00";"62,28";"1.118";"1.059,45";"außerh. d. Bez.pegels";"" +"136,400";"63,8";"Mobil";"55,83";"62,26";"1.118";"1.059,45";"außerh. d. Bez.pegels";"" +"136,500";"62,4";"Mobil";"55,91";"62,24";"1.118";"1.059,45";"außerh. d. Bez.pegels";"" +"136,600";"60,6";"Mobil";"56,07";"62,21";"1.118";"1.059,45";"außerh. d. Bez.pegels";"" +"136,700";"64,1";"Mobil";"55,77";"62,19";"1.118";"1.059,45";"außerh. d. Bez.pegels";"" +"136,800";"64,0";"Mobil";"55,77";"62,16";"1.118";"1.059,45";"außerh. d. Bez.pegels";"" +"136,900";"63,6";"Mobil";"55,79";"62,15";"1.118";"1.059,45";"außerh. d. Bez.pegels";"" +"137,000";"65,8";"Mobil";"55,55";"62,13";"1.118";"1.059,45";"außerh. d. Bez.pegels";"" +"137,100";"67,2";"Mobil";"55,33";"62,09";"1.118";"1.059,45";"außerh. d. Bez.pegels";"" +"137,200";"67,0";"Mobil";"55,30";"62,05";"1.118";"1.059,45";"außerh. d. Bez.pegels";"Geschiebemessstelle: Vockerode" +"137,300";"63,3";"Mobil";"55,57";"62,02";"1.118";"1.059,45";"außerh. d. Bez.pegels";"" +"137,400";"60,4";"Mobil";"55,86";"61,99";"1.118";"1.059,45";"außerh. d. Bez.pegels";"" +"137,500";"61,0";"Mobil";"55,85";"61,98";"1.118";"1.059,45";"außerh. d. Bez.pegels";"" +"137,600";"61,1";"Mobil";"55,85";"61,96";"1.118";"1.059,45";"außerh. d. Bez.pegels";"" +"137,700";"62,9";"Mobil";"55,70";"61,95";"1.118";"1.059,45";"außerh. d. Bez.pegels";"" +"137,800";"64,5";"Mobil";"55,55";"61,94";"1.118";"1.059,45";"außerh. d. Bez.pegels";"" +"137,900";"65,8";"Mobil";"55,42";"61,93";"1.118";"1.059,45";"außerh. d. Bez.pegels";"" +"138,000";"64,6";"Mobil";"55,51";"61,91";"1.118";"1.059,45";"außerh. d. Bez.pegels";"" +"138,100";"64,8";"Mobil";"55,46";"61,89";"1.118";"1.059,45";"außerh. d. Bez.pegels";"" +"138,200";"65,4";"Mobil";"55,38";"61,87";"1.118";"1.059,45";"außerh. d. Bez.pegels";"" +"138,300";"66,5";"Mobil";"55,24";"61,85";"1.118";"1.059,45";"außerh. d. Bez.pegels";"HW-Schutz: Kliekener-Deich" +"138,400";"63,8";"Mobil";"55,44";"61,82";"1.118";"1.059,45";"außerh. d. Bez.pegels";"" +"138,500";"69,1";"Mobil";"54,96";"61,80";"1.118";"1.059,45";"außerh. d. Bez.pegels";"" +"138,600";"67,3";"Mobil";"55,12";"61,78";"1.118";"1.059,45";"außerh. d. Bez.pegels";"" +"138,700";"63,4";"Mobil";"55,45";"61,76";"1.118";"1.059,45";"außerh. d. Bez.pegels";"" +"138,800";"66,2";"Mobil";"55,19";"61,73";"1.118";"1.059,45";"außerh. d. Bez.pegels";"" +"138,900";"62,8";"Mobil";"55,48";"61,72";"1.118";"1.059,45";"außerh. d. Bez.pegels";"" +"139,000";"63,7";"Mobil";"55,38";"61,70";"1.118";"1.059,45";"außerh. d. Bez.pegels";"" +"139,100";"62,1";"Mobil";"55,50";"61,68";"1.118";"1.059,45";"außerh. d. Bez.pegels";"" +"139,200";"63,3";"Mobil";"55,38";"61,66";"1.118";"1.059,45";"außerh. d. Bez.pegels";"" +"139,300";"63,1";"Mobil";"55,40";"61,64";"1.118";"1.059,45";"außerh. d. Bez.pegels";"" +"139,400";"61,2";"Mobil";"55,52";"61,62";"1.118";"1.059,45";"außerh. d. Bez.pegels";"" +"139,500";"60,6";"Mobil";"55,50";"61,59";"1.118";"1.059,45";"außerh. d. Bez.pegels";"" +"139,600";"62,9";"Mobil";"55,27";"61,56";"1.118";"1.059,45";"außerh. d. Bez.pegels";"" +"139,700";"61,8";"Mobil";"55,33";"61,54";"1.118";"1.059,45";"außerh. d. Bez.pegels";"" +"139,800";"60,3";"Mobil";"55,45";"61,51";"1.118";"1.059,45";"außerh. d. Bez.pegels";"" +"139,900";"62,9";"Mobil";"55,21";"61,49";"1.118";"1.059,45";"außerh. d. Bez.pegels";"" +"140,000";"64,0";"Mobil";"55,07";"61,47";"1.118";"1.059,45";"außerh. d. Bez.pegels";"" +"140,100";"63,8";"Mobil";"55,04";"61,44";"1.118";"1.059,45";"außerh. d. Bez.pegels";"" +"140,200";"62,0";"Mobil";"55,16";"61,41";"1.118";"1.059,45";"außerh. d. Bez.pegels";"" +"140,300";"62,1";"Mobil";"55,11";"61,39";"1.118";"1.059,45";"außerh. d. Bez.pegels";"" +"140,400";"64,2";"Mobil";"54,94";"61,37";"1.118";"1.059,45";"außerh. d. Bez.pegels";"" +"140,500";"66,8";"Mobil";"54,72";"61,35";"1.118";"1.059,45";"außerh. d. Bez.pegels";"" +"140,600";"67,4";"Mobil";"54,59";"61,33";"1.118";"1.059,45";"außerh. d. Bez.pegels";"" +"140,700";"66,2";"Mobil";"54,58";"61,29";"1.118";"1.059,45";"außerh. d. Bez.pegels";"" +"140,800";"63,1";"Mobil";"54,80";"61,25";"1.118";"1.059,45";"außerh. d. Bez.pegels";"" +"140,900";"61,4";"Mobil";"54,90";"61,22";"1.118";"1.059,45";"außerh. d. Bez.pegels";"" +"141,000";"61,1";"Mobil";"54,89";"61,19";"1.118";"1.059,45";"außerh. d. Bez.pegels";"" +"141,100";"60,9";"Mobil";"54,88";"61,16";"1.118";"1.059,45";"außerh. d. Bez.pegels";"" +"141,200";"61,1";"Mobil";"54,80";"61,13";"1.118";"1.059,45";"außerh. d. Bez.pegels";"" +"141,300";"60,4";"Mobil";"54,80";"61,10";"1.118";"1.059,45";"außerh. d. Bez.pegels";"" +"141,400";"61,8";"Mobil";"54,67";"61,06";"1.118";"1.059,45";"außerh. d. Bez.pegels";"" +"141,500";"62,4";"Mobil";"54,62";"61,04";"1.118";"1.059,45";"außerh. d. Bez.pegels";"" +"141,600";"63,9";"Mobil";"54,47";"61,01";"1.118";"1.059,45";"außerh. d. Bez.pegels";"" +"143,700";"65,5";"Mobil";"54,24";"60,85";"1.118";"1.059,45";"außerh. d. Bez.pegels";"" +"143,800";"65,7";"Mobil";"54,22";"60,83";"1.118";"1.059,45";"außerh. d. Bez.pegels";"" +"143,900";"63,8";"Mobil";"54,34";"60,80";"1.118";"1.059,45";"außerh. d. Bez.pegels";"" +"144,000";"62,6";"Mobil";"54,39";"60,77";"1.118";"1.059,45";"außerh. d. Bez.pegels";"" +"144,100";"64,1";"Mobil";"54,24";"60,74";"1.118";"1.059,45";"außerh. d. Bez.pegels";"" +"144,200";"65,7";"Mobil";"54,08";"60,70";"1.118";"1.059,45";"außerh. d. Bez.pegels";"" +"144,300";"66,6";"Mobil";"53,99";"60,68";"1.118";"1.059,45";"außerh. d. Bez.pegels";"" +"144,400";"67,7";"Mobil";"53,89";"60,65";"1.118";"1.059,45";"außerh. d. Bez.pegels";"" +"144,500";"67,4";"Mobil";"53,90";"60,63";"1.118";"1.059,45";"außerh. d. Bez.pegels";"" +"144,600";"64,0";"Mobil";"54,18";"60,60";"1.118";"1.059,45";"außerh. d. Bez.pegels";"" +"144,700";"62,0";"Mobil";"54,30";"60,57";"1.118";"1.059,45";"außerh. d. Bez.pegels";"" +"144,800";"61,9";"Mobil";"54,25";"60,54";"1.118";"1.059,45";"außerh. d. Bez.pegels";"" +"144,900";"59,2";"Mobil";"54,41";"60,52";"1.118";"1.059,45";"außerh. d. Bez.pegels";"" +"145,000";"60,0";"Mobil";"54,28";"60,49";"1.118";"1.059,45";"außerh. d. Bez.pegels";"" +"145,100";"61,2";"Mobil";"54,15";"60,47";"1.118";"1.059,45";"außerh. d. Bez.pegels";"" +"145,200";"62,4";"Mobil";"54,03";"60,44";"1.118";"1.059,45";"außerh. d. Bez.pegels";"" +"145,300";"62,4";"Mobil";"54,06";"60,42";"1.118";"1.059,45";"außerh. d. Bez.pegels";"" +"145,400";"62,1";"Mobil";"54,11";"60,40";"1.118";"1.059,45";"außerh. d. Bez.pegels";"" +"145,500";"61,3";"Mobil";"54,11";"60,37";"1.118";"1.059,45";"außerh. d. Bez.pegels";"" +"145,600";"59,6";"Mobil";"54,16";"60,34";"1.118";"1.059,45";"außerh. d. Bez.pegels";"" +"145,700";"63,8";"Mobil";"53,91";"60,31";"1.118";"1.059,45";"außerh. d. Bez.pegels";"" +"145,800";"63,8";"Mobil";"53,96";"60,28";"1.118";"1.059,45";"außerh. d. Bez.pegels";"" +"145,900";"61,6";"Mobil";"54,14";"60,25";"1.118";"1.059,45";"außerh. d. Bez.pegels";"" +"146,000";"60,7";"Mobil";"54,19";"60,22";"1.118";"1.059,45";"außerh. d. Bez.pegels";"" +"146,100";"64,8";"Mobil";"53,79";"60,20";"1.118";"1.059,45";"außerh. d. Bez.pegels";"" +"146,200";"66,1";"Mobil";"53,64";"60,18";"1.118";"1.059,45";"außerh. d. Bez.pegels";"" +"146,300";"66,2";"Mobil";"53,60";"60,15";"1.118";"1.059,45";"außerh. d. Bez.pegels";"" +"146,400";"66,3";"Mobil";"53,56";"60,11";"1.118";"1.059,45";"außerh. d. Bez.pegels";"" +"146,500";"64,0";"Mobil";"53,76";"60,11";"1.118";"1.059,45";"außerh. d. Bez.pegels";"" +"146,600";"63,1";"Mobil";"53,84";"60,10";"1.118";"1.059,45";"außerh. d. Bez.pegels";"" +"146,700";"64,4";"Mobil";"53,70";"60,09";"1.118";"1.059,45";"außerh. d. Bez.pegels";"" +"146,800";"62,4";"Mobil";"53,84";"60,07";"1.118";"1.059,45";"außerh. d. Bez.pegels";"" +"146,900";"61,2";"Mobil";"53,92";"60,06";"1.118";"1.059,45";"außerh. d. Bez.pegels";"" +"147,000";"61,6";"Mobil";"53,85";"60,04";"1.118";"1.059,45";"außerh. d. Bez.pegels";"" +"147,100";"62,6";"Mobil";"53,77";"60,02";"1.118";"1.059,45";"außerh. d. Bez.pegels";"" +"147,200";"63,1";"Mobil";"53,71";"60,00";"1.118";"1.059,45";"außerh. d. Bez.pegels";"" +"147,300";"62,6";"Mobil";"53,73";"59,99";"1.118";"1.059,45";"außerh. d. Bez.pegels";"" +"147,400";"61,5";"Mobil";"53,78";"59,97";"1.118";"1.059,45";"außerh. d. Bez.pegels";"" +"147,500";"60,1";"Mobil";"53,89";"59,96";"1.118";"1.059,45";"außerh. d. Bez.pegels";"" +"147,600";"59,5";"Mobil";"53,93";"59,95";"1.118";"1.059,45";"außerh. d. Bez.pegels";"" +"147,700";"58,0";"Mobil";"53,78";"59,94";"1.118";"1.059,45";"außerh. d. Bez.pegels";"" +"147,800";"56,7";"Starr";"53,61";"59,93";"1.118";"1.059,45";"außerh. d. Bez.pegels";"" +"147,900";"53,3";"Starr";"53,47";"59,92";"1.118";"1.059,45";"außerh. d. Bez.pegels";"HW-Schutz: Rosslau-Deich" +"148,000";"47,7";"Starr";"53,49";"59,90";"1.118";"1.059,45";"außerh. d. Bez.pegels";"" +"148,100";"47,7";"Starr";"53,51";"59,89";"1.118";"1.059,45";"außerh. d. Bez.pegels";"" +"148,200";"46,9";"Starr";"53,59";"59,88";"1.118";"1.059,45";"außerh. d. Bez.pegels";"" +"148,300";"46,2";"Starr";"53,57";"59,87";"1.118";"1.059,45";"außerh. d. Bez.pegels";"" +"148,400";"45,4";"Starr";"53,57";"59,86";"1.118";"1.059,45";"außerh. d. Bez.pegels";"" +"148,500";"45,7";"Starr";"53,49";"59,85";"1.118";"1.059,45";"außerh. d. Bez.pegels";"" +"148,600";"45,2";"Starr";"53,49";"59,83";"1.118";"1.059,45";"außerh. d. Bez.pegels";"" +"148,700";"38,6";"Starr";"53,52";"59,82";"1.118";"1.059,45";"außerh. d. Bez.pegels";"" +"148,800";"26,4";"Starr";"53,51";"59,81";"1.118";"1.059,45";"außerh. d. Bez.pegels";"" +"148,900";"37,9";"Starr";"53,37";"59,79";"1.118";"1.059,45";"außerh. d. Bez.pegels";"" +"149,000";"42,6";"Starr";"53,27";"59,77";"1.118";"1.059,45";"außerh. d. Bez.pegels";"" +"149,100";"45,7";"Starr";"53,18";"59,75";"1.118";"1.059,45";"außerh. d. Bez.pegels";"" +"149,200";"46,3";"Starr";"53,12";"59,72";"1.118";"1.059,45";"außerh. d. Bez.pegels";"" +"149,300";"43,5";"Starr";"53,16";"59,70";"1.118";"1.059,45";"außerh. d. Bez.pegels";"" +"149,400";"38,0";"Starr";"53,19";"59,67";"1.118";"1.059,45";"außerh. d. Bez.pegels";"Zufluss: Rossel" +"149,500";"37,3";"Starr";"53,26";"59,65";"1.118";"1.059,45";"außerh. d. Bez.pegels";"" +"149,600";"37,9";"Starr";"53,14";"59,63";"1.118";"1.059,45";"außerh. d. Bez.pegels";"" +"149,700";"39,7";"Starr";"53,07";"59,59";"1.118";"1.059,45";"außerh. d. Bez.pegels";"" +"149,800";"38,8";"Starr";"53,36";"59,54";"1.118";"1.059,45";"außerh. d. Bez.pegels";"" +"149,900";"43,8";"Starr";"52,78";"59,48";"1.118";"1.059,45";"außerh. d. Bez.pegels";"Hafen: Werfthafen" +"150,000";"44,9";"Starr";"52,73";"59,42";"1.118";"1.059,45";"außerh. d. Bez.pegels";"" +"150,100";"45,0";"Starr";"52,87";"59,41";"1.118";"1.059,45";"außerh. d. Bez.pegels";"" +"150,200";"45,4";"Starr";"52,97";"59,39";"1.118";"1.059,45";"außerh. d. Bez.pegels";"" +"150,300";"47,4";"Starr";"52,98";"59,37";"1.118";"1.059,45";"außerh. d. Bez.pegels";"" +"150,400";"48,8";"Starr";"53,06";"59,35";"1.118";"1.059,45";"außerh. d. Bez.pegels";"" +"150,500";"50,8";"Starr";"53,01";"59,33";"1.118";"1.059,45";"außerh. d. Bez.pegels";"" +"150,600";"52,8";"Starr";"52,96";"59,31";"1.118";"1.059,45";"außerh. d. Bez.pegels";"" +"150,700";"54,4";"Starr";"53,01";"59,30";"1.118";"1.059,45";"außerh. d. Bez.pegels";"" +"150,800";"56,4";"Starr";"53,01";"59,28";"1.118";"1.059,45";"außerh. d. Bez.pegels";"" +"150,900";"57,7";"Starr";"53,05";"59,26";"1.118";"1.059,45";"außerh. d. Bez.pegels";"" +"151,000";"60,0";"Mobil";"53,00";"59,24";"1.118";"1.059,45";"außerh. d. Bez.pegels";"Geschiebemessstelle: Dessau 259 (oberhalb Muldemündung)" +"151,100";"62,7";"Mobil";"52,92";"59,23";"1.118";"1.059,45";"außerh. d. Bez.pegels";"" +"151,200";"68,4";"Mobil";"52,54";"59,21";"1.118";"1.059,45";"außerh. d. Bez.pegels";"Zufluss: Mulde" +"151,300";"74,9";"Mobil";"51,99";"59,19";"1.118";"1.059,45";"außerh. d. Bez.pegels";"" +"151,400";"70,2";"Mobil";"52,39";"59,17";"1.298";"1.059,45";"außerh. d. Bez.pegels";"Geschiebemessstelle: Dessau 260 (unterhalb Muldemündung)" +"151,500";"72,2";"Mobil";"52,14";"59,15";"1.298";"1.059,45";"außerh. d. Bez.pegels";"" +"151,600";"69,4";"Mobil";"52,30";"59,12";"1.298";"1.059,45";"außerh. d. Bez.pegels";"" +"151,700";"66,7";"Mobil";"52,54";"59,11";"1.298";"1.059,45";"außerh. d. Bez.pegels";"" +"151,800";"67,2";"Mobil";"52,49";"59,10";"1.298";"1.059,45";"außerh. d. Bez.pegels";"" +"151,900";"65,6";"Mobil";"52,63";"59,08";"1.298";"1.059,45";"außerh. d. Bez.pegels";"" +"152,000";"70,1";"Mobil";"52,22";"59,05";"1.298";"1.059,45";"außerh. d. Bez.pegels";"Hafen: Dessau-Wallwitz" +"152,100";"74,7";"Mobil";"51,79";"59,04";"1.298";"1.059,45";"außerh. d. Bez.pegels";"" +"152,200";"73,5";"Mobil";"51,88";"59,03";"1.298";"1.059,45";"außerh. d. Bez.pegels";"" +"152,300";"70,8";"Mobil";"52,09";"59,01";"1.298";"1.059,45";"außerh. d. Bez.pegels";"" +"152,400";"65,8";"Mobil";"52,51";"58,98";"1.298";"1.059,45";"außerh. d. Bez.pegels";"" +"152,500";"62,8";"Mobil";"52,74";"58,96";"1.298";"1.059,45";"außerh. d. Bez.pegels";"" +"152,600";"62,0";"Mobil";"52,79";"58,94";"1.298";"1.059,45";"außerh. d. Bez.pegels";"" +"152,700";"64,8";"Mobil";"52,51";"58,93";"1.298";"1.059,45";"außerh. d. Bez.pegels";"" +"152,800";"67,4";"Mobil";"52,26";"58,91";"1.298";"1.059,45";"außerh. d. Bez.pegels";"" +"152,900";"68,2";"Mobil";"52,16";"58,89";"1.298";"1.059,45";"außerh. d. Bez.pegels";"" +"153,000";"70,1";"Mobil";"51,96";"58,87";"1.298";"1.059,45";"außerh. d. Bez.pegels";"" +"153,100";"69,0";"Mobil";"52,05";"58,85";"1.298";"1.059,45";"außerh. d. Bez.pegels";"Hafen: Leopoldhafen" +"153,200";"68,6";"Mobil";"52,06";"58,83";"1.298";"1.059,45";"außerh. d. Bez.pegels";"" +"153,300";"67,3";"Mobil";"52,15";"58,82";"1.298";"1.059,45";"außerh. d. Bez.pegels";"" +"153,400";"68,9";"Mobil";"52,00";"58,80";"1.298";"1.059,45";"außerh. d. Bez.pegels";"" +"153,500";"67,8";"Mobil";"52,07";"58,78";"1.298";"1.059,45";"außerh. d. Bez.pegels";"" +"153,600";"70,0";"Mobil";"51,83";"58,76";"1.298";"1.059,45";"außerh. d. Bez.pegels";"" +"153,700";"70,4";"Mobil";"51,76";"58,74";"1.298";"1.059,45";"außerh. d. Bez.pegels";"" +"153,800";"70,3";"Mobil";"51,74";"58,72";"1.294";"1.059,45";"außerh. d. Bez.pegels";"" +"153,900";"68,3";"Mobil";"51,90";"58,71";"1.294";"1.059,45";"außerh. d. Bez.pegels";"" +"154,000";"67,0";"Mobil";"52,00";"58,70";"1.294";"1.059,45";"außerh. d. Bez.pegels";"" +"154,100";"67,1";"Mobil";"51,97";"58,69";"1.294";"1.059,45";"außerh. d. Bez.pegels";"" +"154,200";"66,8";"Mobil";"51,98";"58,67";"1.294";"1.059,45";"außerh. d. Bez.pegels";"" +"154,300";"66,6";"Mobil";"51,96";"58,66";"1.294";"1.059,45";"außerh. d. Bez.pegels";"" +"154,400";"66,9";"Mobil";"51,91";"58,64";"1.294";"1.059,45";"außerh. d. Bez.pegels";"" +"154,500";"64,8";"Mobil";"52,07";"58,62";"1.294";"1.059,45";"außerh. d. Bez.pegels";"" +"154,600";"66,0";"Mobil";"51,93";"58,60";"1.294";"1.059,45";"außerh. d. Bez.pegels";"" +"154,700";"65,5";"Mobil";"51,96";"58,59";"1.294";"1.059,45";"außerh. d. Bez.pegels";"" +"154,800";"64,5";"Mobil";"52,01";"58,57";"1.294";"1.059,45";"außerh. d. Bez.pegels";"" +"154,900";"64,0";"Mobil";"52,02";"58,56";"1.294";"1.059,45";"außerh. d. Bez.pegels";"" +"155,000";"67,9";"Mobil";"51,64";"58,54";"1.294";"1.059,45";"außerh. d. Bez.pegels";"" +"155,100";"67,3";"Mobil";"51,64";"58,52";"1.294";"1.059,45";"außerh. d. Bez.pegels";"" +"155,200";"67,5";"Mobil";"51,57";"58,49";"1.294";"1.059,45";"außerh. d. Bez.pegels";"" +"155,300";"67,7";"Mobil";"51,56";"58,47";"1.294";"1.059,45";"außerh. d. Bez.pegels";"" +"155,400";"67,0";"Mobil";"51,62";"58,45";"1.294";"1.059,45";"außerh. d. Bez.pegels";"" +"155,500";"66,6";"Mobil";"51,56";"58,43";"1.294";"1.059,45";"außerh. d. Bez.pegels";"" +"155,600";"66,8";"Mobil";"51,42";"58,40";"1.294";"1.059,45";"außerh. d. Bez.pegels";"" +"155,700";"68,9";"Mobil";"51,22";"58,37";"1.294";"1.059,45";"außerh. d. Bez.pegels";"" +"155,800";"67,3";"Mobil";"51,36";"58,34";"1.294";"1.059,45";"außerh. d. Bez.pegels";"Hafen: Roßlau Industriehafen" +"155,900";"67,8";"Mobil";"51,29";"58,30";"1.294";"1.059,45";"außerh. d. Bez.pegels";"" +"156,000";"71,5";"Mobil";"50,92";"58,25";"1.294";"1.059,45";"außerh. d. Bez.pegels";"" +"156,100";"69,6";"Mobil";"51,10";"58,25";"1.294";"1.059,45";"außerh. d. Bez.pegels";"" +"156,200";"70,0";"Mobil";"51,06";"58,24";"1.294";"1.059,45";"außerh. d. Bez.pegels";"" +"156,300";"68,1";"Mobil";"51,19";"58,18";"1.294";"1.059,45";"außerh. d. Bez.pegels";"" +"156,400";"65,9";"Mobil";"51,34";"58,12";"1.294";"1.059,45";"außerh. d. Bez.pegels";"" +"156,500";"63,9";"Mobil";"51,50";"58,10";"1.294";"1.059,45";"außerh. d. Bez.pegels";"" +"156,600";"62,3";"Mobil";"51,62";"58,08";"1.294";"1.059,45";"außerh. d. Bez.pegels";"" +"156,700";"60,2";"Mobil";"51,81";"58,07";"1.294";"1.059,45";"außerh. d. Bez.pegels";"" +"156,800";"60,3";"Mobil";"51,80";"58,05";"1.294";"1.059,45";"außerh. d. Bez.pegels";"" +"156,900";"59,2";"Mobil";"51,87";"58,04";"1.294";"1.059,45";"außerh. d. Bez.pegels";"" +"157,000";"59,5";"Mobil";"51,83";"58,02";"1.294";"1.059,45";"außerh. d. Bez.pegels";"" +"157,100";"59,1";"Mobil";"51,83";"58,00";"1.294";"1.059,45";"außerh. d. Bez.pegels";"" +"157,200";"59,0";"Mobil";"51,79";"57,98";"1.294";"1.059,45";"außerh. d. Bez.pegels";"" +"157,300";"59,5";"Mobil";"51,72";"57,96";"1.294";"1.059,45";"außerh. d. Bez.pegels";"" +"157,400";"60,3";"Mobil";"51,62";"57,94";"1.294";"1.059,45";"außerh. d. Bez.pegels";"" +"157,500";"61,0";"Mobil";"51,56";"57,92";"1.294";"1.059,45";"außerh. d. Bez.pegels";"" +"157,600";"62,5";"Mobil";"51,43";"57,90";"1.294";"1.059,45";"außerh. d. Bez.pegels";"" +"157,700";"62,6";"Mobil";"51,41";"57,88";"1.294";"1.059,45";"außerh. d. Bez.pegels";"" +"157,800";"62,5";"Mobil";"51,40";"57,86";"1.294";"1.059,45";"außerh. d. Bez.pegels";"" +"157,900";"63,3";"Mobil";"51,30";"57,83";"1.294";"1.059,45";"außerh. d. Bez.pegels";"" +"158,000";"62,7";"Mobil";"51,33";"57,80";"1.294";"1.059,45";"außerh. d. Bez.pegels";"" +"158,100";"62,1";"Mobil";"51,37";"57,78";"1.294";"1.059,45";"außerh. d. Bez.pegels";"" +"158,200";"61,7";"Mobil";"51,39";"57,76";"1.294";"1.059,45";"außerh. d. Bez.pegels";"" +"158,300";"62,1";"Mobil";"51,34";"57,75";"1.294";"1.059,45";"außerh. d. Bez.pegels";"" +"158,400";"60,4";"Mobil";"51,47";"57,73";"1.294";"1.059,45";"außerh. d. Bez.pegels";"" +"158,500";"60,8";"Mobil";"51,43";"57,71";"1.294";"1.059,45";"außerh. d. Bez.pegels";"" +"158,600";"61,4";"Mobil";"51,35";"57,69";"1.294";"1.059,45";"außerh. d. Bez.pegels";"" +"158,700";"60,8";"Mobil";"51,39";"57,67";"1.294";"1.059,45";"außerh. d. Bez.pegels";"" +"158,800";"61,3";"Mobil";"51,33";"57,65";"1.294";"1.059,45";"außerh. d. Bez.pegels";"" +"158,900";"60,6";"Mobil";"51,38";"57,63";"1.294";"1.059,45";"außerh. d. Bez.pegels";"" +"159,000";"61,0";"Mobil";"51,32";"57,61";"1.294";"1.059,45";"außerh. d. Bez.pegels";"" +"159,100";"61,8";"Mobil";"51,20";"57,59";"1.294";"1.059,45";"außerh. d. Bez.pegels";"" +"159,200";"62,7";"Mobil";"51,09";"57,56";"1.294";"1.059,45";"außerh. d. Bez.pegels";"" +"159,300";"61,1";"Mobil";"51,26";"57,55";"1.294";"1.059,45";"außerh. d. Bez.pegels";"" +"159,400";"60,7";"Mobil";"51,28";"57,53";"1.294";"1.059,45";"außerh. d. Bez.pegels";"" +"159,500";"61,2";"Mobil";"51,22";"57,51";"1.294";"1.059,45";"außerh. d. Bez.pegels";"" +"159,600";"62,3";"Mobil";"51,10";"57,49";"1.294";"1.059,45";"außerh. d. Bez.pegels";"" +"159,700";"64,6";"Mobil";"50,87";"57,47";"1.294";"1.059,45";"außerh. d. Bez.pegels";"" +"159,800";"65,3";"Mobil";"50,79";"57,45";"1.294";"1.059,45";"außerh. d. Bez.pegels";"" +"159,900";"62,1";"Mobil";"51,05";"57,43";"1.294";"1.059,45";"außerh. d. Bez.pegels";"" +"160,000";"59,8";"Mobil";"51,24";"57,40";"1.294";"1.059,45";"außerh. d. Bez.pegels";"" +"160,100";"59,4";"Mobil";"51,27";"57,39";"1.294";"1.059,45";"außerh. d. Bez.pegels";"" +"160,200";"63,1";"Mobil";"50,93";"57,38";"1.294";"1.059,45";"außerh. d. Bez.pegels";"" +"160,300";"66,1";"Mobil";"50,64";"57,37";"1.294";"1.059,45";"außerh. d. Bez.pegels";"" +"160,400";"65,9";"Mobil";"50,64";"57,35";"1.294";"1.059,45";"außerh. d. Bez.pegels";"" +"160,500";"65,7";"Mobil";"50,65";"57,33";"1.294";"1.059,45";"außerh. d. Bez.pegels";"" +"160,600";"65,7";"Mobil";"50,63";"57,31";"1.294";"1.059,45";"außerh. d. Bez.pegels";"" +"160,700";"62,5";"Mobil";"50,92";"57,29";"1.294";"1.059,45";"außerh. d. Bez.pegels";"" +"160,800";"61,8";"Mobil";"50,95";"57,27";"1.290";"1.059,45";"außerh. d. Bez.pegels";"" +"160,900";"62,2";"Mobil";"50,90";"57,25";"1.290";"1.059,45";"außerh. d. Bez.pegels";"" +"161,000";"61,9";"Mobil";"50,91";"57,23";"1.290";"1.059,45";"außerh. d. Bez.pegels";"" +"161,100";"62,4";"Mobil";"50,85";"57,22";"1.290";"1.059,45";"außerh. d. Bez.pegels";"" +"161,200";"61,2";"Mobil";"50,96";"57,20";"1.290";"1.059,45";"außerh. d. Bez.pegels";"" +"161,300";"60,3";"Mobil";"51,03";"57,19";"1.290";"1.059,45";"außerh. d. Bez.pegels";"" +"161,400";"60,4";"Mobil";"51,00";"57,17";"1.290";"1.059,45";"außerh. d. Bez.pegels";"" +"161,500";"62,6";"Mobil";"50,79";"57,16";"1.290";"1.059,45";"außerh. d. Bez.pegels";"" +"161,600";"63,6";"Mobil";"50,66";"57,14";"1.290";"1.059,45";"außerh. d. Bez.pegels";"" +"161,700";"63,4";"Mobil";"50,68";"57,13";"1.290";"1.059,45";"außerh. d. Bez.pegels";"" +"161,800";"64,9";"Mobil";"50,53";"57,11";"1.290";"1.059,45";"außerh. d. Bez.pegels";"" +"161,900";"61,4";"Mobil";"50,84";"57,10";"1.290";"1.059,45";"außerh. d. Bez.pegels";"" +"162,000";"60,8";"Mobil";"50,89";"57,08";"1.290";"1.059,45";"außerh. d. Bez.pegels";"" +"162,100";"62,1";"Mobil";"50,74";"57,06";"1.290";"1.059,45";"außerh. d. Bez.pegels";"" +"162,200";"61,9";"Mobil";"50,72";"57,04";"1.290";"1.059,45";"außerh. d. Bez.pegels";"" +"162,300";"60,0";"Mobil";"50,86";"57,03";"1.290";"1.059,45";"außerh. d. Bez.pegels";"" +"162,400";"62,4";"Mobil";"50,60";"57,02";"1.290";"1.059,45";"außerh. d. Bez.pegels";"" +"162,500";"63,6";"Mobil";"50,52";"57,00";"1.290";"1.059,45";"außerh. d. Bez.pegels";"" +"162,600";"63,2";"Mobil";"50,57";"56,98";"1.290";"1.059,45";"außerh. d. Bez.pegels";"" +"162,700";"63,4";"Mobil";"50,54";"56,97";"1.290";"1.059,45";"außerh. d. Bez.pegels";"" +"162,800";"67,9";"Mobil";"50,13";"56,95";"1.290";"1.059,45";"außerh. d. Bez.pegels";"" +"162,900";"67,8";"Mobil";"50,12";"56,93";"1.290";"1.059,45";"außerh. d. Bez.pegels";"" +"163,000";"66,9";"Mobil";"50,18";"56,90";"1.290";"1.059,45";"außerh. d. Bez.pegels";"" +"163,100";"63,8";"Mobil";"50,42";"56,87";"1.290";"1.059,45";"außerh. d. Bez.pegels";"" +"163,200";"62,9";"Mobil";"50,47";"56,84";"1.290";"1.059,45";"außerh. d. Bez.pegels";"" +"163,300";"63,0";"Mobil";"50,45";"56,83";"1.290";"1.059,45";"außerh. d. Bez.pegels";"" +"163,400";"62,2";"Mobil";"50,53";"56,82";"1.290";"1.059,45";"außerh. d. Bez.pegels";"" +"163,500";"61,9";"Mobil";"50,55";"56,80";"1.290";"1.059,45";"außerh. d. Bez.pegels";"" +"163,600";"60,9";"Mobil";"50,62";"56,78";"1.290";"1.059,45";"außerh. d. Bez.pegels";"" +"163,700";"63,0";"Mobil";"50,40";"56,77";"1.290";"1.059,45";"außerh. d. Bez.pegels";"" +"163,800";"64,4";"Mobil";"50,24";"56,75";"1.290";"1.059,45";"außerh. d. Bez.pegels";"" +"163,900";"63,9";"Mobil";"50,28";"56,73";"1.290";"1.059,45";"außerh. d. Bez.pegels";"" +"164,000";"63,9";"Mobil";"50,26";"56,71";"1.290";"1.059,45";"außerh. d. Bez.pegels";"" +"164,100";"62,9";"Mobil";"50,36";"56,70";"1.290";"1.059,45";"außerh. d. Bez.pegels";"" +"164,200";"64,0";"Mobil";"50,25";"56,68";"1.290";"1.059,45";"außerh. d. Bez.pegels";"" +"164,300";"66,4";"Mobil";"50,01";"56,67";"1.290";"1.059,45";"außerh. d. Bez.pegels";"" +"164,400";"65,6";"Mobil";"50,07";"56,65";"1.290";"1.059,45";"außerh. d. Bez.pegels";"" +"164,500";"65,6";"Mobil";"50,05";"56,63";"1.290";"1.059,45";"außerh. d. Bez.pegels";"" +"164,600";"65,8";"Mobil";"50,00";"56,60";"1.290";"1.059,45";"außerh. d. Bez.pegels";"" +"164,700";"65,7";"Mobil";"50,00";"56,59";"1.290";"1.059,45";"außerh. d. Bez.pegels";"" +"164,800";"66,1";"Mobil";"49,96";"56,57";"1.290";"1.059,45";"außerh. d. Bez.pegels";"" +"164,900";"64,8";"Mobil";"50,05";"56,56";"1.290";"1.059,45";"außerh. d. Bez.pegels";"" +"165,000";"62,6";"Mobil";"50,21";"56,54";"1.290";"1.059,45";"außerh. d. Bez.pegels";"" +"165,100";"62,7";"Mobil";"50,18";"56,52";"1.290";"1.059,45";"außerh. d. Bez.pegels";"" +"165,200";"63,3";"Mobil";"50,10";"56,49";"1.290";"1.059,45";"außerh. d. Bez.pegels";"" +"165,300";"64,2";"Mobil";"50,02";"56,47";"1.290";"1.059,45";"außerh. d. Bez.pegels";"" +"165,400";"65,1";"Mobil";"49,93";"56,45";"1.290";"1.059,45";"außerh. d. Bez.pegels";"" +"165,500";"63,8";"Mobil";"50,02";"56,44";"1.290";"1.059,45";"außerh. d. Bez.pegels";"" +"165,600";"63,6";"Mobil";"50,01";"56,42";"1.290";"1.059,45";"außerh. d. Bez.pegels";"" +"165,700";"63,8";"Mobil";"50,00";"56,40";"1.290";"1.059,45";"außerh. d. Bez.pegels";"" +"165,800";"65,7";"Mobil";"49,82";"56,37";"1.290";"1.059,45";"außerh. d. Bez.pegels";"" +"165,900";"67,3";"Mobil";"49,67";"56,35";"1.290";"1.059,45";"außerh. d. Bez.pegels";"" +"166,000";"68,6";"Mobil";"49,54";"56,33";"1.290";"1.059,45";"außerh. d. Bez.pegels";"" +"166,100";"68,6";"Mobil";"49,53";"56,32";"1.290";"1.059,45";"außerh. d. Bez.pegels";"" +"166,200";"69,5";"Mobil";"49,43";"56,30";"1.290";"1.059,45";"außerh. d. Bez.pegels";"" +"166,300";"68,2";"Mobil";"49,53";"56,28";"1.290";"1.059,45";"außerh. d. Bez.pegels";"" +"166,400";"65,4";"Mobil";"49,76";"56,26";"1.290";"1.059,45";"außerh. d. Bez.pegels";"Hafen: Hornhafen Aken" +"166,500";"67,5";"Mobil";"49,56";"56,25";"1.290";"1.059,45";"außerh. d. Bez.pegels";"Fähre: Aken -Gierseilfähre" +"166,600";"65,6";"Mobil";"49,72";"56,23";"1.290";"1.059,45";"außerh. d. Bez.pegels";"" +"166,700";"66,9";"Mobil";"49,60";"56,22";"1.290";"1.059,45";"außerh. d. Bez.pegels";"" +"166,800";"67,2";"Mobil";"49,57";"56,20";"1.290";"1.059,45";"außerh. d. Bez.pegels";"" +"166,900";"68,7";"Mobil";"49,40";"56,19";"1.290";"1.059,45";"außerh. d. Bez.pegels";"" +"167,000";"69,0";"Mobil";"49,34";"56,17";"1.290";"1.059,45";"außerh. d. Bez.pegels";"" +"167,100";"67,8";"Mobil";"49,43";"56,15";"1.290";"1.059,45";"außerh. d. Bez.pegels";"" +"167,200";"67,5";"Mobil";"49,45";"56,13";"1.290";"1.059,45";"außerh. d. Bez.pegels";"" +"167,300";"69,5";"Mobil";"49,24";"56,11";"1.290";"1.059,45";"außerh. d. Bez.pegels";"" +"167,400";"68,1";"Mobil";"49,33";"56,09";"1.290";"1.059,45";"außerh. d. Bez.pegels";"" +"167,500";"65,7";"Mobil";"49,55";"56,08";"1.290";"1.059,45";"außerh. d. Bez.pegels";"" +"167,600";"63,6";"Mobil";"49,74";"56,06";"1.290";"1.059,45";"außerh. d. Bez.pegels";"" +"167,700";"64,9";"Mobil";"49,61";"56,04";"1.290";"1.059,45";"außerh. d. Bez.pegels";"" +"167,800";"67,5";"Mobil";"49,36";"56,02";"1.290";"1.059,45";"außerh. d. Bez.pegels";"" +"167,900";"68,4";"Mobil";"49,23";"56,00";"1.290";"1.059,45";"außerh. d. Bez.pegels";"" +"168,000";"67,5";"Mobil";"49,25";"55,98";"1.290";"1.059,45";"außerh. d. Bez.pegels";"" +"168,100";"66,6";"Mobil";"49,32";"55,96";"1.290";"1.059,45";"außerh. d. Bez.pegels";"" +"168,200";"65,7";"Mobil";"49,38";"55,94";"1.290";"1.059,45";"außerh. d. Bez.pegels";"" +"168,300";"63,6";"Mobil";"49,54";"55,93";"1.290";"1.059,45";"außerh. d. Bez.pegels";"" +"168,400";"63,0";"Mobil";"49,58";"55,91";"1.290";"1.059,45";"außerh. d. Bez.pegels";"" +"168,500";"63,7";"Mobil";"49,51";"55,89";"1.290";"1.059,45";"außerh. d. Bez.pegels";"" +"168,600";"65,6";"Mobil";"49,33";"55,87";"1.290";"1.059,45";"außerh. d. Bez.pegels";"" +"168,700";"68,1";"Mobil";"49,10";"55,85";"1.290";"1.059,45";"außerh. d. Bez.pegels";"" +"168,800";"70,8";"Mobil";"48,85";"55,83";"1.290";"1.059,45";"außerh. d. Bez.pegels";"" +"168,900";"71,4";"Mobil";"48,79";"55,81";"1.290";"1.059,45";"außerh. d. Bez.pegels";"" +"169,000";"67,0";"Mobil";"49,16";"55,79";"1.290";"1.059,45";"außerh. d. Bez.pegels";"Hafen: Verkehrshafen Aken" +"169,100";"71,1";"Mobil";"48,80";"55,77";"1.290";"1.059,45";"außerh. d. Bez.pegels";"" +"169,200";"74,1";"Mobil";"48,52";"55,75";"1.290";"1.059,45";"außerh. d. Bez.pegels";"" +"169,300";"74,5";"Mobil";"48,47";"55,74";"1.290";"1.059,45";"außerh. d. Bez.pegels";"" +"169,400";"74,5";"Mobil";"48,46";"55,72";"1.290";"1.059,45";"außerh. d. Bez.pegels";"" +"169,500";"73,3";"Mobil";"48,54";"55,70";"1.290";"1.059,45";"außerh. d. Bez.pegels";"" +"169,600";"72,6";"Mobil";"48,57";"55,68";"1.290";"1.059,45";"außerh. d. Bez.pegels";"" +"169,700";"72,7";"Mobil";"48,55";"55,67";"1.290";"1.059,45";"außerh. d. Bez.pegels";"" +"169,800";"72,4";"Mobil";"48,57";"55,65";"1.290";"1.059,45";"außerh. d. Bez.pegels";"" +"169,900";"72,0";"Mobil";"48,59";"55,64";"1.290";"1.059,45";"außerh. d. Bez.pegels";"" +"170,000";"70,9";"Mobil";"48,68";"55,62";"1.290";"1.059,45";"außerh. d. Bez.pegels";"" +"170,100";"69,2";"Mobil";"48,84";"55,61";"1.290";"1.059,45";"außerh. d. Bez.pegels";"" +"170,200";"67,9";"Mobil";"48,95";"55,59";"1.290";"1.059,45";"außerh. d. Bez.pegels";"" +"170,300";"67,7";"Mobil";"48,95";"55,57";"1.290";"1.059,45";"außerh. d. Bez.pegels";"" +"170,400";"69,7";"Mobil";"48,75";"55,55";"1.290";"1.059,45";"außerh. d. Bez.pegels";"" +"170,500";"74,3";"Mobil";"48,31";"55,53";"1.290";"1.059,45";"außerh. d. Bez.pegels";"" +"170,600";"70,8";"Mobil";"48,60";"55,51";"1.290";"1.059,45";"außerh. d. Bez.pegels";"" +"170,700";"68,4";"Mobil";"48,80";"55,50";"1.290";"1.059,45";"außerh. d. Bez.pegels";"" +"170,800";"68,3";"Mobil";"48,79";"55,48";"1.290";"1.059,45";"außerh. d. Bez.pegels";"" +"170,900";"70,5";"Mobil";"48,56";"55,47";"1.290";"1.059,45";"außerh. d. Bez.pegels";"" +"171,000";"70,4";"Mobil";"48,53";"55,46";"1.288";"1.059,45";"außerh. d. Bez.pegels";"" +"171,100";"71,3";"Mobil";"48,44";"55,44";"1.288";"1.059,45";"außerh. d. Bez.pegels";"" +"171,200";"69,4";"Mobil";"48,60";"55,42";"1.288";"1.059,45";"außerh. d. Bez.pegels";"" +"171,300";"69,0";"Mobil";"48,63";"55,40";"1.288";"1.059,45";"außerh. d. Bez.pegels";"" +"171,400";"67,5";"Mobil";"48,74";"55,38";"1.288";"1.059,45";"außerh. d. Bez.pegels";"" +"171,500";"69,4";"Mobil";"48,56";"55,37";"1.288";"1.059,45";"außerh. d. Bez.pegels";"" +"171,600";"69,7";"Mobil";"48,51";"55,35";"1.288";"1.059,45";"außerh. d. Bez.pegels";"" +"171,700";"68,0";"Mobil";"48,63";"55,33";"1.288";"1.059,45";"außerh. d. Bez.pegels";"" +"171,800";"67,7";"Mobil";"48,62";"55,30";"1.288";"1.059,45";"außerh. d. Bez.pegels";"" +"171,900";"70,4";"Mobil";"48,38";"55,29";"1.288";"1.059,45";"außerh. d. Bez.pegels";"" +"172,000";"71,0";"Mobil";"48,33";"55,27";"1.288";"1.059,45";"außerh. d. Bez.pegels";"" +"172,100";"71,4";"Mobil";"48,27";"55,26";"1.288";"1.059,45";"außerh. d. Bez.pegels";"" +"172,200";"70,0";"Mobil";"48,37";"55,24";"1.288";"1.059,45";"außerh. d. Bez.pegels";"" +"172,300";"69,0";"Mobil";"48,43";"55,22";"1.288";"1.059,45";"außerh. d. Bez.pegels";"" +"172,400";"67,2";"Mobil";"48,56";"55,19";"1.288";"1.059,45";"außerh. d. Bez.pegels";"" +"172,500";"66,1";"Mobil";"48,61";"55,17";"1.288";"1.059,45";"außerh. d. Bez.pegels";"" +"172,600";"65,5";"Mobil";"48,62";"55,15";"1.288";"1.059,45";"außerh. d. Bez.pegels";"" +"172,700";"67,6";"Mobil";"48,44";"55,13";"1.288";"1.059,45";"außerh. d. Bez.pegels";"" +"172,800";"68,2";"Mobil";"48,38";"55,11";"1.288";"1.059,45";"außerh. d. Bez.pegels";"" +"172,900";"66,3";"Mobil";"48,47";"55,09";"1.288";"1.059,45";"außerh. d. Bez.pegels";"" +"173,000";"64,8";"Mobil";"48,52";"55,07";"1.288";"1.059,45";"außerh. d. Bez.pegels";"" +"173,100";"65,9";"Mobil";"48,45";"55,05";"1.288";"1.059,45";"außerh. d. Bez.pegels";"" +"173,200";"67,8";"Mobil";"48,30";"55,02";"1.288";"1.059,45";"außerh. d. Bez.pegels";"" +"173,300";"68,4";"Mobil";"48,26";"55,00";"1.288";"1.059,45";"außerh. d. Bez.pegels";"" +"173,400";"67,4";"Mobil";"48,36";"54,97";"1.288";"1.059,45";"außerh. d. Bez.pegels";"" +"173,500";"68,7";"Mobil";"48,23";"54,95";"1.288";"1.059,45";"außerh. d. Bez.pegels";"" +"173,600";"68,5";"Mobil";"48,24";"54,93";"1.288";"1.059,45";"außerh. d. Bez.pegels";"" +"173,700";"67,1";"Mobil";"48,29";"54,89";"1.288";"1.059,45";"außerh. d. Bez.pegels";"" +"173,800";"67,5";"Mobil";"48,20";"54,84";"1.288";"1.059,45";"außerh. d. Bez.pegels";"Geschiebemessstelle: Aken" +"173,900";"68,9";"Mobil";"48,08";"54,83";"1.288";"1.059,45";"außerh. d. Bez.pegels";"" +"174,000";"69,7";"Mobil";"48,00";"54,82";"1.288";"1.059,45";"außerh. d. Bez.pegels";"" +"174,100";"68,6";"Mobil";"48,09";"54,81";"1.288";"1.059,45";"außerh. d. Bez.pegels";"" +"174,200";"67,7";"Mobil";"48,16";"54,80";"1.288";"1.059,45";"außerh. d. Bez.pegels";"" +"174,300";"71,6";"Mobil";"47,80";"54,79";"1.288";"1.059,45";"außerh. d. Bez.pegels";"" +"174,400";"71,4";"Mobil";"47,80";"54,77";"1.288";"1.059,45";"außerh. d. Bez.pegels";"" +"174,500";"72,2";"Mobil";"47,68";"54,75";"1.288";"1.059,45";"außerh. d. Bez.pegels";"" +"174,600";"69,9";"Mobil";"47,83";"54,72";"1.288";"1.059,45";"außerh. d. Bez.pegels";"" +"174,700";"67,4";"Mobil";"48,06";"54,71";"1.288";"1.059,45";"außerh. d. Bez.pegels";"" +"174,800";"66,8";"Mobil";"48,11";"54,69";"1.288";"1.059,45";"außerh. d. Bez.pegels";"" +"174,900";"66,9";"Mobil";"48,07";"54,67";"1.288";"1.059,45";"außerh. d. Bez.pegels";"" +"175,000";"68,4";"Mobil";"47,90";"54,65";"1.288";"1.059,45";"außerh. d. Bez.pegels";"" +"175,100";"69,4";"Mobil";"47,80";"54,64";"1.288";"1.059,45";"außerh. d. Bez.pegels";"" +"175,200";"69,2";"Mobil";"47,81";"54,62";"1.288";"1.059,45";"außerh. d. Bez.pegels";"" +"175,300";"68,3";"Mobil";"47,86";"54,60";"1.288";"1.059,45";"außerh. d. Bez.pegels";"" +"175,400";"69,3";"Mobil";"47,73";"54,57";"1.288";"1.059,45";"außerh. d. Bez.pegels";"" +"175,500";"70,9";"Mobil";"47,58";"54,56";"1.288";"1.059,45";"außerh. d. Bez.pegels";"" +"175,600";"75,0";"Mobil";"47,20";"54,55";"1.288";"1.059,45";"außerh. d. Bez.pegels";"" +"175,700";"71,5";"Mobil";"47,47";"54,53";"1.288";"1.059,45";"außerh. d. Bez.pegels";"" +"175,800";"70,3";"Mobil";"47,54";"54,51";"1.288";"1.059,45";"außerh. d. Bez.pegels";"" +"175,900";"70,6";"Mobil";"47,52";"54,50";"1.288";"1.059,45";"außerh. d. Bez.pegels";"" +"176,000";"68,7";"Mobil";"47,69";"54,48";"1.288";"1.059,45";"außerh. d. Bez.pegels";"" +"176,100";"68,3";"Mobil";"47,69";"54,46";"1.288";"1.059,45";"außerh. d. Bez.pegels";"" +"176,200";"68,8";"Mobil";"47,61";"54,43";"1.288";"1.059,45";"außerh. d. Bez.pegels";"" +"176,300";"70,3";"Mobil";"47,46";"54,42";"1.288";"1.059,45";"außerh. d. Bez.pegels";"" +"176,400";"70,4";"Mobil";"47,44";"54,40";"1.288";"1.059,45";"außerh. d. Bez.pegels";"" +"176,500";"68,4";"Mobil";"47,58";"54,38";"1.288";"1.059,45";"außerh. d. Bez.pegels";"" +"176,600";"67,9";"Mobil";"47,59";"54,35";"1.288";"1.059,45";"außerh. d. Bez.pegels";"" +"176,700";"66,8";"Mobil";"47,65";"54,34";"1.288";"1.059,45";"außerh. d. Bez.pegels";"" +"176,800";"66,1";"Mobil";"47,66";"54,32";"1.288";"1.059,45";"außerh. d. Bez.pegels";"" +"176,900";"65,5";"Mobil";"47,67";"54,30";"1.288";"1.059,45";"außerh. d. Bez.pegels";"" +"177,000";"70,8";"Mobil";"47,14";"54,27";"1.288";"1.059,45";"außerh. d. Bez.pegels";"" +"177,100";"69,7";"Mobil";"47,24";"54,26";"1.288";"1.059,45";"außerh. d. Bez.pegels";"" +"177,200";"68,2";"Mobil";"47,36";"54,24";"1.288";"1.059,45";"außerh. d. Bez.pegels";"" +"177,300";"67,8";"Mobil";"47,39";"54,22";"1.288";"1.059,45";"außerh. d. Bez.pegels";"" +"177,400";"71,5";"Mobil";"47,04";"54,19";"1.288";"1.059,45";"außerh. d. Bez.pegels";"" +"177,500";"76,7";"Mobil";"46,57";"54,16";"1.288";"1.059,45";"außerh. d. Bez.pegels";"" +"177,600";"76,0";"Mobil";"46,61";"54,13";"1.288";"1.059,45";"außerh. d. Bez.pegels";"" +"177,700";"73,8";"Mobil";"46,75";"54,10";"1.288";"1.059,45";"außerh. d. Bez.pegels";"" +"177,800";"69,6";"Mobil";"47,07";"54,06";"1.288";"1.059,45";"außerh. d. Bez.pegels";"" +"177,900";"67,3";"Mobil";"47,25";"54,04";"1.288";"1.059,45";"außerh. d. Bez.pegels";"" +"178,000";"66,4";"Mobil";"47,32";"54,02";"1.288";"1.059,45";"außerh. d. Bez.pegels";"" +"178,100";"66,7";"Mobil";"47,31";"54,01";"1.288";"1.059,45";"außerh. d. Bez.pegels";"" +"178,200";"65,8";"Mobil";"47,40";"53,99";"1.288";"1.059,45";"außerh. d. Bez.pegels";"" +"178,300";"66,9";"Mobil";"47,24";"53,97";"1.288";"1.059,45";"außerh. d. Bez.pegels";"" +"178,400";"66,3";"Mobil";"47,21";"53,95";"1.288";"1.059,45";"außerh. d. Bez.pegels";"" +"178,500";"64,8";"Mobil";"47,33";"53,93";"1.288";"1.059,45";"außerh. d. Bez.pegels";"" +"178,600";"65,4";"Mobil";"47,26";"53,91";"1.288";"1.059,45";"außerh. d. Bez.pegels";"" +"178,700";"68,1";"Mobil";"47,03";"53,89";"1.288";"1.059,45";"außerh. d. Bez.pegels";"" +"178,800";"69,8";"Mobil";"46,88";"53,87";"1.288";"1.059,45";"außerh. d. Bez.pegels";"Fähre: Breitenhagen -Gierseilfähre" +"178,900";"70,8";"Mobil";"46,75";"53,86";"1.288";"1.059,45";"außerh. d. Bez.pegels";"" +"179,000";"71,5";"Mobil";"46,66";"53,84";"1.288";"1.059,45";"außerh. d. Bez.pegels";"" +"179,100";"68,9";"Mobil";"46,86";"53,80";"1.288";"1.059,45";"außerh. d. Bez.pegels";"" +"179,200";"68,1";"Mobil";"46,89";"53,76";"1.288";"1.059,45";"außerh. d. Bez.pegels";"" +"179,300";"66,2";"Mobil";"47,06";"53,74";"1.288";"1.059,45";"außerh. d. Bez.pegels";"" +"179,400";"67,0";"Mobil";"46,99";"53,72";"1.288";"1.059,45";"außerh. d. Bez.pegels";"" +"179,500";"68,0";"Mobil";"46,88";"53,71";"1.288";"1.059,45";"außerh. d. Bez.pegels";"" +"179,600";"67,3";"Mobil";"46,92";"53,69";"1.286";"1.059,45";"außerh. d. Bez.pegels";"" +"179,700";"68,3";"Mobil";"46,82";"53,67";"1.286";"1.059,45";"außerh. d. Bez.pegels";"" +"179,800";"67,0";"Mobil";"46,91";"53,64";"1.286";"1.059,45";"außerh. d. Bez.pegels";"" +"179,900";"66,9";"Mobil";"46,89";"53,63";"1.286";"1.059,45";"außerh. d. Bez.pegels";"" +"180,000";"66,8";"Mobil";"46,87";"53,61";"1.286";"1.059,45";"außerh. d. Bez.pegels";"" +"180,100";"67,8";"Mobil";"46,75";"53,59";"1.286";"1.059,45";"außerh. d. Bez.pegels";"" +"180,200";"67,0";"Mobil";"46,79";"53,57";"1.286";"1.059,45";"außerh. d. Bez.pegels";"" +"180,300";"66,6";"Mobil";"46,80";"53,55";"1.286";"1.059,45";"außerh. d. Bez.pegels";"" +"180,400";"67,9";"Mobil";"46,67";"53,52";"1.286";"1.059,45";"außerh. d. Bez.pegels";"" +"180,500";"68,5";"Mobil";"46,59";"53,50";"1.286";"1.059,45";"außerh. d. Bez.pegels";"" +"180,600";"69,1";"Mobil";"46,52";"53,48";"1.286";"1.059,45";"außerh. d. Bez.pegels";"" +"180,700";"69,4";"Mobil";"46,48";"53,46";"1.286";"1.059,45";"außerh. d. Bez.pegels";"" +"180,800";"69,4";"Mobil";"46,47";"53,43";"1.286";"1.059,45";"außerh. d. Bez.pegels";"" +"180,900";"69,3";"Mobil";"46,46";"53,41";"1.286";"1.059,45";"außerh. d. Bez.pegels";"" +"181,000";"68,6";"Mobil";"46,51";"53,39";"1.286";"1.059,45";"außerh. d. Bez.pegels";"" +"181,100";"68,0";"Mobil";"46,54";"53,37";"1.286";"1.059,45";"außerh. d. Bez.pegels";"" +"181,200";"68,1";"Mobil";"46,50";"53,35";"1.286";"1.059,45";"außerh. d. Bez.pegels";"" +"181,300";"67,6";"Mobil";"46,55";"53,33";"1.286";"1.059,45";"außerh. d. Bez.pegels";"" +"181,400";"68,4";"Mobil";"46,46";"53,30";"1.286";"1.059,45";"außerh. d. Bez.pegels";"" +"181,500";"67,0";"Mobil";"46,56";"53,29";"1.286";"1.059,45";"außerh. d. Bez.pegels";"" +"181,600";"66,2";"Mobil";"46,59";"53,27";"1.286";"1.059,45";"außerh. d. Bez.pegels";"" +"181,800";"68,0";"Mobil";"46,43";"53,22";"1.286";"1.059,45";"außerh. d. Bez.pegels";"" +"181,900";"68,8";"Mobil";"46,34";"53,21";"1.286";"1.059,45";"außerh. d. Bez.pegels";"" +"182,000";"69,9";"Mobil";"46,22";"53,19";"1.286";"1.059,45";"außerh. d. Bez.pegels";"" +"182,100";"69,2";"Mobil";"46,27";"53,18";"1.286";"1.059,45";"außerh. d. Bez.pegels";"" +"182,200";"70,2";"Starr";"46,29";"53,16";"1.286";"1.059,45";"außerh. d. Bez.pegels";"" +""