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 :

http://dive4elements.wald.intevation.org