Mercurial > dive4elements > river
annotate artifacts/src/main/java/org/dive4elements/river/exports/ATWriter.java @ 6955:94cb1845c667
(issue1452) Coalesce to zero to avoid NaN arithmetic.
author | Andre Heinecke <aheinecke@intevation.de> |
---|---|
date | Fri, 30 Aug 2013 15:45:14 +0200 |
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 : |