Mercurial > dive4elements > gnv-client
diff gnv-artifacts/src/main/java/de/intevation/gnv/state/profile/horizontalcrosssection/HorizontalCrossSectionMeshOutputState.java @ 484:823e4f808418
Generate JTS geometries (multi polygons and multi linestrings) from
interpolation with external palette indices.
gnv-artifacts/trunk@559 c6561f87-3c4e-4783-a992-168aeb5c3f6f
author | Sascha L. Teichmann <sascha.teichmann@intevation.de> |
---|---|
date | Mon, 18 Jan 2010 11:25:52 +0000 |
parents | 64e65daa65e9 |
children | 6e8364e766fa |
line wrap: on
line diff
--- a/gnv-artifacts/src/main/java/de/intevation/gnv/state/profile/horizontalcrosssection/HorizontalCrossSectionMeshOutputState.java Mon Jan 18 10:56:41 2010 +0000 +++ b/gnv-artifacts/src/main/java/de/intevation/gnv/state/profile/horizontalcrosssection/HorizontalCrossSectionMeshOutputState.java Mon Jan 18 11:25:52 2010 +0000 @@ -2,6 +2,8 @@ import com.vividsolutions.jts.geom.Coordinate; import com.vividsolutions.jts.geom.Envelope; +import com.vividsolutions.jts.geom.MultiLineString; +import com.vividsolutions.jts.geom.MultiPolygon; import com.vividsolutions.jts.geom.Polygon; import de.intevation.artifactdatabase.Config; @@ -29,6 +31,15 @@ import de.intevation.gnv.math.Point2d; import de.intevation.gnv.math.QueriedXYDepth; +import de.intevation.gnv.raster.ExternalIndexConverter; +import de.intevation.gnv.raster.IsoAttributeGenerator; +import de.intevation.gnv.raster.JTSMultiLineStringProducer; +import de.intevation.gnv.raster.JTSMultiPolygonProducer; +import de.intevation.gnv.raster.Palette; +import de.intevation.gnv.raster.PaletteManager; +import de.intevation.gnv.raster.Raster; +import de.intevation.gnv.raster.Vectorizer; + import de.intevation.gnv.state.InputData; import de.intevation.gnv.state.OutputStateBase; @@ -37,6 +48,7 @@ import de.intevation.gnv.state.timeseries.TimeSeriesOutputState; import de.intevation.gnv.utils.FileUtils; +import de.intevation.gnv.utils.Pair; import de.intevation.gnv.utils.StringUtils; import de.intevation.gnv.utils.WKTUtils; @@ -48,7 +60,9 @@ import java.util.ArrayList; import java.util.Collection; +import java.util.HashMap; import java.util.List; +import java.util.Map; import org.apache.log4j.Logger; @@ -327,12 +341,11 @@ return process( env, p, - numSamples(callContext), - preprocess( + callContext, + preProcess( queryExecutor.executeQuery( queryID, - addedFilterValues)), - getGroundInterpolation(callContext)); + addedFilterValues))); } catch (QueryException e) { log.error(e,e); @@ -341,12 +354,12 @@ throw new StateException("no result produced"); } - public AttributedPoint2ds preprocess(Collection<Result> results) { + public AttributedPoint2ds preProcess(Collection<Result> results) { boolean debug = log.isDebugEnabled(); if (debug) { - log.debug("--- preprocess: " + results.size() + " results"); + log.debug("--- preProcess: " + results.size() + " results"); } AttributedPoint2ds ap2ds = new AttributedPoint2ds(); @@ -409,28 +422,46 @@ public AttributedPoint2ds process( Envelope boundingBox, Polygon polygon, - int numSamples, - AttributedPoint2ds input, - int groundInterpolation + CallContext callContext, + AttributedPoint2ds input ) { if (input == null) { log.error("no data to interpolate"); return null; } + Integer parameterId = + (Integer)input.getAttribute("PARAMETERID"); // XXX: hardcoded + + 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("before interpolation"); + log.debug("interpolation"); } AreaInterpolation interpolation = new AreaInterpolation(); - List<? extends Point2d> points = input.getPoints(); + int numSamples = numSamples(callContext); + int groundInterpolation = getGroundInterpolation(callContext); if (!interpolation.interpolate( - points, + input.getPoints(), boundingBox, new Dimension(numSamples, numSamples), new QueriedXYDepth(groundInterpolation) @@ -439,17 +470,90 @@ return null; } + // Do the post processing + Raster raster = new Raster( + interpolation.getRaster(), + numSamples); + + // TODO: Filter operations. + if (debug) { - log.debug("after interpolation"); + log.debug("to indexed raster"); } - return null; + // scan for regions with base palette + Palette basePalette = paletteManager.getBase(); + + int [] intRaster = raster.toIndexed(basePalette); + + // produce JFreeChart compatible polygons + + if (debug) { + log.debug("vectorize indexed raster"); + } + + // produce JTS compatible polygons + + JTSMultiPolygonProducer jtsmpp = new JTSMultiPolygonProducer( + boundingBox.getMinX(), boundingBox.getMinY(), + boundingBox.getMaxX(), boundingBox.getMaxY()); + + int numRegions = new Vectorizer(intRaster, numSamples) + .process(jtsmpp); + + Map<Integer, MultiPolygon> polygons = jtsmpp.getMultiPolygons( + new ExternalIndexConverter(basePalette)); + + jtsmpp.clear(); jtsmpp = null; // help gc + + int numColors = polygons.size(); + + if (debug) { + log.debug("number of regions: " + numRegions); + log.debug("number of colors: " + numColors); + } + // generate iso lines + + int numIso; + + if (numColors < 5) { numIso = 5; } + else if (numColors < 10) { numIso = 2; } + else { numIso = 0; } + + Palette isoPalette; + + if (numIso == 0) { // same palette + isoPalette = basePalette; + /* intRaster = intRaster; */ + } + else { + isoPalette = paletteManager.getLevel(numIso); + intRaster = raster.toIndexed(isoPalette); + } + + JTSMultiLineStringProducer jtslsp = new JTSMultiLineStringProducer( + boundingBox.getMinX(), boundingBox.getMinY(), + boundingBox.getMaxX(), boundingBox.getMaxY()); + + numRegions = new Vectorizer(false, intRaster, numSamples) + .process(jtslsp); + + IsoAttributeGenerator iag = new IsoAttributeGenerator(isoPalette); + + List<Pair<Object, MultiLineString>> lineStrings = + jtslsp.getMultiLineStrings(iag); + + jtslsp.clear(); jtslsp = null; // help gc + + input.setInterpolation(interpolation); + + input.setPolygons(polygons); + input.setLineStrings(lineStrings); + + return input; } - /** - * @see de.intevation.gnv.state.timeseries.TimeSeriesOutputState#setup(org.w3c.dom.Node) - */ @Override public void setup(Node configuration) { super.setup(configuration); @@ -486,5 +590,18 @@ return RasterObject.getInterpolationType(interpolation); } + + 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>(); + } } // vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 :