comparison artifacts/src/main/java/org/dive4elements/river/artifacts/sinfo/flood_duration/FloodDurationCalculationResult.java @ 9229:0dcd1cd41915

Different themes/facets for left bank and right bank infrastructures in S-Info flood durations, some fixmes done
author mschaefer
date Thu, 05 Jul 2018 16:49:42 +0200
parents 4e6111f87dda
children b515ed950d39
comparison
equal deleted inserted replaced
9228:dba14da43f23 9229:0dcd1cd41915
25 import org.dive4elements.river.artifacts.common.ResultRow; 25 import org.dive4elements.river.artifacts.common.ResultRow;
26 import org.dive4elements.river.artifacts.sinfo.common.SInfoI18NStrings; 26 import org.dive4elements.river.artifacts.sinfo.common.SInfoI18NStrings;
27 import org.dive4elements.river.artifacts.sinfo.common.SInfoResultType; 27 import org.dive4elements.river.artifacts.sinfo.common.SInfoResultType;
28 import org.dive4elements.river.artifacts.sinfo.util.RiverInfo; 28 import org.dive4elements.river.artifacts.sinfo.util.RiverInfo;
29 import org.dive4elements.river.exports.DiagramGenerator; 29 import org.dive4elements.river.exports.DiagramGenerator;
30 import org.dive4elements.river.model.Attribute.AttributeKey;
30 31
31 import gnu.trove.TDoubleArrayList; 32 import gnu.trove.TDoubleArrayList;
32 33
33 /** 34 /**
34 * Contains the result of a {@link FloodDurationCalculation}. 35 * Contains the result of a {@link FloodDurationCalculation}.
39 40
40 private static final long serialVersionUID = 1L; 41 private static final long serialVersionUID = 1L;
41 42
42 private final String[] mainvalueLabels; 43 private final String[] mainvalueLabels;
43 44
44 private final int waterlevelCount;
45 // private final WstInfo wstInfo; 45 // private final WstInfo wstInfo;
46
46 private final int maxWaterlevelPdf = 3; 47 private final int maxWaterlevelPdf = 3;
47 48
48 public interface ValueGetter { 49 public interface ValueGetter {
49 double getValue(DurationWaterlevel waterlevel); 50 double getValue(DurationWaterlevel waterlevel);
50 } 51 }
54 } 55 }
55 56
56 public FloodDurationCalculationResult(final String label, final String[] mainvalueLabels, final Collection<ResultRow> rows) { 57 public FloodDurationCalculationResult(final String label, final String[] mainvalueLabels, final Collection<ResultRow> rows) {
57 super(label, rows); 58 super(label, rows);
58 this.mainvalueLabels = mainvalueLabels; 59 this.mainvalueLabels = mainvalueLabels;
59 this.waterlevelCount = mainvalueLabels.length; 60 }
60 }
61
62 /**
63 * The label of one of the optional main values, or null
64 */
65 // public String getMainValueLabel(final int index) {
66 // if (index <= this.mainvalueLabels.length - 1)
67 // return this.mainvalueLabels[index];
68 // else
69 // return null;
70 // }
71 61
72 /** 62 /**
73 * Collection of the result rows containing only the rows describing an infrastructure 63 * Collection of the result rows containing only the rows describing an infrastructure
74 */ 64 */
75 @Override 65 @Override
77 final List<ResultRow> infrasOnlyRows = new ArrayList<>(); 67 final List<ResultRow> infrasOnlyRows = new ArrayList<>();
78 for (final ResultRow row : this.rows) 68 for (final ResultRow row : this.rows)
79 if (row.getValue(SInfoResultType.infrastructuretype) != null) 69 if (row.getValue(SInfoResultType.infrastructuretype) != null)
80 infrasOnlyRows.add(row); 70 infrasOnlyRows.add(row);
81 return Collections.unmodifiableCollection(infrasOnlyRows); 71 return Collections.unmodifiableCollection(infrasOnlyRows);
82 }
83
84 /**
85 * Fetches the km-longitudinal section of the infrastructures and one of their result fields
86 */
87 public final double[][] fetchInfrastructurePoints(final IResultType type) {
88 final TDoubleArrayList xPoints = new TDoubleArrayList(this.rows.size());
89 final TDoubleArrayList yPoints = new TDoubleArrayList(this.rows.size());
90 for (final ResultRow row : this.rows) {
91 if (row.getValue(SInfoResultType.infrastructuretype) != null) {
92 xPoints.add(row.getDoubleValue(GeneralResultType.station));
93 yPoints.add(row.getDoubleValue(type));
94 }
95 }
96 return new double[][] { xPoints.toNativeArray(), yPoints.toNativeArray() };
97 }
98
99 /**
100 * Fetches the km-longitudinal section of a main value
101 */
102 public final double[][] fetchMainValuePoints(final IResultType type) {
103 final TDoubleArrayList xPoints = new TDoubleArrayList(this.rows.size());
104 final TDoubleArrayList yPoints = new TDoubleArrayList(this.rows.size());
105 // final IResultType check = new IResultType[] { SInfoResultType.mainValue1Duration, SInfoResultType.mainValue2Duration,
106 // SInfoResultType.mainValue3Duration }[index];
107 for (final ResultRow row : this.rows) {
108 // if (!Double.isNaN(row.getDoubleValue(check))) {
109 xPoints.add(row.getDoubleValue(GeneralResultType.station));
110 yPoints.add(row.getDoubleValue(type));
111 // }
112 }
113 return new double[][] { xPoints.toNativeArray(), yPoints.toNativeArray() };
114 } 72 }
115 73
116 @Override 74 @Override
117 protected void writeCSVResultMetadata(final ExportContextCSV exportContextCSV) { 75 protected void writeCSVResultMetadata(final ExportContextCSV exportContextCSV) {
118 if (this.mainvalueLabels.length >= 1) { 76 if (this.mainvalueLabels.length >= 1) {
123 // "# Bezeichnung der Wasserspiegellage: " 81 // "# Bezeichnung der Wasserspiegellage: "
124 final String label = this.getMainValueLabel(i - 1); 82 final String label = this.getMainValueLabel(i - 1);
125 exportContextCSV.writeCSVMetaEntry(SInfoI18NStrings.CSV_META_HEADER_WATERLEVEL_NAME, String.format("%d: %s", i, label)); 83 exportContextCSV.writeCSVMetaEntry(SInfoI18NStrings.CSV_META_HEADER_WATERLEVEL_NAME, String.format("%d: %s", i, label));
126 } 84 }
127 // "# Bezugspegel: " 85 // "# Bezugspegel: "
128 exportContextCSV.writeCSVMetaEntry(SInfoI18NStrings.CSV_META_HEADER_WATERLEVEL_GAUGE, "TODO: gauge"); 86 for (final ResultRow row : this.rows) {
87 exportContextCSV.writeCSVMetaEntry(SInfoI18NStrings.CSV_META_HEADER_WATERLEVEL_GAUGE, row.getValue(SInfoResultType.gaugeLabel));
88 break;
89 }
129 } 90 }
130 exportContextCSV.writeBlankLine(); 91 exportContextCSV.writeBlankLine();
131 } 92 }
132 93
133 @Override 94 @Override
134 protected String getJasperFile() { 95 protected String getJasperFile() {
135 if (this.waterlevelCount <= 1) 96 if (this.getWaterlevelCount() <= 1)
136 return "/jasper/templates/sinfo.floodduration.jrxml"; 97 return "/jasper/templates/sinfo.floodduration.jrxml";
137 else 98 else
138 return "/jasper/templates/sinfo.floodduration2.jrxml"; 99 return "/jasper/templates/sinfo.floodduration2.jrxml";
139 } 100 }
140 101
187 148
188 // add dynamic headers 149 // add dynamic headers
189 final int waterlevelCount = // results. 150 final int waterlevelCount = // results.
190 getWaterlevelCount(); 151 getWaterlevelCount();
191 for (int i = 0; i < waterlevelCount; i++) { 152 for (int i = 0; i < waterlevelCount; i++) {
192 final int naturalIndex = i + 1; 153 final String appendIndex = "_" + Integer.toString(i + 1);
193 final String appendIndex = new StringBuilder().append("_").append(naturalIndex).toString(); 154 header.add(exportContextCSV.msg(DurationWaterlevel.getHeaderWCsv(), appendIndex, "results.getRiver().getWstUnit()"));
194 final Object[] args = new Object[] { appendIndex }; 155 header.add(exportContextCSV.msg(DurationWaterlevel.getHeaderFloodDurPerYearCsv(), appendIndex));
195 // new StringBuilder().append('\u2081').toString(); // schlechter UTF-8-Support für subscript ints 156 header.add(exportContextCSV.msg(DurationWaterlevel.getHeaderQ(), appendIndex));
196 header.add(exportContextCSV.msg(DurationWaterlevel.getHeaderWCsv(), new Object[] { appendIndex, "results.getRiver().getWstUnit()" })); 157 header.add(exportContextCSV.msg(DurationWaterlevel.getHeaderBezeichnCsv(), appendIndex));
197 header.add(exportContextCSV.msg(DurationWaterlevel.getHeaderFloodDurPerYearCsv(), args));
198 header.add(exportContextCSV.msg(DurationWaterlevel.getHeaderQ(), args));
199 header.add(exportContextCSV.msg(DurationWaterlevel.getHeaderBezeichnCsv(), args));
200 } 158 }
201 159
202 header.add(exportContextCSV.formatCsvHeader(SInfoResultType.gaugeLabel)); 160 header.add(exportContextCSV.formatCsvHeader(SInfoResultType.gaugeLabel));
203 header.add(exportContextCSV.formatCsvHeader(SInfoResultType.location)); 161 header.add(exportContextCSV.formatCsvHeader(SInfoResultType.location));
204 162
227 exportContextPDF.addJRMetadata(source, "inundationduration_header", SInfoResultType.floodDuration); 185 exportContextPDF.addJRMetadata(source, "inundationduration_header", SInfoResultType.floodDuration);
228 exportContextPDF.addJRMetadata(source, "inundationduration_q_header", SInfoResultType.floodDischarge); 186 exportContextPDF.addJRMetadata(source, "inundationduration_q_header", SInfoResultType.floodDischarge);
229 exportContextPDF.addJRMetadata(source, "infrastructure_height_header", SInfoResultType.infrastructureHeight); 187 exportContextPDF.addJRMetadata(source, "infrastructure_height_header", SInfoResultType.infrastructureHeight);
230 exportContextPDF.addJRMetadata(source, "infrastructure_type_header", SInfoResultType.infrastructuretype); 188 exportContextPDF.addJRMetadata(source, "infrastructure_type_header", SInfoResultType.infrastructuretype);
231 189
232 for (int i = 0; i < this.waterlevelCount; i++) { 190 for (int i = 1; i <= this.getWaterlevelCount(); i++) {
233 final int naturalIndex = i + 1; 191
234 192 final String appendIndex = "_" + Integer.toString(i);
235 final Object[] args = new String[] { new StringBuilder().append("_").append(naturalIndex).toString() }; 193 exportContextPDF.addJRMetadata(source, getPdfHeader("w", i), exportContextPDF.msg(DurationWaterlevel.getHeaderWPdf(), appendIndex));
236 exportContextPDF.addJRMetadata(source, getPdfHeader("w", naturalIndex), exportContextPDF.msg(DurationWaterlevel.getHeaderWPdf(), args)); 194 exportContextPDF.addJRMetadata(source, getPdfHeader("duration", i),
237 exportContextPDF.addJRMetadata(source, getPdfHeader("duration", naturalIndex), 195 exportContextPDF.msg(DurationWaterlevel.getHeaderFloodDurPerYearPdf(), appendIndex));
238 exportContextPDF.msg(DurationWaterlevel.getHeaderFloodDurPerYearPdf(), args)); 196 exportContextPDF.addJRMetadata(source, getPdfHeader("q", i), exportContextPDF.msg(DurationWaterlevel.getHeaderQ(), appendIndex));
239 exportContextPDF.addJRMetadata(source, getPdfHeader("q", naturalIndex), exportContextPDF.msg(DurationWaterlevel.getHeaderQ(), args)); 197 exportContextPDF.addJRMetadata(source, getPdfHeader("bezeichnung", i),
240 exportContextPDF.addJRMetadata(source, getPdfHeader("bezeichnung", naturalIndex), 198 exportContextPDF.msg(DurationWaterlevel.getHeaderBezeichnPdf(), appendIndex));
241 exportContextPDF.msg(DurationWaterlevel.getHeaderBezeichnPdf(), args));
242 } 199 }
243 200
244 exportContextPDF.addJRMetadata(source, "gauge_header", SInfoResultType.gaugeLabel); 201 exportContextPDF.addJRMetadata(source, "gauge_header", SInfoResultType.gaugeLabel);
245 exportContextPDF.addJRMetadata(source, "location_header", SInfoResultType.location); 202 exportContextPDF.addJRMetadata(source, "location_header", SInfoResultType.location);
246 }
247
248 public final int getWaterlevelCount() {
249 return this.waterlevelCount;
250 } 203 }
251 204
252 private final String getPdfHeader(final String rootStr, final int index) { 205 private final String getPdfHeader(final String rootStr, final int index) {
253 final String hd = "_header"; 206 final String hd = "_header";
254 final StringBuilder builder = new StringBuilder(); 207 final StringBuilder builder = new StringBuilder();
255 return builder.append(rootStr).append("_").append(index).append(hd).toString(); 208 return builder.append(rootStr).append("_").append(index).append(hd).toString();
256 } 209 }
257 210
211 public final int getWaterlevelCount() {
212 return (this.mainvalueLabels != null) ? this.mainvalueLabels.length : 0;
213 }
214
258 public String getMainValueLabel(final int j) { 215 public String getMainValueLabel(final int j) {
259
260 if (this.mainvalueLabels != null && j < this.mainvalueLabels.length) 216 if (this.mainvalueLabels != null && j < this.mainvalueLabels.length)
261 return this.mainvalueLabels[j]; 217 return this.mainvalueLabels[j];
262 return ""; 218 return "";
263 } 219 }
264 220
265 public final double[][] getMainValueDurationPoints(final DiagramGenerator generator, final ValueGetter valuegetter, final int dataIndex) { 221 /**
222 * Gets the longitudinal section of a result value type for one river side
223 */
224 public final double[][] getInfrastructurePoints(final IResultType type, final AttributeKey riverside) {
266 225
267 final TDoubleArrayList xPoints = new TDoubleArrayList(this.rows.size()); 226 final TDoubleArrayList xPoints = new TDoubleArrayList(this.rows.size());
268 final TDoubleArrayList yPoints = new TDoubleArrayList(this.rows.size()); 227 final TDoubleArrayList yPoints = new TDoubleArrayList(this.rows.size());
269 228
270 for (final ResultRow row : this.rows) { 229 for (final ResultRow row : this.rows) {
271 230
272 final double station = row.getDoubleValue(GeneralResultType.station); 231 final double station = row.getDoubleValue(GeneralResultType.station);
232 final double value = row.getDoubleValue(type);
233 if (row.getValue(SInfoResultType.riverside) == riverside) {
234 xPoints.add(station);
235 yPoints.add(value);
236 }
237 }
238
239 return new double[][] { xPoints.toNativeArray(), yPoints.toNativeArray() };
240 }
241
242 /**
243 * Gets a longitudinal section of W, Q, or flood duration of one of the waterlevels
244 */
245 public final double[][] getMainValueDurationPoints(final DiagramGenerator generator, final ValueGetter valuegetter, final int dataIndex) {
246
247 final TDoubleArrayList xPoints = new TDoubleArrayList(this.rows.size());
248 final TDoubleArrayList yPoints = new TDoubleArrayList(this.rows.size());
249
250 for (final ResultRow row : this.rows) {
251
252 final double station = row.getDoubleValue(GeneralResultType.station);
273 253
274 final List<DurationWaterlevel> waterlevels = (List<DurationWaterlevel>) row.getValue(SInfoResultType.customMultiRowColWaterlevel); 254 final List<DurationWaterlevel> waterlevels = (List<DurationWaterlevel>) row.getValue(SInfoResultType.customMultiRowColWaterlevel);
275 final DurationWaterlevel waterlevel = waterlevels.get(dataIndex); 255 final DurationWaterlevel waterlevel = waterlevels.get(dataIndex);
276 256
277 final Double value = valuegetter.getValue(waterlevel); 257 final Double value = valuegetter.getValue(waterlevel);

http://dive4elements.wald.intevation.org