comparison flys-artifacts/src/main/java/de/intevation/flys/artifacts/model/sq/MeasurementFactory.java @ 4004:3b79e8afca7e

S(Q) calculate effective width
author Sascha L. Teichmann <teichmann@intevation.de>
date Mon, 01 Oct 2012 15:51:55 +0200
parents ab3a4ad82ae1
children 22abdc45869c
comparison
equal deleted inserted replaced
4003:4d74a579c5c5 4004:3b79e8afca7e
1 package de.intevation.flys.artifacts.model.sq; 1 package de.intevation.flys.artifacts.model.sq;
2 2
3 import java.util.ArrayList; 3 import java.util.ArrayList;
4 import java.util.Date;
4 import java.util.List; 5 import java.util.List;
5 import java.util.TreeMap; 6 import java.util.TreeMap;
6 7
7 import de.intevation.flys.artifacts.model.DateRange; 8 import de.intevation.flys.artifacts.model.DateRange;
8 9
89 "g.NAME = :river_name " + 90 "g.NAME = :river_name " +
90 "AND m.Q_BPEGEL IS NOT NULL " + 91 "AND m.Q_BPEGEL IS NOT NULL " +
91 "AND s.KM BETWEEN :location - 0.001 AND :location + 0.001 " + 92 "AND s.KM BETWEEN :location - 0.001 AND :location + 0.001 " +
92 "AND m.DATUM BETWEEN :from AND :to " + 93 "AND m.DATUM BETWEEN :from AND :to " +
93 "AND m.TGESCHIEBE IS NOT NULL " + 94 "AND m.TGESCHIEBE IS NOT NULL " +
95 "AND m.DATUM IS NOT NULL " +
94 "AND (" + 96 "AND (" +
95 "COALESCE(gs.RSIEB01, 0) + COALESCE(gs.RSIEB02, 0) +" + 97 "COALESCE(gs.RSIEB01, 0) + COALESCE(gs.RSIEB02, 0) +" +
96 "COALESCE(gs.RSIEB03, 0) + COALESCE(gs.RSIEB04, 0) +" + 98 "COALESCE(gs.RSIEB03, 0) + COALESCE(gs.RSIEB04, 0) +" +
97 "COALESCE(gs.RSIEB05, 0) + COALESCE(gs.RSIEB06, 0) +" + 99 "COALESCE(gs.RSIEB05, 0) + COALESCE(gs.RSIEB06, 0) +" +
98 "COALESCE(gs.RSIEB07, 0) + COALESCE(gs.RSIEB08, 0) +" + 100 "COALESCE(gs.RSIEB07, 0) + COALESCE(gs.RSIEB08, 0) +" +
268 } 270 }
269 271
270 return new Measurements(measuments, accumulated); 272 return new Measurements(measuments, accumulated);
271 } 273 }
272 274
275 protected static List<Measurement> separateByDate(List<Measurement> measurements) {
276
277 List<Measurement> result = new ArrayList<Measurement>();
278
279 List<Measurement> same = new ArrayList<Measurement>();
280
281 Date lastDate = null;
282
283 for (Measurement m: measurements) {
284 Date currentDate = (Date)m.getData("DATUM");
285 if ((lastDate == null
286 || !equalDate(currentDate, lastDate))
287 && !same.isEmpty()
288 ) {
289 result.add(processSameDate(same));
290 same.clear();
291 }
292 same.add(m);
293 lastDate = currentDate;
294 }
295
296 if (!same.isEmpty()) {
297 result.add(processSameDate(same));
298 }
299
300 return result;
301 }
302
303 protected static Measurement processSameDate(List<Measurement> measurements) {
304 int N = measurements.size();
305 if (N == 1) {
306 Measurement current = measurements.get(0);
307 double left = current.get("UFERABLINKS");
308 double right = current.get("UFERABST");
309 current.set("EFFWIDTH", left + right);
310 }
311 else {
312 for (int i = 0; i < N; ++i) {
313 Measurement current = measurements.get(i);
314
315 if (i == 0) {
316 Measurement next = measurements.get(i+1);
317 double distCurrent = current.get("UFERABST");
318 double distNext = next.get("UFERABST");
319 current.set("EFFWIDTH", distNext - distCurrent);
320 }
321 else if (i == N-1) {
322 Measurement prev = measurements.get(i-1);
323 double distCurrent = current.get("UFERABST");
324 double distPrev = prev.get("UFERABST");
325 current.set("EFFWIDTH", distCurrent - distPrev);
326 }
327 else {
328 Measurement prev = measurements.get(i-1);
329 Measurement next = measurements.get(i+1);
330 double distPrev = prev.get("UFERABST");
331 double distNext = next.get("UFERABST");
332 current.set("EFFWIDTH", 0.5*(distNext - distPrev));
333 }
334 }
335 }
336
337 return null;
338 }
339
340
341 private static final boolean equalDate(Date a, Date b) {
342 // TODO: compare only year, month and day.
343 return a.equals(b);
344 }
345
346
273 protected static Measurement accumulate(List<Measurement> measuments) { 347 protected static Measurement accumulate(List<Measurement> measuments) {
274 348
275 int N = measuments.size(); 349 int N = measuments.size();
276 if (N == 1) { 350 if (N == 1) {
277 return measuments.get(0); 351 return measuments.get(0);

http://dive4elements.wald.intevation.org