Mercurial > dive4elements > river
view flys-artifacts/src/main/java/de/intevation/flys/artifacts/access/RangeAccess.java @ 5515:87dab419b924
Properly handle hydr_boundaries and hydr_boundaries_poly in datacage
This also fixes hydr_boundaries_poly which refered to the wrong
table
author | Andre Heinecke <aheinecke@intevation.de> |
---|---|
date | Thu, 28 Mar 2013 17:13:53 +0100 |
parents | 14db045d6368 |
children | 3b12c890b0b2 |
line wrap: on
line source
package de.intevation.flys.artifacts.access; import org.apache.log4j.Logger; import gnu.trove.TDoubleArrayList; import de.intevation.artifacts.CallContext; import de.intevation.flys.artifacts.FLYSArtifact; import de.intevation.flys.artifacts.WINFOArtifact; import de.intevation.flys.utils.FLYSUtils; /** For the moment, light-weight wrapper around FLYSUtils. */ // TODO employ 'Caching' like other Accesses, remove usage of FLYSUtils. public class RangeAccess extends RiverAccess { private static Logger logger = Logger.getLogger(RangeAccess.class); private CallContext context; public static enum KM_MODE { RANGE, LOCATIONS, NONE }; double[] kmRange; Double from; Double to; Double step; private KM_MODE mode; public RangeAccess(FLYSArtifact artifact, CallContext context) { super(artifact); this.context = context; } /** Evaluate the ld_mode data of artifact. */ public KM_MODE getKmRangeMode() { if (mode != null) { return mode; } String modeData = getString("ld_mode"); if (modeData == null || modeData.length() == 0) { mode = KM_MODE.NONE; } else if (modeData.equals("distance")) { mode = KM_MODE.RANGE; } else if (modeData.equals("locations")) { mode = KM_MODE.LOCATIONS; } else { mode = KM_MODE.NONE; } return mode; } /** * Return sorted array of locations at which stuff was calculated * (from ld_locations data), null if not parameterized this way. */ public double[] getLocations() { String locationStr = getString("ld_locations"); if (locationStr == null || locationStr.length() == 0) { if (getArtifact() instanceof WINFOArtifact) { WINFOArtifact winfo = (WINFOArtifact) getArtifact(); if (winfo.getReferenceStartKm() != null && winfo.getReferenceEndKms() != null) { return new double[] { winfo.getReferenceStartKm().doubleValue(), winfo.getReferenceEndKms()[0] }; } } return null; } String[] tmp = locationStr.split(" "); TDoubleArrayList locations = new TDoubleArrayList(); for (String l: tmp) { try { locations.add(Double.parseDouble(l)); } catch (NumberFormatException nfe) { logger.debug(nfe.getLocalizedMessage(), nfe); } } locations.sort(); return locations.toNativeArray(); } /** Return ld_from data (in km). */ public double getFrom() { if (from == null) { from = getDouble("ld_from"); } if (logger.isDebugEnabled()) { logger.debug("from: '" + from + "'"); } return from.doubleValue(); } /** Return ld_to data (in km). */ public double getTo() { if (to == null) { to = getDouble("ld_to"); } if (logger.isDebugEnabled()) { logger.debug("to: '" + to + "'"); } return to.doubleValue(); } /** Step width for calculation. */ public Double getStep() { if (step == null) { step = getDouble("ld_step"); } if (logger.isDebugEnabled()) { logger.debug("step: '" + step + "'"); } return step; } /** * Get min and max kilometer, independent of parametization * (ld_from/to vs ld_locations). */ public double[] getKmRange() { // TODO store kmRange in field. switch (getKmRangeMode()) { case RANGE: { return getKmFromTo(); } case LOCATIONS: { double[] locs = getLocations(); // if no locations, nPE. if (locs == null) { logger.warn("no locations to get km range from."); return new double[] { Double.NaN, Double.NaN }; } return new double[] { locs[0], locs[locs.length-1] }; } case NONE: { double[] locs = getLocations(); if (locs != null) { return new double[] { locs[0], locs[locs.length-1] }; } else { return getKmFromTo(); } } } return new double[] { Double.NaN, Double.NaN }; } public double[] getKmFromTo() { return FLYSUtils.getKmFromTo(this.getArtifact()); } } // vim:set ts=4 sw=4 si et sta sts=4 fenc=utf-8 :