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) {

http://dive4elements.wald.intevation.org