Mercurial > dive4elements > river
view 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 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.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(); } }