From 8413b1d00d0e10e4e88c3c2805a6f240f97705cb Mon Sep 17 00:00:00 2001 From: vera-rubin Date: Tue, 13 Oct 2026 16:59:46 +0000 Subject: [PATCH] Fix IsSimpleOp for empty MultiPoint elements --- .../jts/operation/valid/IsSimpleOp.java | 1 + .../jts/operation/valid/IsSimpleTest.java | 14 ++++++++++++++ 2 files changed, 15 insertions(+) diff --git a/modules/core/src/main/java/org/locationtech/jts/operation/valid/IsSimpleOp.java b/modules/core/src/main/java/org/locationtech/jts/operation/valid/IsSimpleOp.java index df548320ab..6c0e0d5161 100644 --- a/modules/core/src/main/java/org/locationtech/jts/operation/valid/IsSimpleOp.java +++ b/modules/core/src/main/java/org/locationtech/jts/operation/valid/IsSimpleOp.java @@ -209,6 +209,7 @@ private boolean isSimpleMultiPoint(MultiPoint mp) Set points = new HashSet(); for (int i = 0; i < mp.getNumGeometries(); i++) { Point pt = (Point) mp.getGeometryN(i); + if (pt.isEmpty()) continue; Coordinate p = pt.getCoordinate(); if (points.contains(p)) { nonSimplePts.add(p); diff --git a/modules/core/src/test/java/org/locationtech/jts/operation/valid/IsSimpleTest.java b/modules/core/src/test/java/org/locationtech/jts/operation/valid/IsSimpleTest.java index 0da9868c84..7c8708a6dc 100644 --- a/modules/core/src/test/java/org/locationtech/jts/operation/valid/IsSimpleTest.java +++ b/modules/core/src/test/java/org/locationtech/jts/operation/valid/IsSimpleTest.java @@ -147,6 +147,20 @@ public void testMultiPointAll() { BoundaryNodeRule.MOD2_BOUNDARY_RULE, "MULTIPOINT((1 2), (1 4), (1 5))"); } + + public void testMultiPointWithEmptyElements() { + String wkt = "MULTIPOINT (EMPTY, EMPTY, (1 2))"; + Geometry g = read(wkt); + assertTrue(g.isSimple()); + assertTrue(IsSimpleOp.isSimple(g)); + checkIsSimple(wkt, BoundaryNodeRule.MOD2_BOUNDARY_RULE, true); + checkIsSimpleAll(wkt, BoundaryNodeRule.MOD2_BOUNDARY_RULE, "MULTIPOINT EMPTY"); + + String wktRepeated = "MULTIPOINT (EMPTY, EMPTY, (1 2), (1 2))"; + checkIsSimple(wktRepeated, BoundaryNodeRule.MOD2_BOUNDARY_RULE, false, new Coordinate(1, 2)); + checkIsSimpleAll(wktRepeated, BoundaryNodeRule.MOD2_BOUNDARY_RULE, "MULTIPOINT ((1 2))"); + } + public void testGeometryCollectionAll() { checkIsSimpleAll("GEOMETRYCOLLECTION(MULTILINESTRING ((10 20, 90 20), (10 30, 90 30), (50 40, 50 10)), " + "MULTIPOINT((1 1), (1 2), (1 2), (1 3), (1 4), (1 4), (1 5), (1 5)))",