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 :

http://dive4elements.wald.intevation.org