teichmann@5863: /* Copyright (C) 2011, 2012, 2013 by Bundesanstalt für Gewässerkunde teichmann@5863: * Software engineering by Intevation GmbH teichmann@5863: * teichmann@5994: * This file is Free Software under the GNU AGPL (>=v3) teichmann@5863: * and comes with ABSOLUTELY NO WARRANTY! Check out the teichmann@5994: * documentation coming with Dive4Elements River for details. teichmann@5863: */ teichmann@5863: teichmann@5831: package org.dive4elements.river.artifacts.model; sascha@2119: sascha@2119: import java.util.List; sascha@2119: import java.util.Collections; sascha@2119: sascha@2119: import java.io.Serializable; sascha@2119: teichmann@5831: import org.dive4elements.river.model.CrossSection; sascha@2119: teichmann@5831: import org.dive4elements.river.model.FastCrossSectionLine; sascha@2126: sascha@2126: import org.apache.log4j.Logger; sascha@2126: sascha@2119: public class FastCrossSectionChunk sascha@2119: implements Serializable sascha@2119: { sascha@2126: private static Logger log = Logger.getLogger(FastCrossSectionChunk.class); sascha@2126: sascha@2119: public static final String PREFIX = "FCSC:"; sascha@2119: public static final double KM_RANGE = 1.0; sascha@2119: sascha@2119: protected double startKm; sascha@2119: protected int crossSectionId; sascha@2119: sascha@2119: protected List crossSectionLines; sascha@2119: sascha@2119: public FastCrossSectionChunk() { sascha@2119: } sascha@2119: sascha@2119: public FastCrossSectionChunk(CrossSection cs, double km) { sascha@2119: sascha@2119: crossSectionId = cs.getId(); sascha@2119: startKm = Math.floor(km); sascha@2119: double stopKm = startKm + KM_RANGE; sascha@2119: sascha@2126: long startTime = System.currentTimeMillis(); sascha@2119: sascha@2126: crossSectionLines = cs.getFastLines(startKm, stopKm); sascha@2119: sascha@2126: long stopTime = System.currentTimeMillis(); sascha@2126: sascha@2126: if (log.isDebugEnabled()) { sascha@3076: log.debug("Fetching cross section lines took " + sascha@2126: (float)(stopTime-startTime)/1000f + " secs."); sascha@2119: } sascha@2119: } sascha@2119: felix@6265: /** Finds the FastCrossSectionLine at km (null if not found). */ sascha@2119: public FastCrossSectionLine getCrossSectionLine(double km) { sascha@2119: FastCrossSectionLine key = new FastCrossSectionLine(km); felix@6266: Collections.sort(crossSectionLines, FastCrossSectionLine.KM_CMP); sascha@2119: int pos = Collections.binarySearch( sascha@2119: crossSectionLines, key, FastCrossSectionLine.KM_CMP); sascha@2119: return pos < 0 ? null : crossSectionLines.get(pos); sascha@2119: } sascha@2119: sascha@2119: public static String createHashKey(CrossSection cs, double km) { sascha@2119: return PREFIX + cs.getId() + ":" + (int)Math.floor(km); sascha@2119: } sascha@2119: sascha@2119: public String getHashKey() { sascha@2119: return PREFIX + crossSectionId + ":" + (int)Math.floor(startKm); sascha@2119: } sascha@2119: sascha@2119: public double getStartKm() { sascha@2119: return startKm; sascha@2119: } sascha@2119: sascha@2119: public void setStartKm(double startKm) { sascha@2119: this.startKm = startKm; sascha@2119: } sascha@2119: sascha@2119: public double getStopKm() { sascha@2119: return startKm + KM_RANGE; sascha@2119: } sascha@2119: sascha@2119: public int getCrossSectionId() { sascha@2119: return crossSectionId; sascha@2119: } sascha@2119: sascha@2119: public void setCrossSectionId(int crossSectionId) { sascha@2119: this.crossSectionId = crossSectionId; sascha@2119: } sascha@2119: } sascha@2119: // vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 :