From 0d5eac992da509d052e3d23b522c375ba902cd86 Mon Sep 17 00:00:00 2001 From: Martin Davis Date: Tue, 23 Jul 2024 15:36:39 -0700 Subject: [PATCH] Fix RelateGeometry test for zero-length lines --- .../jts/operation/relateng/RelateGeometry.java | 2 +- .../jts/operation/relateng/RelateGeometryTest.java | 5 ++++- .../jts/operation/relateng/RelateNGTest.java | 13 +++++++++++++ 3 files changed, 18 insertions(+), 2 deletions(-) diff --git a/modules/core/src/main/java/org/locationtech/jts/operation/relateng/RelateGeometry.java b/modules/core/src/main/java/org/locationtech/jts/operation/relateng/RelateGeometry.java index e84713ad63..9f5ac3cd03 100644 --- a/modules/core/src/main/java/org/locationtech/jts/operation/relateng/RelateGeometry.java +++ b/modules/core/src/main/java/org/locationtech/jts/operation/relateng/RelateGeometry.java @@ -143,7 +143,7 @@ private static boolean isZeroLength(LineString line) { if (line.getNumPoints() >= 2) { Coordinate p0 = line.getCoordinateN(0); for (int i = 0 ; i < line.getNumPoints(); i++) { - Coordinate pi = line.getCoordinateN(1); + Coordinate pi = line.getCoordinateN(i); //-- most non-zero-len lines will trigger this right away if (! p0.equals2D(pi)) return false; diff --git a/modules/core/src/test/java/org/locationtech/jts/operation/relateng/RelateGeometryTest.java b/modules/core/src/test/java/org/locationtech/jts/operation/relateng/RelateGeometryTest.java index f5c511fe09..3c5e116803 100644 --- a/modules/core/src/test/java/org/locationtech/jts/operation/relateng/RelateGeometryTest.java +++ b/modules/core/src/test/java/org/locationtech/jts/operation/relateng/RelateGeometryTest.java @@ -54,11 +54,12 @@ public void testDimension() { checkDimension("POINT (0 0)", 0, 0); checkDimension("LINESTRING (0 0, 0 0)", 1, 0); checkDimension("LINESTRING (0 0, 9 9)", 1, 1); + checkDimension("LINESTRING (0 0, 0 0, 9 9)", 1, 1); checkDimension("POLYGON ((1 9, 5 9, 5 5, 1 5, 1 9))", 2, 2); checkDimension("GEOMETRYCOLLECTION (POLYGON ((1 9, 5 9, 5 5, 1 5, 1 9)), LINESTRING (1 1, 5 4), POINT (6 5))", 2, 2); checkDimension("GEOMETRYCOLLECTION (POLYGON EMPTY, LINESTRING (1 1, 5 4), POINT (6 5))", 2, 1); } - + private void checkDimension(String wkt, int expectedDim, int expectedDimReal) { Geometry geom = read(wkt); RelateGeometry rgeom = new RelateGeometry(geom); @@ -66,4 +67,6 @@ private void checkDimension(String wkt, int expectedDim, int expectedDimReal) { assertEquals(expectedDimReal, rgeom.getDimensionReal()); } + + } diff --git a/modules/core/src/test/java/org/locationtech/jts/operation/relateng/RelateNGTest.java b/modules/core/src/test/java/org/locationtech/jts/operation/relateng/RelateNGTest.java index cb793b1c8f..1d50364658 100644 --- a/modules/core/src/test/java/org/locationtech/jts/operation/relateng/RelateNGTest.java +++ b/modules/core/src/test/java/org/locationtech/jts/operation/relateng/RelateNGTest.java @@ -109,6 +109,19 @@ public void testZeroLengthLineLine() { checkEquals(a, b, true); } + // tests bug involving checking for non-zero-length lines + public void testNonZeroLengthLinePoint() { + String a = "LINESTRING (0 0, 0 0, 9 9)"; + String b = "POINT (1 1)"; + checkRelate(a, b, "0F1FF0FF2"); + checkIntersectsDisjoint(a, b, true); + checkContainsWithin(a, b, true); + checkContainsWithin(b, a, false); + checkCoversCoveredBy(a, b, true); + checkCoversCoveredBy(b, a, false); + checkEquals(a, b, false); + } + public void testLinePointIntAndExt() { String a = "MULTIPOINT((60 60), (100 100))"; String b = "LINESTRING(40 40, 80 80)";