Mercurial > dive4elements > river
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) { |