Mercurial > dive4elements > river
view artifacts/src/main/java/org/dive4elements/river/artifacts/sinfo/tkhstate/DefaultBedHeights.java @ 9706:299c1c61d8ef
zu 1.1. Sohlhöhen-Überlappung
author | dnt_bjoernsen <d.tironi@bjoernsen.de> |
---|---|
date | Fri, 22 Jan 2021 12:28:58 +0100 |
parents | b9c87bbff6a4 |
children | b74f817435fe |
line wrap: on
line source
/** Copyright (C) 2017 by Bundesanstalt für Gewässerkunde * Software engineering by * Björnsen Beratende Ingenieure GmbH * Dr. Schumacher Ingenieurbüro für Wasser und Umwelt * * This file is Free Software under the GNU AGPL (>=v3) * and comes with ABSOLUTELY NO WARRANTY! Check out the * documentation coming with Dive4Elements River for details. */ package org.dive4elements.river.artifacts.sinfo.tkhstate; import java.util.ArrayList; import java.util.Collection; import java.util.Collections; import java.util.List; import org.apache.commons.lang.math.NumberRange; import org.dive4elements.river.artifacts.model.Calculation; import org.dive4elements.river.artifacts.sinfo.tkhstate.DefaultBedHeightsConfig.DefaultBedHeight; import org.dive4elements.river.model.BedHeight; import org.dive4elements.river.model.Range; import org.dive4elements.river.model.River; /** * This class knows how to find the default bed levels defined for tkh and other * calculations * * @author Gernot Belger */ public final class DefaultBedHeights { private final River river; public DefaultBedHeights(final River river) { this.river = river; } public List<BedHeight> getBedHeights(final Calculation problems) { final Collection<DefaultBedHeight> defaults = DefaultBedHeightsConfig.getDefaults(this.river, problems); // check ob jede default-range irgendeine andere überlappt for (DefaultBedHeight check : defaults) { double end = check.endKm > check.startKm ? check.endKm : check.startKm; double start = check.startKm < check.endKm ? check.startKm : check.endKm; for (DefaultBedHeight checkInner : defaults) { if (!checkInner.description.equals(check.description) && (checkInner.startKm < end && checkInner.endKm > start)) problems.addProblem("sinfo.bedheightsfinder.overlappingrange", check.description); } } final List<BedHeight> defaultBedHeights = loadBedHeightsByName(this.river, defaults, problems); if (defaultBedHeights.isEmpty()) { problems.addProblem("sinfo.bedheightsfinder.nobedheightsforriver", this.river.getName()); return Collections.emptyList(); } /* * check for overlapping ranges, N2-search, but we expect only have small * numbers of bed levels */ final List<BedHeight> result = new ArrayList<>(defaultBedHeights.size()); for (int i = 0; i < defaultBedHeights.size(); i++) { final BedHeight bedHeight = defaultBedHeights.get(i); DefaultBedHeight configuredBH = getConfiguredBedheightByDescription(problems, defaults, bedHeight.getDescription()); final double startKm = configuredBH.startKm < configuredBH.endKm ? configuredBH.startKm : configuredBH.endKm; final double endKm = configuredBH.endKm > configuredBH.startKm ? configuredBH.endKm : configuredBH.startKm; // final NumberRange bedRange = new NumberRange(range.getA(), range.getB()); // FIXME: optional: deckt die echte Range (Datenbank) die // konfigurierte Range ab? // copy bedheight and restrict to configured ranges BedHeight rangedBedheight = BedHeight.copyPojoFrom(bedHeight, startKm, endKm); result.add(rangedBedheight); } final List<BedHeight> validBedHeights = new ArrayList<>(defaultBedHeights.size()); // REMARK: check for bad ranges because db schema allow for incomplete ranges, // and ignore if this is the case for (final BedHeight bedHeight : defaultBedHeights) { final Range range = bedHeight.getRange(); if (range.getA() == null || range.getB() == null) problems.addProblem("sinfo.bedheightsfinder.badrange", bedHeight.getDescription()); else validBedHeights.add(bedHeight); } return result; } private DefaultBedHeight getConfiguredBedheightByDescription(Calculation problems, Collection<DefaultBedHeight> defaults, String description) { for (DefaultBedHeight bh : defaults) { if (bh.description.equals(description)) return bh; } problems.addProblem("could not find the configured bedheight, which is not possible", description); return null; } private static List<BedHeight> loadBedHeightsByName(final River river, final Collection<DefaultBedHeight> defaults, final Calculation problems) { final List<BedHeight> bedHeights = new ArrayList<>(defaults.size()); for (final DefaultBedHeight heightDefault : defaults) { final String description = heightDefault.description; try { final BedHeight bedHeight = BedHeight.getBedHeightByDescription(river, description, heightDefault.startKm, heightDefault.endKm); if (bedHeight == null) problems.addProblem("sinfo.bedheightsfinder.missingdescription", river.getName(), description); else bedHeights.add(bedHeight); } catch (final Exception e) { e.printStackTrace(); problems.addProblem("sinfo.bedheightsfinder.missingdescription", river.getName(), description); } } return bedHeights; } /* * this check is replaced by configRangeCheck private static boolean * overlapsRange(final NumberRange bedRange, final List<BedHeight> result, final * int startIndex) { * * for (int i = startIndex; i < result.size(); i++) { * * final BedHeight compareBed = result.get(i); final Range range = * compareBed.getRange(); final NumberRange compareRange = new * NumberRange(range.getA(), range.getB()); * * if (compareRange.overlapsRange(bedRange)) return true; } * * return false; } */ }