comparison gnv-artifacts/src/main/java/de/intevation/gnv/chart/VerticalProfileChartFactory.java @ 82:5eb62df21f9a

Added Support for Vertical Profiles Marnet, STAUN, IMIS gnv-artifacts/trunk@111 c6561f87-3c4e-4783-a992-168aeb5c3f6f
author Tim Englich <tim.englich@intevation.de>
date Tue, 22 Sep 2009 13:20:30 +0000
parents
children 5c8e54726a58
comparison
equal deleted inserted replaced
81:9b41f3688610 82:5eb62df21f9a
1 /**
2 * Title: ChartFactory, $Header: /share/gdi/SDI-Suite/Repository/projekte/BSH-GDI/genericViewer/src/main/java/de/conterra/bsh/gdi/gnviewer/output/chart/ChartFactory.java,v 1.8 2007/12/21 12:31:15 blume Exp $
3 * Source: $Source: /share/gdi/SDI-Suite/Repository/projekte/BSH-GDI/genericViewer/src/main/java/de/conterra/bsh/gdi/gnviewer/output/chart/ChartFactory.java,v $
4 * created by: Stefan Blume (blume)
5 * erstellt am: 06.12.2007
6 * Copyright: con terra GmbH, 2005
7 *
8 * modified by: $Author: blume $
9 * modified on: $Date: 2007/12/21 12:31:15 $
10 * Version: $Revision: 1.8 $
11 * TAG: $Name: $
12 * locked from: $Locker: $
13 * CVS State: $State: Exp $
14 * Project: $ProjectName$
15 */
16 package de.intevation.gnv.chart;
17
18 import java.awt.Color;
19 import java.awt.Font;
20 import java.awt.image.BufferedImage;
21 import java.io.IOException;
22 import java.io.OutputStream;
23 import java.util.Collection;
24 import java.util.Date;
25 import java.util.Iterator;
26
27 import org.apache.log4j.Logger;
28 import org.jfree.chart.JFreeChart;
29 import org.jfree.chart.axis.AxisLocation;
30 import org.jfree.chart.axis.DateAxis;
31 import org.jfree.chart.axis.NumberAxis;
32 import org.jfree.chart.axis.NumberTickUnit;
33 import org.jfree.chart.encoders.KeypointPNGEncoderAdapter;
34 import org.jfree.chart.plot.PlotOrientation;
35 import org.jfree.chart.plot.XYPlot;
36 import org.jfree.chart.renderer.xy.StandardXYItemRenderer;
37 import org.jfree.chart.renderer.xy.XYLineAndShapeRenderer;
38 import org.jfree.data.general.Series;
39 import org.jfree.data.time.Minute;
40 import org.jfree.data.time.TimeSeries;
41 import org.jfree.data.time.TimeSeriesCollection;
42 import org.jfree.data.xy.DefaultXYDataset;
43 import org.jfree.data.xy.XYDataset;
44 import org.jfree.data.xy.XYSeries;
45 import org.jfree.data.xy.XYSeriesCollection;
46 import org.jfree.ui.RectangleInsets;
47
48 import de.intevation.gnv.chart.exception.TechnicalChartException;
49 import de.intevation.gnv.geobackend.base.Result;
50 import de.intevation.gnv.transition.describedata.KeyValueDescibeData;
51
52 /**
53 * The class <code>ChartFactory</code> fulfills the following purposes:
54 * <ol>
55 * <li></li>
56 * </ol>
57 *
58 * @author blume
59 * @version 1.0
60 * @serial 1.0
61 * @see
62 * @since 06.12.2007 17:25:59
63 */
64 public class VerticalProfileChartFactory {
65
66 /**
67 * Default Logging instance
68 */
69 private static Logger sLogger = Logger.getLogger(VerticalProfileChartFactory.class);
70 private static boolean sDebug = sLogger.isDebugEnabled();
71
72
73 public synchronized void createSimpleVerticalProfileChart(ChartLabels pLabels, ChartStyle pStyle, String name, Collection<KeyValueDescibeData> parameters, Collection<KeyValueDescibeData> measurements, OutputStream outputStream, Collection<Result> resultSet) throws IOException, TechnicalChartException {
74 if (sDebug)
75 sLogger.debug("createSimpleTimeSeriesChart()");
76 int lLowerLevel = Integer.MIN_VALUE;
77 int lUpperLevel = Integer.MAX_VALUE;
78 if (pStyle.isUseUpperDataLevel()
79 && pStyle.getUpperLevel() < Integer.MAX_VALUE) {
80 lUpperLevel = pStyle.getUpperLevel();
81 }
82 if (pStyle.isUseLowerDataLevel()
83 && pStyle.getLowerLevel() > Integer.MIN_VALUE) {
84 lLowerLevel = pStyle.getLowerLevel();
85 }
86 if (sDebug)
87 sLogger.debug(" vor createDataset()");
88 XYDataset lSet = createDataset(name, resultSet, lUpperLevel,
89 lLowerLevel,parameters,measurements);
90 if (sDebug)
91 sLogger.debug(" nach createDataset()");
92 final Color[] color = {Color.black, Color.red, Color.green, Color.blue};
93 NumberAxis domain = new NumberAxis("Tiefe");
94 NumberAxis axis;
95 StandardXYItemRenderer renderer = new StandardXYItemRenderer();
96 XYPlot plot = new XYPlot();
97 //Global settings
98
99 plot.setOrientation(PlotOrientation.HORIZONTAL);
100 plot.setBackgroundPaint(Color.lightGray);
101 plot.setDomainGridlinePaint(Color.white);
102 plot.setRangeGridlinePaint(Color.white);
103 plot.setAxisOffset(new RectangleInsets(5.0,5.0,5.0,5.0));
104 //plot.getRangeAxis().setFixedDimension(10.0);
105 plot.setDomainAxis(domain);
106 plot.setDomainAxisLocation(AxisLocation.BOTTOM_OR_LEFT);
107 if (parameters.size() == 1) {
108 KeyValueDescibeData parameter = parameters.iterator().next();
109 axis = new NumberAxis(parameter.getValue());
110 if(parameter.getValue().contains("richtung")){
111 NumberAxis axis1 = new NumberAxis(
112 ((String) parameter.getValue()));//,new Range(0.0,360.0));
113 axis1.setTickUnit(new NumberTickUnit(30.0));
114 axis1.setUpperBound(360.0);
115 axis1.setLowerBound(0.0);
116 //axis1.setDisplayRange(0.0,360.0);
117 plot.setRangeAxis( axis1);
118 }else{
119 axis.setFixedDimension(10.0);
120 axis.setAutoRangeIncludesZero(false);
121 plot.setRangeAxis(axis);
122 }
123 axis.configure();
124 plot.setRangeAxisLocation( AxisLocation.BOTTOM_OR_LEFT);
125 plot.setRenderer(renderer);
126 plot.setDataset(lSet);
127 } else {
128 // Individual settings for different parameters
129 for (int i = 0; i < lSet.getSeriesCount(); i++) {
130
131 plot.setDataset(i, getDataset((XYSeriesCollection) lSet, i));
132 Color mColor=color[i % color.length]; // zyklische Farbvergabe
133 mColor = color[0];
134 // if ( pParameterId.length==1){
135
136 if(((String) lSet.getSeriesKey(i)).contains("richtung")){
137 NumberAxis axis1 = new NumberAxis(((String) lSet.getSeriesKey(i)));//,new Range(0.0,360.0));
138 axis1.setTickUnit(new NumberTickUnit(30.0));
139 //axis1.setDisplayRange(0.0,360.0);
140 axis1.setLabelPaint(mColor);
141 axis1.setTickLabelPaint(mColor);
142 axis1.setUpperBound(360.0);
143 axis1.setLowerBound(0.0);
144 plot.setRangeAxis(i, axis1);
145
146
147 }
148 else {
149 axis = new NumberAxis((String) lSet.getSeriesKey(i));
150 axis.setFixedDimension(10.0);
151 axis.setAutoRangeIncludesZero(false);
152 axis.setLabelPaint(mColor);
153 axis.setTickLabelPaint(mColor);
154 plot.setRangeAxis(i, axis);
155 axis.configure();
156 }
157 if (i % 2 != 0)
158 plot.setRangeAxisLocation(i, AxisLocation.BOTTOM_OR_RIGHT);
159 else
160 plot.setRangeAxisLocation(i, AxisLocation.BOTTOM_OR_LEFT);
161 plot.mapDatasetToRangeAxis(i, i);
162 // }
163 renderer = new StandardXYItemRenderer();
164 renderer.setSeriesPaint(i, mColor);
165 // renderer.setSeriesStroke(i,stroke[j]);
166 plot.setRenderer(i, renderer);
167 }
168 }
169 JFreeChart chart = new JFreeChart(
170 pLabels.getTitle(),
171 new Font ("SansSerif",Font.BOLD,24),
172 plot,true);
173
174
175 setStyle(chart, pStyle);
176 configureRenderingOptions(chart);
177 if (sDebug)
178 sLogger.debug(" vor encodeChart()");
179
180 encodeChart(chart, pStyle, outputStream);
181 }
182 private static XYDataset getDataset(XYSeriesCollection T, int pIndex){ //throws TechnicalChartException{
183 //if (T.getSeriesCount() < pIndex) throw TechnicalChartException();
184 XYSeriesCollection XYSC = new XYSeriesCollection();
185 XYSC.addSeries(T.getSeries(pIndex));
186 return (XYDataset) XYSC;
187 }
188
189 private void configureRenderingOptions(JFreeChart pJfreechart) {
190 org.jfree.chart.renderer.xy.XYItemRenderer xyitemrenderer = ((XYPlot) pJfreechart
191 .getPlot()).getRenderer();
192 if (xyitemrenderer instanceof XYLineAndShapeRenderer) {
193 XYLineAndShapeRenderer xylineandshaperenderer = (XYLineAndShapeRenderer) xyitemrenderer;
194 xylineandshaperenderer.setBaseShapesVisible(true);
195 xylineandshaperenderer.setBaseShapesFilled(true);
196 }
197 }
198
199 private void setStyle(JFreeChart pJfreechart, ChartStyle pStyle) {
200 if (sDebug)
201 sLogger.debug("setStyle()");
202 pJfreechart.setBackgroundPaint(pStyle.getCanvasColor());
203 XYPlot xyplot = (XYPlot) pJfreechart.getPlot();
204 xyplot.setBackgroundPaint(pStyle.getPlotBackgroundColor());
205 xyplot.setDomainGridlinePaint(pStyle.getDomainGridlineColor());
206 xyplot.setRangeGridlinePaint(pStyle.getRangeGridlineColor());
207
208 Insets lOffsets = pStyle.getAxisOffset();
209 RectangleInsets lRectangleInsets = new RectangleInsets(lOffsets.mUpper,
210 lOffsets.mLeft, lOffsets.mLower, lOffsets.mRight);
211 xyplot.setAxisOffset(lRectangleInsets);
212 xyplot.setDomainCrosshairVisible(pStyle.isDomainCrosshairVisible());
213 xyplot.setRangeCrosshairVisible(pStyle.isRangeCrosshairVisible());
214
215 }
216
217
218 protected XYSeries createXYSeries(String seriesName, Collection<Result> resultSet,
219 int lUpperCut, int lLowerCut,int pStart,int pEnd) throws TechnicalChartException{
220 if (sDebug)
221 sLogger.debug("createXYSeries()");
222 XYSeries series = new XYSeries(seriesName);
223 try {
224 double xValue=0;
225 double yValue=0;
226 int i = 0;
227 Iterator<Result> resultIterator = resultSet.iterator();
228 while (resultIterator.hasNext()){
229 Result lRow = resultIterator.next();
230 if (i >= pStart && i <= pEnd ){
231 xValue = lRow.getDouble("XORDINATE");
232 yValue = lRow.getDouble("YORDINATE");
233 series.add(xValue, yValue);
234 sLogger.debug(seriesName+" Added Value "+xValue+" / "+yValue);
235
236 }else if (i > pEnd){
237 return series;
238 }
239 i++;
240 }
241 } catch (OutOfMemoryError e) {
242 sLogger.error(e.getMessage(), e);
243 return series;
244
245 } catch (Exception e) { //TechnicalChartException
246 sLogger.error(e.getMessage(), e);
247 }
248 finally {
249 }
250
251 return series;
252 }
253
254 private XYDataset createDataset(String name, Collection<Result> resultSet,
255 int lUpperCut, int lLowerCut,Collection<KeyValueDescibeData> parameters, Collection<KeyValueDescibeData> measurements) throws TechnicalChartException {
256
257 XYSeriesCollection xyDataset = new XYSeriesCollection();
258
259 try{
260 String break1, break2, break3;
261 int mStart = 0;
262 int mEnd = 0;
263
264
265 Iterator<Result> resultIterator = resultSet.iterator();
266 if (resultIterator.hasNext()){
267 // Row row = new Row(sArrayStrLine);
268 Result row = resultIterator.next();
269
270 break1 = row.getString("GROUP1"); // 2
271 break2 = row.getString("GROUP2"); //3
272 break3 = row.getString("GROUP3"); // 4
273 int i = 0;
274 while (resultIterator.hasNext()) {
275 row = resultIterator.next();
276 if (!break1.equals(row.getString("GROUP1"))
277 || !break2 .equals(row.getString("GROUP2"))
278 || !break3.equals(row.getString("GROUP3"))){
279 String seriesName = findValueTitle(parameters,break1)+" "+
280 findValueTitle(measurements,break2);
281 sLogger.debug("Neuer Datensatz "+seriesName+ "von Datensätzen "+mStart+" / "+mEnd);
282 xyDataset.addSeries(createXYSeries(seriesName,
283 resultSet, lUpperCut, lLowerCut, mStart, mEnd));
284 mStart = i;
285
286 break1 = row.getString("GROUP1");
287 break2 = row.getString("GROUP2"); //3
288 break3 = row.getString("GROUP3"); // 4
289
290 }
291 mEnd = i;
292 //mEnd ++;
293 i = i + 1;
294 }
295
296 String seriesName = findValueTitle(parameters,break1)+" "+
297 findValueTitle(measurements,break2);
298 sLogger.debug("Neuer Datensatz "+seriesName+ "von Datensätzen "+mStart+" / "+mEnd);
299 xyDataset.addSeries(createXYSeries(seriesName,
300 resultSet, lUpperCut, lLowerCut, mStart, mEnd));
301 }
302 }
303 catch (Exception e){
304 sLogger.error(e.getMessage(), e);
305 }
306 finally{
307 }
308 return xyDataset;
309 }
310
311
312
313 private void encodeChart(JFreeChart pChart, ChartStyle pStyle, OutputStream outputStream)
314 throws IOException {
315 if (sDebug)
316 sLogger.debug("encodeChart()");
317 KeypointPNGEncoderAdapter lEncoder = new KeypointPNGEncoderAdapter();
318 lEncoder.setEncodingAlpha(true);
319
320 int lWidth = (int) pStyle.getChartSize().getWidth();
321 int lHeight = (int) pStyle.getChartSize().getHeight();
322
323 BufferedImage lImage = pChart.createBufferedImage(lWidth, lHeight,
324 BufferedImage.BITMASK, null);
325
326 lEncoder.encode(lImage, outputStream);
327
328 }
329
330 private String findValueTitle(Collection<KeyValueDescibeData> values, String pMmtId){
331 int id = 0;
332 try {
333 id = Integer.parseInt(pMmtId);
334 } catch (NumberFormatException e) {
335 sLogger.warn(e,e);
336 return pMmtId;
337 }
338
339 Iterator<KeyValueDescibeData> it = values.iterator();
340 while(it.hasNext()){
341 KeyValueDescibeData data = it.next();
342 if (id ==Integer.parseInt(data.getKey())){ // TODO just a hack
343 return data.getValue();
344 }
345 }
346 return "";
347 }
348 }

http://dive4elements.wald.intevation.org