view artifacts/src/main/java/org/dive4elements/river/artifacts/sinfo/common/AbstractTkhCalculationResult.java @ 8980:b194fa64506a

SINFO - show results themes according to spec, either raw data or floating mean values. Some improvements to error handling and handling of empty results.
author gernotbelger
date Thu, 05 Apr 2018 18:30:34 +0200
parents a4f1ac81f26d
children 50cc99579a46
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.common;

import java.util.Collection;
import java.util.List;

import org.dive4elements.river.artifacts.sinfo.tkhcalculation.SoilKind;
import org.dive4elements.river.artifacts.sinfo.util.WstInfo;

import gnu.trove.TDoubleArrayList;

/**
 * @author Gernot Belger
 */
public abstract class AbstractTkhCalculationResult extends AbstractSInfoCalculationResult {

    private static final long serialVersionUID = 1L;

    private final boolean hasTkh;

    public AbstractTkhCalculationResult(final String label, final WstInfo wst, final boolean hasTkh, final Collection<SInfoResultRow> rows) {
        super(label, wst, rows);

        this.hasTkh = hasTkh;
    }

    public final boolean hasTkh() {
        return this.hasTkh;
    }

    public final double[][] getTkhUpPoints() {

        final double[][] points = getStationPoints(SInfoResultType.tkhup);
        final List<SoilKind> kinds = getValues(SInfoResultType.soilkind);

        final double[] xPoints = points[0];
        final double[] yPoints = points[1];

        return adjustTkhVisualization(xPoints, yPoints, kinds);
    }

    public final double[][] getTkhDownPoints() {

        final double[][] points = getStationPoints(SInfoResultType.tkhdown);
        final List<SoilKind> kinds = getValues(SInfoResultType.soilkind);

        final double[] xPoints = points[0];
        final double[] yPoints = points[1];

        return adjustTkhVisualization(xPoints, yPoints, kinds);
    }

    /**
     * the up and down points must be further adjusted for visualization, see Mail Hr. Reiß
     * basically we need to introduce extra points when the kind changes, so we get vertical lines in that case
     */
    private double[][] adjustTkhVisualization(final double[] xPoints, final double[] yPoints, final List<SoilKind> kinds) {

        final TDoubleArrayList adjustedX = new TDoubleArrayList(xPoints.length);
        final TDoubleArrayList adjustedY = new TDoubleArrayList(yPoints.length);

        adjustedX.add(xPoints[0]);
        adjustedY.add(yPoints[0]);

        for (int i = 1; i < xPoints.length; i++) {

            final SoilKind kind1 = kinds.get(i - 1);
            final SoilKind kind2 = kinds.get(i);

            if (kind1 != kind2) {
                /* introduce two extra points in order to create a vertical line in the middle of the two adjacent points */
                final double x1 = xPoints[i - 1];
                final double y1 = yPoints[i - 1];
                final double x2 = xPoints[i];
                final double y2 = yPoints[i];

                final double middleX = (x1 + x2) / 2;

                // REMARK: we can't produce a 100% vertical line, as the area-renderer will not work correctly
                adjustedX.add(middleX - 0.0001);
                adjustedY.add(y1);

                adjustedX.add(middleX + 0.0001);
                adjustedY.add(y2);
            }

            /* always add the real point now */
            adjustedX.add(xPoints[i]);
            adjustedY.add(yPoints[i]);
        }

        return new double[][] { adjustedX.toNativeArray(), adjustedY.toNativeArray() };
    }
}

http://dive4elements.wald.intevation.org