[geos-commits] [SCM] GEOS branch main updated. b4a4ace48b2c3fe6ac4d9a0219d6b232158ca931
git at osgeo.org
git at osgeo.org
Wed Jul 8 04:30:41 PDT 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 b4a4ace48b2c3fe6ac4d9a0219d6b232158ca931 (commit)
from 4f2442b078b7e26df23ced6193dc62f11090f674 (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 b4a4ace48b2c3fe6ac4d9a0219d6b232158ca931
Author: Daniel Baston <dbaston at gmail.com>
Date: Wed Jul 8 07:30:23 2026 -0400
Prepared geometries: linearize test geom if needed (#1469)
diff --git a/capi/geos_ts_c.cpp b/capi/geos_ts_c.cpp
index 21202a2b0..91ac5898e 100644
--- a/capi/geos_ts_c.cpp
+++ b/capi/geos_ts_c.cpp
@@ -4461,7 +4461,7 @@ extern "C" {
const PreparedGeometry* pg, const Geometry* g)
{
return execute(extHandle, 2, [&]() {
- return pg->contains(g);
+ return pg->contains(convertToLineIfNeeded(extHandle, g));
});
}
@@ -4479,7 +4479,7 @@ extern "C" {
const PreparedGeometry* pg, const Geometry* g)
{
return execute(extHandle, 2, [&]() {
- return pg->containsProperly(g);
+ return pg->containsProperly(convertToLineIfNeeded(extHandle, g));
});
}
@@ -4488,7 +4488,7 @@ extern "C" {
const PreparedGeometry* pg, const Geometry* g)
{
return execute(extHandle, 2, [&]() {
- return pg->coveredBy(g);
+ return pg->coveredBy(convertToLineIfNeeded(extHandle, g));
});
}
@@ -4497,7 +4497,7 @@ extern "C" {
const PreparedGeometry* pg, const Geometry* g)
{
return execute(extHandle, 2, [&]() {
- return pg->covers(g);
+ return pg->covers(convertToLineIfNeeded(extHandle, g));
});
}
@@ -4506,7 +4506,7 @@ extern "C" {
const PreparedGeometry* pg, const Geometry* g)
{
return execute(extHandle, 2, [&]() {
- return pg->crosses(g);
+ return pg->crosses(convertToLineIfNeeded(extHandle, g));
});
}
@@ -4515,7 +4515,7 @@ extern "C" {
const PreparedGeometry* pg, const Geometry* g)
{
return execute(extHandle, 2, [&]() {
- return pg->disjoint(g);
+ return pg->disjoint(convertToLineIfNeeded(extHandle, g));
});
}
@@ -4524,7 +4524,7 @@ extern "C" {
const PreparedGeometry* pg, const Geometry* g)
{
return execute(extHandle, 2, [&]() {
- return pg->intersects(g);
+ return pg->intersects(convertToLineIfNeeded(extHandle, g));
});
}
@@ -4542,7 +4542,7 @@ extern "C" {
const PreparedGeometry* pg, const Geometry* g)
{
return execute(extHandle, 2, [&]() {
- return pg->overlaps(g);
+ return pg->overlaps(convertToLineIfNeeded(extHandle, g));
});
}
@@ -4551,7 +4551,7 @@ extern "C" {
const PreparedGeometry* pg, const Geometry* g)
{
return execute(extHandle, 2, [&]() {
- return pg->touches(g);
+ return pg->touches(convertToLineIfNeeded(extHandle, g));
});
}
@@ -4560,7 +4560,7 @@ extern "C" {
const PreparedGeometry* pg, const Geometry* g)
{
return execute(extHandle, 2, [&]() {
- return pg->within(g);
+ return pg->within(convertToLineIfNeeded(extHandle, g));
});
}
@@ -4569,7 +4569,7 @@ extern "C" {
const PreparedGeometry* pg, const Geometry* g)
{
return execute(extHandle, [&]() -> char * {
- return gstrdup(pg->relate(g)->toString());
+ return gstrdup(pg->relate(convertToLineIfNeeded(extHandle, g))->toString());
});
}
@@ -4578,7 +4578,7 @@ extern "C" {
const PreparedGeometry* pg, const Geometry* g, const char* imPattern)
{
return execute(extHandle, 2, [&]() {
- return pg->relate(g, std::string(imPattern));
+ return pg->relate(convertToLineIfNeeded(extHandle, g), std::string(imPattern));
});
}
diff --git a/src/geom/prep/AbstractPreparedPolygonContains.cpp b/src/geom/prep/AbstractPreparedPolygonContains.cpp
index f0dbdeacc..c977c94e6 100644
--- a/src/geom/prep/AbstractPreparedPolygonContains.cpp
+++ b/src/geom/prep/AbstractPreparedPolygonContains.cpp
@@ -106,6 +106,8 @@ AbstractPreparedPolygonContains::findAndClassifyIntersections(const geom::Geomet
bool
AbstractPreparedPolygonContains::eval(const geom::Geometry* geom)
{
+ geos::util::ensureNoCurvedComponents(geom);
+
// Do point-in-poly tests first, since they are cheaper and may result
// in a quick negative result.
auto outermostLoc = getOutermostTestComponentLocation(geom);
diff --git a/src/geom/prep/PreparedPolygonContainsProperly.cpp b/src/geom/prep/PreparedPolygonContainsProperly.cpp
index 403af5c33..de663576e 100644
--- a/src/geom/prep/PreparedPolygonContainsProperly.cpp
+++ b/src/geom/prep/PreparedPolygonContainsProperly.cpp
@@ -27,6 +27,7 @@
#include <geos/noding/SegmentString.h>
#include <geos/noding/SegmentStringUtil.h>
#include <geos/noding/FastSegmentSetIntersectionFinder.h>
+#include <geos/util/Assert.h>
namespace geos {
namespace geom { // geos.geom
@@ -45,6 +46,8 @@ namespace prep { // geos.geom.prep
bool
PreparedPolygonContainsProperly::containsProperly(const geom::Geometry* geom)
{
+ geos::util::ensureNoCurvedComponents(geom);
+
// Do point-in-poly tests first, since they are cheaper and may result
// in a quick negative result.
// If a point of any test components does not lie in target,
diff --git a/tests/unit/capi/GEOSPreparedGeometryTest.cpp b/tests/unit/capi/GEOSPreparedGeometryTest.cpp
index 28e24b187..5b74ceed4 100644
--- a/tests/unit/capi/GEOSPreparedGeometryTest.cpp
+++ b/tests/unit/capi/GEOSPreparedGeometryTest.cpp
@@ -482,5 +482,91 @@ void object::test<17>()
GEOSFree(r2);
}
+template<>
+template<>
+void object::test<18>()
+{
+ set_test_name("Polygon first argument, CurvePolygon second argument");
+ useContext();
+
+ geom1_ = fromWKT("POLYGON ((0 0, 2 0, 2 8, 8 8, 8 0, 10 0, 10 10, 0 10, 0 0))");
+ geom2_ = fromWKT("CURVEPOLYGON (COMPOUNDCURVE(CIRCULARSTRING (5 1, 6 2, 7 1), (7 1, 5 1)))");
+ geom3_ = fromWKT("CURVEPOLYGON (COMPOUNDCURVE((-100 100, -100 -100, 100 -100, 100 100), CIRCULARSTRING (100 100, 0 200, -100 100)))");
+
+ prepGeom1_ = GEOSPrepare_r(ctxt_, geom1_);
+
+ // No curve-to-line params; all functions return 2 (error)
+ ensure_equals("contains", GEOSPreparedContains_r(ctxt_, prepGeom1_, geom2_), 2);
+ ensure_equals("contains properly", GEOSPreparedContainsProperly_r(ctxt_, prepGeom1_, geom2_), 2);
+ ensure_equals("crosses", GEOSPreparedCrosses_r(ctxt_, prepGeom1_, geom2_), 2);
+ ensure_equals("covered by", GEOSPreparedCoveredBy_r(ctxt_, prepGeom1_, geom3_), 2);
+ ensure_equals("touches", GEOSPreparedTouches_r(ctxt_, prepGeom1_, geom2_), 2);
+ ensure_equals("overlaps", GEOSPreparedOverlaps_r(ctxt_, prepGeom1_, geom2_), 2);
+ ensure_equals("intersects", GEOSPreparedIntersects_r(ctxt_, prepGeom1_, geom2_), 2);
+ ensure_equals("disjoint", GEOSPreparedDisjoint_r(ctxt_, prepGeom1_, geom2_), 2);
+ ensure_equals("relate pattern", GEOSPreparedRelatePattern_r(ctxt_, prepGeom1_, geom2_, "T********"), 2);
+ ensure_equals("within", GEOSPreparedWithin_r(ctxt_, prepGeom1_, geom3_), 2);
+ ensure(GEOSPreparedRelate_r(ctxt_, prepGeom1_, geom2_) == nullptr);
+
+ GEOSContext_setCurveToLineParams_r(ctxt_, curveToLineParams_);
+
+ ensure_equals("contains", GEOSPreparedContains_r(ctxt_, prepGeom1_, geom2_), 0);
+ ensure_equals("contains properly", GEOSPreparedContainsProperly_r(ctxt_, prepGeom1_, geom2_), 0);
+ ensure_equals("crosses", GEOSPreparedCrosses_r(ctxt_, prepGeom1_, geom2_), 0);
+ ensure_equals("covered by", GEOSPreparedCoveredBy_r(ctxt_, prepGeom1_, geom3_), 1);
+ ensure_equals("touches", GEOSPreparedTouches_r(ctxt_, prepGeom1_, geom2_), 0);
+ ensure_equals("overlaps", GEOSPreparedOverlaps_r(ctxt_, prepGeom1_, geom2_), 0);
+ ensure_equals("intersects", GEOSPreparedIntersects_r(ctxt_, prepGeom1_, geom2_), 0);
+ ensure_equals("disjoint", GEOSPreparedDisjoint_r(ctxt_, prepGeom1_, geom2_), 1);
+ ensure_equals("relate pattern", GEOSPreparedRelatePattern_r(ctxt_, prepGeom1_, geom2_, "T********"), 0);
+ ensure_equals("within", GEOSPreparedWithin_r(ctxt_, prepGeom1_, geom3_), 1);
+
+ str_ = GEOSPreparedRelate_r(ctxt_, prepGeom1_, geom2_);
+ ensure(str_);
+}
+
+template<>
+template<>
+void object::test<19>()
+{
+ set_test_name("LineString first argument, CircularString second argument");
+ useContext();
+
+ geom1_ = fromWKT("LINESTRING (-10 -10, 10 10)");
+ geom2_ = fromWKT("CIRCULARSTRING (-5 0, 0 5, 5 0)");
+ geom3_ = fromWKT("CIRCULARSTRING (-100 -100, 0 100, 100 0)");
+
+ prepGeom1_ = GEOSPrepare_r(ctxt_, geom1_);
+
+ // No curve-to-line params; all functions return 2 (error)
+ ensure_equals("contains", GEOSPreparedContains_r(ctxt_, prepGeom1_, geom2_), 2);
+ ensure_equals("contains properly", GEOSPreparedContainsProperly_r(ctxt_, prepGeom1_, geom2_), 2);
+ ensure_equals("crosses", GEOSPreparedCrosses_r(ctxt_, prepGeom1_, geom2_), 2);
+ ensure_equals("covered by", GEOSPreparedCoveredBy_r(ctxt_, prepGeom1_, geom3_), 2);
+ ensure_equals("touches", GEOSPreparedTouches_r(ctxt_, prepGeom1_, geom2_), 2);
+ ensure_equals("overlaps", GEOSPreparedOverlaps_r(ctxt_, prepGeom1_, geom2_), 2);
+ ensure_equals("intersects", GEOSPreparedIntersects_r(ctxt_, prepGeom1_, geom2_), 2);
+ ensure_equals("disjoint", GEOSPreparedDisjoint_r(ctxt_, prepGeom1_, geom2_), 2);
+ ensure_equals("relate pattern", GEOSPreparedRelatePattern_r(ctxt_, prepGeom1_, geom2_, "T********"), 2);
+ ensure_equals("within", GEOSPreparedWithin_r(ctxt_, prepGeom1_, geom3_), 2);
+ ensure(GEOSPreparedRelate_r(ctxt_, prepGeom1_, geom2_) == nullptr);
+
+ GEOSContext_setCurveToLineParams_r(ctxt_, curveToLineParams_);
+
+ ensure_equals("contains", GEOSPreparedContains_r(ctxt_, prepGeom1_, geom2_), 0);
+ ensure_equals("contains properly", GEOSPreparedContainsProperly_r(ctxt_, prepGeom1_, geom2_), 0);
+ ensure_equals("crosses", GEOSPreparedCrosses_r(ctxt_, prepGeom1_, geom2_), 1);
+ ensure_equals("covered by", GEOSPreparedCoveredBy_r(ctxt_, prepGeom1_, geom3_), 0);
+ ensure_equals("touches", GEOSPreparedTouches_r(ctxt_, prepGeom1_, geom2_), 0);
+ ensure_equals("overlaps", GEOSPreparedOverlaps_r(ctxt_, prepGeom1_, geom2_), 0);
+ ensure_equals("intersects", GEOSPreparedIntersects_r(ctxt_, prepGeom1_, geom2_), 1);
+ ensure_equals("disjoint", GEOSPreparedDisjoint_r(ctxt_, prepGeom1_, geom2_), 0);
+ ensure_equals("relate pattern", GEOSPreparedRelatePattern_r(ctxt_, prepGeom1_, geom2_, "T********"), 1);
+ ensure_equals("within", GEOSPreparedWithin_r(ctxt_, prepGeom1_, geom3_), 0);
+
+ str_ = GEOSPreparedRelate_r(ctxt_, prepGeom1_, geom2_);
+ ensure(str_);
+}
+
} // namespace tut
-----------------------------------------------------------------------
Summary of changes:
capi/geos_ts_c.cpp | 24 +++----
src/geom/prep/AbstractPreparedPolygonContains.cpp | 2 +
src/geom/prep/PreparedPolygonContainsProperly.cpp | 3 +
tests/unit/capi/GEOSPreparedGeometryTest.cpp | 86 +++++++++++++++++++++++
4 files changed, 103 insertions(+), 12 deletions(-)
hooks/post-receive
--
GEOS
More information about the geos-commits
mailing list