# HG changeset patch # User Sascha L. Teichmann # Date 1263169785 0 # Node ID f7038820df2e8cb2ffcba22e9e0ee6cffbb38ba4 # Parent 70df44021a9f5443f21a2048ba85ac6e3d252ece Added support to trace rasters to JTS multi polygons and multi line strings. Write them to shape files with GeoTools. gnv-artifacts/trunk@526 c6561f87-3c4e-4783-a992-168aeb5c3f6f diff -r 70df44021a9f -r f7038820df2e gnv-artifacts/ChangeLog --- a/gnv-artifacts/ChangeLog Sat Jan 09 17:55:45 2010 +0000 +++ b/gnv-artifacts/ChangeLog Mon Jan 11 00:29:45 2010 +0000 @@ -1,3 +1,54 @@ +2010-01-11 Sascha L. Teichmann + + * pom.xml: Introduced dependency to GeoTools 2.4.5 (maybe a bit too old) + Needed to write traced polygons and line strings to shape files. + + * src/main/java/de/intevation/gnv/utils/Pair.java: New + simple pair tuple for type safety. + + * src/main/java/de/intevation/gnv/utils/ShapeFileWriter.java: + New. Writes multi polygons and multi line strings to + shapefiles. Writing the multi polygons works. + + !! Writing the multi line strings fails! + !! Its not clear by now if its a geotool bug or a + !! misunderstanding of the API. The polygon and + !! the line string export are coded symmetrically + !! but the line string export complains about invalid + !! FIDs states. + + * src/main/java/de/intevation/gnv/raster/AbstractProducer.java: + New. Abstract base class for multi line string/polygons producers + as backends of the vectorizer. + + * src/main/java/de/intevation/gnv/raster/PolygonDatasetProducer.java: + Inherits from AbstractProducer now. + + * src/main/java/de/intevation/gnv/raster/IsoProducer.java: + New. Common base class for the iso line producers, inherits + from AbstractProducer. + + * src/main/java/de/intevation/gnv/raster/IsoPolygonSeriesProducer.java: + Moved some code to new base class IsoProducer. + + * src/main/java/de/intevation/gnv/raster/DemuxRingsHandler.java: + New. Little helper class to demultiplex many ring handlers on + one single vectorizer. + + * src/main/java/de/intevation/gnv/raster/IsoAttributeGenerator.java: + The implemented AttributeGenerator interface is defined in IsoProducer + now. + + * src/main/java/de/intevation/gnv/raster/JTSMultiPolygonProducer.java: + New. Traces regions directly to JTS multi polygons. + + * src/main/java/de/intevation/gnv/raster/JTSMultiLineStringProducer.java: + New. Traces iso lines directly to JTS multi line strings. + + * src/main/java/de/intevation/gnv/math/QueriedXYDepth.java, + src/main/java/de/intevation/gnv/statistics/AbstractStatistics.java: + Removed needless imports. + 2010-01-09 Ingo Weinzierl * src/main/java/de/intevation/gnv/artifacts/fis/FISSelectArtifact.java: diff -r 70df44021a9f -r f7038820df2e gnv-artifacts/pom.xml --- a/gnv-artifacts/pom.xml Sat Jan 09 17:55:45 2010 +0000 +++ b/gnv-artifacts/pom.xml Mon Jan 11 00:29:45 2010 +0000 @@ -77,12 +77,12 @@ org.apache.xmlgraphics batik-dom 1.7 - + org.apache.xmlgraphics batik-svggen 1.7 - + com.lowagie itext @@ -113,15 +113,20 @@ oro 2.0.8 - + + org.geotools + gt2-shapefile + 2.4.5 + + com.vividsolutions jts 1.9 - trove - trove - 2.1.1 + trove + trove + 2.1.1 diff -r 70df44021a9f -r f7038820df2e gnv-artifacts/src/main/java/de/intevation/gnv/math/QueriedXYDepth.java --- a/gnv-artifacts/src/main/java/de/intevation/gnv/math/QueriedXYDepth.java Sat Jan 09 17:55:45 2010 +0000 +++ b/gnv-artifacts/src/main/java/de/intevation/gnv/math/QueriedXYDepth.java Mon Jan 11 00:29:45 2010 +0000 @@ -5,7 +5,6 @@ import java.util.ArrayList; import java.util.Collection; -import java.util.HashMap; import java.lang.ref.SoftReference; diff -r 70df44021a9f -r f7038820df2e gnv-artifacts/src/main/java/de/intevation/gnv/raster/AbstractProducer.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gnv-artifacts/src/main/java/de/intevation/gnv/raster/AbstractProducer.java Mon Jan 11 00:29:45 2010 +0000 @@ -0,0 +1,26 @@ +package de.intevation.gnv.raster; + +import de.intevation.gnv.raster.Vectorizer.RingsHandler; + +public abstract class AbstractProducer +implements RingsHandler +{ + protected double minX; + protected double minY; + protected double maxX; + protected double maxY; + + public AbstractProducer() { + } + + public AbstractProducer( + double minX, double minY, + double maxX, double maxY + ) { + this.minX = minX; + this.minY = minY; + this.maxX = maxX; + this.maxY = maxY; + } +} +// vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 : diff -r 70df44021a9f -r f7038820df2e gnv-artifacts/src/main/java/de/intevation/gnv/raster/DemuxRingsHandler.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gnv-artifacts/src/main/java/de/intevation/gnv/raster/DemuxRingsHandler.java Mon Jan 11 00:29:45 2010 +0000 @@ -0,0 +1,40 @@ +package de.intevation.gnv.raster; + +import java.util.ArrayList; +import java.util.List; + +import de.intevation.gnv.raster.Vectorizer.RingsHandler; +import de.intevation.gnv.raster.Vectorizer.Edge; + +/** + * @author Sascha L. Teichmann (sascha.teichmann@intevation.de) + */ +public class DemuxRingsHandler +implements RingsHandler +{ + protected ArrayList handlers; + + public DemuxRingsHandler() { + handlers = new ArrayList(); + } + + public void addHandler(RingsHandler handler) { + handlers.add(handler); + } + + public void handleRings( + List rings, + int value, + int width, + int height + ) { + for (RingsHandler handler: handlers) { + handler.handleRings(rings, value, width, height); + } + } + + public void clear() { + handlers.clear(); + } +} +// vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 : diff -r 70df44021a9f -r f7038820df2e gnv-artifacts/src/main/java/de/intevation/gnv/raster/IsoAttributeGenerator.java --- a/gnv-artifacts/src/main/java/de/intevation/gnv/raster/IsoAttributeGenerator.java Sat Jan 09 17:55:45 2010 +0000 +++ b/gnv-artifacts/src/main/java/de/intevation/gnv/raster/IsoAttributeGenerator.java Mon Jan 11 00:29:45 2010 +0000 @@ -1,7 +1,10 @@ package de.intevation.gnv.raster; +/** + * @author Sascha L. Teichmann (sascha.teichmann@intevation.de) + */ public class IsoAttributeGenerator -implements IsoPolygonSeriesProducer.AttributeGenerator +implements IsoProducer.AttributeGenerator { protected Palette palette; diff -r 70df44021a9f -r f7038820df2e gnv-artifacts/src/main/java/de/intevation/gnv/raster/IsoPolygonSeriesProducer.java --- a/gnv-artifacts/src/main/java/de/intevation/gnv/raster/IsoPolygonSeriesProducer.java Sat Jan 09 17:55:45 2010 +0000 +++ b/gnv-artifacts/src/main/java/de/intevation/gnv/raster/IsoPolygonSeriesProducer.java Mon Jan 11 00:29:45 2010 +0000 @@ -1,19 +1,13 @@ package de.intevation.gnv.raster; -import java.util.List; -import java.util.HashSet; -import java.util.HashMap; import java.util.ArrayList; import java.util.Collection; import org.apache.log4j.Logger; -import gnu.trove.TIntHashSet; import gnu.trove.TIntObjectHashMap; import gnu.trove.TDoubleArrayList; -import gnu.trove.TObjectProcedure; -import de.intevation.gnv.raster.Vectorizer.RingsHandler; import de.intevation.gnv.raster.Vectorizer.Edge; import de.intevation.gnv.math.IJKey; @@ -25,114 +19,20 @@ * @author Sascha L. Teichmann (sascha.teichmann@intevation.de) */ public class IsoPolygonSeriesProducer -implements RingsHandler +extends IsoProducer { private static Logger log = Logger.getLogger( IsoPolygonSeriesProducer.class); public static final Float LINE_WIDTH = Float.valueOf(0.1f); - public interface AttributeGenerator { - - Object generateAttribute(int neighbor1, int neighbor2); - - } // interface AttributeGenerator - - protected HashMap open; - protected HashMap commonOpen; - protected HashMap> complete; - - protected int width; - protected int height; - - protected double minX; - protected double minY; - protected double maxX; - protected double maxY; - public IsoPolygonSeriesProducer( double minX, double minY, double maxX, double maxY ) { - this.minX = minX; - this.minY = minY; - this.maxX = maxX; - this.maxY = maxY; - - open = new HashMap(); - commonOpen = new HashMap(); - complete = new HashMap>(); + super(minX, minY, maxX, maxY); } - public void handleRings( - List rings, - int value, - int width, - int height - ) { - if (value == -1) { - return; - } - this.width = width; - this.height = height; - - Integer v = Integer.valueOf(value); - - for (Edge head: rings) { - Edge current = head; - do { - Integer neighbor = open.remove(current); - - if (neighbor != null) { - IJKey pair = new IJKey(value, neighbor.intValue()); - pair.sort(); - - TIntObjectHashMap co = commonOpen.get(pair); - - if (co == null) { - commonOpen.put(pair, co = new TIntObjectHashMap()); - } - - Edge edge = new Edge(current); - - Edge otherA = (Edge)co.remove(edge.a); - if (otherA != null) { - otherA.chain(edge, edge.a); - } - - Edge otherB = (Edge)co.remove(edge.b); - if (otherB != null) { - otherB.chain(edge, edge.b); - } - - if (edge.isComplete()) { - ArrayList list = complete.get(pair); - if (list == null) { - complete.put(pair, list = new ArrayList()); - } - list.add(Vectorizer.simplify(edge, width)); - } - else { - if (otherA == null) { - co.put(edge.a, edge); - } - if (otherB == null) { - co.put(edge.b, edge); - } - } - } - else { - Edge edge = new Edge(current.b, current.a); - open.put(edge, v); - } - - current = current.next; - } - while (current != head); - } // for all rings - - } // handleRings - public Collection getSeries() { return getSeries(null); } @@ -152,18 +52,9 @@ ? (maxY - minY)/(height-1) : 0d; - // join keys of complete and open polygons - HashSet pairs = new HashSet(); - for (IJKey key: complete.keySet()) { - pairs.add(key); - } - for (IJKey key: commonOpen.keySet()) { - pairs.add(key); - } - TDoubleArrayList vertices = new TDoubleArrayList(); - for (IJKey key: pairs) { + for (IJKey key: joinPairs()) { PolygonSeries ps = new PolygonSeries(); // process complete @@ -188,19 +79,7 @@ TIntObjectHashMap map = commonOpen.get(key); if (map != null) { - final ArrayList headList = new ArrayList(); - map.forEachValue(new TObjectProcedure() { - TIntHashSet headSet = new TIntHashSet(); - public boolean execute(Object value) { - Edge head = ((Edge)value).head(); - if (headSet.add(head.a)) { - headList.add(head); - } - return true; - } - }); - - for (Edge head: headList) { + for (Edge head: headList(map)) { head = Vectorizer.simplify(head, width); Edge current = head, last = head; @@ -234,11 +113,5 @@ return series; } - - public void clear() { - open.clear(); - complete.clear(); - commonOpen.clear(); - } } // vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8: diff -r 70df44021a9f -r f7038820df2e gnv-artifacts/src/main/java/de/intevation/gnv/raster/IsoProducer.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gnv-artifacts/src/main/java/de/intevation/gnv/raster/IsoProducer.java Mon Jan 11 00:29:45 2010 +0000 @@ -0,0 +1,143 @@ +package de.intevation.gnv.raster; + +import java.util.List; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.HashSet; + +import gnu.trove.TIntObjectHashMap; +import gnu.trove.TIntHashSet; +import gnu.trove.TObjectProcedure; + +import de.intevation.gnv.math.IJKey; + +import de.intevation.gnv.raster.Vectorizer.Edge; + +/** + * @author Sascha L. Teichmann (sascha.teichmann@intevation.de) + */ +public class IsoProducer +extends AbstractProducer +{ + public interface AttributeGenerator { + + Object generateAttribute(int neighbor1, int neighbor2); + + } // interface AttributeGenerator + + protected HashMap open; + protected HashMap commonOpen; + protected HashMap> complete; + + protected int width; + protected int height; + + public IsoProducer( + double minX, double minY, + double maxX, double maxY + ) { + super(minX, minY, maxX, maxY); + + open = new HashMap(); + commonOpen = new HashMap(); + complete = new HashMap>(); + } + + public void handleRings( + List rings, + int value, + int width, + int height + ) { + if (value == -1) { + return; + } + this.width = width; + this.height = height; + + Integer v = Integer.valueOf(value); + + for (Edge head: rings) { + Edge current = head; + do { + Integer neighbor = open.remove(current); + + if (neighbor != null) { + IJKey pair = new IJKey(value, neighbor.intValue()); + pair.sort(); + + TIntObjectHashMap co = commonOpen.get(pair); + + if (co == null) { + commonOpen.put(pair, co = new TIntObjectHashMap()); + } + + Edge edge = new Edge(current); + + Edge otherA = (Edge)co.remove(edge.a); + if (otherA != null) { + otherA.chain(edge, edge.a); + } + + Edge otherB = (Edge)co.remove(edge.b); + if (otherB != null) { + otherB.chain(edge, edge.b); + } + + if (edge.isComplete()) { + ArrayList list = complete.get(pair); + if (list == null) { + complete.put(pair, list = new ArrayList()); + } + list.add(Vectorizer.simplify(edge, width)); + } + else { + if (otherA == null) { + co.put(edge.a, edge); + } + if (otherB == null) { + co.put(edge.b, edge); + } + } + } + else { + Edge edge = new Edge(current.b, current.a); + open.put(edge, v); + } + + current = current.next; + } + while (current != head); + } // for all rings + + } // handleRings + + protected HashSet joinPairs() { + HashSet pairs = new HashSet(); + pairs.addAll(complete .keySet()); + pairs.addAll(commonOpen.keySet()); + return pairs; + } + + protected static ArrayList headList(TIntObjectHashMap map) { + final ArrayList headList = new ArrayList(); + map.forEachValue(new TObjectProcedure() { + TIntHashSet headSet = new TIntHashSet(); + public boolean execute(Object value) { + Edge head = ((Edge)value).head(); + if (headSet.add(head.a)) { + headList.add(head); + } + return true; + } + }); + return headList; + } + + public void clear() { + open.clear(); + complete.clear(); + commonOpen.clear(); + } +} +// vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 : diff -r 70df44021a9f -r f7038820df2e gnv-artifacts/src/main/java/de/intevation/gnv/raster/JTSMultiLineStringProducer.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gnv-artifacts/src/main/java/de/intevation/gnv/raster/JTSMultiLineStringProducer.java Mon Jan 11 00:29:45 2010 +0000 @@ -0,0 +1,140 @@ +package de.intevation.gnv.raster; + +import java.util.List; +import java.util.ArrayList; + +import org.apache.log4j.Logger; + +import com.vividsolutions.jts.geom.GeometryFactory; +import com.vividsolutions.jts.geom.MultiLineString; +import com.vividsolutions.jts.geom.LineString; +import com.vividsolutions.jts.geom.Coordinate; + +import gnu.trove.TIntObjectHashMap; + +import de.intevation.gnv.raster.Vectorizer.Edge; + +import de.intevation.gnv.utils.Pair; + +import de.intevation.gnv.math.IJKey; + +/** + * @author Sascha L. Teichmann (sascha.teichmann@intevation.de) + */ +public class JTSMultiLineStringProducer +extends IsoProducer +{ + private static Logger log = Logger.getLogger( + JTSMultiLineStringProducer.class); + + protected GeometryFactory geometryFactory; + + public JTSMultiLineStringProducer( + double minX, double minY, + double maxX, double maxY + ) { + this( + JTSMultiPolygonProducer.createDefaultGeometryFactory(), + minX, minY, + maxX, maxY); + } + + public JTSMultiLineStringProducer( + GeometryFactory geometryFactory, + double minX, double minY, + double maxX, double maxY + ) { + super(minX, minY, maxX, maxY); + this.geometryFactory = geometryFactory; + } + + public List> getMultiLineStrings( + AttributeGenerator attributeGenerator + ) { + ArrayList> multiLineStrings = + new ArrayList>(); + + double b1 = minX; + double m1 = width != 1 + ? (maxX - minX)/(width-1) + : 0d; + + double b2 = minY; + double m2 = height != 1 + ? (maxY - minY)/(height-1) + : 0d; + + ArrayList coordinates = new ArrayList(); + + for (IJKey key: joinPairs()) { + ArrayList lineStrings = new ArrayList(); + + // process complete + ArrayList completeList = complete.get(key); + if (completeList != null) { + for (Edge head: completeList) { + Edge current = head; + do { + coordinates.add(new Coordinate( + m1*(current.a % width) + b1, + m2*(current.a / width) + b2)); + } + while ((current = current.next) != head); + // add head again to close shape + coordinates.add(new Coordinate( + m1*(head.a % width) + b1, + m2*(head.a / width) + b2)); + lineStrings.add( + geometryFactory.createLineString( + coordinates.toArray( + new Coordinate[coordinates.size()]))); + coordinates.clear(); + } + } + + // process open + TIntObjectHashMap map = commonOpen.get(key); + + if (map != null) { + for (Edge head: headList(map)) { + + head = Vectorizer.simplify(head, width); + Edge current = head, last = head; + do { + coordinates.add(new Coordinate( + m1*(current.a % width) + b1, + m2*(current.a / width) + b2)); + last = current; + } + while ((current = current.next) != null); + // add b from tail + coordinates.add(new Coordinate( + m1*(last.b % width) + b1, + m2*(last.b / width) + b2)); + lineStrings.add( + geometryFactory.createLineString( + coordinates.toArray( + new Coordinate[coordinates.size()]))); + coordinates.clear(); + } // for all in common open + } // if map defined for key + + if (!lineStrings.isEmpty()) { + MultiLineString multiLineString = + geometryFactory.createMultiLineString( + lineStrings.toArray( + new LineString[lineStrings.size()])); + lineStrings.clear(); + Object attribute = attributeGenerator != null + ? attributeGenerator.generateAttribute(key.i, key.j) + : key; + multiLineStrings.add(new Pair( + attribute, + multiLineString)); + } + } // for all pairs + + return multiLineStrings; + } +} +// vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 : diff -r 70df44021a9f -r f7038820df2e gnv-artifacts/src/main/java/de/intevation/gnv/raster/JTSMultiPolygonProducer.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gnv-artifacts/src/main/java/de/intevation/gnv/raster/JTSMultiPolygonProducer.java Mon Jan 11 00:29:45 2010 +0000 @@ -0,0 +1,183 @@ +package de.intevation.gnv.raster; + +import java.util.Map; +import java.util.List; +import java.util.HashMap; +import java.util.TreeMap; +import java.util.ArrayList; + +import com.vividsolutions.jts.geom.GeometryFactory; +import com.vividsolutions.jts.geom.MultiPolygon; +import com.vividsolutions.jts.geom.Polygon; +import com.vividsolutions.jts.geom.Coordinate; +import com.vividsolutions.jts.geom.LinearRing; +import com.vividsolutions.jts.geom.PrecisionModel; + +import com.vividsolutions.jts.algorithm.CGAlgorithms; + +import com.vividsolutions.jts.geom.impl.PackedCoordinateSequenceFactory; + +import org.apache.log4j.Logger; + +import de.intevation.gnv.raster.Vectorizer.Edge; + +/** + * @author Sascha L. Teichmann (sascha.teichmann@intevation.de) + */ +public class JTSMultiPolygonProducer +extends AbstractProducer +{ + private static Logger log = Logger.getLogger( + JTSMultiPolygonProducer.class); + + public static final int SRID_WGS84 = 4326; + + public interface ValueConverter { + + Integer convert(Integer value); + + } // interface ValueConverter + + protected GeometryFactory geometryFactory; + + protected HashMap> valueToPolygons; + + public JTSMultiPolygonProducer() { + } + + public JTSMultiPolygonProducer( + double minX, double minY, + double maxX, double maxY + ) { + this( + createDefaultGeometryFactory(), + minX, minY, + maxX, maxY); + } + + public JTSMultiPolygonProducer( + GeometryFactory geometryFactory, + double minX, double minY, + double maxX, double maxY + ) { + super(minX, minY, maxX, maxY); + this.geometryFactory = geometryFactory; + valueToPolygons = new HashMap>(); + } + + public static GeometryFactory createDefaultGeometryFactory() { + return new GeometryFactory( + new PrecisionModel( + PrecisionModel.FLOATING), + SRID_WGS84, + new PackedCoordinateSequenceFactory( + PackedCoordinateSequenceFactory.DOUBLE, + 2)); + } + + public void handleRings( + List rings, + int value, + int width, + int height + ) { + if (value == -1) { + return; + } + + Integer v = Integer.valueOf(value); + + ArrayList polygons = valueToPolygons.get(v); + + if (polygons == null) { + valueToPolygons.put(v, polygons = new ArrayList()); + } + + double b1 = minX; + double m1 = width != 1 + ? (maxX - minX)/(width-1) + : 0d; + + double b2 = minY; + double m2 = height != 1 + ? (maxY - minY)/(height-1) + : 0d; + + ArrayList vertices = new ArrayList(); + + LinearRing shell = null; + ArrayList holes = new ArrayList(); + + for (Edge head: rings) { + Edge current = head; + do { + vertices.add(new Coordinate( + m1*(current.a % width) + b1, + m2*(current.a / width) + b2)); + } + while ((current = current.next) != head); + vertices.add(new Coordinate( + m1*(head.a % width) + b1, + m2*(head.a / width) + b2)); + + Coordinate [] coordinates = + vertices.toArray(new Coordinate[vertices.size()]); + + vertices.clear(); + + LinearRing ring = geometryFactory.createLinearRing( + coordinates); + + if (CGAlgorithms.isCCW(coordinates)) { + shell = ring; + } + else { + holes.add(ring); + } + } + + if (shell == null) { + log.error("polygon has no shell"); + return; + } + + Polygon polygon = geometryFactory.createPolygon( + shell, + holes.toArray(new LinearRing[holes.size()])); + + polygons.add(polygon); + } + + public Map getMultiPolygons() { + return getMultiPolygons(null); + } + + public Map getMultiPolygons( + ValueConverter valueConverter + ) { + TreeMap multiPolygons = + new TreeMap(); + + for (Map.Entry> entry: + valueToPolygons.entrySet() + ) { + ArrayList polygons = entry.getValue(); + + Integer value = valueConverter != null + ? valueConverter.convert(entry.getKey()) + : entry.getKey(); + + multiPolygons.put( + value, + geometryFactory.createMultiPolygon( + polygons.toArray(new Polygon[polygons.size()]))); + } + + return multiPolygons; + } + + public void clear() { + valueToPolygons.clear(); + } +} +// vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 : diff -r 70df44021a9f -r f7038820df2e gnv-artifacts/src/main/java/de/intevation/gnv/raster/PolygonDatasetProducer.java --- a/gnv-artifacts/src/main/java/de/intevation/gnv/raster/PolygonDatasetProducer.java Sat Jan 09 17:55:45 2010 +0000 +++ b/gnv-artifacts/src/main/java/de/intevation/gnv/raster/PolygonDatasetProducer.java Mon Jan 11 00:29:45 2010 +0000 @@ -5,7 +5,6 @@ import gnu.trove.TDoubleArrayList; -import de.intevation.gnv.raster.Vectorizer.RingsHandler; import de.intevation.gnv.raster.Vectorizer.Edge; import de.intevation.gnv.jfreechart.PolygonSeries; @@ -16,13 +15,8 @@ * @author Sascha L. Teichmann (sascha.teichmann@intevation.de) */ public class PolygonDatasetProducer -implements RingsHandler +extends AbstractProducer { - protected double minX; - protected double minY; - protected double maxX; - protected double maxY; - protected HashMap polygonSeries; protected PolygonDatasetProducer() { @@ -33,11 +27,7 @@ double maxX, double maxY ) { - this.minX = minX; - this.minY = minY; - this.maxX = maxX; - this.maxY = maxY; - + super(minX, minY, maxX, maxY); polygonSeries = new HashMap(); } @@ -53,7 +43,7 @@ Integer v = Integer.valueOf(value); - PolygonSeries ps = (PolygonSeries)polygonSeries.get(v); + PolygonSeries ps = polygonSeries.get(v); if (ps == null) { polygonSeries.put(v, ps = new PolygonSeries()); diff -r 70df44021a9f -r f7038820df2e gnv-artifacts/src/main/java/de/intevation/gnv/statistics/AbstractStatistics.java --- a/gnv-artifacts/src/main/java/de/intevation/gnv/statistics/AbstractStatistics.java Sat Jan 09 17:55:45 2010 +0000 +++ b/gnv-artifacts/src/main/java/de/intevation/gnv/statistics/AbstractStatistics.java Mon Jan 11 00:29:45 2010 +0000 @@ -1,8 +1,5 @@ package de.intevation.gnv.statistics; -import java.util.Collection; -import java.util.ArrayList; - import org.apache.commons.math.stat.descriptive.DescriptiveStatistics; import org.apache.commons.math.stat.regression.SimpleRegression; diff -r 70df44021a9f -r f7038820df2e gnv-artifacts/src/main/java/de/intevation/gnv/utils/Pair.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gnv-artifacts/src/main/java/de/intevation/gnv/utils/Pair.java Mon Jan 11 00:29:45 2010 +0000 @@ -0,0 +1,30 @@ +package de.intevation.gnv.utils; + +import java.io.Serializable; + +/** + * @author Sascha L. Teichmann (sascha.teichmann@intevation.de) + */ +public final class Pair +implements Serializable +{ + private A a; + private B b; + + private Pair() { + } + + public Pair(A a, B b) { + this.a = a; + this.b = b; + } + + public A getA() { + return a; + } + + public B getB() { + return b; + } +} +// vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 : diff -r 70df44021a9f -r f7038820df2e gnv-artifacts/src/main/java/de/intevation/gnv/utils/ShapeFileWriter.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gnv-artifacts/src/main/java/de/intevation/gnv/utils/ShapeFileWriter.java Mon Jan 11 00:29:45 2010 +0000 @@ -0,0 +1,218 @@ +package de.intevation.gnv.utils; + +import java.util.Map; +import java.util.List; +import java.util.HashMap; + +import java.io.File; +import java.io.IOException; + +import java.net.MalformedURLException; + +import com.vividsolutions.jts.geom.MultiPolygon; +import com.vividsolutions.jts.geom.MultiLineString; + +import org.geotools.data.DataUtilities; +import org.geotools.data.Transaction; +import org.geotools.data.DefaultTransaction; +import org.geotools.data.FeatureWriter; + +import org.geotools.feature.Feature; +import org.geotools.feature.FeatureType; +import org.geotools.feature.SchemaException; +import org.geotools.feature.IllegalAttributeException; + +import org.geotools.data.shapefile.ShapefileDataStore; +import org.geotools.data.shapefile.ShapefileDataStoreFactory; + +import org.apache.log4j.Logger; + +/** + * @author Sascha L. Teichmann (sascha.teichmann@intevation.de) + */ +public final class ShapeFileWriter +{ + private static Logger log = Logger.getLogger( + ShapeFileWriter.class); + + private ShapeFileWriter() { + } + + public static boolean writeMultiLineStringsToFile( + File shapeFile, + List> multiLineStrings + ) { + return writeMultiLineStringsToFile(shapeFile, multiLineStrings, null); + } + + public static boolean writeMultiLineStringsToFile( + File shapeFile, + List> multiLineStrings, + String typeName + ) { + HashMap params = new HashMap(); + + try { + params.put( + ShapefileDataStoreFactory.URLP.key, + shapeFile.toURI().toURL()); + } + catch (MalformedURLException mue) { + log.error(mue.getLocalizedMessage(), mue); + return false; + } + + boolean success = false; + Transaction tx = null; + + try { + ShapefileDataStoreFactory sfdsf = + new ShapefileDataStoreFactory(); + + ShapefileDataStore sfds = + (ShapefileDataStore)sfdsf.createNewDataStore(params); + + if (typeName == null) { + typeName = shapeFile.getName(); + } + + FeatureType featureType = DataUtilities.createType( + typeName, + "geom:MultiLineString,VALUE:Double"); + + sfds.createSchema(featureType); + + tx = new DefaultTransaction(); + + FeatureWriter featureWriter = sfds.getFeatureWriter( + typeName, tx); + + for (Pair pair: multiLineStrings) { + log.debug("00000000000000000 -> " + pair.getA()); + Feature feature = featureWriter.next(); + feature.setAttribute("geom", pair.getB()); + feature.setAttribute("VALUE", asDouble(pair.getA())); + featureWriter.write(); + } + + tx.commit(); + success = true; + } + catch (IllegalAttributeException iae) { + log.error(iae.getLocalizedMessage(), iae); + } + catch (SchemaException se) { + log.error(se.getLocalizedMessage(), se); + } + catch (IOException ioe) { + log.error(ioe.getLocalizedMessage(), ioe); + } + finally { + if (!success && tx != null) { + try { tx.rollback(); } + catch (IOException ioe) {} + } + } + + if (tx != null) { + try { tx.close(); } + catch (IOException ioe) {} + } + + return success; + } + + public static boolean writeMultiPolygonsToFile( + File shapeFile, + Map multiPolygons + ) { + return writeMultiPolygonsToFile(shapeFile, multiPolygons, null); + } + + public static boolean writeMultiPolygonsToFile( + File shapeFile, + Map multiPolygons, + String typeName + ) { + HashMap params = new HashMap(); + + try { + params.put( + ShapefileDataStoreFactory.URLP.key, + shapeFile.toURI().toURL()); + } + catch (MalformedURLException mue) { + log.error(mue.getLocalizedMessage(), mue); + return false; + } + + boolean success = false; + Transaction tx = null; + + try { + ShapefileDataStoreFactory sfdsf = + new ShapefileDataStoreFactory(); + + ShapefileDataStore sfds = + (ShapefileDataStore)sfdsf.createNewDataStore(params); + + if (typeName == null) { + typeName = shapeFile.getName(); + } + + FeatureType featureType = DataUtilities.createType( + typeName, + "geom:MultiPolygon,CLASS:Integer"); + + sfds.createSchema(featureType); + + tx = new DefaultTransaction(); + + FeatureWriter featureWriter = sfds.getFeatureWriter( + typeName, tx); + + for (Map.Entry entry: + multiPolygons.entrySet() + ) { + Feature feature = featureWriter.next(); + feature.setAttribute("geom", entry.getValue()); + feature.setAttribute("CLASS", entry.getKey()); + featureWriter.write(); + } + + tx.commit(); + success = true; + } + catch (IllegalAttributeException iae) { + log.error(iae.getLocalizedMessage(), iae); + } + catch (SchemaException se) { + log.error(se.getLocalizedMessage(), se); + } + catch (IOException ioe) { + log.error(ioe.getLocalizedMessage(), ioe); + } + finally { + if (!success && tx != null) { + try { tx.rollback(); } + catch (IOException ioe) {} + } + } + + if (tx != null) { + try { tx.close(); } + catch (IOException ioe) {} + } + + return success; + } + + private static final Double asDouble(Object a) { + if (a instanceof Double) + return (Double)a; + if (a instanceof Number) + return Double.valueOf(((Number)a).doubleValue()); + return 0d; + } +} +// vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 :