From 5dbfc97dc58938389441061f31fbb40cecb51a42 Mon Sep 17 00:00:00 2001 From: Martin Davis Date: Wed, 23 Dec 2020 15:51:58 -0800 Subject: [PATCH] Add check for valid polygonal before fixing Signed-off-by: Martin Davis --- .../src/main/java/org/locationtech/jts/densify/Densifier.java | 3 ++- .../locationtech/jts/simplify/DouglasPeuckerSimplifier.java | 3 ++- .../main/java/org/locationtech/jts/simplify/VWSimplifier.java | 3 ++- .../jts/simplify/DouglasPeuckerSimplifierTest.java | 2 +- .../java/org/locationtech/jts/simplify/VWSimplifierTest.java | 2 +- 5 files changed, 8 insertions(+), 5 deletions(-) diff --git a/modules/core/src/main/java/org/locationtech/jts/densify/Densifier.java b/modules/core/src/main/java/org/locationtech/jts/densify/Densifier.java index 0b420c47f9..dd6bf8dd0f 100644 --- a/modules/core/src/main/java/org/locationtech/jts/densify/Densifier.java +++ b/modules/core/src/main/java/org/locationtech/jts/densify/Densifier.java @@ -185,7 +185,8 @@ protected Geometry transformMultiPolygon(MultiPolygon geom, Geometry parent) { * @return a valid area geometry */ private Geometry createValidArea(Geometry roughAreaGeom) { - if (! isValidated) return roughAreaGeom; + // if valid no need to process to make valid + if (! isValidated || roughAreaGeom.isValid()) return roughAreaGeom; return roughAreaGeom.buffer(0.0); } } diff --git a/modules/core/src/main/java/org/locationtech/jts/simplify/DouglasPeuckerSimplifier.java b/modules/core/src/main/java/org/locationtech/jts/simplify/DouglasPeuckerSimplifier.java index 6c62786317..7d3c3c0308 100644 --- a/modules/core/src/main/java/org/locationtech/jts/simplify/DouglasPeuckerSimplifier.java +++ b/modules/core/src/main/java/org/locationtech/jts/simplify/DouglasPeuckerSimplifier.java @@ -199,7 +199,8 @@ protected Geometry transformMultiPolygon(MultiPolygon geom, Geometry parent) { */ private Geometry createValidArea(Geometry rawAreaGeom) { - if ( isEnsureValidTopology) + // if geometry is invalid then make it valid + if (isEnsureValidTopology && ! rawAreaGeom.isValid()) return rawAreaGeom.buffer(0.0); return rawAreaGeom; } diff --git a/modules/core/src/main/java/org/locationtech/jts/simplify/VWSimplifier.java b/modules/core/src/main/java/org/locationtech/jts/simplify/VWSimplifier.java index 037dda315a..005b03cc40 100644 --- a/modules/core/src/main/java/org/locationtech/jts/simplify/VWSimplifier.java +++ b/modules/core/src/main/java/org/locationtech/jts/simplify/VWSimplifier.java @@ -204,7 +204,8 @@ protected Geometry transformMultiPolygon(MultiPolygon geom, Geometry parent) */ private Geometry createValidArea(Geometry rawAreaGeom) { - if (isEnsureValidTopology) + // if geometry is invalid then make it valid + if (isEnsureValidTopology && ! rawAreaGeom.isValid()) return rawAreaGeom.buffer(0.0); return rawAreaGeom; } diff --git a/modules/core/src/test/java/org/locationtech/jts/simplify/DouglasPeuckerSimplifierTest.java b/modules/core/src/test/java/org/locationtech/jts/simplify/DouglasPeuckerSimplifierTest.java index 28cbcd191b..55f0bc9fa3 100644 --- a/modules/core/src/test/java/org/locationtech/jts/simplify/DouglasPeuckerSimplifierTest.java +++ b/modules/core/src/test/java/org/locationtech/jts/simplify/DouglasPeuckerSimplifierTest.java @@ -81,7 +81,7 @@ public void testPolygonWithTouchingHole() throws Exception { DPSimplifierResult.getResult( "POLYGON ((80 200, 240 200, 240 60, 80 60, 80 200), (120 120, 220 120, 180 199, 160 200, 140 199, 120 120))", 10.0)) - .setExpectedResult("POLYGON ((80 200, 160 200, 240 200, 240 60, 80 60, 80 200), (160 200, 140 199, 120 120, 220 120, 180 199, 160 200)))") + .setExpectedResult("POLYGON ((80 200, 240 200, 240 60, 80 60, 80 200), (120 120, 220 120, 180 199, 160 200, 140 199, 120 120))") .test(); } public void testFlattishPolygon() throws Exception { diff --git a/modules/core/src/test/java/org/locationtech/jts/simplify/VWSimplifierTest.java b/modules/core/src/test/java/org/locationtech/jts/simplify/VWSimplifierTest.java index 3ef3404f47..28e3a427dc 100644 --- a/modules/core/src/test/java/org/locationtech/jts/simplify/VWSimplifierTest.java +++ b/modules/core/src/test/java/org/locationtech/jts/simplify/VWSimplifierTest.java @@ -55,7 +55,7 @@ public void testPolygonSpikeInShell() throws Exception { VWSimplifierResult.getResult( "POLYGON ((1721355.3 693015.146, 1721318.687 693046.251, 1721306.747 693063.038, 1721367.025 692978.29, 1721355.3 693015.146))", 10.0)) - .setExpectedResult("POLYGON ((1721355.3 693015.146, 1721367.025 692978.29, 1721318.687 693046.251, 1721355.3 693015.146))") + .setExpectedResult("POLYGON ((1721355.3 693015.146, 1721318.687 693046.251, 1721367.025 692978.29, 1721355.3 693015.146))") .test(); } public void testPolygonSpikeInHole() throws Exception {