Mercurial > dive4elements > river
comparison flys-artifacts/src/main/java/de/intevation/flys/exports/fixings/FixLongitudinalSectionGenerator.java @ 3169:b6da650b0718
FixA: Added longitudinal section chart.
flys-artifacts/trunk@4782 c6561f87-3c4e-4783-a992-168aeb5c3f6f
author | Raimund Renkert <raimund.renkert@intevation.de> |
---|---|
date | Mon, 25 Jun 2012 15:53:34 +0000 |
parents | |
children | 70966b52c073 |
comparison
equal
deleted
inserted
replaced
3168:e10323bf3cbc | 3169:b6da650b0718 |
---|---|
1 package de.intevation.flys.exports.fixings; | |
2 | |
3 import java.util.List; | |
4 import java.util.ArrayList; | |
5 | |
6 import java.awt.BasicStroke; | |
7 import java.awt.Color; | |
8 | |
9 import de.intevation.artifactdatabase.state.ArtifactAndFacet; | |
10 | |
11 import de.intevation.flys.artifacts.model.FacetTypes; | |
12 | |
13 import de.intevation.flys.artifacts.model.fixings.DateRange; | |
14 import de.intevation.flys.artifacts.model.fixings.FixFunction; | |
15 import de.intevation.flys.artifacts.model.fixings.FixWQCurveFacet; | |
16 import de.intevation.flys.artifacts.model.fixings.QW; | |
17 import de.intevation.flys.artifacts.model.fixings.QWD; | |
18 import de.intevation.flys.artifacts.model.fixings.AnalysisPeriod; | |
19 | |
20 import de.intevation.flys.exports.ChartGenerator; | |
21 import de.intevation.flys.exports.XYChartGenerator; | |
22 | |
23 import de.intevation.flys.jfree.Function2DAdapter; | |
24 import de.intevation.flys.jfree.StyledXYSeries; | |
25 import de.intevation.flys.jfree.StyledAreaSeriesCollection; | |
26 | |
27 import de.intevation.flys.utils.KMIndex; | |
28 | |
29 import org.apache.log4j.Logger; | |
30 | |
31 import org.jfree.data.general.DatasetUtilities; | |
32 | |
33 import org.jfree.data.xy.XYSeries; | |
34 import org.jfree.chart.plot.Marker; | |
35 import org.jfree.chart.plot.ValueMarker; | |
36 import org.jfree.data.xy.XYSeriesCollection; | |
37 | |
38 import org.w3c.dom.Document; | |
39 | |
40 public class FixLongitudinalSectionGenerator | |
41 extends XYChartGenerator | |
42 implements FacetTypes | |
43 { | |
44 private static Logger logger = | |
45 Logger.getLogger(FixLongitudinalSectionGenerator.class); | |
46 | |
47 public static final String I18N_CHART_TITLE = | |
48 "chart.fixings.longitudinalsection.title"; | |
49 | |
50 public static final String I18N_CHART_SUBTITLE = | |
51 "chart.fixings.longitudinalsection.subtitle"; | |
52 | |
53 public static final String I18N_XAXIS_LABEL = | |
54 "chart.fixings.longitudinalsection.xaxis.label"; | |
55 | |
56 public static final String I18N_YAXIS_LABEL = | |
57 "chart.fixings.longitudinalsection.yaxis.label"; | |
58 | |
59 public static final String I18N_CHART_TITLE_DEFAULT = | |
60 "Fixierungsanalyse"; | |
61 | |
62 public static final String I18N_XAXIS_LABEL_DEFAULT = | |
63 "[m]"; | |
64 | |
65 public static final String I18N_YAXIS_LABEL_DEFAULT = | |
66 "delta W [cm]"; | |
67 | |
68 public static enum YAXIS { | |
69 dW(0); | |
70 public int idx; | |
71 private YAXIS(int c) { | |
72 idx = c; | |
73 } | |
74 } | |
75 | |
76 @Override | |
77 public void doOut(ArtifactAndFacet aaf, Document doc, boolean visible) { | |
78 String name = aaf.getFacetName(); | |
79 logger.debug("doOut: " + name); | |
80 | |
81 if (name.contains(FIX_SECTOR_AVERAGE_LS_DEVIATION)) { | |
82 doSectorAverageDeviationOut(aaf, doc, visible); | |
83 } | |
84 else if (name.contains(FIX_SECTOR_AVERAGE_LS)) { | |
85 doSectorAverageOut(aaf, doc, visible); | |
86 } | |
87 else if (name.equals(FIX_REFERENCE_EVENTS_LS)) { | |
88 doReferenceEventsOut(aaf, doc, visible); | |
89 } | |
90 else if (name.equals(FIX_ANALYSIS_EVENTS_LS)) { | |
91 doAnalysisEventsOut(aaf, doc, visible); | |
92 } | |
93 else if (name.equals(FIX_DEVIATION_LS)) { | |
94 doReferenceDeviationOut(aaf, doc, visible); | |
95 } | |
96 else { | |
97 logger.warn("Unknown facet name " + name); | |
98 return; | |
99 } | |
100 } | |
101 | |
102 protected void doSectorAverageOut( | |
103 ArtifactAndFacet aaf, | |
104 Document doc, | |
105 boolean visible) | |
106 { | |
107 logger.debug("doSectorAverageOut" + aaf.getFacet().getIndex()); | |
108 | |
109 int index = aaf.getFacet().getIndex(); | |
110 int sectorNdx = index & 3; | |
111 int periodNdx = index >> 2; | |
112 | |
113 KMIndex<AnalysisPeriod[]> kms = | |
114 (KMIndex<AnalysisPeriod[]>)aaf.getData(context); | |
115 | |
116 if(kms == null) { | |
117 return; | |
118 } | |
119 | |
120 XYSeries series = new StyledXYSeries(aaf.getFacetDescription(), doc); | |
121 | |
122 for (KMIndex.Entry<AnalysisPeriod[]> entry: kms) { | |
123 double km = entry.getKm(); | |
124 AnalysisPeriod[] ap = entry.getValue(); | |
125 QWD qwd = ap[periodNdx].getQSectorAverages()[sectorNdx]; | |
126 if (qwd == null) { | |
127 continue; | |
128 } | |
129 double deltaW = qwd.getDeltaW(); | |
130 series.add(km, deltaW); | |
131 } | |
132 | |
133 addAxisSeries(series, 0, visible); | |
134 | |
135 } | |
136 | |
137 | |
138 protected void doSectorAverageDeviationOut( | |
139 ArtifactAndFacet aaf, | |
140 Document doc, | |
141 boolean visible) | |
142 { | |
143 logger.debug("doSectorAverageOut" + aaf.getFacet().getIndex()); | |
144 | |
145 int index = aaf.getFacet().getIndex(); | |
146 int sectorNdx = index & 3; | |
147 int periodNdx = index >> 2; | |
148 | |
149 KMIndex<AnalysisPeriod[]> kms = | |
150 (KMIndex<AnalysisPeriod[]>)aaf.getData(context); | |
151 | |
152 if(kms == null) { | |
153 return; | |
154 } | |
155 | |
156 StyledAreaSeriesCollection area = new StyledAreaSeriesCollection(doc); | |
157 XYSeries upper = | |
158 new StyledXYSeries(aaf.getFacetDescription(), false, doc); | |
159 XYSeries lower = | |
160 new StyledXYSeries(aaf.getFacetDescription() + " ", false, doc); | |
161 | |
162 | |
163 for (KMIndex.Entry<AnalysisPeriod[]> entry: kms) { | |
164 double km = entry.getKm(); | |
165 AnalysisPeriod[] ap = entry.getValue(); | |
166 QWD qwd = ap[periodNdx].getQSectorAverages()[sectorNdx]; | |
167 double dev = ap[periodNdx].getQSectorStdDev(sectorNdx); | |
168 logger.debug("std-dev: " + dev); | |
169 if (qwd == null) { | |
170 continue; | |
171 } | |
172 double deltaW = qwd.getDeltaW(); | |
173 double up = deltaW + dev; | |
174 double lo = deltaW - dev; | |
175 upper.add(km, up); | |
176 lower.add(km, lo); | |
177 } | |
178 area.addSeries(upper); | |
179 area.addSeries(lower); | |
180 | |
181 addAreaSeries(area, 0, visible); | |
182 } | |
183 | |
184 | |
185 protected void doReferenceDeviationOut( | |
186 ArtifactAndFacet aaf, | |
187 Document doc, | |
188 boolean visible) | |
189 { | |
190 logger.debug("doReferenceOut"); | |
191 | |
192 KMIndex<double[]> kms = | |
193 (KMIndex<double[]>)aaf.getData(context); | |
194 | |
195 if(kms == null) { | |
196 return; | |
197 } | |
198 | |
199 StyledAreaSeriesCollection area = new StyledAreaSeriesCollection(doc); | |
200 XYSeries upper = | |
201 new StyledXYSeries(aaf.getFacetDescription(), false, doc); | |
202 XYSeries lower = | |
203 new StyledXYSeries(aaf.getFacetDescription() + " ", false, doc); | |
204 | |
205 | |
206 for (KMIndex.Entry<double[]> entry: kms) { | |
207 double km = entry.getKm(); | |
208 double[] devArray = entry.getValue(); | |
209 if (devArray == null) { | |
210 continue; | |
211 } | |
212 double dev = devArray[0]; | |
213 double up = dev; | |
214 double lo = -dev; | |
215 upper.add(km, up); | |
216 lower.add(km, lo); | |
217 } | |
218 area.addSeries(upper); | |
219 area.addSeries(lower); | |
220 | |
221 Marker marker = new ValueMarker(0); | |
222 marker.setStroke(new BasicStroke(2)); | |
223 marker.setPaint(Color.BLACK); | |
224 addValueMarker(marker); | |
225 addAreaSeries(area, 0, visible); | |
226 } | |
227 | |
228 protected void doAnalysisEventsOut( | |
229 ArtifactAndFacet aaf, | |
230 Document doc, | |
231 boolean visible) | |
232 { | |
233 logger.debug("doAnalysisEventsOut"); | |
234 int index = aaf.getFacet().getIndex(); | |
235 int sectorNdx = index & 3; | |
236 int periodNdx = index >> 2; | |
237 | |
238 KMIndex<AnalysisPeriod[]> kms = | |
239 (KMIndex<AnalysisPeriod[]>)aaf.getData(context); | |
240 | |
241 if(kms == null) { | |
242 return; | |
243 } | |
244 | |
245 XYSeriesCollection col = new XYSeriesCollection(); | |
246 | |
247 List<StyledXYSeries> series = new ArrayList<StyledXYSeries>(); | |
248 | |
249 for (KMIndex.Entry<AnalysisPeriod[]> entry: kms) { | |
250 double km = entry.getKm(); | |
251 AnalysisPeriod[] ap = entry.getValue(); | |
252 QWD[] qwds = ap[periodNdx].getQWDs(); | |
253 | |
254 String space = ""; | |
255 for (int i = 0; i < qwds.length; i++) { | |
256 if (series.size() <= i && qwds.length > i) { | |
257 StyledXYSeries s = new StyledXYSeries(aaf.getFacetDescription() + space, false, doc); | |
258 series.add (s); | |
259 } | |
260 StyledXYSeries s = series.get(i); | |
261 s.add(km, qwds[i].getDeltaW()); | |
262 space+= " "; | |
263 } | |
264 } | |
265 for (StyledXYSeries s: series) { | |
266 col.addSeries(s); | |
267 } | |
268 | |
269 addAxisDataset(col, 0, visible); | |
270 } | |
271 | |
272 protected void doReferenceEventsOut( | |
273 ArtifactAndFacet aaf, | |
274 Document doc, | |
275 boolean visible) | |
276 { | |
277 logger.debug("doReferenceEventOut"); | |
278 | |
279 KMIndex<QWD[]> kms = | |
280 (KMIndex<QWD[]>)aaf.getData(context); | |
281 | |
282 if(kms == null) { | |
283 return; | |
284 } | |
285 | |
286 XYSeriesCollection col = new XYSeriesCollection(); | |
287 | |
288 List<StyledXYSeries> series = new ArrayList<StyledXYSeries>(); | |
289 | |
290 for (KMIndex.Entry<QWD[]> entry: kms) { | |
291 double km = entry.getKm(); | |
292 QWD[] qwds = entry.getValue(); | |
293 | |
294 String space = ""; | |
295 for (int i = 0; i < qwds.length; i++) { | |
296 if (series.size() <= i && qwds.length > i) { | |
297 StyledXYSeries s = new StyledXYSeries(aaf.getFacetDescription() + space, false, doc); | |
298 series.add (s); | |
299 } | |
300 StyledXYSeries s = series.get(i); | |
301 s.add(km, qwds[i].getDeltaW()); | |
302 space += " "; | |
303 } | |
304 } | |
305 for (StyledXYSeries s: series) { | |
306 col.addSeries(s); | |
307 } | |
308 | |
309 addAxisDataset(col, 0, visible); | |
310 } | |
311 | |
312 | |
313 @Override | |
314 protected String getDefaultChartTitle() { | |
315 return msg(I18N_CHART_TITLE, I18N_CHART_TITLE_DEFAULT); | |
316 } | |
317 | |
318 @Override | |
319 protected String getDefaultXAxisLabel() { | |
320 return msg(I18N_XAXIS_LABEL, I18N_XAXIS_LABEL_DEFAULT); | |
321 } | |
322 | |
323 @Override | |
324 protected String getDefaultYAxisLabel(int pos) { | |
325 return msg(I18N_YAXIS_LABEL, I18N_YAXIS_LABEL_DEFAULT); | |
326 } | |
327 | |
328 @Override | |
329 protected ChartGenerator.YAxisWalker getYAxisWalker() { | |
330 return new YAxisWalker() { | |
331 @Override | |
332 public int length() { | |
333 return YAXIS.values().length; | |
334 } | |
335 | |
336 @Override | |
337 public String getId(int idx) { | |
338 YAXIS[] yaxes = YAXIS.values(); | |
339 return yaxes[idx].toString(); | |
340 } | |
341 }; | |
342 } | |
343 } | |
344 // vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 : |