Mercurial > dive4elements > river
comparison flys-artifacts/src/main/java/de/intevation/flys/exports/ChartHelper.java @ 3318:dbe2f85bf160
merged flys-artifacts/2.8
author | Thomas Arendsen Hein <thomas@intevation.de> |
---|---|
date | Fri, 28 Sep 2012 12:14:35 +0200 |
parents | b2ea89a665bc |
children |
comparison
equal
deleted
inserted
replaced
2987:98c7a46ec5ae | 3318:dbe2f85bf160 |
---|---|
1 package de.intevation.flys.exports; | |
2 | |
3 import org.jfree.data.Range; | |
4 import org.jfree.data.xy.XYDataset; | |
5 import org.jfree.data.xy.XYSeriesCollection; | |
6 import org.jfree.data.time.RegularTimePeriod; | |
7 import org.jfree.data.time.TimeSeriesCollection; | |
8 import org.jfree.data.time.TimeSeries; | |
9 | |
10 import org.apache.log4j.Logger; | |
11 | |
12 import de.intevation.flys.jfree.Bounds; | |
13 import de.intevation.flys.jfree.DoubleBounds; | |
14 import de.intevation.flys.jfree.TimeBounds; | |
15 | |
16 | |
17 /** | |
18 * @author <a href="mailto:ingo.weinzierl@intevation.de">Ingo Weinzierl</a> | |
19 */ | |
20 public class ChartHelper { | |
21 | |
22 private static final Logger logger = Logger.getLogger(ChartHelper.class); | |
23 | |
24 | |
25 /** | |
26 * This method returns the ranges of the XYDataset <i>dataset</i> as array | |
27 * with [xrange, yrange]. | |
28 * | |
29 * @param dataset The dataset which should be evaluated. | |
30 * | |
31 * @return an array with x and y ranges. | |
32 */ | |
33 public static Bounds[] getBounds(XYSeriesCollection dataset) { | |
34 int seriesCount = dataset != null ? dataset.getSeriesCount() : 0; | |
35 | |
36 if (seriesCount == 0) { | |
37 logger.warn("Dataset is empty or has no Series set."); | |
38 return null; | |
39 } | |
40 | |
41 boolean foundValue = false; | |
42 | |
43 double minX = Double.MAX_VALUE; | |
44 double maxX = -Double.MAX_VALUE; | |
45 double minY = Double.MAX_VALUE; | |
46 double maxY = -Double.MAX_VALUE; | |
47 | |
48 for (int i = 0, m = seriesCount; i < m; i++) { | |
49 for (int j = 0, n = dataset.getItemCount(i); j < n; j++) { | |
50 double x = dataset.getXValue(i, j); | |
51 double y = dataset.getYValue(i, j); | |
52 | |
53 if (Double.isNaN(x) || Double.isNaN(y)) { | |
54 logger.warn("Item " + j + " in Series " + i + " is broken"); | |
55 continue; | |
56 } | |
57 | |
58 foundValue = true; | |
59 | |
60 if (x < minX) { | |
61 minX = x; | |
62 } | |
63 | |
64 if (x > maxX) { | |
65 maxX = x; | |
66 } | |
67 | |
68 if (y < minY) { | |
69 minY = y; | |
70 } | |
71 | |
72 if (y > maxY) { | |
73 maxY = y; | |
74 } | |
75 } | |
76 } | |
77 | |
78 return foundValue | |
79 ? new Bounds[] { | |
80 new DoubleBounds(minX, maxX), | |
81 new DoubleBounds(minY, maxY) } | |
82 : null; | |
83 } | |
84 | |
85 | |
86 public static Bounds[] getBounds(XYDataset dataset) { | |
87 if (dataset instanceof XYSeriesCollection) { | |
88 return getBounds((XYSeriesCollection) dataset); | |
89 } | |
90 else if(dataset instanceof TimeSeriesCollection) { | |
91 return getBounds((TimeSeriesCollection) dataset); | |
92 } | |
93 else { | |
94 logger.warn("Unknown XYDataset instance: " + dataset.getClass()); | |
95 return null; | |
96 } | |
97 } | |
98 | |
99 | |
100 public static Bounds[] getBounds(TimeSeriesCollection collection) { | |
101 int seriesCount = collection != null ? collection.getSeriesCount() : 0; | |
102 | |
103 if (seriesCount == 0) { | |
104 logger.warn("TimeSeriesCollection is empty or has no Series set."); | |
105 return null; | |
106 } | |
107 | |
108 boolean foundValue = false; | |
109 | |
110 long lowerX = Long.MAX_VALUE; | |
111 long upperX = -Long.MAX_VALUE; | |
112 | |
113 double lowerY = Double.MAX_VALUE; | |
114 double upperY = -Double.MAX_VALUE; | |
115 | |
116 for (int i = 0, m = seriesCount; i < m; i++) { | |
117 TimeSeries series = collection.getSeries(i); | |
118 | |
119 for (int j = 0, n = collection.getItemCount(i); j < n; j++) { | |
120 RegularTimePeriod rtp = series.getTimePeriod(j); | |
121 | |
122 if (rtp == null) { | |
123 continue; | |
124 } | |
125 | |
126 foundValue = true; | |
127 | |
128 long start = rtp.getFirstMillisecond(); | |
129 long end = rtp.getLastMillisecond(); | |
130 | |
131 if (start < lowerX) { | |
132 lowerX = start; | |
133 } | |
134 | |
135 if (end > upperX) { | |
136 upperX = end; | |
137 } | |
138 | |
139 double y = series.getValue(j).doubleValue(); | |
140 | |
141 lowerY = Math.min(lowerY, y); | |
142 upperY = Math.max(upperY, y); | |
143 } | |
144 } | |
145 | |
146 if (foundValue) { | |
147 return new Bounds[] { | |
148 new TimeBounds(lowerX, upperX), | |
149 new DoubleBounds(lowerY, upperY) | |
150 }; | |
151 } | |
152 | |
153 return null; | |
154 } | |
155 | |
156 | |
157 /** | |
158 * Expand bounds by percent. | |
159 * | |
160 * @param bounds The bounds to expand. | |
161 * @param percent The percentage to expand. | |
162 * | |
163 * @return a new, expanded bounds. | |
164 */ | |
165 public static Bounds expandBounds(Bounds bounds, double percent) { | |
166 if (bounds == null) { | |
167 return null; | |
168 } | |
169 | |
170 double value = (Double) bounds.getLower(); | |
171 double expand = Math.abs(value / 100 * percent); | |
172 | |
173 return expand != 0 | |
174 ? new DoubleBounds(value-expand, value+expand) | |
175 : new DoubleBounds(-0.01 * percent, 0.01 * percent); | |
176 } | |
177 | |
178 | |
179 /** | |
180 * Expand range by percent. | |
181 * | |
182 * @param range The range to expand. | |
183 * @param percent The percentage to expand. | |
184 * | |
185 * @return a new, expanded range. | |
186 */ | |
187 public static Range expandRange(Range range, double percent) { | |
188 if (range == null) { | |
189 return null; | |
190 } | |
191 | |
192 double value = range.getLowerBound(); | |
193 double expand = Math.abs(value / 100 * percent); | |
194 | |
195 return expand != 0 | |
196 ? new Range(value-expand, value+expand) | |
197 : new Range(-0.01 * percent, 0.01 * percent); | |
198 } | |
199 } | |
200 // vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 : |