8850
|
1 /** Copyright (C) 2017 by Bundesanstalt für Gewässerkunde |
|
2 * Software engineering by |
|
3 * Björnsen Beratende Ingenieure GmbH |
|
4 * Dr. Schumacher Ingenieurbüro für Wasser und Umwelt |
|
5 * |
|
6 * This file is Free Software under the GNU AGPL (>=v3) |
|
7 * and comes with ABSOLUTELY NO WARRANTY! Check out the |
|
8 * documentation coming with Dive4Elements River for details. |
|
9 */ |
|
10 package org.dive4elements.river.utils; |
|
11 |
|
12 import java.util.List; |
|
13 |
|
14 import org.dive4elements.river.model.Gauge; |
|
15 |
|
16 /** |
|
17 * Allows performant access to gauges by station. |
|
18 * @author Gernot Belger |
|
19 */ |
|
20 public class GaugeIndex { |
|
21 private List<Gauge> gauges; |
|
22 |
|
23 private Gauge lastGauge = null; |
|
24 |
|
25 public GaugeIndex( List<Gauge> gauges) { |
|
26 this.gauges = gauges; |
|
27 } |
|
28 |
|
29 public Gauge findGauge(double km) { |
|
30 |
|
31 // REMARK: this is code copied from WaterlevelExporter, which is honestly not very fast/good. |
|
32 // Instead we need to index by range with an RTree and directly acccess the right gauge. |
|
33 |
|
34 if( lastGauge != null && lastGauge.getRange().contains(km) ) |
|
35 return lastGauge; |
|
36 |
|
37 final Gauge gauge = findGauge(km, gauges); |
|
38 |
|
39 lastGauge = gauge; |
|
40 |
|
41 return gauge; |
|
42 } |
|
43 |
|
44 private static Gauge findGauge(double km, List<Gauge> gauges) { |
|
45 for (Gauge gauge: gauges) { |
|
46 if (gauge.getRange().contains(km)) { |
|
47 return gauge; |
|
48 } |
|
49 } |
|
50 return null; |
|
51 } |
|
52 } |