mschaefer@9400: /** Copyright (C) 2017 by Bundesanstalt für Gewässerkunde mschaefer@9400: * Software engineering by mschaefer@9400: * Björnsen Beratende Ingenieure GmbH mschaefer@9400: * Dr. Schumacher Ingenieurbüro für Wasser und Umwelt mschaefer@9400: * mschaefer@9400: * This file is Free Software under the GNU AGPL (>=v3) mschaefer@9400: * and comes with ABSOLUTELY NO WARRANTY! Check out the mschaefer@9400: * documentation coming with Dive4Elements River for details. mschaefer@9400: */ mschaefer@9400: package org.dive4elements.river.artifacts.sinfo.tkhstate; mschaefer@9400: mschaefer@9400: import java.util.Collection; mschaefer@9400: import java.util.TreeSet; mschaefer@9400: mschaefer@9400: import org.apache.commons.lang.ArrayUtils; mschaefer@9400: import org.apache.commons.lang.math.DoubleRange; mschaefer@9400: mschaefer@9400: /** mschaefer@9400: * Helper functions for bed height calculations mschaefer@9400: */ mschaefer@9400: public final class BedHeightsUtils { mschaefer@9400: mschaefer@9400: /** mschaefer@9400: * Get a union of all stations in a collection of bed heights mschaefer@9400: */ mschaefer@9400: public static double[] extractStations(final Collection bedHeightFinders) { mschaefer@9400: mschaefer@9400: return extractStations(bedHeightFinders, false); mschaefer@9400: } mschaefer@9400: mschaefer@9400: /** mschaefer@9400: * Get a union of all stations in a collection of bed heights mschaefer@9400: */ mschaefer@9400: public static double[] extractStations(final Collection bedHeightFinders, final boolean minMaxAware) { mschaefer@9400: mschaefer@9400: final Collection allStations = extractStationCollection(bedHeightFinders, minMaxAware); mschaefer@9400: return ArrayUtils.toPrimitive(allStations.toArray(new Double[allStations.size()])); mschaefer@9400: } mschaefer@9400: mschaefer@9400: /** mschaefer@9400: * Get a union of all stations in a collection of bed heights mschaefer@9400: */ mschaefer@9400: public static Collection extractStationCollection(final Collection bedHeightFinders, final boolean minMaxAware) { mschaefer@9400: mschaefer@9400: if (!minMaxAware) mschaefer@9400: return extractStationCollection(bedHeightFinders); mschaefer@9400: mschaefer@9400: final DoubleRange kmRange = extractMinimumStationRange(bedHeightFinders); mschaefer@9400: mschaefer@9400: final Collection allStations = new TreeSet<>(); mschaefer@9400: for (final BedHeightsFinder bhf : bedHeightFinders) { mschaefer@9400: for (final Double station : bhf.getStations()) mschaefer@9400: if ((station.doubleValue() >= kmRange.getMinimumDouble() - 0.0001) && (station.doubleValue() <= kmRange.getMaximumDouble() + 0.0001)) mschaefer@9400: allStations.add(station.doubleValue()); mschaefer@9400: } mschaefer@9400: return allStations; mschaefer@9400: } mschaefer@9400: mschaefer@9400: /** mschaefer@9400: * Get a union of all stations in a collection of bed heights mschaefer@9400: */ mschaefer@9400: public static Collection extractStationCollection(final Collection bedHeights) { mschaefer@9400: mschaefer@9400: final Collection allStations = new TreeSet<>(); mschaefer@9400: mschaefer@9400: for (final BedHeightsFinder bedHeight : bedHeights) mschaefer@9400: allStations.addAll(bedHeight.getStations()); mschaefer@9400: mschaefer@9400: return allStations; mschaefer@9400: } mschaefer@9400: mschaefer@9400: /** mschaefer@9400: * Intersects all km ranges of a collection of bed heights mschaefer@9400: */ mschaefer@9400: public static DoubleRange extractMinimumStationRange(final Collection bedHeightFinders) { mschaefer@9400: DoubleRange kmRange = null; mschaefer@9400: for (final BedHeightsFinder bhf : bedHeightFinders) mschaefer@9400: kmRange = intersectRanges(kmRange, bhf.getKmRange()); mschaefer@9400: return new DoubleRange(kmRange.getMinimumDouble() - 0.0001, kmRange.getMaximumDouble() + 0.0001); mschaefer@9400: } mschaefer@9400: mschaefer@9400: /** mschaefer@9400: * Creates a range with the minimum overlapping of two ranges mschaefer@9400: */ mschaefer@9400: public static DoubleRange intersectRanges(final DoubleRange a, final DoubleRange b) { mschaefer@9400: if (a == null) mschaefer@9400: return new DoubleRange(b.getMinimumDouble(), b.getMaximumDouble()); mschaefer@9400: if (b == null) mschaefer@9400: return new DoubleRange(a.getMinimumDouble(), a.getMaximumDouble()); mschaefer@9400: return new DoubleRange(Math.max(a.getMinimumDouble(), b.getMinimumDouble()), Math.min(a.getMaximumDouble(), b.getMaximumDouble())); mschaefer@9400: } mschaefer@9400: }