Mercurial > dive4elements > gnv-client
diff gnv-artifacts/src/main/java/de/intevation/gnv/state/profile/verticalcrosssection/VerticalCrossSectionOutputState.java @ 445:f42ed4f10b79
Fixed some bugs and create "Profilschnitt" polygons via configuration.
gnv-artifacts/trunk@493 c6561f87-3c4e-4783-a992-168aeb5c3f6f
author | Sascha L. Teichmann <sascha.teichmann@intevation.de> |
---|---|
date | Wed, 30 Dec 2009 23:02:10 +0000 |
parents | eb2ac62e853a |
children | f5a041000357 |
line wrap: on
line diff
--- a/gnv-artifacts/src/main/java/de/intevation/gnv/state/profile/verticalcrosssection/VerticalCrossSectionOutputState.java Wed Dec 30 10:35:19 2009 +0000 +++ b/gnv-artifacts/src/main/java/de/intevation/gnv/state/profile/verticalcrosssection/VerticalCrossSectionOutputState.java Wed Dec 30 23:02:10 2009 +0000 @@ -17,6 +17,8 @@ import java.util.Arrays; import java.util.List; +import java.awt.Dimension; + import org.apache.log4j.Logger; import org.jfree.chart.ChartTheme; @@ -30,6 +32,8 @@ import de.intevation.artifacts.CallContext; +import de.intevation.gnv.artifacts.context.GNVArtifactContext; + import de.intevation.gnv.artifacts.cache.CacheFactory; import de.intevation.gnv.chart.Chart; @@ -49,6 +53,9 @@ import de.intevation.gnv.math.HeightValue; import de.intevation.gnv.math.XYColumn; import de.intevation.gnv.math.IJKey; +import de.intevation.gnv.math.LinearMetrics; +import de.intevation.gnv.math.Interpolation3D; +import de.intevation.gnv.math.ConstantXYDepth; import de.intevation.gnv.state.InputData; @@ -59,12 +66,23 @@ import de.intevation.gnv.statistics.Statistics; import de.intevation.gnv.statistics.VerticalProfileStatistics; +import de.intevation.gnv.utils.DistanceCalculator; import de.intevation.gnv.utils.WKTUtils; import de.intevation.gnv.utils.StringUtils; +import de.intevation.gnv.raster.Filter; +import de.intevation.gnv.raster.PaletteManager; +import de.intevation.gnv.raster.Palette; +import de.intevation.gnv.raster.Raster; +import de.intevation.gnv.raster.PolygonDatasetProducer; +import de.intevation.gnv.raster.Vectorizer; + +import de.intevation.gnv.jfreechart.PolygonDataset; + /** - * @author Tim Englich <tim.englich@intevation.de> - * + * @author Tim Englich (tim.englich@intevation.de) + * @author Ingo Weinzierl (iweinzierl@intevation.de) + * @author Sascha L. Teichmann (sascha.teichmann@intevation.de) */ public class VerticalCrossSectionOutputState extends TimeSeriesOutputState { @@ -159,14 +177,135 @@ return obj; } + private static Dimension getRasterSize(CallContext callContext) { + GNVArtifactContext context = + (GNVArtifactContext)callContext.globalContext(); + Dimension size = (Dimension)context.get( + GNVArtifactContext.VERTICAL_CROSS_SECTION_SAMPLES_KEY); + return size != null + ? size + : GNVArtifactContext.DEFAULT_VERTICAL_CROSS_SECTION_SAMPLES; + } + + private static List<Filter.Factory> getFilterFactories(CallContext callContext) { + GNVArtifactContext context = + (GNVArtifactContext)callContext.globalContext(); + List<Filter.Factory> factories = (List<Filter.Factory>)context.get( + GNVArtifactContext.VERTICAL_CROSS_SECTION_FILTER_FACTORIES_KEY); + return factories != null + ? factories + : new ArrayList<Filter.Factory>(); + } + + private static Map<Integer, PaletteManager> getPalettes( + CallContext callContext + ) { + GNVArtifactContext context = + (GNVArtifactContext)callContext.globalContext(); + Map<Integer, PaletteManager> palettes = + (Map<Integer, PaletteManager>)context.get( + GNVArtifactContext.PALETTES_KEY); + return palettes != null + ? palettes + : new HashMap<Integer, PaletteManager>(); + } + + public static final double EPSILON = 1e-5d; protected Object process( List<Coordinate> path, AttributedXYColumns columns, CallContext callContext ) { + Integer parameterId = + (Integer)columns.getAttribute("GROUP1"); // XXX: hardcoded - // TODO Implement me + if (parameterId == null) { + log.error("missing parameter id"); + return null; + } + + Map<Integer, PaletteManager> paletteManagers = + getPalettes(callContext); + + PaletteManager paletteManager = paletteManagers.get(parameterId); + + if (paletteManager == null) { + log.error("no palette found for parameter id " + parameterId); + return null; + } + + boolean debug = log.isDebugEnabled(); + + if (debug) { + log.debug("using palette '" + paletteManager.getName() + "'"); + } + + Dimension rasterSize = getRasterSize(callContext); + List<Filter.Factory> filterFactories = getFilterFactories(callContext); + Interpolation3D interpolation = new Interpolation3D(rasterSize); + + double distance = WKTUtils.toKM( + DistanceCalculator.calculateDistance(path)); + + if (distance < EPSILON) { + log.warn("distance too short for interpolation"); + return null; + } + + boolean success = interpolation.interpolate( + path, + columns.getXYColumns(), + 0d, + distance, + LinearMetrics.INSTANCE, + new ConstantXYDepth(-42d)); // TODO: Use DEM here!! + + if (!success) { + log.warn("interpolation failed"); + return null; + } + + // Do the post processing + Raster raster = new Raster( + interpolation.getRaster(), + rasterSize.width); + + for (Filter.Factory factory: filterFactories) { + raster = factory.create().filter(raster); + } + + if (debug) { + log.debug("to indexed raster"); + } + + // scan for regions with base palette + Palette base = paletteManager.getBase(); + + int [] intRaster = raster.toIndexed(base); + + // produce JFreeChart compatible polygons + + if (debug) { + log.debug("vectorize indexed raster"); + } + + PolygonDatasetProducer pdsp = new PolygonDatasetProducer( + 0, 0, + distance, interpolation.getMaxDepth()); + + Vectorizer vectorizer = new Vectorizer( + intRaster, rasterSize.width); + + int numRegions = vectorizer.process(pdsp); + + PolygonDataset pds = pdsp.getPolygonDataset(); + + if (debug) { + log.debug("number of regions: " + numRegions); + log.debug("number of series: " + pds.getSeriesCount()); + } + return null; } @@ -222,7 +361,7 @@ if (col == null) { Coordinate coord = WKTUtils.toCoordinate(result.getString(sIdx)); if (coord == null) coord = new Coordinate(); - col = new XYColumn(coord.x, coord.z, i, j); + col = new XYColumn(coord.x, coord.y, i, j); map.put(key, col); }