Mercurial > dive4elements > river
comparison flys-artifacts/src/main/java/de/intevation/flys/artifacts/CrossSectionArtifact.java @ 2120:f021080cb409
Use improved caching for cross section lines data.
flys-artifacts/trunk@3690 c6561f87-3c4e-4783-a992-168aeb5c3f6f
author | Sascha L. Teichmann <sascha.teichmann@intevation.de> |
---|---|
date | Mon, 16 Jan 2012 17:38:39 +0000 |
parents | cd9bcdcf6597 |
children | d626ae185305 |
comparison
equal
deleted
inserted
replaced
2119:dc28ea60b53d | 2120:f021080cb409 |
---|---|
1 package de.intevation.flys.artifacts; | 1 package de.intevation.flys.artifacts; |
2 | 2 |
3 import java.util.ArrayList; | 3 import java.util.ArrayList; |
4 import java.util.List; | 4 import java.util.List; |
5 import java.util.NavigableMap; | |
5 | 6 |
6 import org.apache.log4j.Logger; | 7 import org.apache.log4j.Logger; |
7 | 8 |
8 import org.w3c.dom.Document; | 9 import org.w3c.dom.Document; |
9 | 10 |
10 import de.intevation.artifacts.Artifact; | 11 import de.intevation.artifacts.Artifact; |
11 import de.intevation.artifacts.ArtifactFactory; | 12 import de.intevation.artifacts.ArtifactFactory; |
12 import de.intevation.artifacts.CallMeta; | 13 import de.intevation.artifacts.CallMeta; |
13 | 14 |
14 import de.intevation.flys.artifacts.model.CrossSectionFacet; | 15 import de.intevation.flys.artifacts.model.CrossSectionFacet; |
16 import de.intevation.flys.artifacts.model.FastCrossSectionLine; | |
17 import de.intevation.flys.artifacts.model.FastCrossSectionLineFactory; | |
15 | 18 |
16 import de.intevation.flys.model.CrossSection; | 19 import de.intevation.flys.model.CrossSection; |
17 import de.intevation.flys.model.CrossSectionLine; | 20 import de.intevation.flys.model.CrossSectionLine; |
18 import de.intevation.flys.artifacts.model.CrossSectionFactory; | 21 import de.intevation.flys.artifacts.model.CrossSectionFactory; |
19 import de.intevation.artifacts.common.ArtifactNamespaceContext; | 22 import de.intevation.artifacts.common.ArtifactNamespaceContext; |
23 | 26 |
24 import de.intevation.artifactdatabase.state.Facet; | 27 import de.intevation.artifactdatabase.state.Facet; |
25 import de.intevation.artifactdatabase.state.State; | 28 import de.intevation.artifactdatabase.state.State; |
26 | 29 |
27 import de.intevation.flys.utils.FLYSUtils; | 30 import de.intevation.flys.utils.FLYSUtils; |
31 | |
32 import de.intevation.flys.artifacts.services.CrossSectionKMService; | |
28 | 33 |
29 | 34 |
30 /** | 35 /** |
31 * Artifact describing a cross-section. | 36 * Artifact describing a cross-section. |
32 */ | 37 */ |
88 else { | 93 else { |
89 throw new IllegalArgumentException("No attribute 'ids' found!"); | 94 throw new IllegalArgumentException("No attribute 'ids' found!"); |
90 } | 95 } |
91 | 96 |
92 List<Facet> fs = new ArrayList<Facet>(); | 97 List<Facet> fs = new ArrayList<Facet>(); |
93 CrossSection cs = CrossSectionFactory.getCrossSection(Integer.valueOf(ids)); | 98 CrossSection cs = CrossSectionFactory.getCrossSection( |
94 CrossSectionLine csl = cs.getLines().get(0); | 99 Integer.valueOf(ids)); |
95 // Find min-km of cross sections, than set DATA_KM to min(DATA_KM, minCross). | 100 |
96 if (csl != null) { | 101 List<CrossSectionLine> csls = cs.getLines(); |
102 if (!csls.isEmpty()) { | |
103 CrossSectionLine csl = csls.get(0); | |
104 // Find min-km of cross sections, | |
105 // then set DATA_KM to min(DATA_KM, minCross). | |
97 double masterKm = Double.valueOf(getDataAsString(DATA_KM)); | 106 double masterKm = Double.valueOf(getDataAsString(DATA_KM)); |
98 if (masterKm < csl.getKm().doubleValue()) { | 107 if (masterKm < csl.getKm().doubleValue()) { |
99 addStringData(DATA_KM, csl.getKm().toString()); | 108 addStringData(DATA_KM, csl.getKm().toString()); |
100 } | 109 } |
101 } | 110 } |
220 * in the form {{x1, x2} {y1, y2}} ). | 229 * in the form {{x1, x2} {y1, y2}} ). |
221 */ | 230 */ |
222 public double [][] getCrossSectionData() { | 231 public double [][] getCrossSectionData() { |
223 logger.info("getCrossSectionData() for cross_section.km " | 232 logger.info("getCrossSectionData() for cross_section.km " |
224 + getDataAsString(DATA_KM)); | 233 + getDataAsString(DATA_KM)); |
225 CrossSectionLine line = searchCrossSectionLine(); | 234 FastCrossSectionLine line = searchCrossSectionLine(); |
226 | 235 |
227 return line != null | 236 return line != null |
228 ? line.fetchCrossSectionProfile() | 237 ? line.fetchCrossSectionProfile() |
229 : null; | 238 : null; |
230 } | 239 } |
234 * Get CrossSectionLine spatially closest to what is specified in the data | 243 * Get CrossSectionLine spatially closest to what is specified in the data |
235 * "cross_section.km". | 244 * "cross_section.km". |
236 * | 245 * |
237 * @return CrossSectionLine closest to "cross_section.km". | 246 * @return CrossSectionLine closest to "cross_section.km". |
238 */ | 247 */ |
239 public CrossSectionLine searchCrossSectionLine() { | 248 public FastCrossSectionLine searchCrossSectionLine() { |
240 double wishKM = getKm(); | 249 |
241 | 250 CrossSection crossSection = CrossSectionFactory |
242 CrossSection crossSection = CrossSectionFactory.getCrossSection(getDBID()); | 251 .getCrossSection(getDBID()); |
243 logger.debug("dbid " + getDBID() + " : " + crossSection); | 252 |
244 List<CrossSectionLine> crossSectionLines = | 253 if (logger.isDebugEnabled()) { |
245 crossSection.getLines(); | 254 logger.debug("dbid " + getDBID() + " : " + crossSection); |
246 | 255 } |
247 // Get the cross section closest to requested km. | 256 |
248 // Naive, linear approach. | 257 NavigableMap<Double, Integer> kms = CrossSectionKMService |
249 CrossSectionLine oldLine = crossSectionLines.get(0); | 258 .getKms(crossSection.getId()); |
250 double oldDiff = Math.abs(wishKM - oldLine.getKm().doubleValue()); | 259 |
251 for (CrossSectionLine line: crossSectionLines) { | 260 Double wishKM = getKm(); |
252 double diff = Math.abs(wishKM - line.getKm().doubleValue()); | 261 |
253 if (diff > oldDiff) { | 262 Double floor = kms.floorKey(wishKM); |
254 break; | 263 Double ceil = kms.ceilingKey(wishKM); |
255 } | 264 |
256 oldDiff = diff; | 265 double floorD = floor != null |
257 oldLine = line; | 266 ? Math.abs(floor - wishKM) |
258 } | 267 : Double.MAX_VALUE; |
259 return oldLine; | 268 |
269 double ceilD = ceil != null | |
270 ? Math.abs(ceil - wishKM) | |
271 : Double.MAX_VALUE; | |
272 | |
273 double km = floorD < ceilD ? floor : ceil; | |
274 | |
275 return FastCrossSectionLineFactory | |
276 .getCrossSectionLine(crossSection, km); | |
260 } | 277 } |
261 | 278 |
262 | 279 |
263 /** | 280 /** |
264 * Determines Facets initial disposition regarding activity (think of | 281 * Determines Facets initial disposition regarding activity (think of |