diff artifacts/src/main/java/org/dive4elements/river/artifacts/uinfo/vegetationzones/VegetationZonesCrossSectionProcessor.java @ 9499:853f2dafc16e

VegetationZones in CrossSectionsDiagram
author gernotbelger
date Thu, 27 Sep 2018 18:06:26 +0200
parents
children cb3dabb77857
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/artifacts/src/main/java/org/dive4elements/river/artifacts/uinfo/vegetationzones/VegetationZonesCrossSectionProcessor.java	Thu Sep 27 18:06:26 2018 +0200
@@ -0,0 +1,118 @@
+/** 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.uinfo.vegetationzones;
+
+import java.awt.Color;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Set;
+
+import org.dive4elements.artifactdatabase.state.ArtifactAndFacet;
+import org.dive4elements.artifactdatabase.state.Facet;
+import org.dive4elements.artifacts.Artifact;
+import org.dive4elements.artifacts.CallContext;
+import org.dive4elements.artifacts.DataProvider;
+import org.dive4elements.river.artifacts.common.AbstractCalculationResult;
+import org.dive4elements.river.artifacts.common.AbstractProcessor;
+import org.dive4elements.river.artifacts.model.CrossSectionFacetUtils;
+import org.dive4elements.river.artifacts.model.river.MainWstValuesCalculator;
+import org.dive4elements.river.artifacts.uinfo.UINFOArtifact;
+import org.dive4elements.river.exports.CrossSectionGenerator;
+import org.dive4elements.river.exports.DiagramGenerator;
+import org.dive4elements.river.jfree.StripedAreaDataset;
+import org.dive4elements.river.jfree.StripedAreaDataset.Stripe;
+import org.dive4elements.river.model.FastCrossSectionLine;
+import org.dive4elements.river.model.River;
+import org.dive4elements.river.themes.ThemeDocument;
+
+/**
+ * @author Domenico Nardi Tironi
+ *
+ */
+public class VegetationZonesCrossSectionProcessor extends AbstractProcessor {
+
+    private static final String MAIN_VALUE_MQ = "mq";
+
+    public static final String FACET_VEGETATION_ZONES_CROSS_SECTION = "uinfo_facet_vegetation_zones_cross_section";
+
+    private static final String FACET_VEGETATION_ZONES_CROSS_SECTION_DESCRIPTION = "uinfo_facet_vegetation_zones_cross_section.description";
+
+    private static final Set<String> HANDLED_FACET_TYPES = new HashSet<>();
+
+    static {
+        HANDLED_FACET_TYPES.add(FACET_VEGETATION_ZONES_CROSS_SECTION);
+    }
+
+    public static Facet createVegetationZonesCrossSectionFacet(final CallContext context, final String hash, final String id,
+            final AbstractCalculationResult result, final int index) {
+        return AbstractProcessor.createFacet(context, hash, id, result, index, CrossSectionGenerator.I18N_XAXIS_LABEL, FACET_VEGETATION_ZONES_CROSS_SECTION,
+                FACET_VEGETATION_ZONES_CROSS_SECTION_DESCRIPTION);
+    }
+
+    public static void generateSeries(final CrossSectionGenerator generator, final ArtifactAndFacet bundle, final CallContext context,
+            final ThemeDocument theme, final boolean visible) {
+
+        final DataProvider provider = CrossSectionFacetUtils.getDataProvider(context);
+        final FastCrossSectionLine crossSection = CrossSectionFacetUtils.getCrossSection(provider, context);
+        if (crossSection == null)
+            return;
+        final double currentStation = crossSection.getKm();
+
+        if (bundle.getFacetName().equals(FACET_VEGETATION_ZONES_CROSS_SECTION)) {
+
+            final StripedAreaDataset dataset = new StripedAreaDataset(theme);
+
+            final Artifact artifact = bundle.getArtifact();
+            final VegetationzonesAccess vAccess = new VegetationzonesAccess((UINFOArtifact) artifact);
+            final River river = vAccess.getRiver();
+            final List<VegetationZoneServerClientXChange> zones = VegetationZoneServerClientXChange.parse(vAccess.getVegZones());
+
+            for (final VegetationZoneServerClientXChange zone : zones) {
+
+                final double lower = uefdToHeight(context, river, currentStation, zone.getLowerFromTo());
+                final double upper = uefdToHeight(context, river, currentStation, zone.getUpperFromTo());
+
+                final Color color = Color.decode(zone.getHexColor());
+                dataset.addStripe(new Stripe(zone.getZoneName(), color, lower, upper));
+            }
+
+            generator.addAxisDataset(dataset, 0, visible);
+            return;
+        }
+
+        throw new UnsupportedOperationException();
+    }
+
+    private static double uefdToHeight(final CallContext context, final River river, final double station, final int uefd) {
+
+        final MainWstValuesCalculator mainWstValues = MainWstValuesCalculator.forRiver(context, river, null, MAIN_VALUE_MQ);
+
+        final double mw = mainWstValues.interpolateW(station, MAIN_VALUE_MQ);
+
+        // Üfd = -70,559 ∗ ln((DGM - MW) + 0,5) + 80,711
+        final double f1 = -70.559;
+        final double f2 = -88.711;
+
+        final double dgm = Math.exp((uefd - f2) / f1) + mw - 0.5;
+        return dgm;
+    }
+
+    public VegetationZonesCrossSectionProcessor() {
+        super(CrossSectionGenerator.I18N_YAXIS_LABEL, HANDLED_FACET_TYPES);
+
+        throw new UnsupportedOperationException();
+    }
+
+    @Override
+    protected String generateSeries(final DiagramGenerator generator, final ArtifactAndFacet bundle, final ThemeDocument theme, final boolean visible) {
+        throw new UnsupportedOperationException();
+    }
+
+}
\ No newline at end of file

http://dive4elements.wald.intevation.org