[geos-commits] r4311 - in trunk: include/geos/geom/util src/geom/util src/simplify tests/unit/simplify

Sandro Santilli strk at kbt.io
Fri Dec 2 05:58:45 PST 2016


Author: strk
Date: 2016-12-02 05:58:45 -0800 (Fri, 02 Dec 2016)
New Revision: 4311

Modified:
   trunk/include/geos/geom/util/GeometryTransformer.h
   trunk/src/geom/util/GeometryTransformer.cpp
   trunk/src/simplify/DouglasPeuckerSimplifier.cpp
   trunk/tests/unit/simplify/DouglasPeuckerSimplifierTest.cpp
Log:
Fix empty GEOSSimplify return on inner ring collapse

Patch by Even Rouault
See #741

Modified: trunk/include/geos/geom/util/GeometryTransformer.h
===================================================================
--- trunk/include/geos/geom/util/GeometryTransformer.h	2016-12-02 13:58:35 UTC (rev 4310)
+++ trunk/include/geos/geom/util/GeometryTransformer.h	2016-12-02 13:58:45 UTC (rev 4311)
@@ -99,6 +99,8 @@
 
 	std::auto_ptr<Geometry> transform(const Geometry* nInputGeom);
 
+	void setSkipTransformedInvalidInteriorRings(bool b);
+
 protected:
 
 	const GeometryFactory* factory;
@@ -178,6 +180,11 @@
 	 */
 	bool preserveType;
 
+	/**
+	 * <code>true</code> if transformed invalid interior rings should be skipped
+	 */
+	bool skipTransformedInvalidInteriorRings;
+
 	// Declare type as noncopyable
 	GeometryTransformer(const GeometryTransformer& other);
 	GeometryTransformer& operator=(const GeometryTransformer& rhs);

Modified: trunk/src/geom/util/GeometryTransformer.cpp
===================================================================
--- trunk/src/geom/util/GeometryTransformer.cpp	2016-12-02 13:58:35 UTC (rev 4310)
+++ trunk/src/geom/util/GeometryTransformer.cpp	2016-12-02 13:58:45 UTC (rev 4311)
@@ -59,13 +59,19 @@
 	pruneEmptyGeometry(true),
 	preserveGeometryCollectionType(true),
 	preserveCollections(false),
-	preserveType(false)
+	preserveType(false),
+	skipTransformedInvalidInteriorRings(false)
 {}
 
 GeometryTransformer::~GeometryTransformer()
 {
 }
 
+void GeometryTransformer::setSkipTransformedInvalidInteriorRings(bool b)
+{
+	skipTransformedInvalidInteriorRings = b;
+}
+
 /*public*/
 auto_ptr<Geometry>
 GeometryTransformer::transform(const Geometry* nInputGeom)
@@ -283,6 +289,8 @@
 
 		if ( ! dynamic_cast<LinearRing*>(hole.get()) )
 		{
+			if ( skipTransformedInvalidInteriorRings )
+			    continue;
 			isAllValidLinearRings = false;
 		}
 

Modified: trunk/src/simplify/DouglasPeuckerSimplifier.cpp
===================================================================
--- trunk/src/simplify/DouglasPeuckerSimplifier.cpp	2016-12-02 13:58:35 UTC (rev 4310)
+++ trunk/src/simplify/DouglasPeuckerSimplifier.cpp	2016-12-02 13:58:45 UTC (rev 4311)
@@ -89,6 +89,7 @@
 	:
 	distanceTolerance(t)
 {
+	setSkipTransformedInvalidInteriorRings(true);
 }
 
 Geometry::AutoPtr

Modified: trunk/tests/unit/simplify/DouglasPeuckerSimplifierTest.cpp
===================================================================
--- trunk/tests/unit/simplify/DouglasPeuckerSimplifierTest.cpp	2016-12-02 13:58:35 UTC (rev 4310)
+++ trunk/tests/unit/simplify/DouglasPeuckerSimplifierTest.cpp	2016-12-02 13:58:45 UTC (rev 4311)
@@ -331,5 +331,26 @@
         //std::string const simplifiedWkt2 = wktwriter.write(simplified2.get());
 	}
 
+	// 13 - Polygon with inner ring whose extent is less than the simplify distance (#741)
+	template<>
+	template<>
+	void object::test<13>()
+	{
+		std::string wkt_in("POLYGON ((0 0,0 1,1 1,0 0),(0.1 0.1,0.2 0.1,0.2 0.2,0.1 0.1))");
+
+		std::string wkt_ex("POLYGON ((0 0,0 1,1 1,0 0))");
+
+		GeomPtr g(wktreader.read(wkt_in));
+
+		GeomPtr expected(wktreader.read(wkt_ex));
+
+		GeomPtr simplified = DouglasPeuckerSimplifier::simplify(
+			g.get(), 0.5);
+
+		ensure( simplified->isValid() );
+
+		ensure( simplified->equalsExact(expected.get()) );
+	}
+
 } // namespace tut
 



More information about the geos-commits mailing list