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