comparison artifacts/src/main/java/org/dive4elements/river/exports/TimeseriesChartGenerator.java @ 7034:557cb3a3d772 generator-refactoring

Combine AxisDataset implementations and remove / simplify handling code. Tested with longitudinal section and hist. discharges should be ok.
author Andre Heinecke <aheinecke@intevation.de>
date Wed, 18 Sep 2013 10:12:47 +0200
parents 1b35b2ddfc28
children ce1b8a59934e
comparison
equal deleted inserted replaced
7033:0d91a6598a89 7034:557cb3a3d772
14 import org.dive4elements.river.jfree.CollisionFreeXYTextAnnotation; 14 import org.dive4elements.river.jfree.CollisionFreeXYTextAnnotation;
15 import org.dive4elements.river.jfree.DoubleBounds; 15 import org.dive4elements.river.jfree.DoubleBounds;
16 import org.dive4elements.river.jfree.RiverAnnotation; 16 import org.dive4elements.river.jfree.RiverAnnotation;
17 import org.dive4elements.river.jfree.StyledTimeSeries; 17 import org.dive4elements.river.jfree.StyledTimeSeries;
18 import org.dive4elements.river.jfree.TimeBounds; 18 import org.dive4elements.river.jfree.TimeBounds;
19 import org.dive4elements.river.jfree.AxisDataset;
19 import org.dive4elements.river.themes.ThemeDocument; 20 import org.dive4elements.river.themes.ThemeDocument;
20 21
21 import java.awt.Color; 22 import java.awt.Color;
22 import java.awt.Font; 23 import java.awt.Font;
23 import java.text.DateFormat; 24 import java.text.DateFormat;
58 * @author <a href="mailto:ingo.weinzierl@intevation.de">Ingo Weinzierl</a> 59 * @author <a href="mailto:ingo.weinzierl@intevation.de">Ingo Weinzierl</a>
59 */ 60 */
60 public abstract class TimeseriesChartGenerator 61 public abstract class TimeseriesChartGenerator
61 extends ChartGenerator { 62 extends ChartGenerator {
62 63
63 /**
64 * Inner class TimeseriesAxisDataset stores TimeSeriesCollection.
65 */
66 public class TimeseriesAxisDataset implements AxisDataset {
67
68 protected int axisSymbol;
69
70 protected List<TimeSeriesCollection> datasets;
71
72 protected Range range;
73
74 protected int plotAxisIndex;
75
76 public TimeseriesAxisDataset(int axisSymbol) {
77 this.axisSymbol = axisSymbol;
78 this.datasets = new ArrayList<TimeSeriesCollection>();
79 }
80
81
82 @Override
83 public void addDataset(XYDataset dataset) {
84 if (!(dataset instanceof TimeSeriesCollection)) {
85 logger.warn("Skip non TimeSeriesCollection dataset.");
86 return;
87 }
88
89 TimeSeriesCollection tsc = (TimeSeriesCollection) dataset;
90
91 datasets.add(tsc);
92 mergeRanges(tsc);
93 }
94
95
96 @Override
97 public XYDataset[] getDatasets() {
98 return datasets.toArray(new XYDataset[datasets.size()]);
99 }
100
101
102 @Override
103 public boolean isEmpty() {
104 return datasets.isEmpty();
105 }
106
107
108 @Override
109 public void setRange(Range range) {
110 this.range = range;
111 }
112
113
114 @Override
115 public Range getRange() {
116 return range;
117 }
118
119
120 @Override
121 public void setPlotAxisIndex(int plotAxisIndex) {
122 this.plotAxisIndex = plotAxisIndex;
123 }
124
125
126 @Override
127 public int getPlotAxisIndex() {
128 return plotAxisIndex;
129 }
130
131
132 @Override
133 public boolean isArea(XYDataset dataset) {
134 logger.warn("This AxisDataset doesn't support Areas yet!");
135 return false;
136 }
137
138
139 protected void mergeRanges(TimeSeriesCollection dataset) {
140 logger.debug("Range before merging: " + range);
141 Range subRange = null;
142
143 // Determine min/max of range axis.
144 for (int i = 0; i < dataset.getSeriesCount(); i++) {
145 if (dataset.getSeries(i).getItemCount() == 0) {
146 continue;
147 }
148 double min = Double.MAX_VALUE;
149 double max = -Double.MAX_VALUE;
150 TimeSeries series = dataset.getSeries(i);
151 for (int j = 0; j < series.getItemCount(); j++) {
152 double tmp = series.getValue(j).doubleValue();
153 min = tmp < min ? tmp : min;
154 max = tmp > max ? tmp : max;
155 }
156 if (subRange != null) {
157 subRange = new Range(
158 min < subRange.getLowerBound() ?
159 min : subRange.getLowerBound(),
160 max > subRange.getUpperBound() ?
161 max : subRange.getUpperBound());
162 }
163 else {
164 subRange = new Range(min, max);
165 }
166 }
167
168 // Avoid merging NaNs, as they take min/max place forever.
169 if (subRange == null ||
170 Double.isNaN(subRange.getLowerBound()) ||
171 Double.isNaN(subRange.getUpperBound())) {
172 return;
173 }
174 if (range == null) {
175 range = subRange;
176 return;
177 }
178 range = Range.combine(range, subRange);
179 }
180
181 } // end of TimeseriesAxisDataset class
182
183 protected List<Marker> domainMarker; 64 protected List<Marker> domainMarker;
184 65
185 protected List<Marker> valueMarker; 66 protected List<Marker> valueMarker;
186 67
187 protected Map<String, String> attributes; 68 protected Map<String, String> attributes;
387 return ((TimeSeriesCollection) dataset).getSeries(idx); 268 return ((TimeSeriesCollection) dataset).getSeries(idx);
388 } 269 }
389 270
390 271
391 /** 272 /**
392 * This method creates new instances of TimeseriesAxisDataset. 273 * This method creates new instances of AxisDataset.
393 * 274 *
394 * @param idx The symbol for the new TimeseriesAxisDataset. 275 * @param idx The symbol for the new AxisDataset.
395 */ 276 */
396 @Override 277 @Override
397 protected AxisDataset createAxisDataset(int idx) { 278 protected AxisDataset createAxisDataset(int idx) {
398 logger.debug("Create a new AxisDataset for index: " + idx); 279 logger.debug("Create a new AxisDataset for index: " + idx);
399 return new TimeseriesAxisDataset(idx); 280 return new AxisDataset(idx);
400 } 281 }
401 282
402 283
403 @Override 284 @Override
404 protected void combineXBounds(Bounds bounds, int index) { 285 protected void combineXBounds(Bounds bounds, int index) {

http://dive4elements.wald.intevation.org