Mercurial > dive4elements > gnv-client
comparison gnv-artifacts/src/main/java/de/intevation/gnv/chart/VerticalProfileChart.java @ 340:07a64cfafdf1
Added gap detection in horizontal and vertical profile charts. Distinguish between meshes and other data sources.
gnv-artifacts/trunk@406 c6561f87-3c4e-4783-a992-168aeb5c3f6f
author | Ingo Weinzierl <ingo.weinzierl@intevation.de> |
---|---|
date | Wed, 09 Dec 2009 10:22:20 +0000 |
parents | e964a3d8f7bc |
children | 2413273f1c13 |
comparison
equal
deleted
inserted
replaced
339:02c71ea5c9c8 | 340:07a64cfafdf1 |
---|---|
24 */ | 24 */ |
25 public class VerticalProfileChart | 25 public class VerticalProfileChart |
26 extends AbstractXYLineChart | 26 extends AbstractXYLineChart |
27 { | 27 { |
28 private static Logger log = Logger.getLogger(VerticalProfileChart.class); | 28 private static Logger log = Logger.getLogger(VerticalProfileChart.class); |
29 | |
30 protected final double PERCENTAGE = 5.0; | |
31 protected final double GAP_MAX_LEVEL = Math.sqrt(2.0); | |
32 protected final int GAP_MAX_VALUES = 60; | |
29 | 33 |
30 | 34 |
31 public VerticalProfileChart( | 35 public VerticalProfileChart( |
32 ChartLabels labels, | 36 ChartLabels labels, |
33 ChartTheme theme, | 37 ChartTheme theme, |
65 Iterator iter = resultSet.iterator(); | 69 Iterator iter = resultSet.iterator(); |
66 Result row = null; | 70 Result row = null; |
67 String seriesName = null; | 71 String seriesName = null; |
68 XYSeries series = null; | 72 XYSeries series = null; |
69 | 73 |
70 int idx = 0; | 74 int idx = 0; |
75 int startPos = 0; | |
76 int endPos = 0; | |
77 double startValue = 0; | |
78 double endValue = 0; | |
79 | |
80 Result[] results = | |
81 (Result[]) resultSet.toArray(new Result[resultSet.size()]); | |
71 | 82 |
72 while (iter.hasNext()) { | 83 while (iter.hasNext()) { |
73 row = (Result) iter.next(); | 84 row = (Result) iter.next(); |
74 | 85 |
75 // add current data to plot and prepare for next one | 86 // add current data to plot and prepare for next one |
78 !row.getString("GROUP3").equals(breakPoint3) | 89 !row.getString("GROUP3").equals(breakPoint3) |
79 ) { | 90 ) { |
80 log.debug("prepare data/plot for next dataset"); | 91 log.debug("prepare data/plot for next dataset"); |
81 | 92 |
82 if(series != null) { | 93 if(series != null) { |
94 gapDetection(results, series, startPos, endPos); | |
83 addSeries(series, seriesName, idx); | 95 addSeries(series, seriesName, idx); |
96 | |
97 startPos = endPos +1; | |
84 } | 98 } |
85 | 99 |
86 // prepare variables for next plot | 100 // prepare variables for next plot |
87 breakPoint1 = row.getString("GROUP1"); | 101 breakPoint1 = row.getString("GROUP1"); |
88 breakPoint2 = row.getString("GROUP2"); | 102 breakPoint2 = row.getString("GROUP2"); |
97 log.debug("next dataset is '" + seriesName + "'"); | 111 log.debug("next dataset is '" + seriesName + "'"); |
98 series = new XYSeries(seriesName); | 112 series = new XYSeries(seriesName); |
99 } | 113 } |
100 | 114 |
101 addValue(row, series); | 115 addValue(row, series); |
102 } | 116 endPos++; |
103 | 117 } |
118 | |
119 if (results.length == 0) | |
120 return; | |
121 | |
122 gapDetection(results, series, startPos, endPos); | |
104 addSeries(series, seriesName, idx); | 123 addSeries(series, seriesName, idx); |
105 | 124 |
106 addDatasets(); | 125 addDatasets(); |
107 } | 126 } |
108 | 127 |
109 | 128 |
129 protected void gapDetection( | |
130 Result[] results, | |
131 Series series, | |
132 int startPos, | |
133 int endPos | |
134 ) { | |
135 double startValue = results[startPos].getDouble("XORDINATE"); | |
136 double endValue = results[endPos-1].getDouble("XORDINATE"); | |
137 if (results[0].getInteger("DATAID") == 2) | |
138 addGapsOnGrid(results, series, startPos, endPos); | |
139 else | |
140 addGaps(results, series, startValue, endValue, startPos, endPos); | |
141 } | |
142 | |
143 | |
110 protected void addValue(Result row, Series series) { | 144 protected void addValue(Result row, Series series) { |
111 // TODO look for gaps between two values | |
112 ((XYSeries) series).add( | 145 ((XYSeries) series).add( |
113 row.getDouble("XORDINATE"), | 146 row.getDouble("XORDINATE"), |
114 row.getDouble("YORDINATE") | 147 row.getDouble("YORDINATE") |
115 ); | 148 ); |
116 } | 149 } |
180 return findValueTitle(parameters, breakPoint1) + | 213 return findValueTitle(parameters, breakPoint1) + |
181 " " + | 214 " " + |
182 findValueTitle(measurements, breakPoint2) + | 215 findValueTitle(measurements, breakPoint2) + |
183 "m"; | 216 "m"; |
184 } | 217 } |
218 | |
219 | |
220 protected void addGapsOnGrid( | |
221 Result[] results, | |
222 Series series, | |
223 int startPos, | |
224 int endPos | |
225 ) { | |
226 String axis = getDependendAxisName( | |
227 results[startPos], | |
228 results[startPos+1] | |
229 ); | |
230 double range = 0; | |
231 int last = 0; | |
232 int current = 0; | |
233 | |
234 for (int i = startPos+1; i < endPos; i++) { | |
235 last = results[i-1].getInteger(axis); | |
236 current = results[i].getInteger(axis); | |
237 | |
238 boolean detected = gridDetection(last, current); | |
239 | |
240 if (detected) { | |
241 double xOld = results[i-1].getDouble("XORDINATE"); | |
242 double xNow = results[i].getDouble("XORDINATE"); | |
243 log.debug("Gap detected on grid between "+ xOld +" and "+ xNow); | |
244 ((XYSeries) series).add(xOld+0.0001, null); | |
245 } | |
246 } | |
247 } | |
248 | |
249 | |
250 protected void addGaps( | |
251 Result[] results, | |
252 Series series, | |
253 double startValue, | |
254 double endValue, | |
255 int startPos, | |
256 int endPos | |
257 ) { | |
258 | |
259 double last = 0; | |
260 double current = 0; | |
261 int num = results.length; | |
262 | |
263 for (int i = startPos+1; i < endPos; i++) { | |
264 boolean detected = false; | |
265 | |
266 last = results[i-1].getDouble("YORDINATE"); | |
267 current = results[i].getDouble("YORDINATE"); | |
268 | |
269 // gap detection for more than GAP_MAX_VALUES values | |
270 if (num > GAP_MAX_VALUES) | |
271 detected = simpleDetection(startValue, endValue, last, current); | |
272 // gap detection for less than GAP_MAX_VALUES values | |
273 else | |
274 detected = specialDetection( | |
275 startValue, | |
276 endValue, | |
277 last, | |
278 current, | |
279 num | |
280 ); | |
281 | |
282 if (detected) { | |
283 log.info("Gap between " + last + " and " + current); | |
284 ((XYSeries) series).add((last+current)/2, null); | |
285 } | |
286 } | |
287 } | |
288 | |
289 | |
290 protected boolean simpleDetection( | |
291 double start, | |
292 double end, | |
293 double last, | |
294 double current | |
295 ) { | |
296 double delta = Math.abs(end - start); | |
297 double smallDelta = Math.abs(current - last); | |
298 | |
299 return (smallDelta > delta / 100 * PERCENTAGE); | |
300 } | |
301 | |
302 | |
303 protected boolean specialDetection( | |
304 double start, | |
305 double end, | |
306 double last, | |
307 double current, | |
308 int count | |
309 ) { | |
310 double delta = Math.abs(end - start); | |
311 double smallDelta = Math.abs(current - last); | |
312 | |
313 return (smallDelta > (3.0 / (count - 1) * delta)); | |
314 } | |
315 | |
316 | |
317 protected boolean gridDetection(double last, double current) { | |
318 return (Math.abs(current - last) > GAP_MAX_LEVEL); | |
319 } | |
320 | |
321 | |
322 protected String getDependendAxisName(Result first, Result second) { | |
323 if (first.getInteger("IPOSITION") == second.getInteger("IPOSITION")) | |
324 return "JPOSITION"; | |
325 | |
326 return "IPOSITION"; | |
327 } | |
185 } | 328 } |
186 // vim:set ts=4 sw=4 si et sta sts=4 fenc=utf-8 : | 329 // vim:set ts=4 sw=4 si et sta sts=4 fenc=utf-8 : |