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

http://dive4elements.wald.intevation.org