[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