gernotbelger@8850: /** Copyright (C) 2017 by Bundesanstalt für Gewässerkunde mschaefer@9295: * Software engineering by mschaefer@9295: * 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 { mschaefer@9295: private final List gauges; gernotbelger@8850: mschaefer@9295: private Gauge lastGauge = null; gernotbelger@8850: mschaefer@9295: public GaugeIndex(final List gauges) { mschaefer@9295: this.gauges = gauges; mschaefer@9295: } mschaefer@9295: mschaefer@9295: public Gauge findGauge(final double km) { mschaefer@9295: mschaefer@9295: // REMARK: this is code copied from WaterlevelExporter, which is honestly not very fast/good. mschaefer@9295: // Instead we need to index by range with an RTree and directly acccess the right gauge. mschaefer@9295: mschaefer@9295: if( this.lastGauge != null && this.lastGauge.getRange().contains(km) ) mschaefer@9295: return this.lastGauge; mschaefer@9295: mschaefer@9295: final Gauge gauge = findGauge(km, this.gauges); mschaefer@9295: mschaefer@9295: this.lastGauge = gauge; mschaefer@9295: gernotbelger@8850: return gauge; mschaefer@9295: } mschaefer@9295: mschaefer@9295: private static Gauge findGauge(final double km, final List gauges) { mschaefer@9295: for (final Gauge gauge: gauges) { gernotbelger@8850: if (gauge.getRange().contains(km)) { gernotbelger@8850: return gauge; gernotbelger@8850: } gernotbelger@8850: } gernotbelger@8850: return null; gernotbelger@8850: } mschaefer@9295: mschaefer@9295: public List getGauges() { mschaefer@9295: return this.gauges; mschaefer@9295: } gernotbelger@8850: }