view artifacts/src/main/java/org/dive4elements/river/artifacts/model/minfo/BedHeightMinMaxFacet.java @ 8964:45f1ad66560e

Code cleanup concerning calculations: improved error handling; improved interpolation; bed heights are now always used for spatial discretisation
author gernotbelger
date Thu, 29 Mar 2018 15:48:17 +0200
parents 8a1c6e2ad48b
children
line wrap: on
line source
/* Copyright (C) 2011, 2012, 2013 by Bundesanstalt für Gewässerkunde
 * Software engineering by Intevation GmbH
 *
 * 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.model.minfo;

import java.util.List;

import org.dive4elements.artifacts.Artifact;
import org.dive4elements.artifacts.CallContext;
import org.dive4elements.river.artifacts.D4EArtifact;
import org.dive4elements.river.artifacts.access.BedHeightAccess;
import org.dive4elements.river.artifacts.model.BlackboardDataFacet;
import org.dive4elements.river.artifacts.model.FacetTypes;
import org.dive4elements.river.artifacts.resources.Resources;
import org.dive4elements.river.model.BedHeight;
import org.dive4elements.river.model.BedHeightValue;
import org.dive4elements.river.model.BedHeightValueType;

import gnu.trove.TDoubleArrayList;

/**
 * More or less the same as {@link BedHeightFacet}, but was necessary to copy because else we break the old
 * serialization.
 *
 * @author Gernot Belger
 */
public class BedHeightMinMaxFacet extends BlackboardDataFacet implements FacetTypes {

    private static final long serialVersionUID = 1L;

    private final BedHeightValueType valueType;

    public BedHeightMinMaxFacet(final String name, final String description, final BedHeightValueType valueType) {
        super(0, name, description);

        this.valueType = valueType;

        this.metaData.put("X", "chart.longitudinal.section.xaxis.label");
        this.metaData.put("Y", "chart.bedheight_middle.section.yaxis.label");
    }

    /**
     * Returns the data this facet requires.
     *
     * @param artifact
     *            the owner artifact.
     * @param context
     *            the CallContext (ignored).
     *
     * @return the data.
     */
    @Override
    public Object getData(final Artifact artifact, final CallContext context) {

        final BedHeightAccess access = new BedHeightAccess((D4EArtifact) artifact);

        final BedHeight single = BedHeight.getBedHeightById(access.getHeightId());

        final List<BedHeightValue> bedheightValues = BedHeightValue.getBedHeightValues(single, access.getFrom(true), access.getTo(true));

        final TDoubleArrayList stations = new TDoubleArrayList(bedheightValues.size());
        final TDoubleArrayList values = new TDoubleArrayList(bedheightValues.size());

        for (final BedHeightValue bedheightValue : bedheightValues) {

            final Double station = bedheightValue.getStation();
            final Double value = this.valueType.getValue(bedheightValue);

            if (station != null && value != null) {
                stations.add(station);
                values.add(value);
            }
        }

        this.addMetaData(Resources.getMsg(context.getMeta(), "meta.bedheight.cur.elevation"), single.getCurElevationModel().getName());

        if (single.getOldElevationModel() != null)
            this.addMetaData(Resources.getMsg(context.getMeta(), "meta.bedheight.old.elevation"), single.getOldElevationModel().getName());

        this.addMetaData(Resources.getMsg(context.getMeta(), "meta.bedheight.river.elevation"), access.getRiver().getWstUnit().getName());

        return new double[][] { stations.toNativeArray(), values.toNativeArray() };
    }

    /**
     * Create a deep copy of this Facet.
     *
     * @return a deep copy.
     */
    @Override
    public BedHeightMinMaxFacet deepCopy() {
        final BedHeightMinMaxFacet copy = new BedHeightMinMaxFacet(this.name, this.description, this.valueType);
        copy.set(this);
        return copy;
    }
}

http://dive4elements.wald.intevation.org