Mercurial > dive4elements > river
comparison artifacts/src/main/java/org/dive4elements/river/artifacts/sinfo/flowdepth/FlowDepthExporter.java @ 8946:5d5d482da3e9
Implementing SINFO - FlowDepthMinMax calculation
author | gernotbelger |
---|---|
date | Tue, 13 Mar 2018 18:49:33 +0100 |
parents | 9c02733a1b3c |
children | a4f1ac81f26d |
comparison
equal
deleted
inserted
replaced
8945:4a6b6a3c279c | 8946:5d5d482da3e9 |
---|---|
6 * documentation coming with Dive4Elements River for details. | 6 * documentation coming with Dive4Elements River for details. |
7 */ | 7 */ |
8 | 8 |
9 package org.dive4elements.river.artifacts.sinfo.flowdepth; | 9 package org.dive4elements.river.artifacts.sinfo.flowdepth; |
10 | 10 |
11 import java.text.DateFormat; | |
12 import java.text.NumberFormat; | |
13 import java.util.ArrayList; | 11 import java.util.ArrayList; |
14 import java.util.Collection; | 12 import java.util.Collection; |
15 import java.util.Date; | |
16 import java.util.Locale; | |
17 | 13 |
18 import org.apache.commons.lang.StringUtils; | 14 import org.apache.commons.lang.StringUtils; |
19 import org.apache.commons.lang.math.DoubleRange; | |
20 import org.apache.log4j.Logger; | 15 import org.apache.log4j.Logger; |
21 import org.dive4elements.river.FLYS; | |
22 import org.dive4elements.river.artifacts.resources.Resources; | |
23 import org.dive4elements.river.artifacts.sinfo.SInfoI18NStrings; | 16 import org.dive4elements.river.artifacts.sinfo.SInfoI18NStrings; |
24 import org.dive4elements.river.artifacts.sinfo.common.AbstractSInfoExporter; | 17 import org.dive4elements.river.artifacts.sinfo.common.AbstractSInfoExporter; |
25 import org.dive4elements.river.artifacts.sinfo.util.BedHeightInfo; | 18 import org.dive4elements.river.artifacts.sinfo.util.BedHeightInfo; |
26 import org.dive4elements.river.artifacts.sinfo.util.MetaAndTableJRDataSource; | 19 import org.dive4elements.river.artifacts.sinfo.util.MetaAndTableJRDataSource; |
27 import org.dive4elements.river.artifacts.sinfo.util.RiverInfo; | 20 import org.dive4elements.river.artifacts.sinfo.util.RiverInfo; |
29 import org.dive4elements.river.utils.RiverUtils; | 22 import org.dive4elements.river.utils.RiverUtils; |
30 | 23 |
31 import au.com.bytecode.opencsv.CSVWriter; | 24 import au.com.bytecode.opencsv.CSVWriter; |
32 | 25 |
33 /** | 26 /** |
34 * Generates different output formats (csv, pdf) of data that resulted from a flow depths computation. | 27 * Generates different output formats (csv, pdf) of data that resulted from a flow depths min/max computation. |
35 * | 28 * |
36 * @author <a href="mailto:ingo.weinzierl@intevation.de">Ingo Weinzierl</a> | 29 * @author <a href="mailto:ingo.weinzierl@intevation.de">Ingo Weinzierl</a> |
37 * @author Gernot Belger | 30 * @author Gernot Belger |
38 */ | 31 */ |
39 // REMARK: must be public because its registered in generators.xml | 32 // REMARK: must be public because its registered in generators.xml |
40 public class FlowDepthExporter extends AbstractSInfoExporter<FlowDepthRow, FlowDepthCalculationResult, FlowDepthCalculationResults> { | 33 public class FlowDepthExporter extends AbstractSInfoExporter<FlowDepthRow, FlowDepthCalculationResult, FlowDepthCalculationResults> { |
41 | 34 |
42 /** The log used in this exporter. */ | 35 /** The log used in this exporter. */ |
43 private static Logger log = Logger.getLogger(FlowDepthExporter.class); | 36 private static Logger log = Logger.getLogger(FlowDepthExporter.class); |
44 | 37 |
45 private static final String CSV_FLOWDEPTH_HEADER = "sinfo.export.flow_depth.csv.header.flowdepth"; | 38 private static final String CSV_FLOWDEPTHMINMAX_HEADER = "sinfo.export.flow_depth_minmax.csv.header.flowdepthminmax"; |
46 private static final String CSV_FLOWDEPTHTKH_HEADER = "sinfo.export.flow_depth.csv.header.flowdepthTkh"; | 39 |
40 private static final String CSV_FLOWDEPTHTKHMINMAX_HEADER = "sinfo.export.flow_depth_minmax.csv.header.flowdepthTkh"; | |
41 | |
47 private static final String CSV_TKH_HEADER = "sinfo.export.flow_depth.csv.header.tkh"; | 42 private static final String CSV_TKH_HEADER = "sinfo.export.flow_depth.csv.header.tkh"; |
48 | 43 |
49 private static final String CSV_MEAN_BED_HEIGHT_HEADER_SHORT = "sinfo.export.flow_depth.csv.header.mean_bed_height.short"; | 44 private static final String JASPER_FILE = "/jasper/sinfo.flowdepthminmax.jasper"; |
50 private static final String CSV_SOUNDING_HEADER = "sinfo.export.flow_depth.csv.header.sounding"; | |
51 | |
52 private static final String CSV_META_HEADER_SOUNDING = "sinfo.export.flow_depth.csv.meta.header.sounding"; | |
53 | |
54 private static final String CSV_META_HEADER_SOUNDING_YEAR = "sinfo.export.flow_depth.csv.meta.header.sounding.year"; | |
55 | |
56 private static final String CSV_META_HEADER_SOUNDING_TYPE = "sinfo.export.flow_depth.csv.meta.header.sounding.type"; | |
57 | |
58 private static final String CSV_META_HEADER_SOUNDING_EVALUATOR = "sinfo.export.flow_depth.csv.meta.header.sounding.evaluator"; | |
59 | |
60 private static final String CSV_META_HEADER_SOUNDING_PRJ = "sinfo.export.flow_depth.csv.meta.header.sounding.prj"; | |
61 | |
62 private static final String CSV_META_HEADER_SOUNDING_ELEVATIOIN_MODEL = "sinfo.export.flow_depth.csv.meta.header.sounding.elevationmodel"; | |
63 | |
64 private static final String CSV_META_HEADER_SOUNDING_ELEVATIOIN_MODEL_ORIGINAL = "sinfo.export.flow_depth.csv.meta.header.sounding.elevationmodel.original"; | |
65 | |
66 private static final String JASPER_FILE = "/jasper/sinfo.flowdepth.jasper"; | |
67 | 45 |
68 @Override | 46 @Override |
69 protected Logger getLog() { | 47 protected Logger getLog() { |
70 return log; | 48 return log; |
71 } | 49 } |
72 | 50 |
73 @Override | 51 @Override |
74 protected void writeCSVResultMetadata(final CSVWriter writer, final FlowDepthCalculationResults results, final FlowDepthCalculationResult result) { | 52 protected void writeCSVGlobalMetadata(final CSVWriter writer, final FlowDepthCalculationResults results) { |
53 log.info("FlowDepthExporter.writeCSVMeta"); | |
75 | 54 |
76 /* first some specific metadata */ | 55 super.writeCSVGlobalMetadataDefaults(writer, results); |
77 final BedHeightInfo sounding = result.getSounding(); | |
78 final WstInfo wst = result.getWst(); | |
79 | 56 |
80 // "##METADATEN PEILUNG" | 57 writer.writeNext(new String[] { "" }); |
81 writeCSVMetaEntry(writer, CSV_META_HEADER_SOUNDING); | |
82 | |
83 // "# Jahr der Peilung: " | |
84 writeCSVMetaEntry(writer, CSV_META_HEADER_SOUNDING_YEAR, Integer.toString(sounding.getYear())); | |
85 // "# Aufnahmeart: " | |
86 writeCSVMetaEntry(writer, CSV_META_HEADER_SOUNDING_TYPE, sounding.getType()); | |
87 // "# Auswerter: " | |
88 writeCSVMetaEntry(writer, CSV_META_HEADER_SOUNDING_EVALUATOR, sounding.getEvaluationBy()); | |
89 // "# Lagesystem: " | |
90 writeCSVMetaEntry(writer, CSV_META_HEADER_SOUNDING_PRJ, sounding.getLocationSystem()); | |
91 // "# Höhensystem: " | |
92 writeCSVMetaEntry(writer, CSV_META_HEADER_SOUNDING_ELEVATIOIN_MODEL, sounding.getCurElevationModelUnit()); | |
93 // "# ursprüngliches Höhensystem: " | |
94 writeCSVMetaEntry(writer, CSV_META_HEADER_SOUNDING_ELEVATIOIN_MODEL_ORIGINAL, sounding.getOldElevationModelUnit()); | |
95 | |
96 // "##METADATEN WASSERSPIEGELLAGE" | |
97 writeCSVMetaEntry(writer, SInfoI18NStrings.CSV_META_HEADER_WATERLEVEL); | |
98 // "# Bezeichnung der Wasserspiegellage: " | |
99 writeCSVMetaEntry(writer, SInfoI18NStrings.CSV_META_HEADER_WATERLEVEL_NAME, wst.getLabel()); | |
100 // "# Bezugspegel: " | |
101 writeCSVMetaEntry(writer, SInfoI18NStrings.CSV_META_HEADER_WATERLEVEL_GAUGE, wst.getGauge()); | |
102 // "# Jahr/Zeitraum der Wasserspiegellage: " | |
103 writeCSVMetaEntry(writer, SInfoI18NStrings.CSV_META_HEADER_WATERLEVEL_YEAR, Integer.toString(wst.getYear())); | |
104 } | 58 } |
105 | 59 |
106 @Override | 60 @Override |
107 protected void writeCSVGlobalMetadata(final CSVWriter writer, final FlowDepthCalculationResults results) { | 61 protected void writeCSVResultMetadata(final CSVWriter writer, final FlowDepthCalculationResults results, final FlowDepthCalculationResult result) { |
108 log.info("FlowDepthExporter.writeCSVMeta"); | |
109 | 62 |
110 final String calcModeLabel = results.getCalcModeLabel(); | 63 final BedHeightInfo sounding = result.getSounding(); |
111 final RiverInfo river = results.getRiver(); | 64 super.writeCSVSoundingMetadata(writer, sounding); |
112 writeCSVMetaEntry(writer, SInfoI18NStrings.CSV_META_HEADER_RESULT, msg(SInfoI18NStrings.CSV_META_HEADER_RESULT_LABEL), river.getName(), calcModeLabel); | |
113 | 65 |
114 // "# FLYS-Version: " | 66 final WstInfo wst = result.getWst(); |
115 writeCSVMetaEntry(writer, SInfoI18NStrings.CSV_META_VERSION, msg(SInfoI18NStrings.CSV_META_VERSION_LABEL), FLYS.VERSION); | 67 super.writeCSVWaterlevelMetadata(writer, wst); |
116 | |
117 // "# Bearbeiter: " | |
118 writeCSVMetaEntry(writer, SInfoI18NStrings.CSV_META_USER, msg(SInfoI18NStrings.CSV_META_USER_LABEL), results.getUser()); | |
119 | |
120 // "# Datum der Erstellung: " | |
121 final Locale locale = Resources.getLocale(this.context.getMeta()); | |
122 final DateFormat df = DateFormat.getDateInstance(DateFormat.SHORT, locale); | |
123 writeCSVMetaEntry(writer, SInfoI18NStrings.CSV_META_CREATION, msg(SInfoI18NStrings.CSV_META_CREATION_LABEL), df.format(new Date())); | |
124 | |
125 // "# Gewässer: " | |
126 writeCSVMetaEntry(writer, SInfoI18NStrings.CSV_META_RIVER, msg(SInfoI18NStrings.CSV_META_RIVER_LABEL), river.getName()); | |
127 | |
128 // "# Höhensystem des Flusses: " | |
129 writeCSVMetaEntry(writer, SInfoI18NStrings.CSV_META_HEIGHT_UNIT_RIVER, river.getWstUnit()); | |
130 | |
131 // "# Ort/Bereich (km): " | |
132 final DoubleRange calcRange = results.getCalcRange(); | |
133 writeCSVMetaEntry(writer, SInfoI18NStrings.CSV_META_RANGE, msg(SInfoI18NStrings.CSV_META_RANGE_LABEL), | |
134 getKmFormatter().format(calcRange.getMinimumDouble()), | |
135 getKmFormatter().format(calcRange.getMaximumDouble())); | |
136 | |
137 writer.writeNext(new String[] { "" }); | |
138 } | 68 } |
139 | 69 |
140 /** | 70 /** |
141 * Write the header, with different headings depending on whether at a | 71 * Write the header, with different headings depending on whether at a |
142 * gauge or at a location. | 72 * gauge or at a location. |
150 log.info("FlowDepthExporter.writeCSVHeader"); | 80 log.info("FlowDepthExporter.writeCSVHeader"); |
151 | 81 |
152 final Collection<String> header = new ArrayList<>(11); | 82 final Collection<String> header = new ArrayList<>(11); |
153 | 83 |
154 header.add(msg(SInfoI18NStrings.CSV_KM_HEADER)); | 84 header.add(msg(SInfoI18NStrings.CSV_KM_HEADER)); |
155 header.add(msgUnit(CSV_FLOWDEPTH_HEADER, SInfoI18NStrings.UNIT_M)); | 85 header.add(msgUnit(CSV_FLOWDEPTHMINMAX_HEADER, SInfoI18NStrings.UNIT_M)); |
156 if (getData().isUseTkh()) { | 86 if (getData().isUseTkh()) { |
157 header.add(msgUnit(CSV_FLOWDEPTHTKH_HEADER, SInfoI18NStrings.UNIT_M)); | 87 header.add(msgUnit(CSV_FLOWDEPTHTKHMINMAX_HEADER, SInfoI18NStrings.UNIT_M)); |
158 header.add(msgUnit(CSV_TKH_HEADER, SInfoI18NStrings.UNIT_CM)); | 88 header.add(msgUnit(CSV_TKH_HEADER, SInfoI18NStrings.UNIT_CM)); |
159 } | 89 } |
160 | 90 |
161 header.add(msgUnit(SInfoI18NStrings.CSV_WATERLEVEL_HEADER, river.getWstUnit())); | 91 header.add(msgUnit(SInfoI18NStrings.CSV_WATERLEVEL_HEADER, river.getWstUnit())); |
162 header.add(msgUnit(SInfoI18NStrings.CSV_DISCHARGE_HEADER, SInfoI18NStrings.UNIT_CUBIC_M)); | 92 header.add(msgUnit(SInfoI18NStrings.CSV_DISCHARGE_HEADER, SInfoI18NStrings.UNIT_CUBIC_M)); |
163 header.add(msg(SInfoI18NStrings.CSV_LABEL_HEADER)); | 93 header.add(msg(SInfoI18NStrings.CSV_LABEL_HEADER)); |
164 header.add(msg(SInfoI18NStrings.CSV_GAUGE_HEADER)); | 94 header.add(msg(SInfoI18NStrings.CSV_GAUGE_HEADER)); |
165 header.add(msgUnit(SInfoI18NStrings.CSV_MEAN_BED_HEIGHT_HEADER, river.getWstUnit())); | 95 header.add(msgUnit(SInfoI18NStrings.CSV_MEAN_BED_HEIGHT_HEADER, river.getWstUnit())); |
166 header.add(msg(CSV_SOUNDING_HEADER)); | 96 header.add(msg(SInfoI18NStrings.CSV_SOUNDING_HEADER)); |
167 header.add(msg(SInfoI18NStrings.CSV_LOCATION_HEADER)); | 97 header.add(msg(SInfoI18NStrings.CSV_LOCATION_HEADER)); |
168 | 98 |
169 writer.writeNext(header.toArray(new String[header.size()])); | 99 writer.writeNext(header.toArray(new String[header.size()])); |
170 } | 100 } |
171 | 101 |
233 } | 163 } |
234 | 164 |
235 @Override | 165 @Override |
236 protected final void addJRMetaData(final MetaAndTableJRDataSource source, final FlowDepthCalculationResults results) { | 166 protected final void addJRMetaData(final MetaAndTableJRDataSource source, final FlowDepthCalculationResults results) { |
237 | 167 |
238 final RiverInfo river = results.getRiver(); | |
239 final String wstUnitName = river.getWstUnit(); | |
240 | |
241 /* general metadata */ | 168 /* general metadata */ |
242 source.addMetaData("header", msg(SInfoI18NStrings.CSV_META_HEADER_RESULT_LABEL)); | 169 super.addJRMetaDataDefaults(source, results); |
243 source.addMetaData("calcMode", results.getCalcModeLabel()); | |
244 | |
245 source.addMetaData("version_label", msg(SInfoI18NStrings.CSV_META_VERSION_LABEL)); | |
246 source.addMetaData("version", FLYS.VERSION); | |
247 | |
248 source.addMetaData("user_label", msg(SInfoI18NStrings.CSV_META_USER_LABEL)); | |
249 source.addMetaData("user", results.getUser()); | |
250 | |
251 final Locale locale = Resources.getLocale(this.context.getMeta()); | |
252 final DateFormat df = DateFormat.getDateInstance(DateFormat.SHORT, locale); | |
253 source.addMetaData("date_label", msg(SInfoI18NStrings.CSV_META_CREATION_LABEL)); | |
254 source.addMetaData("date", df.format(new Date())); | |
255 | |
256 source.addMetaData("river_label", msg(SInfoI18NStrings.CSV_META_RIVER_LABEL)); | |
257 source.addMetaData("river", river.getName()); | |
258 | |
259 final DoubleRange calcRange = results.getCalcRange(); | |
260 final NumberFormat kmFormatter = getKmFormatter(); | |
261 final String rangeValue = String.format("%s - %s", kmFormatter.format(calcRange.getMinimumDouble()), kmFormatter.format(calcRange.getMaximumDouble())); | |
262 source.addMetaData("range_label", msg(SInfoI18NStrings.CSV_META_RANGE_LABEL)); | |
263 source.addMetaData("range", rangeValue); | |
264 | 170 |
265 /* column headings */ | 171 /* column headings */ |
266 source.addMetaData("station_header", msg(SInfoI18NStrings.CSV_KM_HEADER)); | 172 source.addMetaData("station_header", msg(SInfoI18NStrings.CSV_KM_HEADER)); |
267 source.addMetaData("flowdepth_header", msg(CSV_FLOWDEPTH_HEADER)); | 173 source.addMetaData("flowdepth_header", msg(CSV_FLOWDEPTHMINMAX_HEADER)); |
268 source.addMetaData("flowdepth_tkh_header", msg(CSV_FLOWDEPTHTKH_HEADER)); | 174 source.addMetaData("flowdepth_tkh_header", msg(CSV_FLOWDEPTHTKHMINMAX_HEADER)); |
269 source.addMetaData("tkh_header", msg(CSV_TKH_HEADER)); | 175 source.addMetaData("tkh_header", msg(CSV_TKH_HEADER)); |
270 source.addMetaData("waterlevel_header", msg(SInfoI18NStrings.CSV_WATERLEVEL_HEADER)); | 176 source.addMetaData("waterlevel_header", msg(SInfoI18NStrings.CSV_WATERLEVEL_HEADER)); |
271 source.addMetaData("river_unit", wstUnitName); | |
272 source.addMetaData("discharge_header", msg(SInfoI18NStrings.CSV_DISCHARGE_HEADER)); | 177 source.addMetaData("discharge_header", msg(SInfoI18NStrings.CSV_DISCHARGE_HEADER)); |
273 source.addMetaData("waterlevel_name_header", msg(SInfoI18NStrings.CSV_LABEL_HEADER)); | 178 source.addMetaData("waterlevel_name_header", msg(SInfoI18NStrings.CSV_LABEL_HEADER)); |
274 source.addMetaData("gauge_header", msg(SInfoI18NStrings.CSV_GAUGE_HEADER)); | 179 source.addMetaData("gauge_header", msg(SInfoI18NStrings.CSV_GAUGE_HEADER)); |
275 source.addMetaData("bedheight_header", msg(CSV_MEAN_BED_HEIGHT_HEADER_SHORT)); | 180 source.addMetaData("bedheight_header", msg(SInfoI18NStrings.CSV_MEAN_BED_HEIGHT_HEADER_SHORT)); |
276 source.addMetaData("sounding_name_header", msg(CSV_SOUNDING_HEADER)); | 181 source.addMetaData("sounding_name_header", msg(SInfoI18NStrings.CSV_SOUNDING_HEADER)); |
277 source.addMetaData("location_header", msg(SInfoI18NStrings.CSV_LOCATION_HEADER)); | 182 source.addMetaData("location_header", msg(SInfoI18NStrings.CSV_LOCATION_HEADER)); |
278 } | 183 } |
279 | 184 |
280 @Override | 185 @Override |
281 protected String[] formatPDFRow(final FlowDepthCalculationResults results, final FlowDepthRow row) { | 186 protected String[] formatPDFRow(final FlowDepthCalculationResults results, final FlowDepthRow row) { |