Mercurial > dive4elements > gnv-client
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 } |