[geos-commits] [SCM] GEOS branch main updated. 9bc6ca8716552f8d35e90cd22be433123c06b175
git at osgeo.org
git at osgeo.org
Fri Feb 6 12:52:59 PST 2026
This is an automated email from the git hooks/post-receive script. It was
generated because a ref change was pushed to the repository containing
the project "GEOS".
The branch, main has been updated
via 9bc6ca8716552f8d35e90cd22be433123c06b175 (commit)
from 8ef887079e3d8f18fef4bb7f7e9ab52866b437fa (commit)
Those revisions listed above that are new to this repository have
not appeared on any other notification email; so we list those
revisions in full, below.
- Log -----------------------------------------------------------------
commit 9bc6ca8716552f8d35e90cd22be433123c06b175
Author: Paul Ramsey <pramsey at cleverelephant.ca>
Date: Fri Feb 6 11:47:36 2026 -0800
Fix: Preserve dimension and type for empty geometries during snap/simplify
Closes https://github.com/libgeos/geos/issues/1356
When performing operations like Snap on empty geometries (e.g., POINT EMPTY, LINESTRING EMPTY, POLYGON EMPTY), the GEOS library was incorrectly modifying their coordinate dimension (e.g., adding a Z dimension) and sometimes changing their type (e.g., POLYGON EMPTY becoming a LinearRing or GeometryCollection).
This fix modifies GeometryTransformer to short-circuit the transformation process if the input geometry is already empty. Instead of transforming it, it now returns a direct clone of the empty input geometry. This ensures that the original type and coordinate dimension (e.g., 2D) are preserved, aligning with the expected behavior for empty geometries.
diff --git a/src/geom/util/GeometryTransformer.cpp b/src/geom/util/GeometryTransformer.cpp
index acec018bf..afa01ce32 100644
--- a/src/geom/util/GeometryTransformer.cpp
+++ b/src/geom/util/GeometryTransformer.cpp
@@ -79,6 +79,11 @@ GeometryTransformer::transform(const Geometry* nInputGeom)
inputGeom = nInputGeom;
factory = inputGeom->getFactory();
+ // If the input geometry is empty, return a clone of it to preserve its type and dimension
+ if (inputGeom->isEmpty()) {
+ return inputGeom->clone();
+ }
+
if(const Point* p = dynamic_cast<const Point*>(inputGeom)) {
return transformPoint(p, nullptr);
}
diff --git a/tests/unit/operation/overlay/snap/GeometrySnapperTest.cpp b/tests/unit/operation/overlay/snap/GeometrySnapperTest.cpp
index ef82353e3..9e5245436 100644
--- a/tests/unit/operation/overlay/snap/GeometrySnapperTest.cpp
+++ b/tests/unit/operation/overlay/snap/GeometrySnapperTest.cpp
@@ -76,5 +76,56 @@ void object::test<3> ()
ensure_equals_geometry(expected.get(), result.get());
}
+// Test snapping of empty geometries -- POINT EMPTY
+template<>
+template<>
+void object::test<4> ()
+{
+ std::string wkt = "POINT EMPTY";
+ auto src = reader.read(wkt);
+ GeometrySnapper snapper(*src);
+ auto snap = reader.read(wkt); // Snap against itself
+ auto result = snapper.snapTo(*snap, 1);
+ auto expected = reader.read(wkt);
+
+ ensure_equals_geometry(expected.get(), result.get());
+ ensure_equals(result->getCoordinateDimension(), 2);
+ ensure_equals(result->getGeometryType(), "Point");
+}
+
+// Test snapping of empty geometries -- LINESTRING EMPTY
+template<>
+template<>
+void object::test<5> ()
+{
+ std::string wkt = "LINESTRING EMPTY";
+ auto src = reader.read(wkt);
+ GeometrySnapper snapper(*src);
+ auto snap = reader.read(wkt); // Snap against itself
+ auto result = snapper.snapTo(*snap, 1);
+ auto expected = reader.read(wkt);
+
+ ensure_equals_geometry(expected.get(), result.get());
+ ensure_equals(result->getCoordinateDimension(), 2);
+ ensure_equals(result->getGeometryType(), "LineString");
+}
+
+// Test snapping of empty geometries -- POLYGON EMPTY
+template<>
+template<>
+void object::test<6> ()
+{
+ std::string wkt = "POLYGON EMPTY";
+ auto src = reader.read(wkt);
+ GeometrySnapper snapper(*src);
+ auto snap = reader.read(wkt); // Snap against itself
+ auto result = snapper.snapTo(*snap, 1);
+ auto expected = reader.read(wkt);
+
+ ensure_equals_geometry(expected.get(), result.get());
+ ensure_equals(result->getCoordinateDimension(), 2);
+ ensure_equals(result->getGeometryType(), "Polygon");
+}
+
} // namespace tut
-----------------------------------------------------------------------
Summary of changes:
src/geom/util/GeometryTransformer.cpp | 5 +++
.../operation/overlay/snap/GeometrySnapperTest.cpp | 51 ++++++++++++++++++++++
2 files changed, 56 insertions(+)
hooks/post-receive
--
GEOS
More information about the geos-commits
mailing list