Mercurial > dive4elements > river
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); |