mschaefer@8898: /* Copyright (C) 2017 by Bundesanstalt für Gewässerkunde mschaefer@8898: * Software engineering by mschaefer@8898: * Björnsen Beratende Ingenieure GmbH mschaefer@8898: * Dr. Schumacher Ingenieurbüro für Wasser und Umwelt mschaefer@8898: * mschaefer@8898: * This file is Free Software under the GNU AGPL (>=v3) mschaefer@8898: * and comes with ABSOLUTELY NO WARRANTY! Check out the mschaefer@8898: * documentation coming with Dive4Elements River for details. mschaefer@8898: */ mschaefer@8898: mschaefer@8898: package org.dive4elements.river.artifacts.sinfo.flowdepth; mschaefer@8898: mschaefer@8898: import java.util.ArrayList; mschaefer@8898: import java.util.List; mschaefer@8898: mschaefer@8898: import org.apache.commons.lang.math.DoubleRange; mschaefer@8898: import org.apache.commons.math.ArgumentOutsideDomainException; mschaefer@8898: import org.apache.log4j.Logger; mschaefer@8898: import org.dive4elements.river.model.River; mschaefer@8898: mschaefer@8898: import gnu.trove.TDoubleArrayList; mschaefer@8898: mschaefer@8898: /** mschaefer@8898: * @author matthias mschaefer@8898: * mschaefer@8898: */ mschaefer@8898: public class SoilKindKmValueFinder mschaefer@8898: { mschaefer@8898: /** mschaefer@8898: * Private log to use here. mschaefer@8898: */ mschaefer@8898: private static Logger log = Logger.getLogger(SoilKindKmValueFinder.class); mschaefer@8898: mschaefer@8898: private TDoubleArrayList kms; mschaefer@8898: mschaefer@8898: private List values; mschaefer@8898: mschaefer@8898: /***** METHODS *****/ mschaefer@8898: mschaefer@8898: /** mschaefer@8898: * Searches a km with its soil kind mschaefer@8898: */ mschaefer@8898: public SoilKind findSoilKind(double km) throws ArgumentOutsideDomainException { mschaefer@8898: if ((kms == null) || (kms.size() == 0)) mschaefer@8898: throw new ArgumentOutsideDomainException(km, Double.NaN, Double.NaN); mschaefer@8898: int i = kms.binarySearch(km); mschaefer@8898: if (i >= 0) { mschaefer@8898: // Exact km match mschaefer@8898: return values.get(i); mschaefer@8898: } mschaefer@8898: else { mschaefer@8898: // Out of range or within km interval mschaefer@8898: if (i < 0) mschaefer@8898: i = -i - 1; mschaefer@8898: if ((i <= 0) || (i >= kms.size())) mschaefer@8898: throw new ArgumentOutsideDomainException(km, Double.NaN, Double.NaN); mschaefer@8898: if (km <= ((kms.get(i-1) + kms.get(i)) / 2)) mschaefer@8898: return values.get(i-1); mschaefer@8898: else mschaefer@8898: return values.get(i); mschaefer@8898: } mschaefer@8898: } mschaefer@8898: mschaefer@8898: /** mschaefer@8898: * Loads the range of the river's kms with their soil kind. mschaefer@8898: * @return Whether the load has been successful mschaefer@8898: */ mschaefer@8898: public boolean loadValues(River river, DoubleRange kmRange) { mschaefer@8898: kms = new TDoubleArrayList(); mschaefer@8898: values = new ArrayList(); mschaefer@8898: //FIXME Echte Daten aus der Datenbank abfragen mschaefer@8898: addKmKind(0, SoilKind.starr); mschaefer@8898: addKmKind(15.7, SoilKind.mobil); mschaefer@8898: addKmKind(15.8, SoilKind.mobil); mschaefer@8898: addKmKind(15.9, SoilKind.starr); mschaefer@8898: addKmKind(108.7, SoilKind.mobil); mschaefer@8898: addKmKind(108.8, SoilKind.mobil); mschaefer@8898: addKmKind(108.9, SoilKind.starr); mschaefer@8898: addKmKind(119.1, SoilKind.mobil); mschaefer@8898: addKmKind(119.4, SoilKind.mobil); mschaefer@8898: addKmKind(119.5, SoilKind.starr); mschaefer@8898: addKmKind(128.3, SoilKind.mobil); mschaefer@8898: addKmKind(128.9, SoilKind.mobil); mschaefer@8898: addKmKind(129, SoilKind.starr); mschaefer@8898: addKmKind(133.1, SoilKind.mobil); mschaefer@8898: addKmKind(135.9, SoilKind.mobil); mschaefer@8898: addKmKind(136, SoilKind.starr); mschaefer@8898: addKmKind(136.5, SoilKind.mobil); mschaefer@8898: addKmKind(139.9, SoilKind.mobil); mschaefer@8898: addKmKind(140, SoilKind.starr); mschaefer@8898: addKmKind(140.5, SoilKind.mobil); mschaefer@8898: addKmKind(165, SoilKind.mobil); mschaefer@8898: addKmKind(165.1, SoilKind.starr); mschaefer@8898: addKmKind(165.9, SoilKind.mobil); mschaefer@8898: addKmKind(180.8, SoilKind.mobil); mschaefer@8898: addKmKind(180.9, SoilKind.starr); mschaefer@8898: addKmKind(182, SoilKind.mobil); mschaefer@8898: addKmKind(221.3, SoilKind.mobil); mschaefer@8898: return true; mschaefer@8898: } mschaefer@8898: mschaefer@8898: private void addKmKind(double km, SoilKind kind) { mschaefer@8898: kms.add(km); mschaefer@8898: values.add(kind); mschaefer@8898: } mschaefer@8898: }