annotate artifacts/src/main/java/org/dive4elements/river/exports/ATWriter.java @ 7605:f51c943c707a

(issue1560) Fix off by one error in ATWriter causing the last value to be omitted.
author Andre Heinecke <aheinecke@intevation.de>
date Wed, 27 Nov 2013 17:17:54 +0100
parents 3ac657d60e60
children e4606eae8ea5
rev   line source
5863
4897a58c8746 River artifacts: Added new copyright headers.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 5838
diff changeset
1 /* Copyright (C) 2011, 2012, 2013 by Bundesanstalt für Gewässerkunde
4897a58c8746 River artifacts: Added new copyright headers.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 5838
diff changeset
2 * Software engineering by Intevation GmbH
4897a58c8746 River artifacts: Added new copyright headers.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 5838
diff changeset
3 *
5994
af13ceeba52a Removed trailing whitespace.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 5863
diff changeset
4 * This file is Free Software under the GNU AGPL (>=v3)
5863
4897a58c8746 River artifacts: Added new copyright headers.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 5838
diff changeset
5 * and comes with ABSOLUTELY NO WARRANTY! Check out the
5994
af13ceeba52a Removed trailing whitespace.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 5863
diff changeset
6 * documentation coming with Dive4Elements River for details.
5863
4897a58c8746 River artifacts: Added new copyright headers.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 5838
diff changeset
7 */
4897a58c8746 River artifacts: Added new copyright headers.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 5838
diff changeset
8
5831
bd047b71ab37 Repaired internal references
Sascha L. Teichmann <teichmann@intevation.de>
parents: 5107
diff changeset
9 package org.dive4elements.river.exports;
729
078934923acb New AT writer for results.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
10
078934923acb New AT writer for results.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
11 import java.io.IOException;
078934923acb New AT writer for results.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
12 import java.io.Writer;
078934923acb New AT writer for results.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
13 import java.io.PrintWriter;
4938
b878dce3a671 Write some more metadata in AT-export header.
Raimund Renkert <rrenkert@intevation.de>
parents: 4911
diff changeset
14 import java.math.BigDecimal;
729
078934923acb New AT writer for results.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
15
4938
b878dce3a671 Write some more metadata in AT-export header.
Raimund Renkert <rrenkert@intevation.de>
parents: 4911
diff changeset
16 import java.text.DateFormat;
b878dce3a671 Write some more metadata in AT-export header.
Raimund Renkert <rrenkert@intevation.de>
parents: 4911
diff changeset
17 import java.util.Date;
729
078934923acb New AT writer for results.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
18 import java.util.Locale;
078934923acb New AT writer for results.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
19
5831
bd047b71ab37 Repaired internal references
Sascha L. Teichmann <teichmann@intevation.de>
parents: 5107
diff changeset
20 import org.dive4elements.artifacts.CallMeta;
1658
7d11ad5a52d5 Bugfix: #332 Made AT-exports compatible with desktop FLYS.
Ingo Weinzierl <ingo.weinzierl@intevation.de>
parents: 1033
diff changeset
21
5831
bd047b71ab37 Repaired internal references
Sascha L. Teichmann <teichmann@intevation.de>
parents: 5107
diff changeset
22 import org.dive4elements.river.artifacts.model.WQ;
bd047b71ab37 Repaired internal references
Sascha L. Teichmann <teichmann@intevation.de>
parents: 5107
diff changeset
23 import org.dive4elements.river.artifacts.resources.Resources;
729
078934923acb New AT writer for results.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
24
732
39d191f011dc ATWriter: Results are now in cm. Made it more robust against corner cases.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 729
diff changeset
25 import org.apache.commons.math.analysis.UnivariateRealFunction;
729
078934923acb New AT writer for results.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
26
732
39d191f011dc ATWriter: Results are now in cm. Made it more robust against corner cases.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 729
diff changeset
27 import org.apache.commons.math.analysis.interpolation.SplineInterpolator;
39d191f011dc ATWriter: Results are now in cm. Made it more robust against corner cases.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 729
diff changeset
28 import org.apache.commons.math.analysis.interpolation.LinearInterpolator;
729
078934923acb New AT writer for results.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
29
732
39d191f011dc ATWriter: Results are now in cm. Made it more robust against corner cases.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 729
diff changeset
30 import org.apache.commons.math.analysis.polynomials.PolynomialFunction;
39d191f011dc ATWriter: Results are now in cm. Made it more robust against corner cases.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 729
diff changeset
31
39d191f011dc ATWriter: Results are now in cm. Made it more robust against corner cases.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 729
diff changeset
32 import org.apache.commons.math.FunctionEvaluationException;
729
078934923acb New AT writer for results.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
33
078934923acb New AT writer for results.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
34 import org.apache.log4j.Logger;
078934923acb New AT writer for results.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
35
5107
a929d9a9fa1e Picky doc and whitespace fixes.
Felix Wolfsteller <felix.wolfsteller@intevation.de>
parents: 4947
diff changeset
36 /** Write AT files. */
729
078934923acb New AT writer for results.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
37 public class ATWriter
078934923acb New AT writer for results.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
38 {
078934923acb New AT writer for results.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
39 private static Logger logger = Logger.getLogger(ATWriter.class);
078934923acb New AT writer for results.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
40
078934923acb New AT writer for results.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
41 public static final int COLUMNS = 10;
078934923acb New AT writer for results.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
42
1658
7d11ad5a52d5 Bugfix: #332 Made AT-exports compatible with desktop FLYS.
Ingo Weinzierl <ingo.weinzierl@intevation.de>
parents: 1033
diff changeset
43 public static final String I18N_AT_HEADER =
7d11ad5a52d5 Bugfix: #332 Made AT-exports compatible with desktop FLYS.
Ingo Weinzierl <ingo.weinzierl@intevation.de>
parents: 1033
diff changeset
44 "export.discharge.curve.at.header";
7d11ad5a52d5 Bugfix: #332 Made AT-exports compatible with desktop FLYS.
Ingo Weinzierl <ingo.weinzierl@intevation.de>
parents: 1033
diff changeset
45
4941
65059ad920c6 Use different header in AT export files for gauges and at km.
Raimund Renkert <rrenkert@intevation.de>
parents: 4938
diff changeset
46 public static final String I18N_AT_GAUGE_HEADER =
65059ad920c6 Use different header in AT export files for gauges and at km.
Raimund Renkert <rrenkert@intevation.de>
parents: 4938
diff changeset
47 "export.discharge.curve.at.gauge.header";
65059ad920c6 Use different header in AT export files for gauges and at km.
Raimund Renkert <rrenkert@intevation.de>
parents: 4938
diff changeset
48
6304
152e1ba8e5bd Rework ATWriter/Exporter
Andre Heinecke <aheinecke@intevation.de>
parents: 6234
diff changeset
49 public static final String I18N_AT_CALC_GAUGE_HEADER =
152e1ba8e5bd Rework ATWriter/Exporter
Andre Heinecke <aheinecke@intevation.de>
parents: 6234
diff changeset
50 "export.discharge.curve.at.gauge.calc.header";
152e1ba8e5bd Rework ATWriter/Exporter
Andre Heinecke <aheinecke@intevation.de>
parents: 6234
diff changeset
51
732
39d191f011dc ATWriter: Results are now in cm. Made it more robust against corner cases.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 729
diff changeset
52 public static final String EMPTY = " ";
729
078934923acb New AT writer for results.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
53
6304
152e1ba8e5bd Rework ATWriter/Exporter
Andre Heinecke <aheinecke@intevation.de>
parents: 6234
diff changeset
54 public static double getQ(int w, UnivariateRealFunction qFunc) {
152e1ba8e5bd Rework ATWriter/Exporter
Andre Heinecke <aheinecke@intevation.de>
parents: 6234
diff changeset
55 try {
152e1ba8e5bd Rework ATWriter/Exporter
Andre Heinecke <aheinecke@intevation.de>
parents: 6234
diff changeset
56 double val = qFunc.value(w);
152e1ba8e5bd Rework ATWriter/Exporter
Andre Heinecke <aheinecke@intevation.de>
parents: 6234
diff changeset
57 return val;
152e1ba8e5bd Rework ATWriter/Exporter
Andre Heinecke <aheinecke@intevation.de>
parents: 6234
diff changeset
58 }
152e1ba8e5bd Rework ATWriter/Exporter
Andre Heinecke <aheinecke@intevation.de>
parents: 6234
diff changeset
59 catch (FunctionEvaluationException aode) {
152e1ba8e5bd Rework ATWriter/Exporter
Andre Heinecke <aheinecke@intevation.de>
parents: 6234
diff changeset
60 // should not happen
152e1ba8e5bd Rework ATWriter/Exporter
Andre Heinecke <aheinecke@intevation.de>
parents: 6234
diff changeset
61 logger.error("spline interpolation failed", aode);
152e1ba8e5bd Rework ATWriter/Exporter
Andre Heinecke <aheinecke@intevation.de>
parents: 6234
diff changeset
62 return Double.NaN;
152e1ba8e5bd Rework ATWriter/Exporter
Andre Heinecke <aheinecke@intevation.de>
parents: 6234
diff changeset
63 }
729
078934923acb New AT writer for results.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
64 }
078934923acb New AT writer for results.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
65
6304
152e1ba8e5bd Rework ATWriter/Exporter
Andre Heinecke <aheinecke@intevation.de>
parents: 6234
diff changeset
66 public static void printQ(PrintWriter out, double q) {
152e1ba8e5bd Rework ATWriter/Exporter
Andre Heinecke <aheinecke@intevation.de>
parents: 6234
diff changeset
67 String format;
152e1ba8e5bd Rework ATWriter/Exporter
Andre Heinecke <aheinecke@intevation.de>
parents: 6234
diff changeset
68 if (q < 1d) format = " % 8.3f";
152e1ba8e5bd Rework ATWriter/Exporter
Andre Heinecke <aheinecke@intevation.de>
parents: 6234
diff changeset
69 else if (q < 10d) format = " % 8.2f";
152e1ba8e5bd Rework ATWriter/Exporter
Andre Heinecke <aheinecke@intevation.de>
parents: 6234
diff changeset
70 else if (q < 100d) format = " % 8.1f";
152e1ba8e5bd Rework ATWriter/Exporter
Andre Heinecke <aheinecke@intevation.de>
parents: 6234
diff changeset
71 else {
152e1ba8e5bd Rework ATWriter/Exporter
Andre Heinecke <aheinecke@intevation.de>
parents: 6234
diff changeset
72 format = " % 8.0f";
152e1ba8e5bd Rework ATWriter/Exporter
Andre Heinecke <aheinecke@intevation.de>
parents: 6234
diff changeset
73 if (q > 1000d) q = Math.rint(q/10d)*10d;
152e1ba8e5bd Rework ATWriter/Exporter
Andre Heinecke <aheinecke@intevation.de>
parents: 6234
diff changeset
74 }
152e1ba8e5bd Rework ATWriter/Exporter
Andre Heinecke <aheinecke@intevation.de>
parents: 6234
diff changeset
75 out.printf(Locale.US, format, q);
152e1ba8e5bd Rework ATWriter/Exporter
Andre Heinecke <aheinecke@intevation.de>
parents: 6234
diff changeset
76 }
152e1ba8e5bd Rework ATWriter/Exporter
Andre Heinecke <aheinecke@intevation.de>
parents: 6234
diff changeset
77
152e1ba8e5bd Rework ATWriter/Exporter
Andre Heinecke <aheinecke@intevation.de>
parents: 6234
diff changeset
78 protected static void printCalculatedGaugeHeader(
152e1ba8e5bd Rework ATWriter/Exporter
Andre Heinecke <aheinecke@intevation.de>
parents: 6234
diff changeset
79 PrintWriter out,
152e1ba8e5bd Rework ATWriter/Exporter
Andre Heinecke <aheinecke@intevation.de>
parents: 6234
diff changeset
80 CallMeta callMeta,
152e1ba8e5bd Rework ATWriter/Exporter
Andre Heinecke <aheinecke@intevation.de>
parents: 6234
diff changeset
81 String river,
152e1ba8e5bd Rework ATWriter/Exporter
Andre Heinecke <aheinecke@intevation.de>
parents: 6234
diff changeset
82 double km,
152e1ba8e5bd Rework ATWriter/Exporter
Andre Heinecke <aheinecke@intevation.de>
parents: 6234
diff changeset
83 String gName,
152e1ba8e5bd Rework ATWriter/Exporter
Andre Heinecke <aheinecke@intevation.de>
parents: 6234
diff changeset
84 BigDecimal datum,
152e1ba8e5bd Rework ATWriter/Exporter
Andre Heinecke <aheinecke@intevation.de>
parents: 6234
diff changeset
85 Date date,
152e1ba8e5bd Rework ATWriter/Exporter
Andre Heinecke <aheinecke@intevation.de>
parents: 6234
diff changeset
86 String unit
152e1ba8e5bd Rework ATWriter/Exporter
Andre Heinecke <aheinecke@intevation.de>
parents: 6234
diff changeset
87 ) {
152e1ba8e5bd Rework ATWriter/Exporter
Andre Heinecke <aheinecke@intevation.de>
parents: 6234
diff changeset
88 out.print("*" + Resources.getMsg(
152e1ba8e5bd Rework ATWriter/Exporter
Andre Heinecke <aheinecke@intevation.de>
parents: 6234
diff changeset
89 callMeta,
152e1ba8e5bd Rework ATWriter/Exporter
Andre Heinecke <aheinecke@intevation.de>
parents: 6234
diff changeset
90 I18N_AT_CALC_GAUGE_HEADER,
152e1ba8e5bd Rework ATWriter/Exporter
Andre Heinecke <aheinecke@intevation.de>
parents: 6234
diff changeset
91 I18N_AT_CALC_GAUGE_HEADER,
152e1ba8e5bd Rework ATWriter/Exporter
Andre Heinecke <aheinecke@intevation.de>
parents: 6234
diff changeset
92 new Object[] { river, gName, datum, unit } ));
152e1ba8e5bd Rework ATWriter/Exporter
Andre Heinecke <aheinecke@intevation.de>
parents: 6234
diff changeset
93 out.print("\r\n");
152e1ba8e5bd Rework ATWriter/Exporter
Andre Heinecke <aheinecke@intevation.de>
parents: 6234
diff changeset
94 }
152e1ba8e5bd Rework ATWriter/Exporter
Andre Heinecke <aheinecke@intevation.de>
parents: 6234
diff changeset
95
152e1ba8e5bd Rework ATWriter/Exporter
Andre Heinecke <aheinecke@intevation.de>
parents: 6234
diff changeset
96 protected static void printGaugeHeader(
152e1ba8e5bd Rework ATWriter/Exporter
Andre Heinecke <aheinecke@intevation.de>
parents: 6234
diff changeset
97 PrintWriter out,
152e1ba8e5bd Rework ATWriter/Exporter
Andre Heinecke <aheinecke@intevation.de>
parents: 6234
diff changeset
98 CallMeta callMeta,
152e1ba8e5bd Rework ATWriter/Exporter
Andre Heinecke <aheinecke@intevation.de>
parents: 6234
diff changeset
99 String river,
152e1ba8e5bd Rework ATWriter/Exporter
Andre Heinecke <aheinecke@intevation.de>
parents: 6234
diff changeset
100 double km,
152e1ba8e5bd Rework ATWriter/Exporter
Andre Heinecke <aheinecke@intevation.de>
parents: 6234
diff changeset
101 String gName,
152e1ba8e5bd Rework ATWriter/Exporter
Andre Heinecke <aheinecke@intevation.de>
parents: 6234
diff changeset
102 BigDecimal datum,
152e1ba8e5bd Rework ATWriter/Exporter
Andre Heinecke <aheinecke@intevation.de>
parents: 6234
diff changeset
103 Date date,
152e1ba8e5bd Rework ATWriter/Exporter
Andre Heinecke <aheinecke@intevation.de>
parents: 6234
diff changeset
104 String unit
152e1ba8e5bd Rework ATWriter/Exporter
Andre Heinecke <aheinecke@intevation.de>
parents: 6234
diff changeset
105 ) {
152e1ba8e5bd Rework ATWriter/Exporter
Andre Heinecke <aheinecke@intevation.de>
parents: 6234
diff changeset
106 DateFormat f = DateFormat.getDateInstance(DateFormat.MEDIUM,
152e1ba8e5bd Rework ATWriter/Exporter
Andre Heinecke <aheinecke@intevation.de>
parents: 6234
diff changeset
107 Resources.getLocale(callMeta));
152e1ba8e5bd Rework ATWriter/Exporter
Andre Heinecke <aheinecke@intevation.de>
parents: 6234
diff changeset
108 out.print("*" + Resources.getMsg(
152e1ba8e5bd Rework ATWriter/Exporter
Andre Heinecke <aheinecke@intevation.de>
parents: 6234
diff changeset
109 callMeta,
152e1ba8e5bd Rework ATWriter/Exporter
Andre Heinecke <aheinecke@intevation.de>
parents: 6234
diff changeset
110 I18N_AT_GAUGE_HEADER,
152e1ba8e5bd Rework ATWriter/Exporter
Andre Heinecke <aheinecke@intevation.de>
parents: 6234
diff changeset
111 I18N_AT_GAUGE_HEADER,
152e1ba8e5bd Rework ATWriter/Exporter
Andre Heinecke <aheinecke@intevation.de>
parents: 6234
diff changeset
112 new Object[] { river, gName, f.format(date), datum, unit} ));
152e1ba8e5bd Rework ATWriter/Exporter
Andre Heinecke <aheinecke@intevation.de>
parents: 6234
diff changeset
113 out.print("\r\n");
152e1ba8e5bd Rework ATWriter/Exporter
Andre Heinecke <aheinecke@intevation.de>
parents: 6234
diff changeset
114 }
152e1ba8e5bd Rework ATWriter/Exporter
Andre Heinecke <aheinecke@intevation.de>
parents: 6234
diff changeset
115
152e1ba8e5bd Rework ATWriter/Exporter
Andre Heinecke <aheinecke@intevation.de>
parents: 6234
diff changeset
116 protected static void printHeader(
152e1ba8e5bd Rework ATWriter/Exporter
Andre Heinecke <aheinecke@intevation.de>
parents: 6234
diff changeset
117 PrintWriter out,
152e1ba8e5bd Rework ATWriter/Exporter
Andre Heinecke <aheinecke@intevation.de>
parents: 6234
diff changeset
118 CallMeta callMeta,
152e1ba8e5bd Rework ATWriter/Exporter
Andre Heinecke <aheinecke@intevation.de>
parents: 6234
diff changeset
119 String river,
152e1ba8e5bd Rework ATWriter/Exporter
Andre Heinecke <aheinecke@intevation.de>
parents: 6234
diff changeset
120 double km
152e1ba8e5bd Rework ATWriter/Exporter
Andre Heinecke <aheinecke@intevation.de>
parents: 6234
diff changeset
121 ) {
152e1ba8e5bd Rework ATWriter/Exporter
Andre Heinecke <aheinecke@intevation.de>
parents: 6234
diff changeset
122 out.print("*" + Resources.getMsg(
152e1ba8e5bd Rework ATWriter/Exporter
Andre Heinecke <aheinecke@intevation.de>
parents: 6234
diff changeset
123 callMeta,
152e1ba8e5bd Rework ATWriter/Exporter
Andre Heinecke <aheinecke@intevation.de>
parents: 6234
diff changeset
124 I18N_AT_HEADER,
152e1ba8e5bd Rework ATWriter/Exporter
Andre Heinecke <aheinecke@intevation.de>
parents: 6234
diff changeset
125 I18N_AT_HEADER,
152e1ba8e5bd Rework ATWriter/Exporter
Andre Heinecke <aheinecke@intevation.de>
parents: 6234
diff changeset
126 new Object[] { river, km } ));
152e1ba8e5bd Rework ATWriter/Exporter
Andre Heinecke <aheinecke@intevation.de>
parents: 6234
diff changeset
127 out.print("\r\n");
152e1ba8e5bd Rework ATWriter/Exporter
Andre Heinecke <aheinecke@intevation.de>
parents: 6234
diff changeset
128 }
152e1ba8e5bd Rework ATWriter/Exporter
Andre Heinecke <aheinecke@intevation.de>
parents: 6234
diff changeset
129
152e1ba8e5bd Rework ATWriter/Exporter
Andre Heinecke <aheinecke@intevation.de>
parents: 6234
diff changeset
130 public static void write(
152e1ba8e5bd Rework ATWriter/Exporter
Andre Heinecke <aheinecke@intevation.de>
parents: 6234
diff changeset
131 WQ values,
152e1ba8e5bd Rework ATWriter/Exporter
Andre Heinecke <aheinecke@intevation.de>
parents: 6234
diff changeset
132 Writer writer,
152e1ba8e5bd Rework ATWriter/Exporter
Andre Heinecke <aheinecke@intevation.de>
parents: 6234
diff changeset
133 CallMeta meta,
152e1ba8e5bd Rework ATWriter/Exporter
Andre Heinecke <aheinecke@intevation.de>
parents: 6234
diff changeset
134 String river,
152e1ba8e5bd Rework ATWriter/Exporter
Andre Heinecke <aheinecke@intevation.de>
parents: 6234
diff changeset
135 double km,
152e1ba8e5bd Rework ATWriter/Exporter
Andre Heinecke <aheinecke@intevation.de>
parents: 6234
diff changeset
136 String gName,
152e1ba8e5bd Rework ATWriter/Exporter
Andre Heinecke <aheinecke@intevation.de>
parents: 6234
diff changeset
137 BigDecimal datum,
152e1ba8e5bd Rework ATWriter/Exporter
Andre Heinecke <aheinecke@intevation.de>
parents: 6234
diff changeset
138 Date date,
152e1ba8e5bd Rework ATWriter/Exporter
Andre Heinecke <aheinecke@intevation.de>
parents: 6234
diff changeset
139 String unit)
152e1ba8e5bd Rework ATWriter/Exporter
Andre Heinecke <aheinecke@intevation.de>
parents: 6234
diff changeset
140 throws IOException
152e1ba8e5bd Rework ATWriter/Exporter
Andre Heinecke <aheinecke@intevation.de>
parents: 6234
diff changeset
141 {
152e1ba8e5bd Rework ATWriter/Exporter
Andre Heinecke <aheinecke@intevation.de>
parents: 6234
diff changeset
142 int minW;
152e1ba8e5bd Rework ATWriter/Exporter
Andre Heinecke <aheinecke@intevation.de>
parents: 6234
diff changeset
143 int maxW;
152e1ba8e5bd Rework ATWriter/Exporter
Andre Heinecke <aheinecke@intevation.de>
parents: 6234
diff changeset
144 double minQ;
152e1ba8e5bd Rework ATWriter/Exporter
Andre Heinecke <aheinecke@intevation.de>
parents: 6234
diff changeset
145 double maxQ;
152e1ba8e5bd Rework ATWriter/Exporter
Andre Heinecke <aheinecke@intevation.de>
parents: 6234
diff changeset
146
152e1ba8e5bd Rework ATWriter/Exporter
Andre Heinecke <aheinecke@intevation.de>
parents: 6234
diff changeset
147 UnivariateRealFunction qFunc;
152e1ba8e5bd Rework ATWriter/Exporter
Andre Heinecke <aheinecke@intevation.de>
parents: 6234
diff changeset
148
152e1ba8e5bd Rework ATWriter/Exporter
Andre Heinecke <aheinecke@intevation.de>
parents: 6234
diff changeset
149 WQ wq = WQ.getFixedWQforExportAtGauge(values, datum);
152e1ba8e5bd Rework ATWriter/Exporter
Andre Heinecke <aheinecke@intevation.de>
parents: 6234
diff changeset
150
152e1ba8e5bd Rework ATWriter/Exporter
Andre Heinecke <aheinecke@intevation.de>
parents: 6234
diff changeset
151 // If we converted to centimeter we know that the WQ table is
152e1ba8e5bd Rework ATWriter/Exporter
Andre Heinecke <aheinecke@intevation.de>
parents: 6234
diff changeset
152 // calculated because of the assumption that all calculations
152e1ba8e5bd Rework ATWriter/Exporter
Andre Heinecke <aheinecke@intevation.de>
parents: 6234
diff changeset
153 // are in Meter and only the discharge tables data is in meter.
152e1ba8e5bd Rework ATWriter/Exporter
Andre Heinecke <aheinecke@intevation.de>
parents: 6234
diff changeset
154 boolean isCalculation = wq.getReferenceSystem() != values.getReferenceSystem();
729
078934923acb New AT writer for results.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
155
1033
821aaceb2776 Fix for flys/issue191
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 747
diff changeset
156 int [] bounds = wq.longestIncreasingWRangeIndices();
729
078934923acb New AT writer for results.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
157
1033
821aaceb2776 Fix for flys/issue191
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 747
diff changeset
158 if (logger.isDebugEnabled()) {
6304
152e1ba8e5bd Rework ATWriter/Exporter
Andre Heinecke <aheinecke@intevation.de>
parents: 6234
diff changeset
159 logger.debug("exporting " + (isCalculation ? "calculated " : "") +
152e1ba8e5bd Rework ATWriter/Exporter
Andre Heinecke <aheinecke@intevation.de>
parents: 6234
diff changeset
160 "w between indices " + bounds[0] + " and " + bounds[1] + " (" +
152e1ba8e5bd Rework ATWriter/Exporter
Andre Heinecke <aheinecke@intevation.de>
parents: 6234
diff changeset
161 (int)Math.ceil(wq.getW(bounds[0])) + ", " +
152e1ba8e5bd Rework ATWriter/Exporter
Andre Heinecke <aheinecke@intevation.de>
parents: 6234
diff changeset
162 (int)Math.floor(wq.getW(bounds[1]))+ ")");
1033
821aaceb2776 Fix for flys/issue191
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 747
diff changeset
163 }
821aaceb2776 Fix for flys/issue191
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 747
diff changeset
164
821aaceb2776 Fix for flys/issue191
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 747
diff changeset
165 if (bounds[1]-bounds[0] < 1) { // Only first w can be written out.
6304
152e1ba8e5bd Rework ATWriter/Exporter
Andre Heinecke <aheinecke@intevation.de>
parents: 6234
diff changeset
166 minW = maxW = (int)Math.round(wq.getW(bounds[0]));
1033
821aaceb2776 Fix for flys/issue191
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 747
diff changeset
167 minQ = maxQ = wq.getQ(bounds[0]);
732
39d191f011dc ATWriter: Results are now in cm. Made it more robust against corner cases.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 729
diff changeset
168 // constant function
39d191f011dc ATWriter: Results are now in cm. Made it more robust against corner cases.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 729
diff changeset
169 qFunc = new PolynomialFunction(new double [] { minQ });
729
078934923acb New AT writer for results.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
170 return;
078934923acb New AT writer for results.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
171 }
078934923acb New AT writer for results.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
172
7605
f51c943c707a (issue1560) Fix off by one error in ATWriter causing the last value to be omitted.
Andre Heinecke <aheinecke@intevation.de>
parents: 6310
diff changeset
173 /* example: bounds[0] = 0
f51c943c707a (issue1560) Fix off by one error in ATWriter causing the last value to be omitted.
Andre Heinecke <aheinecke@intevation.de>
parents: 6310
diff changeset
174 * bounds[1] = 5 -> we need to store 6 values.*/
f51c943c707a (issue1560) Fix off by one error in ATWriter causing the last value to be omitted.
Andre Heinecke <aheinecke@intevation.de>
parents: 6310
diff changeset
175
f51c943c707a (issue1560) Fix off by one error in ATWriter causing the last value to be omitted.
Andre Heinecke <aheinecke@intevation.de>
parents: 6310
diff changeset
176 double [] ws = new double[bounds[1]-bounds[0] + 1];
729
078934923acb New AT writer for results.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
177 double [] qs = new double[ws.length];
078934923acb New AT writer for results.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
178
7605
f51c943c707a (issue1560) Fix off by one error in ATWriter causing the last value to be omitted.
Andre Heinecke <aheinecke@intevation.de>
parents: 6310
diff changeset
179 for (int i = 0; i < ws.length; i++) {
1033
821aaceb2776 Fix for flys/issue191
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 747
diff changeset
180 int idx = bounds[0]+i;
821aaceb2776 Fix for flys/issue191
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 747
diff changeset
181 ws[i] = wq.getW(idx);
821aaceb2776 Fix for flys/issue191
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 747
diff changeset
182 qs[i] = wq.getQ(idx);
729
078934923acb New AT writer for results.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
183 }
078934923acb New AT writer for results.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
184
732
39d191f011dc ATWriter: Results are now in cm. Made it more robust against corner cases.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 729
diff changeset
185 qFunc = ws.length < 3
39d191f011dc ATWriter: Results are now in cm. Made it more robust against corner cases.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 729
diff changeset
186 ? new LinearInterpolator().interpolate(ws, qs)
39d191f011dc ATWriter: Results are now in cm. Made it more robust against corner cases.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 729
diff changeset
187 : new SplineInterpolator().interpolate(ws, qs);
729
078934923acb New AT writer for results.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
188
6304
152e1ba8e5bd Rework ATWriter/Exporter
Andre Heinecke <aheinecke@intevation.de>
parents: 6234
diff changeset
189 minW = (int)Math.ceil(wq.getW(bounds[0]));
152e1ba8e5bd Rework ATWriter/Exporter
Andre Heinecke <aheinecke@intevation.de>
parents: 6234
diff changeset
190 maxW = (int)Math.floor(wq.getW(bounds[1]));
1033
821aaceb2776 Fix for flys/issue191
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 747
diff changeset
191 minQ = wq.getQ(bounds[0]);
821aaceb2776 Fix for flys/issue191
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 747
diff changeset
192 maxQ = wq.getQ(bounds[1]);
729
078934923acb New AT writer for results.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
193 PrintWriter out = new PrintWriter(writer);
078934923acb New AT writer for results.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
194
5107
a929d9a9fa1e Picky doc and whitespace fixes.
Felix Wolfsteller <felix.wolfsteller@intevation.de>
parents: 4947
diff changeset
195 // A header is required, because the desktop version of FLYS will skip
1658
7d11ad5a52d5 Bugfix: #332 Made AT-exports compatible with desktop FLYS.
Ingo Weinzierl <ingo.weinzierl@intevation.de>
parents: 1033
diff changeset
196 // the first row.
4941
65059ad920c6 Use different header in AT export files for gauges and at km.
Raimund Renkert <rrenkert@intevation.de>
parents: 4938
diff changeset
197 if (gName != null) {
6304
152e1ba8e5bd Rework ATWriter/Exporter
Andre Heinecke <aheinecke@intevation.de>
parents: 6234
diff changeset
198 if (isCalculation) {
152e1ba8e5bd Rework ATWriter/Exporter
Andre Heinecke <aheinecke@intevation.de>
parents: 6234
diff changeset
199 printCalculatedGaugeHeader(out, meta, river, km, gName, datum, date, unit);
6310
3ac657d60e60 Don't print two header at calculated gauges
Andre Heinecke <aheinecke@intevation.de>
parents: 6304
diff changeset
200 } else {
3ac657d60e60 Don't print two header at calculated gauges
Andre Heinecke <aheinecke@intevation.de>
parents: 6304
diff changeset
201 printGaugeHeader(out, meta, river, km, gName, datum, date, unit);
6304
152e1ba8e5bd Rework ATWriter/Exporter
Andre Heinecke <aheinecke@intevation.de>
parents: 6234
diff changeset
202 }
4941
65059ad920c6 Use different header in AT export files for gauges and at km.
Raimund Renkert <rrenkert@intevation.de>
parents: 4938
diff changeset
203 }
65059ad920c6 Use different header in AT export files for gauges and at km.
Raimund Renkert <rrenkert@intevation.de>
parents: 4938
diff changeset
204 else {
65059ad920c6 Use different header in AT export files for gauges and at km.
Raimund Renkert <rrenkert@intevation.de>
parents: 4938
diff changeset
205 printHeader(out, meta, river, km);
65059ad920c6 Use different header in AT export files for gauges and at km.
Raimund Renkert <rrenkert@intevation.de>
parents: 4938
diff changeset
206 }
4911
da89bb3243d3 Fixed CR and LF in header of AT export.
Raimund Renkert <rrenkert@intevation.de>
parents: 4909
diff changeset
207
6304
152e1ba8e5bd Rework ATWriter/Exporter
Andre Heinecke <aheinecke@intevation.de>
parents: 6234
diff changeset
208 int rest = minW % 10;
729
078934923acb New AT writer for results.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
209
6304
152e1ba8e5bd Rework ATWriter/Exporter
Andre Heinecke <aheinecke@intevation.de>
parents: 6234
diff changeset
210 int startW = minW - rest;
1682
394b7ac58fc9 ATWriter: Get rid of buggy first line code.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1662
diff changeset
211
394b7ac58fc9 ATWriter: Get rid of buggy first line code.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1662
diff changeset
212 if (logger.isDebugEnabled()) {
394b7ac58fc9 ATWriter: Get rid of buggy first line code.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1662
diff changeset
213 logger.debug("startW: " + startW);
394b7ac58fc9 ATWriter: Get rid of buggy first line code.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1662
diff changeset
214 logger.debug("rest: " + rest);
6304
152e1ba8e5bd Rework ATWriter/Exporter
Andre Heinecke <aheinecke@intevation.de>
parents: 6234
diff changeset
215 logger.debug("maxW: " + maxW);
729
078934923acb New AT writer for results.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
216 }
078934923acb New AT writer for results.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
217
078934923acb New AT writer for results.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
218 int col = 0;
7605
f51c943c707a (issue1560) Fix off by one error in ATWriter causing the last value to be omitted.
Andre Heinecke <aheinecke@intevation.de>
parents: 6310
diff changeset
219 for (int w = startW; w <= maxW; w++) {
732
39d191f011dc ATWriter: Results are now in cm. Made it more robust against corner cases.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 729
diff changeset
220 if (col == 0) {
6304
152e1ba8e5bd Rework ATWriter/Exporter
Andre Heinecke <aheinecke@intevation.de>
parents: 6234
diff changeset
221 out.printf(Locale.US, "%8d", w);
732
39d191f011dc ATWriter: Results are now in cm. Made it more robust against corner cases.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 729
diff changeset
222 }
729
078934923acb New AT writer for results.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
223
1682
394b7ac58fc9 ATWriter: Get rid of buggy first line code.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1662
diff changeset
224 if (w < minW) {
394b7ac58fc9 ATWriter: Get rid of buggy first line code.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1662
diff changeset
225 out.print(EMPTY);
6304
152e1ba8e5bd Rework ATWriter/Exporter
Andre Heinecke <aheinecke@intevation.de>
parents: 6234
diff changeset
226 } else {
152e1ba8e5bd Rework ATWriter/Exporter
Andre Heinecke <aheinecke@intevation.de>
parents: 6234
diff changeset
227 double actQ = getQ(w, qFunc);
152e1ba8e5bd Rework ATWriter/Exporter
Andre Heinecke <aheinecke@intevation.de>
parents: 6234
diff changeset
228 if (Double.isNaN(actQ)) {
152e1ba8e5bd Rework ATWriter/Exporter
Andre Heinecke <aheinecke@intevation.de>
parents: 6234
diff changeset
229 // Can't happen™
152e1ba8e5bd Rework ATWriter/Exporter
Andre Heinecke <aheinecke@intevation.de>
parents: 6234
diff changeset
230 break;
152e1ba8e5bd Rework ATWriter/Exporter
Andre Heinecke <aheinecke@intevation.de>
parents: 6234
diff changeset
231 } else {
152e1ba8e5bd Rework ATWriter/Exporter
Andre Heinecke <aheinecke@intevation.de>
parents: 6234
diff changeset
232 printQ(out, actQ);
152e1ba8e5bd Rework ATWriter/Exporter
Andre Heinecke <aheinecke@intevation.de>
parents: 6234
diff changeset
233 }
1682
394b7ac58fc9 ATWriter: Get rid of buggy first line code.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1662
diff changeset
234 }
729
078934923acb New AT writer for results.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
235
078934923acb New AT writer for results.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
236 if (++col >= COLUMNS) {
4947
7669747d22f2 Fix cr/nl in ATWriter.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 4942
diff changeset
237 out.print("\r\n");
729
078934923acb New AT writer for results.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
238 col = 0;
078934923acb New AT writer for results.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
239 }
078934923acb New AT writer for results.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
240 }
078934923acb New AT writer for results.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
241
078934923acb New AT writer for results.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
242 if (col > 0) {
4947
7669747d22f2 Fix cr/nl in ATWriter.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 4942
diff changeset
243 out.print("\r\n");
729
078934923acb New AT writer for results.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
244 }
078934923acb New AT writer for results.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
245
078934923acb New AT writer for results.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
246 out.flush();
078934923acb New AT writer for results.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
247 }
078934923acb New AT writer for results.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
248 }
078934923acb New AT writer for results.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
249 // vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 :

http://dive4elements.wald.intevation.org