Mercurial > dive4elements > river
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 : |