comparison flys-artifacts/src/main/java/de/intevation/flys/artifacts/model/WaterlevelFacet.java @ 3651:06a65baae494

merged flys-artifacts/2.9
author Thomas Arendsen Hein <thomas@intevation.de>
date Fri, 28 Sep 2012 12:14:43 +0200
parents deeda39ef01b
children de6e2b933f33
comparison
equal deleted inserted replaced
3549:6a8f83c538e3 3651:06a65baae494
1 package de.intevation.flys.artifacts.model;
2
3 import de.intevation.artifactdatabase.state.Facet;
4
5 import de.intevation.artifacts.Artifact;
6 import de.intevation.artifacts.CallContext;
7
8 import de.intevation.flys.artifacts.FLYSArtifact;
9
10 import de.intevation.flys.artifacts.states.DefaultState.ComputeType;
11 import de.intevation.flys.artifacts.math.Linear;
12
13 import org.apache.log4j.Logger;
14
15 /**
16 * Facet of a Waterlevel (WQKms).
17 */
18 public class WaterlevelFacet extends DataFacet {
19
20 private static Logger logger = Logger.getLogger(WaterlevelFacet.class);
21
22 public WaterlevelFacet(int index, String name, String description) {
23 super(index, name, description, ComputeType.ADVANCE, null, null);
24 }
25
26 public WaterlevelFacet(
27 int index,
28 String name,
29 String description,
30 ComputeType type,
31 String stateID,
32 String hash
33 ) {
34 super(index, name, description, type, hash, stateID);
35 }
36
37 public WaterlevelFacet() {
38 }
39
40 protected WQKms [] getWQKms(CalculationResult res) {
41 return (WQKms [])res.getData();
42 }
43
44 /**
45 * Get waterlevel data.
46 * @return a WQKms at given index.
47 */
48 public Object getData(Artifact artifact, CallContext context) {
49
50 if (logger.isDebugEnabled()) {
51 logger.debug("Get data for waterlevels at index: " + index +
52 " /stateId: " + stateId);
53 }
54
55 FLYSArtifact winfo = (FLYSArtifact) artifact;
56
57 CalculationResult res = (CalculationResult)
58 winfo.compute(context, hash, stateId, type, false);
59
60 if (res == null) {
61 logger.error("WaterlevelFacet.getData: null result");
62 return null;
63 }
64
65 if (winfo == null) {
66 logger.error("WaterlevelFacet.getData: artifact is null");
67 return null;
68 }
69
70 WQKms [] wqkms = getWQKms(res);
71 Object KM = context.getContextValue("currentKm");
72 if (KM != null) {
73 logger.debug("interpolate at given km");
74 // TODO handle exact match.
75
76 WQKms wqkmsI = wqkms[index];
77 double km = (Double)KM;
78
79 // TODO employ DataUtils interface to TDoubleArraList
80 int size = wqkmsI.size();
81 boolean kmIncreasing = wqkmsI.getKm(0) < wqkmsI.getKm(size-1);
82 int mod = kmIncreasing ? +1 : -1;
83 int idx = 0;
84 if (!kmIncreasing) {
85 while (idx < size && wqkmsI.getKm(idx) < km) {
86 idx++;
87 }
88 }
89 else {
90 idx = size-1;
91 while (idx > 0 && wqkmsI.getKm(idx) > km) {
92 idx--;
93 }
94 }
95 WQKms resultWQKms = new WQKms();
96 if (idx != -1 && idx < size) {
97 double inW = Linear.linear(
98 km,
99 wqkmsI.getKm(idx), wqkmsI.getKm(idx-mod),
100 wqkmsI.getW(idx), wqkmsI.getW(idx-mod));
101 double inQ = Linear.linear(
102 km,
103 wqkmsI.getKm(idx), wqkmsI.getKm(idx-mod),
104 wqkmsI.getQ(idx), wqkmsI.getQ(idx-mod));
105 resultWQKms.add(inW, inQ, km);
106 }
107 return resultWQKms;
108 }
109
110 return wqkms != null ? wqkms[index] : null;
111 }
112
113
114 /** Copy deeply. */
115 @Override
116 public Facet deepCopy() {
117 WaterlevelFacet copy = new WaterlevelFacet();
118 copy.set(this);
119 copy.type = type;
120 copy.hash = hash;
121 copy.stateId = stateId;
122 return copy;
123 }
124 }
125 // vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 :

http://dive4elements.wald.intevation.org