gernotbelger@8850: /** Copyright (C) 2017 by Bundesanstalt für Gewässerkunde gernotbelger@8850: * Software engineering by gernotbelger@8850: * Björnsen Beratende Ingenieure GmbH gernotbelger@8850: * Dr. Schumacher Ingenieurbüro für Wasser und Umwelt gernotbelger@8850: * gernotbelger@8850: * This file is Free Software under the GNU AGPL (>=v3) gernotbelger@8850: * and comes with ABSOLUTELY NO WARRANTY! Check out the gernotbelger@8850: * documentation coming with Dive4Elements River for details. gernotbelger@8850: */ gernotbelger@8850: package org.dive4elements.river.utils; gernotbelger@8850: gernotbelger@8850: import java.util.List; gernotbelger@8850: gernotbelger@8850: import org.dive4elements.river.model.Gauge; gernotbelger@8850: gernotbelger@8850: /** gernotbelger@8850: * Allows performant access to gauges by station. gernotbelger@8850: * @author Gernot Belger gernotbelger@8850: */ gernotbelger@8850: public class GaugeIndex { gernotbelger@8850: private List gauges; gernotbelger@8850: gernotbelger@8850: private Gauge lastGauge = null; gernotbelger@8850: gernotbelger@8850: public GaugeIndex( List gauges) { gernotbelger@8850: this.gauges = gauges; gernotbelger@8850: } gernotbelger@8850: gernotbelger@8850: public Gauge findGauge(double km) { gernotbelger@8850: gernotbelger@8850: // REMARK: this is code copied from WaterlevelExporter, which is honestly not very fast/good. gernotbelger@8850: // Instead we need to index by range with an RTree and directly acccess the right gauge. gernotbelger@8850: gernotbelger@8850: if( lastGauge != null && lastGauge.getRange().contains(km) ) gernotbelger@8850: return lastGauge; gernotbelger@8850: gernotbelger@8850: final Gauge gauge = findGauge(km, gauges); gernotbelger@8850: gernotbelger@8850: lastGauge = gauge; gernotbelger@8850: gernotbelger@8850: return gauge; gernotbelger@8850: } gernotbelger@8850: gernotbelger@8850: private static Gauge findGauge(double km, List gauges) { gernotbelger@8850: for (Gauge gauge: gauges) { gernotbelger@8850: if (gauge.getRange().contains(km)) { gernotbelger@8850: return gauge; gernotbelger@8850: } gernotbelger@8850: } gernotbelger@8850: return null; gernotbelger@8850: } gernotbelger@8850: }