Mercurial > dive4elements > gnv-client
diff gnv-artifacts/src/main/java/de/intevation/gnv/chart/TimeSeriesChart.java @ 298:80f7c5dc09c6
Implementation of classes for creating timeseries, verticalprofile and horizontalprofile charts.
gnv-artifacts/trunk@352 c6561f87-3c4e-4783-a992-168aeb5c3f6f
author | Ingo Weinzierl <ingo.weinzierl@intevation.de> |
---|---|
date | Thu, 19 Nov 2009 15:30:27 +0000 |
parents | |
children | 45625b5cd6d4 |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gnv-artifacts/src/main/java/de/intevation/gnv/chart/TimeSeriesChart.java Thu Nov 19 15:30:27 2009 +0000 @@ -0,0 +1,138 @@ +package de.intevation.gnv.chart; + +import java.util.Collection; +import java.util.Iterator; +import java.util.Locale; + +import org.apache.log4j.Logger; + +import org.jfree.chart.ChartTheme; +import org.jfree.chart.plot.XYPlot; +import org.jfree.chart.plot.PlotOrientation; +import org.jfree.data.general.Series; +import org.jfree.data.time.TimeSeries; +import org.jfree.data.time.Minute; +import org.jfree.data.time.TimeSeriesCollection; + +import de.intevation.gnv.geobackend.base.Result; + + +/** + * @author Ingo Weinzierl <ingo.weinzierl@intevation.de> + */ +public class TimeSeriesChart +extends AbstractXYLineChart +{ + + private static Logger log = Logger.getLogger(TimeSeriesChart.class); + + + public TimeSeriesChart( + ChartLabels labels, + ChartTheme theme, + Collection parameters, + Collection measurements, + Collection result, + Collection dates, + Locale locale + ) { + this.labels = labels; + this.theme = theme; + this.parameters = parameters; + this.measurements = measurements; + this.resultSet = result; + this.dates = dates; + this.locale = locale; + this.PLOT_ORIENTATION = PlotOrientation.VERTICAL; + } + + + protected void initData() { + log.debug("init data for timeseries chart"); + + String breakPoint1 = null; + String breakPoint2 = null; + String breakPoint3 = null; + + Iterator iter = resultSet.iterator(); + Result row = null; + String seriesName = null; + TimeSeries series = null; + + int idx = 0; + + while (iter.hasNext()) { + row = (Result) iter.next(); + + // add current data to plot and prepare for next one + if (!row.getString("GROUP1").equals(breakPoint1) || + !row.getString("GROUP2").equals(breakPoint2) || + !row.getString("GROUP3").equals(breakPoint3) + ) { + log.debug("prepare data/plot for next dataset"); + + if(series != null) { + addSeries(series, idx); + prepareAxis(((String)series.getKey()), idx++); + } + + // prepare variables for next plot + breakPoint1 = row.getString("GROUP1"); + breakPoint2 = row.getString("GROUP2"); + breakPoint3 = row.getString("GROUP3"); + + seriesName = createSeriesName( + breakPoint1, + breakPoint2, + breakPoint3 + ); + + log.debug("next dataset is '" + seriesName + "'"); + series = new TimeSeries(seriesName, Minute.class); + } + + addValue(row, series); + } + + // add the last dataset if existing to plot and prepare its axis + addSeries(series, idx); + prepareAxis(((String)series.getKey()), idx++); + } + + + protected void addValue(Result row, Series series) { + // TODO look for gaps between two values + ((TimeSeries) series).addOrUpdate( + new Minute(row.getDate("XORDINATE")), + row.getDouble("YORDINATE") + ); + } + + + protected void addSeries(Series series, int idx) { + log.debug("add series to timeseries chart"); + XYPlot plot = chart.getXYPlot(); + + if (series == null) { + log.warn("no data to add"); + return; + } + + TimeSeriesCollection tsc = new TimeSeriesCollection((TimeSeries)series); + plot.setDataset(idx, tsc); + } + + + protected String createSeriesName( + String breakPoint1, + String breakPoint2, + String breakPoint3 + ) { + log.debug("create seriesname of timeseries chart"); + return findValueTitle(parameters, breakPoint1) + + " " + + findValueTitle(measurements, breakPoint2) + + "m"; + } +} +// vim:set ts=4 sw=4 si et sta sts=4 fenc=latin1 :