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);
             }
 

http://dive4elements.wald.intevation.org