From: <svn...@os...> - 2012-03-16 12:59:19
|
Author: aaime Date: 2012-03-16 05:59:08 -0700 (Fri, 16 Mar 2012) New Revision: 38631 Modified: branches/2.7.x/modules/library/main/src/main/java/org/geotools/geometry/jts/GeometryCollector.java branches/2.7.x/modules/library/main/src/test/java/org/geotools/geometry/jts/GeometryCollectorTest.java Log: [GEOT-4077] GeometryCollector can build invalid geometries Modified: branches/2.7.x/modules/library/main/src/main/java/org/geotools/geometry/jts/GeometryCollector.java =================================================================== --- branches/2.7.x/modules/library/main/src/main/java/org/geotools/geometry/jts/GeometryCollector.java 2012-03-16 12:53:19 UTC (rev 38630) +++ branches/2.7.x/modules/library/main/src/main/java/org/geotools/geometry/jts/GeometryCollector.java 2012-03-16 12:59:08 UTC (rev 38631) @@ -143,7 +143,19 @@ return gf.createMultiPoint(array); } else if (collectionClass == MultiPolygon.class) { Polygon[] array = (Polygon[]) geometries.toArray(new Polygon[geometries.size()]); - return gf.createMultiPolygon(array); + MultiPolygon mp = gf.createMultiPolygon(array); + + // a collection of valid polygon does not necessarily make up a valid multipolygon + if(array.length > 1 && !mp.isValid()) { + Geometry g = mp.buffer(0); + if(g instanceof Polygon) { + return gf.createMultiPolygon(new Polygon[] {(Polygon) g}); + } else { + return (GeometryCollection) g; + } + } else { + return mp; + } } else if (collectionClass == MultiLineString.class) { LineString[] array = (LineString[]) geometries .toArray(new LineString[geometries.size()]); Modified: branches/2.7.x/modules/library/main/src/test/java/org/geotools/geometry/jts/GeometryCollectorTest.java =================================================================== --- branches/2.7.x/modules/library/main/src/test/java/org/geotools/geometry/jts/GeometryCollectorTest.java 2012-03-16 12:53:19 UTC (rev 38630) +++ branches/2.7.x/modules/library/main/src/test/java/org/geotools/geometry/jts/GeometryCollectorTest.java 2012-03-16 12:59:08 UTC (rev 38631) @@ -3,13 +3,13 @@ import static org.junit.Assert.*; import org.geotools.factory.CommonFactoryFinder; -import org.geotools.referencing.crs.DefaultGeocentricCRS; import org.geotools.referencing.crs.DefaultGeographicCRS; import org.junit.Test; import org.opengis.filter.FilterFactory2; import com.vividsolutions.jts.geom.Geometry; import com.vividsolutions.jts.geom.GeometryCollection; +import com.vividsolutions.jts.geom.Polygon; import com.vividsolutions.jts.io.WKTReader; public class GeometryCollectorTest { @@ -49,7 +49,25 @@ assertSame(p0, result.getGeometryN(0)); assertSame(p1, result.getGeometryN(1)); } + + @Test + public void testInvalidMultipolygon() throws Exception { + WKTReader reader = new WKTReader(); + // three triangles that united form a rectangle with a triangular hole in the middle + GeometryCollector collector = new GeometryCollector(); + collector.setFactory(null); + final Geometry p0 = reader.read("POLYGON((0 0, 0 3, 3 3, 3 0, 0 0))"); + collector.add(p0); + final Geometry p1 = reader.read("POLYGON((1 1, 1 2, 2 2, 2 1, 1 1))"); + collector.add(p1); + + GeometryCollection result = collector.collect(); + assertEquals(1, result.getNumGeometries()); + Polygon p = (com.vividsolutions.jts.geom.Polygon) result.getGeometryN(0); + assertTrue(p.isValid()); + } + @Test public void testTooMany() throws Exception { WKTReader reader = new WKTReader(); |