Mercurial > dive4elements > river
diff artifacts/src/main/java/org/dive4elements/river/artifacts/sinfo/common/AbstractSInfoLineProcessor.java @ 8940:82998242ba84
Preparing for additional outputs of SINFO-Tkh
author | gernotbelger |
---|---|
date | Tue, 06 Mar 2018 18:51:18 +0100 |
parents | |
children | 5d5d482da3e9 |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/artifacts/src/main/java/org/dive4elements/river/artifacts/sinfo/common/AbstractSInfoLineProcessor.java Tue Mar 06 18:51:18 2018 +0100 @@ -0,0 +1,99 @@ +/* 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.Map; +import java.util.Set; + +import org.dive4elements.artifactdatabase.state.ArtifactAndFacet; +import org.dive4elements.artifacts.Artifact; +import org.dive4elements.artifacts.CallContext; +import org.dive4elements.river.artifacts.D4EArtifact; +import org.dive4elements.river.artifacts.access.RiverAccess; +import org.dive4elements.river.artifacts.context.RiverContext; +import org.dive4elements.river.artifacts.math.MovingAverage; +import org.dive4elements.river.artifacts.model.ZoomScale; +import org.dive4elements.river.exports.DiagramGenerator; +import org.dive4elements.river.exports.StyledSeriesBuilder; +import org.dive4elements.river.jfree.StyledXYSeries; +import org.dive4elements.river.themes.ThemeDocument; + +abstract class AbstractSInfoLineProcessor extends AbstractSInfoProcessor { + + public AbstractSInfoLineProcessor(final String i18nAxisLabel, final Set<String> handledFacetType) { + super(i18nAxisLabel, handledFacetType); + } + + @Override + protected final String generateSeries(final DiagramGenerator generator, final ArtifactAndFacet bundle, final ThemeDocument theme, final boolean visible) { + + final CallContext context = generator.getCallContext(); + final Map<String, String> metaData = bundle.getFacet().getMetaData(); + + final Artifact artifact = bundle.getArtifact(); + + final StyledXYSeries series = new StyledXYSeries(bundle.getFacetDescription(), theme); + series.putMetaData(metaData, artifact, context); + + final String facetName = bundle.getFacetName(); + final AbstractSInfoCalculationResult<?> data = (AbstractSInfoCalculationResult<?>) bundle.getData(context); + if (data == null) { + // Check has been here before so we keep it for security reasons + // this should never happen though. + throw new IllegalStateException("Data is null for facet: " + facetName); + } + + final double[][] points = generatePoints(context, artifact, data, facetName); + + StyledSeriesBuilder.addPoints(series, points, true); + generator.addAxisSeries(series, getAxisName(), visible); + + return metaData.get("Y"); + } + + private Double findRadius(final CallContext context, final Artifact artifact) { + final Double start = (Double) context.getContextValue("startkm"); + final Double end = (Double) context.getContextValue("endkm"); + + if (start == null || end == null) + return null; + + final RiverContext fc = (RiverContext) context.globalContext(); + final ZoomScale scales = (ZoomScale) fc.get("zoomscale"); + final RiverAccess access = new RiverAccess((D4EArtifact) artifact); + final String river = access.getRiverName(); + + return scales.getRadius(river, start, end); + } + + private double[][] generatePoints(final CallContext context, final Artifact artifact, final AbstractSInfoCalculationResult<?> data, + final String facetName) { + + final double[][] points = doGetPoints(data, facetName); + if( facetName.endsWith(".filtered")) + { + final Double radius = findRadius(context, artifact); + return movingAverage(radius, points); + } + + return points; + } + + protected abstract double[][] doGetPoints(AbstractSInfoCalculationResult<?> data, String facetName); + + private double[][] movingAverage(final Double radius, final double[][] points) { + + if (radius == null) + return points; + + return MovingAverage.weighted(points, radius); + } +} \ No newline at end of file