annotate artifacts/src/main/java/org/dive4elements/river/exports/ATWriter.java @ 7597:fca46ce8e4f5

(issue1225) Implement Magic labels. There is now a new value in the chartsettings "Suggested Label" which is hidden in the property editor. A suggested label is the label that combines the label's of all processors that wrote data to an axis. This suggested label is set as the label when the user has not overwritten the label.
author Andre Heinecke <aheinecke@intevation.de>
date Mon, 25 Nov 2013 14:58:14 +0100
parents 3ac657d60e60
children f51c943c707a
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
1033
821aaceb2776 Fix for flys/issue191
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 747
diff changeset
173 double [] ws = new double[bounds[1]-bounds[0]];
729
078934923acb New AT writer for results.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
174 double [] qs = new double[ws.length];
078934923acb New AT writer for results.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
175
078934923acb New AT writer for results.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
176 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
177 int idx = bounds[0]+i;
821aaceb2776 Fix for flys/issue191
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 747
diff changeset
178 ws[i] = wq.getW(idx);
821aaceb2776 Fix for flys/issue191
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 747
diff changeset
179 qs[i] = wq.getQ(idx);
729
078934923acb New AT writer for results.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
180 }
078934923acb New AT writer for results.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
181
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
182 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
183 ? 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
184 : new SplineInterpolator().interpolate(ws, qs);
729
078934923acb New AT writer for results.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
185
6304
152e1ba8e5bd Rework ATWriter/Exporter
Andre Heinecke <aheinecke@intevation.de>
parents: 6234
diff changeset
186 minW = (int)Math.ceil(wq.getW(bounds[0]));
152e1ba8e5bd Rework ATWriter/Exporter
Andre Heinecke <aheinecke@intevation.de>
parents: 6234
diff changeset
187 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
188 minQ = wq.getQ(bounds[0]);
821aaceb2776 Fix for flys/issue191
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 747
diff changeset
189 maxQ = wq.getQ(bounds[1]);
729
078934923acb New AT writer for results.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
190 PrintWriter out = new PrintWriter(writer);
078934923acb New AT writer for results.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
191
5107
a929d9a9fa1e Picky doc and whitespace fixes.
Felix Wolfsteller <felix.wolfsteller@intevation.de>
parents: 4947
diff changeset
192 // 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
193 // 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
194 if (gName != null) {
6304
152e1ba8e5bd Rework ATWriter/Exporter
Andre Heinecke <aheinecke@intevation.de>
parents: 6234
diff changeset
195 if (isCalculation) {
152e1ba8e5bd Rework ATWriter/Exporter
Andre Heinecke <aheinecke@intevation.de>
parents: 6234
diff changeset
196 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
197 } else {
3ac657d60e60 Don't print two header at calculated gauges
Andre Heinecke <aheinecke@intevation.de>
parents: 6304
diff changeset
198 printGaugeHeader(out, meta, river, km, gName, datum, date, unit);
6304
152e1ba8e5bd Rework ATWriter/Exporter
Andre Heinecke <aheinecke@intevation.de>
parents: 6234
diff changeset
199 }
4941
65059ad920c6 Use different header in AT export files for gauges and at km.
Raimund Renkert <rrenkert@intevation.de>
parents: 4938
diff changeset
200 }
65059ad920c6 Use different header in AT export files for gauges and at km.
Raimund Renkert <rrenkert@intevation.de>
parents: 4938
diff changeset
201 else {
65059ad920c6 Use different header in AT export files for gauges and at km.
Raimund Renkert <rrenkert@intevation.de>
parents: 4938
diff changeset
202 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
203 }
4911
da89bb3243d3 Fixed CR and LF in header of AT export.
Raimund Renkert <rrenkert@intevation.de>
parents: 4909
diff changeset
204
6304
152e1ba8e5bd Rework ATWriter/Exporter
Andre Heinecke <aheinecke@intevation.de>
parents: 6234
diff changeset
205 int rest = minW % 10;
729
078934923acb New AT writer for results.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
206
6304
152e1ba8e5bd Rework ATWriter/Exporter
Andre Heinecke <aheinecke@intevation.de>
parents: 6234
diff changeset
207 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
208
394b7ac58fc9 ATWriter: Get rid of buggy first line code.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1662
diff changeset
209 if (logger.isDebugEnabled()) {
394b7ac58fc9 ATWriter: Get rid of buggy first line code.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1662
diff changeset
210 logger.debug("startW: " + startW);
394b7ac58fc9 ATWriter: Get rid of buggy first line code.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1662
diff changeset
211 logger.debug("rest: " + rest);
6304
152e1ba8e5bd Rework ATWriter/Exporter
Andre Heinecke <aheinecke@intevation.de>
parents: 6234
diff changeset
212 logger.debug("maxW: " + maxW);
729
078934923acb New AT writer for results.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
213 }
078934923acb New AT writer for results.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
214
078934923acb New AT writer for results.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
215 int col = 0;
6304
152e1ba8e5bd Rework ATWriter/Exporter
Andre Heinecke <aheinecke@intevation.de>
parents: 6234
diff changeset
216 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
217 if (col == 0) {
6304
152e1ba8e5bd Rework ATWriter/Exporter
Andre Heinecke <aheinecke@intevation.de>
parents: 6234
diff changeset
218 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
219 }
729
078934923acb New AT writer for results.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
220
1682
394b7ac58fc9 ATWriter: Get rid of buggy first line code.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1662
diff changeset
221 if (w < minW) {
394b7ac58fc9 ATWriter: Get rid of buggy first line code.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1662
diff changeset
222 out.print(EMPTY);
6304
152e1ba8e5bd Rework ATWriter/Exporter
Andre Heinecke <aheinecke@intevation.de>
parents: 6234
diff changeset
223 } else {
152e1ba8e5bd Rework ATWriter/Exporter
Andre Heinecke <aheinecke@intevation.de>
parents: 6234
diff changeset
224 double actQ = getQ(w, qFunc);
152e1ba8e5bd Rework ATWriter/Exporter
Andre Heinecke <aheinecke@intevation.de>
parents: 6234
diff changeset
225 if (Double.isNaN(actQ)) {
152e1ba8e5bd Rework ATWriter/Exporter
Andre Heinecke <aheinecke@intevation.de>
parents: 6234
diff changeset
226 // Can't happen™
152e1ba8e5bd Rework ATWriter/Exporter
Andre Heinecke <aheinecke@intevation.de>
parents: 6234
diff changeset
227 break;
152e1ba8e5bd Rework ATWriter/Exporter
Andre Heinecke <aheinecke@intevation.de>
parents: 6234
diff changeset
228 } else {
152e1ba8e5bd Rework ATWriter/Exporter
Andre Heinecke <aheinecke@intevation.de>
parents: 6234
diff changeset
229 printQ(out, actQ);
152e1ba8e5bd Rework ATWriter/Exporter
Andre Heinecke <aheinecke@intevation.de>
parents: 6234
diff changeset
230 }
1682
394b7ac58fc9 ATWriter: Get rid of buggy first line code.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1662
diff changeset
231 }
729
078934923acb New AT writer for results.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
232
078934923acb New AT writer for results.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
233 if (++col >= COLUMNS) {
4947
7669747d22f2 Fix cr/nl in ATWriter.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 4942
diff changeset
234 out.print("\r\n");
729
078934923acb New AT writer for results.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
235 col = 0;
078934923acb New AT writer for results.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
236 }
078934923acb New AT writer for results.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
237 }
078934923acb New AT writer for results.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
238
078934923acb New AT writer for results.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
239 if (col > 0) {
4947
7669747d22f2 Fix cr/nl in ATWriter.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 4942
diff changeset
240 out.print("\r\n");
729
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
078934923acb New AT writer for results.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
243 out.flush();
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 // vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 :

http://dive4elements.wald.intevation.org