From git at osgeo.org Sat Aug 1 08:48:18 2026 From: git at osgeo.org (git at osgeo.org) Date: Sat, 1 Aug 2026 08:48:18 -0700 (PDT) Subject: [geos-commits] [SCM] GEOS branch main updated. a03789b339d5adfe3930ee7e972cb156030398f4 Message-ID: <20260801154818.E02851DEDC5@trac.osgeo.org> 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 a03789b339d5adfe3930ee7e972cb156030398f4 (commit) via 25ef2a5ee2eae10f5beeea11df21ee6eb23992d9 (commit) via 082f1ba64ac98791cf29f1433796feabbf2b5906 (commit) from 5936422beec01ab882b7009a142ce3b43cefc272 (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 ----------------------------------------------------------------- ----------------------------------------------------------------------- Summary of changes: include/geos/geom/CircularString.h | 5 +++++ include/geos/geom/CompoundCurve.h | 4 ++++ include/geos/geom/CurvePolygon.h | 4 ++++ include/geos/geom/Geometry.h | 6 +++++- include/geos/geom/MultiCurve.h | 4 ++++ include/geos/geom/MultiSurface.h | 4 ++++ src/geom/Geometry.cpp | 5 +++++ src/geom/GeometryFactory.cpp | 10 ++++----- src/operation/split/GeometrySplitter.cpp | 7 ++++++ src/operation/valid/IsSimpleOp.cpp | 25 +++++++++++++++------- tests/unit/geom/GeometryFactoryTest.cpp | 19 ++++++++++++++++ .../unit/operation/split/GeometrySplitterTest.cpp | 7 ------ tests/unit/operation/valid/IsSimpleOpTest.cpp | 24 +++++++++++++++++++-- 13 files changed, 101 insertions(+), 23 deletions(-) hooks/post-receive -- GEOS From git at osgeo.org Sat Aug 1 08:48:20 2026 From: git at osgeo.org (git at osgeo.org) Date: Sat, 1 Aug 2026 08:48:20 -0700 (PDT) Subject: [geos-commits] [SCM] GEOS branch dependabot/github_actions/all-actions-35a59c4c94 created. a8561f99354528d5278a99aba5d8a10c77233eb6 Message-ID: <20260801154821.0C4431DE92C@trac.osgeo.org> 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, dependabot/github_actions/all-actions-35a59c4c94 has been created at a8561f99354528d5278a99aba5d8a10c77233eb6 (commit) - Log ----------------------------------------------------------------- commit a8561f99354528d5278a99aba5d8a10c77233eb6 Author: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Date: Sat Aug 1 15:47:54 2026 +0000 Bump the all-actions group with 4 updates Bumps the all-actions group with 4 updates: [actions/checkout](https://github.com/actions/checkout), [vmactions/freebsd-vm](https://github.com/vmactions/freebsd-vm), [github/codeql-action](https://github.com/github/codeql-action) and [docker/login-action](https://github.com/docker/login-action). Updates `actions/checkout` from 7.0.0 to 7.0.1 - [Release notes](https://github.com/actions/checkout/releases) - [Changelog](https://github.com/actions/checkout/blob/main/CHANGELOG.md) - [Commits](https://github.com/actions/checkout/compare/v7.0.0...v7.0.1) Updates `vmactions/freebsd-vm` from 1.5.0 to 1.5.2 - [Release notes](https://github.com/vmactions/freebsd-vm/releases) - [Commits](https://github.com/vmactions/freebsd-vm/compare/v1.5.0...v1.5.2) Updates `github/codeql-action` from 4.36.2 to 4.37.3 - [Release notes](https://github.com/github/codeql-action/releases) - [Changelog](https://github.com/github/codeql-action/blob/main/CHANGELOG.md) - [Commits](https://github.com/github/codeql-action/compare/v4.36.2...v4.37.3) Updates `docker/login-action` from 4 to 4.5.1 - [Release notes](https://github.com/docker/login-action/releases) - [Commits](https://github.com/docker/login-action/compare/v4...v4.5.1) --- updated-dependencies: - dependency-name: actions/checkout dependency-version: 7.0.1 dependency-type: direct:production update-type: version-update:semver-patch dependency-group: all-actions - dependency-name: vmactions/freebsd-vm dependency-version: 1.5.2 dependency-type: direct:production update-type: version-update:semver-patch dependency-group: all-actions - dependency-name: github/codeql-action dependency-version: 4.37.3 dependency-type: direct:production update-type: version-update:semver-minor dependency-group: all-actions - dependency-name: docker/login-action dependency-version: 4.5.1 dependency-type: direct:production update-type: version-update:semver-minor dependency-group: all-actions ... Signed-off-by: dependabot[bot] diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 6df0cef55..8058675e1 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -197,7 +197,7 @@ jobs: python3 -m pip install --disable-pip-version-check --user cmake==${{ matrix.ci.cmake }} echo "$(python3 -m site --user-base)/bin" >> $GITHUB_PATH - - uses: actions/checkout at v7.0.0 + - uses: actions/checkout at v7.0.1 - name: Retrieve build cache uses: actions/cache/restore at v6.1.0 @@ -281,7 +281,7 @@ jobs: build_type: ['Debug', 'Release'] steps: - - uses: actions/checkout at v7.0.0 + - uses: actions/checkout at v7.0.1 - name: 'Setup' uses: msys2/setup-msys2 at v2 @@ -337,7 +337,7 @@ jobs: arch: arm64 steps: - - uses: actions/checkout at v7.0.0 + - uses: actions/checkout at v7.0.1 # ccache not supported for this generator and/or Debug @@ -378,7 +378,7 @@ jobs: runs-on: ${{ matrix.ci.os }} steps: - - uses: actions/checkout at v7.0.0 + - uses: actions/checkout at v7.0.1 - name: Retrieve build cache uses: actions/cache/restore at v6.1.0 @@ -459,7 +459,7 @@ jobs: which clang++ clang++ --version - - uses: actions/checkout at v7.0.0 + - uses: actions/checkout at v7.0.1 - name: Retrieve build cache uses: actions/cache/restore at v6.1.0 @@ -495,7 +495,7 @@ jobs: name: FreeBSD runs-on: ubuntu-latest steps: - - uses: actions/checkout at v7.0.0 + - uses: actions/checkout at v7.0.1 - name: Retrieve build cache uses: actions/cache/restore at v6.1.0 @@ -506,7 +506,7 @@ jobs: restore-keys: freebsd - name: Build and test - uses: vmactions/freebsd-vm at v1.5.0 + uses: vmactions/freebsd-vm at v1.5.2 with: release: "15.0" envs: CCACHE_COMPRESS CCACHE_COMPRESSLEVEL CCACHE_MAXSIZE @@ -540,7 +540,7 @@ jobs: sudo -E apt-get autopurge -y needrestart sudo -E apt-get -yq --no-install-suggests --no-install-recommends install make cmake emscripten ccache - - uses: actions/checkout at v7.0.0 + - uses: actions/checkout at v7.0.1 - name: Retrieve build cache uses: actions/cache/restore at v6.1.0 @@ -582,7 +582,7 @@ jobs: sudo -E apt-get -yq --no-install-suggests --no-install-recommends install cppcheck python3 -m pip install --disable-pip-version-check --user codespell - - uses: actions/checkout at v7.0.0 + - uses: actions/checkout at v7.0.1 - name: 'cppcheck' run: ./tools/cppcheck.sh @@ -605,7 +605,7 @@ jobs: python3 -m pip install --disable-pip-version-check --user cmake==3.15.* echo "$(python3 -m site --user-base)/bin" >> $GITHUB_PATH - - uses: actions/checkout at v7.0.0 + - uses: actions/checkout at v7.0.1 with: path: geos diff --git a/.github/workflows/codeql.yml b/.github/workflows/codeql.yml index 3b2190fcf..a42d66e77 100644 --- a/.github/workflows/codeql.yml +++ b/.github/workflows/codeql.yml @@ -36,11 +36,11 @@ jobs: # Learn more about CodeQL language support at https://aka.ms/codeql-docs/language-support steps: - - uses: actions/checkout at v7.0.0 + - uses: actions/checkout at v7.0.1 # Initializes the CodeQL tools for scanning. - name: Initialize CodeQL - uses: github/codeql-action/init at v4.36.2 + uses: github/codeql-action/init at v4.37.3 with: languages: ${{ matrix.language }} # If you wish to specify custom queries, you can do so here or in a config file. @@ -63,6 +63,6 @@ jobs: make -j$(nproc) - name: Perform CodeQL Analysis - uses: github/codeql-action/analyze at v4.36.2 + uses: github/codeql-action/analyze at v4.37.3 with: category: "/language:${{matrix.language}}" diff --git a/.github/workflows/container.yml b/.github/workflows/container.yml index 8689d26ad..649c23048 100644 --- a/.github/workflows/container.yml +++ b/.github/workflows/container.yml @@ -24,7 +24,7 @@ jobs: steps: - - uses: actions/checkout at v7.0.0 + - uses: actions/checkout at v7.0.1 - name: Docker meta id: meta @@ -40,7 +40,7 @@ jobs: type=sha,prefix= - name: Login to GitHub Container Registry - uses: docker/login-action at v4 + uses: docker/login-action at v4.5.1 with: registry: ghcr.io username: ${{ github.repository_owner }} diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 309573c6b..60dcffee5 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -32,7 +32,7 @@ jobs: uname -a sudo -E apt-get -yq --no-install-suggests --no-install-recommends install make doxygen - - uses: actions/checkout at v7.0.0 + - uses: actions/checkout at v7.0.1 - name: Get tag id: tag diff --git a/.github/workflows/web.yml b/.github/workflows/web.yml index 152377359..851d6f820 100644 --- a/.github/workflows/web.yml +++ b/.github/workflows/web.yml @@ -27,7 +27,7 @@ jobs: sudo -E apt-get -yq --no-install-suggests --no-install-recommends install make doxygen - name: 'Check Out ?' - uses: actions/checkout at v7.0.0 + uses: actions/checkout at v7.0.1 - name: 'Hugo Build ?' # ...or replace 'master' with a full version tag, such as: v0.64.1 ----------------------------------------------------------------------- hooks/post-receive -- GEOS From git at osgeo.org Sun Aug 2 14:26:11 2026 From: git at osgeo.org (git at osgeo.org) Date: Sun, 2 Aug 2026 14:26:11 -0700 (PDT) Subject: [geos-commits] [SCM] GEOS branch dependabot/github_actions/all-actions-35a59c4c94 deleted. a8561f99354528d5278a99aba5d8a10c77233eb6 Message-ID: <20260802212611.BFC9F1D381A@trac.osgeo.org> 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, dependabot/github_actions/all-actions-35a59c4c94 has been deleted was a8561f99354528d5278a99aba5d8a10c77233eb6 - Log ----------------------------------------------------------------- a8561f99354528d5278a99aba5d8a10c77233eb6 Bump the all-actions group with 4 updates ----------------------------------------------------------------------- hooks/post-receive -- GEOS From git at osgeo.org Sun Aug 2 14:26:11 2026 From: git at osgeo.org (git at osgeo.org) Date: Sun, 2 Aug 2026 14:26:11 -0700 (PDT) Subject: [geos-commits] [SCM] GEOS branch main updated. 6e7863754410956b182ff8b687251e7f429ed67d Message-ID: <20260802212612.196381D333A@trac.osgeo.org> 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 6e7863754410956b182ff8b687251e7f429ed67d (commit) from a03789b339d5adfe3930ee7e972cb156030398f4 (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 6e7863754410956b182ff8b687251e7f429ed67d Author: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon Aug 3 09:25:38 2026 +1200 Bump the all-actions group with 4 updates (#1496) Bumps the all-actions group with 4 updates: - Updates `actions/checkout` from 7.0.0 to 7.0.1 - Updates `vmactions/freebsd-vm` from 1.5.0 to 1.5.2 - Updates `github/codeql-action` from 4.36.2 to 4.37.3 - Updates `docker/login-action` from 4 to 4.5.1 Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 6df0cef55..8058675e1 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -197,7 +197,7 @@ jobs: python3 -m pip install --disable-pip-version-check --user cmake==${{ matrix.ci.cmake }} echo "$(python3 -m site --user-base)/bin" >> $GITHUB_PATH - - uses: actions/checkout at v7.0.0 + - uses: actions/checkout at v7.0.1 - name: Retrieve build cache uses: actions/cache/restore at v6.1.0 @@ -281,7 +281,7 @@ jobs: build_type: ['Debug', 'Release'] steps: - - uses: actions/checkout at v7.0.0 + - uses: actions/checkout at v7.0.1 - name: 'Setup' uses: msys2/setup-msys2 at v2 @@ -337,7 +337,7 @@ jobs: arch: arm64 steps: - - uses: actions/checkout at v7.0.0 + - uses: actions/checkout at v7.0.1 # ccache not supported for this generator and/or Debug @@ -378,7 +378,7 @@ jobs: runs-on: ${{ matrix.ci.os }} steps: - - uses: actions/checkout at v7.0.0 + - uses: actions/checkout at v7.0.1 - name: Retrieve build cache uses: actions/cache/restore at v6.1.0 @@ -459,7 +459,7 @@ jobs: which clang++ clang++ --version - - uses: actions/checkout at v7.0.0 + - uses: actions/checkout at v7.0.1 - name: Retrieve build cache uses: actions/cache/restore at v6.1.0 @@ -495,7 +495,7 @@ jobs: name: FreeBSD runs-on: ubuntu-latest steps: - - uses: actions/checkout at v7.0.0 + - uses: actions/checkout at v7.0.1 - name: Retrieve build cache uses: actions/cache/restore at v6.1.0 @@ -506,7 +506,7 @@ jobs: restore-keys: freebsd - name: Build and test - uses: vmactions/freebsd-vm at v1.5.0 + uses: vmactions/freebsd-vm at v1.5.2 with: release: "15.0" envs: CCACHE_COMPRESS CCACHE_COMPRESSLEVEL CCACHE_MAXSIZE @@ -540,7 +540,7 @@ jobs: sudo -E apt-get autopurge -y needrestart sudo -E apt-get -yq --no-install-suggests --no-install-recommends install make cmake emscripten ccache - - uses: actions/checkout at v7.0.0 + - uses: actions/checkout at v7.0.1 - name: Retrieve build cache uses: actions/cache/restore at v6.1.0 @@ -582,7 +582,7 @@ jobs: sudo -E apt-get -yq --no-install-suggests --no-install-recommends install cppcheck python3 -m pip install --disable-pip-version-check --user codespell - - uses: actions/checkout at v7.0.0 + - uses: actions/checkout at v7.0.1 - name: 'cppcheck' run: ./tools/cppcheck.sh @@ -605,7 +605,7 @@ jobs: python3 -m pip install --disable-pip-version-check --user cmake==3.15.* echo "$(python3 -m site --user-base)/bin" >> $GITHUB_PATH - - uses: actions/checkout at v7.0.0 + - uses: actions/checkout at v7.0.1 with: path: geos diff --git a/.github/workflows/codeql.yml b/.github/workflows/codeql.yml index 3b2190fcf..a42d66e77 100644 --- a/.github/workflows/codeql.yml +++ b/.github/workflows/codeql.yml @@ -36,11 +36,11 @@ jobs: # Learn more about CodeQL language support at https://aka.ms/codeql-docs/language-support steps: - - uses: actions/checkout at v7.0.0 + - uses: actions/checkout at v7.0.1 # Initializes the CodeQL tools for scanning. - name: Initialize CodeQL - uses: github/codeql-action/init at v4.36.2 + uses: github/codeql-action/init at v4.37.3 with: languages: ${{ matrix.language }} # If you wish to specify custom queries, you can do so here or in a config file. @@ -63,6 +63,6 @@ jobs: make -j$(nproc) - name: Perform CodeQL Analysis - uses: github/codeql-action/analyze at v4.36.2 + uses: github/codeql-action/analyze at v4.37.3 with: category: "/language:${{matrix.language}}" diff --git a/.github/workflows/container.yml b/.github/workflows/container.yml index 8689d26ad..649c23048 100644 --- a/.github/workflows/container.yml +++ b/.github/workflows/container.yml @@ -24,7 +24,7 @@ jobs: steps: - - uses: actions/checkout at v7.0.0 + - uses: actions/checkout at v7.0.1 - name: Docker meta id: meta @@ -40,7 +40,7 @@ jobs: type=sha,prefix= - name: Login to GitHub Container Registry - uses: docker/login-action at v4 + uses: docker/login-action at v4.5.1 with: registry: ghcr.io username: ${{ github.repository_owner }} diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 309573c6b..60dcffee5 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -32,7 +32,7 @@ jobs: uname -a sudo -E apt-get -yq --no-install-suggests --no-install-recommends install make doxygen - - uses: actions/checkout at v7.0.0 + - uses: actions/checkout at v7.0.1 - name: Get tag id: tag diff --git a/.github/workflows/web.yml b/.github/workflows/web.yml index 152377359..851d6f820 100644 --- a/.github/workflows/web.yml +++ b/.github/workflows/web.yml @@ -27,7 +27,7 @@ jobs: sudo -E apt-get -yq --no-install-suggests --no-install-recommends install make doxygen - name: 'Check Out ?' - uses: actions/checkout at v7.0.0 + uses: actions/checkout at v7.0.1 - name: 'Hugo Build ?' # ...or replace 'master' with a full version tag, such as: v0.64.1 ----------------------------------------------------------------------- Summary of changes: .github/workflows/ci.yml | 20 ++++++++++---------- .github/workflows/codeql.yml | 6 +++--- .github/workflows/container.yml | 4 ++-- .github/workflows/release.yml | 2 +- .github/workflows/web.yml | 2 +- 5 files changed, 17 insertions(+), 17 deletions(-) hooks/post-receive -- GEOS From git at osgeo.org Tue Aug 4 07:58:47 2026 From: git at osgeo.org (git at osgeo.org) Date: Tue, 4 Aug 2026 07:58:47 -0700 (PDT) Subject: [geos-commits] [SCM] GEOS branch main updated. f3ef975464a5c1a4b057d0a946aeec103e335228 Message-ID: <20260804145847.DE0AC1DD38D@trac.osgeo.org> 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 f3ef975464a5c1a4b057d0a946aeec103e335228 (commit) from 6e7863754410956b182ff8b687251e7f429ed67d (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 f3ef975464a5c1a4b057d0a946aeec103e335228 Author: doug mansell Date: Tue Aug 4 22:58:24 2026 +0800 C API: Fix GEOSGeom_releaseCollection_r error message (#1498) diff --git a/capi/geos_ts_c.cpp b/capi/geos_ts_c.cpp index ee6391ca2..eaccf1739 100644 --- a/capi/geos_ts_c.cpp +++ b/capi/geos_ts_c.cpp @@ -2762,7 +2762,7 @@ extern "C" { GeometryCollection *col = dynamic_cast(collection); if (!col) { - handle->ERROR_MESSAGE("Parameter collection of GEOSGeom_releaseCollection_r must not be a collection"); + handle->ERROR_MESSAGE("Parameter collection of GEOSGeom_releaseCollection_r must be a collection"); } else { *ngeoms = static_cast(col->getNumGeometries()); } ----------------------------------------------------------------------- Summary of changes: capi/geos_ts_c.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) hooks/post-receive -- GEOS From git at osgeo.org Fri Aug 7 09:10:54 2026 From: git at osgeo.org (git at osgeo.org) Date: Fri, 7 Aug 2026 09:10:54 -0700 (PDT) Subject: [geos-commits] [SCM] GEOS branch main updated. 4ed8f7bf56fc71cf0092ca354cf3fdcf5a8e8d77 Message-ID: <20260807161054.97F841C86E8@trac.osgeo.org> 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 4ed8f7bf56fc71cf0092ca354cf3fdcf5a8e8d77 (commit) from f3ef975464a5c1a4b057d0a946aeec103e335228 (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 4ed8f7bf56fc71cf0092ca354cf3fdcf5a8e8d77 Author: Petr B?lohl?vek Date: Fri Aug 7 18:10:26 2026 +0200 Add CI support for Clang 21 and 22 (#1501) Signed-off-by: Petr Belohlavek diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 8058675e1..4858ec65e 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -183,6 +183,27 @@ jobs: cmake: 4.2.* os: ubuntu-24.04 + # clang 21 and lower are not supported + # in ubuntu 26.04 and higher + + - cxx_compiler: clang++-21 + c_compiler: clang-21 + build_type: Debug + cxxstd: 20 + arch: 64 + packages: 'clang-21' + cmake: 4.3.* + os: ubuntu-26.04 + + - cxx_compiler: clang++-22 + c_compiler: clang-22 + build_type: Debug + cxxstd: 20 + arch: 64 + packages: 'clang-22' + cmake: 4.4.* + os: ubuntu-26.04 + runs-on: ${{ matrix.ci.os }} steps: ----------------------------------------------------------------------- Summary of changes: .github/workflows/ci.yml | 21 +++++++++++++++++++++ 1 file changed, 21 insertions(+) hooks/post-receive -- GEOS From git at osgeo.org Fri Aug 7 11:01:31 2026 From: git at osgeo.org (git at osgeo.org) Date: Fri, 7 Aug 2026 11:01:31 -0700 (PDT) Subject: [geos-commits] [SCM] GEOS branch main updated. 5b62cd06ceeee053f2c7a4bf96138fc1c98675bc Message-ID: <20260807180131.922BB1C9B81@trac.osgeo.org> 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 5b62cd06ceeee053f2c7a4bf96138fc1c98675bc (commit) from 4ed8f7bf56fc71cf0092ca354cf3fdcf5a8e8d77 (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 5b62cd06ceeee053f2c7a4bf96138fc1c98675bc Author: Daniel Baston Date: Fri Aug 7 14:01:13 2026 -0400 CircularArcIntersector: Explicitly check for endpoint/control point equality (#1480) diff --git a/src/algorithm/CircularArcIntersector.cpp b/src/algorithm/CircularArcIntersector.cpp index 5f82d3230..79ab344b9 100644 --- a/src/algorithm/CircularArcIntersector.cpp +++ b/src/algorithm/CircularArcIntersector.cpp @@ -142,9 +142,10 @@ CircularArcIntersector::intersects(const CircularArc& arc, const CoordinateSeque return; } - // Check for exact endpoint-endpoint intersections + // Check for exact endpoint-endpoint or endpoint-control point intersections // If found, replace the computed intersection points with an exact endpoint const CoordinateXY& ap0 = arc.p0(); + const CoordinateXY& ap1 = arc.p1(); const CoordinateXY& ap2 = arc.p2(); const CoordinateXY& bp0 = seq.getAt(segPos0); const CoordinateXY& bp1 = seq.getAt(segPos1); @@ -152,6 +153,9 @@ CircularArcIntersector::intersects(const CircularArc& arc, const CoordinateSeque if (ap0 == bp0 || ap0 == bp1) { closestPoint(isect0, isect1, nPointsIntersectingLine, ap0) = ap0; } + if (ap1 == bp0 || ap1 == bp1) { + closestPoint(isect0, isect1, nPointsIntersectingLine, ap1) = ap1; + } if (ap2 == bp0 || ap2 == bp1) { closestPoint(isect0, isect1, nPointsIntersectingLine, ap2) = ap2; } @@ -251,14 +255,19 @@ CircularArcIntersector::intersects(const CircularArc& arc1, const CircularArc& a // Check to see if computed intersection points are inexact versions of an endpoint intersection const CoordinateXY& ap0 = arc1.p0(); + const CoordinateXY& ap1 = arc1.p1(); const CoordinateXY& ap2 = arc1.p2(); const CoordinateXY& bp0 = arc2.p0(); + const CoordinateXY& bp1 = arc2.p1(); const CoordinateXY& bp2 = arc2.p2(); - if (ap0 == bp0 || ap0 == bp2) { + if (ap0 == bp0 || ap0 == bp1 || ap0 == bp2) { closestPoint(isect0, isect1, 2, ap0) = ap0; } - if (ap2 == bp0 || ap2 == bp2) { + if (ap1 == bp0 || ap1 == bp1 || ap1 == bp2) { + closestPoint(isect0, isect1, 2, ap1) = ap1; + } + if (ap2 == bp0 || ap2 == bp1 || ap2 == bp2) { closestPoint(isect0, isect1, 2, ap2) = ap2; } diff --git a/tests/xmltester/tests/general/TestOverlayCurvesAA.xml b/tests/xmltester/tests/general/TestOverlayCurvesAA.xml index d53c49484..c9a1d43a8 100644 --- a/tests/xmltester/tests/general/TestOverlayCurvesAA.xml +++ b/tests/xmltester/tests/general/TestOverlayCurvesAA.xml @@ -160,7 +160,7 @@ - CURVEPOLYGON ((0 0, 0 230, 210 230, 210 0, 0 0), COMPOUNDCURVE ((70 120, 90 90), CIRCULARSTRING (90 90, 100 120, 70 120)), CIRCULARSTRING (60 90, 60 60, 90 60, 96.21320343559643 75, 90 90, 75 96.21320343559643, 60 90), CIRCULARSTRING (0 0, 40 20, 60 60, 20 40, 0 0), (90 90, 120 70, 120 80, 90 90)) + CURVEPOLYGON ((0 0, 0 230, 210 230, 210 0, 0 0), COMPOUNDCURVE ((70 120, 90 90), CIRCULARSTRING (90 90, 100 120, 70 120)), CIRCULARSTRING (60 60, 75 53.78679656440357, 90 60, 96.21320343559643 75, 90 90, 75 96.21320343559643, 60 90, 53.78679656440357 75, 60 60), CIRCULARSTRING (0 0, 40 20, 60 60, 20 40, 0 0), (90 90, 120 70, 120 80, 90 90)) @@ -174,13 +174,13 @@ - MULTISURFACE (CURVEPOLYGON (CIRCULARSTRING (60 90, 90 90, 90 60, 60 60, 60 90)), CURVEPOLYGON (CIRCULARSTRING (0 0, 20 40, 60 60, 40 20, 0 0))) + MULTISURFACE (CURVEPOLYGON (CIRCULARSTRING (60 60, 53.78679656440357 75, 60 90, 90 90, 90 60, 75 53.78679656440357, 60 60)), CURVEPOLYGON (CIRCULARSTRING (0 0, 20 40, 60 60, 40 20, 0 0))) - CURVEPOLYGON ((0 0, 0 300, 340 300, 340 0, 0 0), CIRCULARSTRING (60 90, 60 60, 90 60, 90 90, 60 90), CIRCULARSTRING (0 0, 40 20, 60 60, 20 40, 0 0)) + CURVEPOLYGON ((0 0, 0 300, 340 300, 340 0, 0 0), CIRCULARSTRING (60 60, 75 53.78679656440357, 90 60, 90 90, 60 90, 53.78679656440357 75, 60 60), CIRCULARSTRING (0 0, 40 20, 60 60, 20 40, 0 0)) @@ -226,12 +226,29 @@ CURVEPOLYGON (COMPOUNDCURVE((0 80, 0 240, 220 240, 220 80), CIRCULARSTRING(220 80, 110 100, 0 80)), COMPOUNDCURVE((110 100, 120 120), CIRCULARSTRING(120 120, 110 120, 110 100))) + + + CURVEPOLYGON (COMPOUNDCURVE ((20 86.75950277309494, 20 160, 200 160, 200 86.75950277309494), CIRCULARSTRING (200 86.75950277309494, 155.48436755308268 96.672156424695, 110 100, 64.5156324469173 96.672156424695, 20 86.75950277309494)), COMPOUNDCURVE ((110 100, 120 120), CIRCULARSTRING (120 120, 110 120, 110 100))) + + + CURVEPOLYGON (COMPOUNDCURVE ((0 80, 0 240, 220 240, 220 80), CIRCULARSTRING (220 80, 210.05709729666793 83.54869072597688, 200 86.75950277309494), (200 86.75950277309494, 200 0, 20 0), (20 0, 20 86.75950277309494), CIRCULARSTRING (20 86.75950277309494, 9.942902703332095 83.54869072597688, 0 80))) + + + MULTISURFACE (CURVEPOLYGON (COMPOUNDCURVE (CIRCULARSTRING (110 100, 110 120, 120 120), (120 120, 110 100))), CURVEPOLYGON (COMPOUNDCURVE ((20 0, 20 86.75950277309494), CIRCULARSTRING (20 86.75950277309494, 64.5156324469173 96.672156424695, 110 100, 155.48436755308268 96.672156424695, 200 86.75950277309494), (200 86.75950277309494, 200 0, 20 0)))) + + + + + + MULTISURFACE (CURVEPOLYGON (COMPOUNDCURVE (CIRCULARSTRING (110 100, 110 120, 120 120), (120 120, 110 100))), CURVEPOLYGON (COMPOUNDCURVE ((0 80, 0 240, 220 240, 220 80), CIRCULARSTRING (220 80, 210.05709729666793 83.54869072597688, 200 86.75950277309494), (200 86.75950277309494, 200 160, 20 160, 20 86.75950277309494), CIRCULARSTRING (20 86.75950277309494, 9.942902703332095 83.54869072597688, 0 80))), CURVEPOLYGON (COMPOUNDCURVE ((20 0, 20 86.75950277309494), CIRCULARSTRING (20 86.75950277309494, 64.5156324469173 96.672156424695, 110 100, 155.48436755308268 96.672156424695, 200 86.75950277309494), (200 86.75950277309494, 200 0, 20 0)))) + + mAmA - complex polygons touching and overlapping ----------------------------------------------------------------------- Summary of changes: src/algorithm/CircularArcIntersector.cpp | 15 +++++++++++--- .../tests/general/TestOverlayCurvesAA.xml | 23 +++++++++++++++++++--- 2 files changed, 32 insertions(+), 6 deletions(-) hooks/post-receive -- GEOS From git at osgeo.org Sun Aug 9 05:33:51 2026 From: git at osgeo.org (git at osgeo.org) Date: Sun, 9 Aug 2026 05:33:51 -0700 (PDT) Subject: [geos-commits] [SCM] GEOS branch main updated. 14fd2d70311aae9646e5d2e5364921822074de2b Message-ID: <20260809123355.F2EEF1D2F99@trac.osgeo.org> 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 14fd2d70311aae9646e5d2e5364921822074de2b (commit) via 59a36b35cfe4c51019ba0f673473e1c1155b5d8e (commit) from 5b62cd06ceeee053f2c7a4bf96138fc1c98675bc (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 14fd2d70311aae9646e5d2e5364921822074de2b Author: Daniel Baston Date: Wed Aug 5 14:17:14 2026 -0400 GeometryNoder: Replace OrientedCoordinateArray with arc-specific logic Resolves https://github.com/libgeos/geos/issues/1497 diff --git a/include/geos/noding/DirectionIndependentArcString.h b/include/geos/noding/DirectionIndependentArcString.h new file mode 100644 index 000000000..b7b0d8f10 --- /dev/null +++ b/include/geos/noding/DirectionIndependentArcString.h @@ -0,0 +1,52 @@ +/********************************************************************** +* + * GEOS - Geometry Engine Open Source + * http://geos.osgeo.org + * + * Copyright (C) 2026 ISciences, LLC + * + * This is free software; you can redistribute and/or modify it under + * the terms of the GNU Lesser General Public Licence as published + * by the Free Software Foundation. + * See the COPYING file for more information. + * + **********************************************************************/ + +#pragma once + +#include +#include + + +namespace geos::noding { +class ArcString; +} + +namespace geos::noding { + +/// The DirectionIndependentArcString is a thin wrapper over an ArcString that provides specialized +/// equality-testing and hashing functions. DirectionIndependentArcStrings are considered equal +/// if they cover the same path, regardless of direction. The control points of arcs are not required +/// to be identical, but must describe the same arc. +class GEOS_DLL DirectionIndependentArcString { + +public: + + explicit DirectionIndependentArcString(const ArcString& as) : m_as(as) {} + + const ArcString& getArcString() const + { + return m_as; + } + + bool operator==(const DirectionIndependentArcString& other) const; + +private: + const ArcString& m_as; +}; +} + +template<> +struct GEOS_DLL std::hash { + std::size_t operator()(const geos::noding::DirectionIndependentArcString& as) const noexcept; +}; diff --git a/src/noding/DirectionIndependentArcString.cpp b/src/noding/DirectionIndependentArcString.cpp new file mode 100644 index 000000000..0628384b2 --- /dev/null +++ b/src/noding/DirectionIndependentArcString.cpp @@ -0,0 +1,93 @@ +/********************************************************************** +* + * GEOS - Geometry Engine Open Source + * http://geos.osgeo.org + * + * Copyright (C) 2026 ISciences, LLC + * + * This is free software; you can redistribute and/or modify it under + * the terms of the GNU Lesser General Public Licence as published + * by the Free Software Foundation. + * See the COPYING file for more information. + * + **********************************************************************/ + +#include +#include + +#include + +namespace geos::noding { +static bool +arcStringsSame(const ArcString& as1, const ArcString& as2, bool reverse) +{ + using geom::CircularArc; + + const auto nArcs = as1.getSize(); + + if (as2.getSize() != nArcs) { + return false; + } + + for (std::size_t i = 0; i < nArcs; i++) { + const CircularArc& arc1 = as1.getArc(i); + const CircularArc& arc2 = as2.getArc(reverse ? nArcs - i - 1: i); + + if (reverse) { + if (arc1.p0() != arc2.p2() || arc1.p2() != arc2.p0()) { + return false; + } + + const bool arc1Linear = arc1.getOrientation() == algorithm::Orientation::COLLINEAR; + const bool arc2Linear = arc2.getOrientation() == algorithm::Orientation::COLLINEAR; + + if (arc1Linear != arc2Linear) { + return false; + } + + if (!arc1Linear && arc1.getOrientation() == arc2.getOrientation()) { + return false; + } + } + else { + if (arc1.p0() != arc2.p0() || arc1.p2() != arc2.p2()) { + return false; + } + if (arc1.getOrientation() != arc2.getOrientation()) { + return false; + } + } + + if (!arc1.isLinear() && arc1.getCenter() != arc2.getCenter()) { + return false; + } + } + + return true; +} + +bool +DirectionIndependentArcString::operator==(const DirectionIndependentArcString& other) const +{ + return arcStringsSame(m_as, other.m_as, false) || arcStringsSame(m_as, other.m_as, true); +} +} + +std::size_t +std::hash::operator()(const geos::noding::DirectionIndependentArcString& + as) const noexcept +{ + const auto* c1 = &as.getArcString().getArc(0).p0(); + const auto* c2 = &as.getArcString().getArc(as.getArcString().getSize() - 1).p2(); + + if (c2->compareTo(*c1) < 0) { + std::swap(c1, c2); + } + + size_t h = std::hash {}(c1->x); + h ^= std::hash {}(c1->y) << 1; + h ^= std::hash {}(c2->x) << 1; + h ^= std::hash {}(c2->y) << 1; + + return h; +} diff --git a/src/noding/GeometryNoder.cpp b/src/noding/GeometryNoder.cpp index 5296e729c..5de3b56b8 100644 --- a/src/noding/GeometryNoder.cpp +++ b/src/noding/GeometryNoder.cpp @@ -29,6 +29,7 @@ #include #include +#include #include #include #include @@ -41,6 +42,8 @@ #include #include // for unique_ptr +#include +#include using geos::geom::CoordinateXY; using geos::geom::SimpleCurve; @@ -317,22 +320,28 @@ GeometryNoder::toGeometry(std::vector>& nodedEdges) const geom::GeometryFactory* geomFact = argGeom1->getFactory(); std::set< OrientedCoordinateArray > ocas; + std::unordered_set arcStrings; std::vector pathsToKeep; - - for(auto& path : nodedEdges) { if (!isInResult(*path)) { continue; } - const auto& coords = path->getCoordinates(); - OrientedCoordinateArray oca1(*coords); + if (const auto* as = dynamic_cast(path.get())) { + // Check if an equivalent arc is known + if (arcStrings.emplace(*as).second) { + pathsToKeep.push_back(path.get()); + } + } else { + const auto& coords = path->getCoordinates(); + OrientedCoordinateArray oca1(*coords); - // Check if an equivalent edge is known - if(ocas.insert(oca1).second) { - pathsToKeep.push_back(path.get()); + // Check if an equivalent edge is known + if(ocas.insert(oca1).second) { + pathsToKeep.push_back(path.get()); + } } } diff --git a/tests/unit/capi/GEOSNodeTest.cpp b/tests/unit/capi/GEOSNodeTest.cpp index 63d893a55..10166adbc 100644 --- a/tests/unit/capi/GEOSNodeTest.cpp +++ b/tests/unit/capi/GEOSNodeTest.cpp @@ -284,8 +284,6 @@ void object::test<12>() expected_ = fromWKT("MULTICURVE (" "CIRCULARSTRING (-5 0, -4.7434164902525691 1.5811388300841900, -4 3)," "CIRCULARSTRING (-4 3, 0 5, 4 3)," - "CIRCULARSTRING (-4 3, 0 5, 4 3)," // FIXME this component is not removed by OrientedCoordinateArray because - // its control point differs slightly from the previous one "CIRCULARSTRING (4 3, 4.7434164902525691 1.5811388300841898, 5 0))"); ensure_equals_geometry_xyzm(reinterpret_cast(result_), @@ -398,5 +396,23 @@ void object::test<18>() } +template<> +template<> +void object::test<19>() +{ + set_test_name("two collinear CircularStrings"); + + input_ = fromWKT("MULTICURVE (CIRCULARSTRING (0 0, 1 1, 2 2), CIRCULARSTRING (2 2, 1 1, 0 0))"); + + result_ = GEOSNode(input_); + ensure(result_); + + ensure_equals(GEOSGetNumGeometries(result_), 1); + expected_ = fromWKT("MULTICURVE(CIRCULARSTRING (0 0, 1 1, 2 2))"); + + ensure_equals_exact_geometry_xyzm(reinterpret_cast(result_), + reinterpret_cast(expected_), 1e-4); +} + } // namespace tut diff --git a/tests/unit/noding/DirectionIndependentArcStringTest.cpp b/tests/unit/noding/DirectionIndependentArcStringTest.cpp new file mode 100644 index 000000000..55c71053f --- /dev/null +++ b/tests/unit/noding/DirectionIndependentArcStringTest.cpp @@ -0,0 +1,108 @@ +#include +#include + +#include +#include +#include +#include +#include + +using namespace geos::geom; +using namespace geos::noding; + +namespace tut { + +struct test_directionindependentarcstring_data { + geos::io::WKTReader reader_; + + static bool isSame(const ArcString& as0, const ArcString& as1) { + std::unordered_set map; + map.emplace(as0); + + return !map.emplace(as1).second; + } + + static bool isSame(const CircularString& cs0, const CircularString& cs1) { + ArcString as0(cs0.getArcs(), cs0.getSharedCoordinates(), nullptr); + ArcString as1(cs1.getArcs(), cs1.getSharedCoordinates(), nullptr); + + return isSame(as0, as1); + } + + bool isSame(const std::string& wkt0, const std::string& wkt1) { + auto cs0 = reader_.read(wkt0); + auto cs1 = reader_.read(wkt1); + + return isSame(*cs0, *cs1); + } +}; + +using group = test_group; +using object = group::object; + +group test_directionindependentarcstring_data("geos::noding::DirectionIndependentArcString"); + +template<> +template<> +void object::test<1>() +{ + set_test_name("equivalent: single-section arcs with different control points and opposite directions"); + + ensure(isSame("CIRCULARSTRING (-5 0, -4 3, 5 0)", "CIRCULARSTRING (5 0, 4 3, -5 0)")); +} + +template<> +template<> +void object::test<2>() +{ + set_test_name("equivalent: multi-section arcs with different control points and opposite directions"); + + ensure(isSame("CIRCULARSTRING (-5 0, -4 3, 5 0, 6 1, 7 0)", "CIRCULARSTRING (7 0, 6 1, 5 0, 4 3, -5 0)")); +} + +template<> +template<> +void object::test<3>() +{ + set_test_name("different: single-section arcs with same endpoints, covering different halves of circle"); + + ensure(!isSame("CIRCULARSTRING (-5 0, -4 3, 5 0)", "CIRCULARSTRING (-5 0, -4 -3, 5 0)")); +} + +template<> +template<> +void object::test<4>() +{ + set_test_name("equivalent: two degenerate (linear) arcs having different control points and opposite directions"); + + ensure(isSame("CIRCULARSTRING (0 0, 4 4, 10 10)", "CIRCULARSTRING (10 10, 8 8, 0 0)")); +} + +template<> +template<> +void object::test<5>() +{ + set_test_name("different: arc and degenerate arc having same endpoints"); + + ensure(!isSame("CIRCULARSTRING (-1 0, 0 1, 1 0)", "CIRCULARSTRING (-1 0, 0 0, 1 0)")); +} + +template<> +template<> +void object::test<6>() +{ + set_test_name("different: two arcs having same endpoints and different control points"); + + ensure(!isSame("CIRCULARSTRING (-1 0, 0 1, 1 0)", "CIRCULARSTRING (-1 0, 0 0.9, 1 0)")); +} + +template<> +template<> +void object::test<7>() +{ + set_test_name("different: two arcs sharing same path that later diverge"); + + ensure(!isSame("CIRCULARSTRING (-1 0, 0 1, 1 0, 2 -1, 3 0)", "CIRCULARSTRING (-1 0, 0 1, 1 0, 2 -1, 3 0.1)")); +} + +} diff --git a/tests/unit/operation/split/GeometrySplitterTest.cpp b/tests/unit/operation/split/GeometrySplitterTest.cpp index 95c730693..d4700ec47 100644 --- a/tests/unit/operation/split/GeometrySplitterTest.cpp +++ b/tests/unit/operation/split/GeometrySplitterTest.cpp @@ -906,11 +906,10 @@ void object::test<75>() { set_test_name("GH-1497"); - auto geom = reader_.read("CURVEPOLYGON (COMPOUNDCURVE((5 0, 0 0, 0 5, 5 5), CIRCULARSTRING(5 5, 7 1, 5 0)))"); - auto edge = reader_.read("CURVEPOLYGON (COMPOUNDCURVE((5 0, 0 0, 5 5), CIRCULARSTRING(5 5, 7 4, 5 0)))"); - - // This case is not currently handled correctly by the GeometrySplitter. Throw an error instead of returning an incorrect result. - ensure_THROW(GeometrySplitter::split(*geom, *edge), geos::util::GEOSException); + testSplit( + "CURVEPOLYGON (COMPOUNDCURVE((5 0, 0 0, 0 5, 5 5), CIRCULARSTRING(5 5, 7 1, 5 0)))", + "CURVEPOLYGON (COMPOUNDCURVE((5 0, 0 0, 5 5), CIRCULARSTRING(5 5, 7 4, 5 0)))", + "GEOMETRYCOLLECTION (CURVEPOLYGON (COMPOUNDCURVE ((5 0, 0 0, 5 5), CIRCULARSTRING (5 5, 7 1, 5 0))), POLYGON ((0 0, 0 5, 5 5, 0 0)))"); } -} \ No newline at end of file +} commit 59a36b35cfe4c51019ba0f673473e1c1155b5d8e Author: Daniel Baston Date: Wed Aug 5 13:32:31 2026 -0400 GeometrySplitter: add check for result area References https://github.com/libgeos/geos/issues/1497 diff --git a/src/operation/split/GeometrySplitter.cpp b/src/operation/split/GeometrySplitter.cpp index 10e766ec5..b669b14ea 100644 --- a/src/operation/split/GeometrySplitter.cpp +++ b/src/operation/split/GeometrySplitter.cpp @@ -373,7 +373,16 @@ GeometrySplitter::splitPolygonalWithEdge(const Geometry &geom, const Geometry &e return geom.getFactory()->createEmptyGeometry(geom::GEOS_GEOMETRYCOLLECTION, geom.hasZ(), geom.hasM()); } - return geom.getFactory()->createGeometryCollection(std::move(keep)); + auto result = geom.getFactory()->createGeometryCollection(std::move(keep)); + + const double inputArea = geom.getArea(); + const double resultArea = result->getArea(); + + if (inputArea > 0 && std::abs(inputArea - resultArea) / inputArea > 1e-6) { + throw util::GEOSException("Splitting polygonal geometry failed to preserve area"); + } + + return result; } } diff --git a/tests/unit/operation/split/GeometrySplitterTest.cpp b/tests/unit/operation/split/GeometrySplitterTest.cpp index 7019ea3fe..95c730693 100644 --- a/tests/unit/operation/split/GeometrySplitterTest.cpp +++ b/tests/unit/operation/split/GeometrySplitterTest.cpp @@ -900,5 +900,17 @@ void object::test<74>() ); } +template<> +template<> +void object::test<75>() +{ + set_test_name("GH-1497"); + auto geom = reader_.read("CURVEPOLYGON (COMPOUNDCURVE((5 0, 0 0, 0 5, 5 5), CIRCULARSTRING(5 5, 7 1, 5 0)))"); + auto edge = reader_.read("CURVEPOLYGON (COMPOUNDCURVE((5 0, 0 0, 5 5), CIRCULARSTRING(5 5, 7 4, 5 0)))"); + + // This case is not currently handled correctly by the GeometrySplitter. Throw an error instead of returning an incorrect result. + ensure_THROW(GeometrySplitter::split(*geom, *edge), geos::util::GEOSException); } + +} \ No newline at end of file ----------------------------------------------------------------------- Summary of changes: .../geos/noding/DirectionIndependentArcString.h | 52 ++++++++++ src/noding/DirectionIndependentArcString.cpp | 93 ++++++++++++++++++ src/noding/GeometryNoder.cpp | 23 +++-- src/operation/split/GeometrySplitter.cpp | 11 ++- tests/unit/capi/GEOSNodeTest.cpp | 20 +++- .../noding/DirectionIndependentArcStringTest.cpp | 108 +++++++++++++++++++++ .../unit/operation/split/GeometrySplitterTest.cpp | 11 +++ 7 files changed, 308 insertions(+), 10 deletions(-) create mode 100644 include/geos/noding/DirectionIndependentArcString.h create mode 100644 src/noding/DirectionIndependentArcString.cpp create mode 100644 tests/unit/noding/DirectionIndependentArcStringTest.cpp hooks/post-receive -- GEOS From git at osgeo.org Wed Aug 12 07:24:14 2026 From: git at osgeo.org (git at osgeo.org) Date: Wed, 12 Aug 2026 07:24:14 -0700 (PDT) Subject: [geos-commits] [SCM] GEOS branch main updated. 383e122c769f1fdaa31f93c12b97115a70085a85 Message-ID: <20260812142414.75ED31DD971@trac.osgeo.org> 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 383e122c769f1fdaa31f93c12b97115a70085a85 (commit) from 14fd2d70311aae9646e5d2e5364921822074de2b (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 383e122c769f1fdaa31f93c12b97115a70085a85 Author: Daniel Baston Date: Wed Aug 12 10:15:10 2026 -0400 NEWS update diff --git a/NEWS.md b/NEWS.md index 1765d1eec..a1f055e3b 100644 --- a/NEWS.md +++ b/NEWS.md @@ -34,7 +34,7 @@ - Preserve M values in GEOSDensify (GH-1319, Dan Baston) - Preserve M values in GEOSSimplify (GH-1317, Dan Baston) - Preserve M values in GEOSPolygonize (GH-1363 Dan Baston) - - Fix some cases of dropped M values in overlay (GH-1364,GH-1388,GH-1407,GH-1408; Dan Baston) + - Fix some cases of dropped M values in overlay (GH-1364,GH-1388,GH-1407,GH-1408,GH-1474; Dan Baston) - Support curved inputs in GEOSNode (GH-1347, Dan Baston) - GEOSClusterDBSCAN fix unsassigned clusters with minPoints <= 1 (GH-1386, Dan Baston) - Fix crash in GEOSConvexHull (GH-1358, Dan Baston) ----------------------------------------------------------------------- Summary of changes: NEWS.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) hooks/post-receive -- GEOS From git at osgeo.org Wed Aug 12 09:12:16 2026 From: git at osgeo.org (git at osgeo.org) Date: Wed, 12 Aug 2026 09:12:16 -0700 (PDT) Subject: [geos-commits] [SCM] GEOS branch main updated. 9d8250fc8d94e8fd48698af7086d94a3b3020ec6 Message-ID: <20260812161216.A3CFE1DE836@trac.osgeo.org> 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 9d8250fc8d94e8fd48698af7086d94a3b3020ec6 (commit) from 383e122c769f1fdaa31f93c12b97115a70085a85 (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 9d8250fc8d94e8fd48698af7086d94a3b3020ec6 Author: Daniel Baston Date: Wed Aug 12 12:11:58 2026 -0400 CircularString::normalizeClosed: avoid selecting control point as start point (#1506) diff --git a/src/geom/CircularString.cpp b/src/geom/CircularString.cpp index 4eeb941de..400094df8 100644 --- a/src/geom/CircularString.cpp +++ b/src/geom/CircularString.cpp @@ -126,7 +126,7 @@ CircularString::normalizeClosed() { std::size_t minInd = 0; const CoordinateXY* minPt = &ringCoords->getAt(minInd); - for (std::size_t i = 2; i < ringCoords->size() - 2; i++) { + for (std::size_t i = 2; i < ringCoords->size() - 2; i += 2) { const CoordinateXY& pt = ringCoords->getAt(i); if (pt.compareTo(*minPt) < 0) { minInd = i; diff --git a/tests/unit/geom/Geometry/normalizeTest.cpp b/tests/unit/geom/Geometry/normalizeTest.cpp index 9ad06928a..d431e9bb9 100644 --- a/tests/unit/geom/Geometry/normalizeTest.cpp +++ b/tests/unit/geom/Geometry/normalizeTest.cpp @@ -264,6 +264,17 @@ void object::test<11> "LINESTRING M (0 0 3, 0 100 2, 100 100 1, 100 0 0)"); } +template<> +template<> +void object::test<12> +() +{ + set_test_name("closed CircularString"); + + runTest("CIRCULARSTRING (120 152.3864417907085, 109.7594383790319 155.56129134453136, 100 160, 90 190, 100 220, 109.7594383790319 224.43870865546864, 120 227.6135582092915, 150.70007323113106 229.3238307529279, 180 220, 190 190, 180 160, 150.70007323113106 150.6761692470721, 120 152.3864417907085)", + "CIRCULARSTRING (100 160, 90 190, 100 220, 109.7594383790319 224.43870865546864, 120 227.6135582092915, 150.70007323113106 229.3238307529279, 180 220, 190 190, 180 160, 150.70007323113106 150.6761692470721, 120 152.3864417907085, 109.7594383790319 155.56129134453136, 100 160)"); +} + } // namespace tut ----------------------------------------------------------------------- Summary of changes: src/geom/CircularString.cpp | 2 +- tests/unit/geom/Geometry/normalizeTest.cpp | 11 +++++++++++ 2 files changed, 12 insertions(+), 1 deletion(-) hooks/post-receive -- GEOS From git at osgeo.org Wed Aug 12 10:20:31 2026 From: git at osgeo.org (git at osgeo.org) Date: Wed, 12 Aug 2026 10:20:31 -0700 (PDT) Subject: [geos-commits] [SCM] GEOS branch main updated. b76f534c34c7f281b884c03ff7f95423ab57ae3a Message-ID: <20260812172031.B2E1E1DF207@trac.osgeo.org> 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 b76f534c34c7f281b884c03ff7f95423ab57ae3a (commit) from 9d8250fc8d94e8fd48698af7086d94a3b3020ec6 (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 b76f534c34c7f281b884c03ff7f95423ab57ae3a Author: Daniel Baston Date: Wed Aug 12 12:24:12 2026 -0400 Add curved line-area overlay XML tests diff --git a/tests/xmltester/tests/general/TestOverlayCurvesLA.xml b/tests/xmltester/tests/general/TestOverlayCurvesLA.xml new file mode 100644 index 000000000..1cef3bf89 --- /dev/null +++ b/tests/xmltester/tests/general/TestOverlayCurvesLA.xml @@ -0,0 +1,138 @@ + + + + mLmA - A and B complex, disjoint + + MULTISURFACE (CURVEPOLYGON((60 320, 60 80, 300 80, 60 320), COMPOUNDCURVE((80 280, 80 100), CIRCULARSTRING(80 100, 170 90, 260 100), (260 100, 80 280))), ((120 160, 140 160, 140 140, 120 160))) + + + MULTICURVE (COMPOUNDCURVE((100 240, 100 180), CIRCULARSTRING(100 180, 160 180, 160 120), (160 120, 220 120)), COMPOUNDCURVE(CIRCULARSTRING(40 360, 20 210, 40 60, 190 40, 340 60), (340 60, 40 360), CIRCULARSTRING(40 360, 20 210, 40 60), (40 60, 40 20)), (120 120, 120 140, 100 140, 100 120, 140 120)) + + + + LINESTRING EMPTY + + + + + + GEOMETRYCOLLECTION (CURVEPOLYGON ((60 80, 60 320, 300 80, 60 80), COMPOUNDCURVE (CIRCULARSTRING (80 100, 170 90, 260 100), (260 100, 80 280), (80 280, 80 100))), COMPOUNDCURVE (CIRCULARSTRING (40 60, 20 210, 40 360), (40 360, 340 60), CIRCULARSTRING (340 60, 190 40, 40 60)), COMPOUNDCURVE ((100 240, 100 180), CIRCULARSTRING (100 180, 160 180, 160 120), (160 120, 220 120)), POLYGON ((120 160, 140 160, 140 140, 120 160)), LINESTRING (100 120, 100 140, 120 140, 120 120, 100 120), LINESTRING (120 120, 140 120), LINESTRING (40 20, 40 60)) + + + + + + MULTISURFACE (CURVEPOLYGON ((60 80, 60 320, 300 80, 60 80), COMPOUNDCURVE (CIRCULARSTRING (80 100, 170 90, 260 100), (260 100, 80 280), (80 280, 80 100))), ((120 160, 140 160, 140 140, 120 160))) + + + + + + GEOMETRYCOLLECTION (CURVEPOLYGON ((60 80, 60 320, 300 80, 60 80), COMPOUNDCURVE (CIRCULARSTRING (80 100, 170 90, 260 100), (260 100, 80 280), (80 280, 80 100))), COMPOUNDCURVE (CIRCULARSTRING (40 60, 20 210, 40 360), (40 360, 340 60), CIRCULARSTRING (340 60, 190 40, 40 60)), COMPOUNDCURVE ((100 240, 100 180), CIRCULARSTRING (100 180, 160 180, 160 120), (160 120, 220 120)), POLYGON ((120 160, 140 160, 140 140, 120 160)), LINESTRING (100 120, 100 140, 120 140, 120 120, 100 120), LINESTRING (120 120, 140 120), LINESTRING (40 20, 40 60)) + + + + + mLmA - A and B complex, overlapping and touching #1 + + MULTISURFACE (CURVEPOLYGON((60 260, 60 120, 220 120, 220 260, 60 260), COMPOUNDCURVE((80 240, 80 140, 200 140, 200 240), CIRCULARSTRING(200 240, 140 250, 80 240))), CURVEPOLYGON(CIRCULARSTRING(100 220, 90 190, 100 160, 140 150, 180 160, 190 190, 180 220, 140 230, 100 220), COMPOUNDCURVE((120 200, 120 180), CIRCULARSTRING(120 180, 140 160, 160 180), (160 180, 160 200), CIRCULARSTRING(160 200, 140 180, 120 200)))) + + + MULTICURVE (COMPOUNDCURVE((40 260, 240 260, 240 240, 200 240), CIRCULARSTRING(200 240, 140 250, 80 240), (80 240, 40 240, 40 220, 100 220), CIRCULARSTRING(100 220, 140 230, 180 220), (180 220, 240 220)), (120 300, 120 80, 140 80, 140 300, 140 80, 120 80, 120 320)) + + + + MULTICURVE (COMPOUNDCURVE (CIRCULARSTRING (140 250, 170.41381265149113 247.4828759089466, 200 240), (200 240, 220 240)), COMPOUNDCURVE ((60 240, 80 240), CIRCULARSTRING (80 240, 99.75235892665049 245.5688992823261, 120 248.9157415774952)), CIRCULARSTRING (140 230, 160.61552812808833 227.4621125123532, 180 220), CIRCULARSTRING (120 248.9157415774952, 129.98531557752852 249.728736519033, 140 250), CIRCULARSTRING (120 227.6135582092915, 129.9290627990683 229.40128093752423, 140 230), CIRCULARSTRING (100 220, 109.7594383790319 224.43870865546864, 120 227.6135582092915), (120 152.3864417907085, 120 180, 120 200, 120 227.6135582092915), (200 220, 220 220), (140 260, 220 260), (140 250, 140 260), (140 180, 140 230), (140 150, 140 160), (140 120, 140 140), (120 260, 140 260), (120 248.9157415774952, 120 260), (120 120, 120 140), (60 260, 120 260), (60 220, 80 220)) + + + + + + GEOMETRYCOLLECTION (CURVEPOLYGON (CIRCULARSTRING (100 160, 90 190, 100 220, 109.7594383790319 224.43870865546864, 120 227.6135582092915, 129.9290627990683 229.40128093752423, 140 230, 160.61552812808833 227.4621125123532, 180 220, 190 190, 180 160, 160.61552812808833 152.5378874876468, 140 150, 129.9290627990683 150.59871906247577, 120 152.3864417907085, 109.7594383790319 155.56129134453136, 100 160), COMPOUNDCURVE (CIRCULARSTRING (120 180, 125.85786437626905 165.85786437626905, 140 160, 154.14213562373095 165.85786437626905, 160 180), (160 180, 160 200), CIRCULARSTRING (160 200, 154.14213562373095 185.85786437626905, 140 180, 125.85786437626905 185.85786437626905, 120 200), (120 200, 120 180))), CURVEPOLYGON ((60 120, 60 220, 60 240, 60 260, 120 260, 140 260, 220 260, 220 240, 220 220, 220 120, 140 120, 120 120, 60 120), COMPOUNDCURVE ((80 140, 120 140, 140 140, 200 140, 200 220, 200 240), CIRCULARSTRING (200 240, 170.41381265149113 247.4828759089466, 140 250, 129.9 8531557752852 249.728736519033, 120 248.9157415774952, 99.75235892665049 245.5688992823261, 80 240), (80 240, 80 220, 80 140))), LINESTRING (220 240, 240 240, 240 260, 220 260), LINESTRING (120 120, 120 80, 140 80, 140 120), LINESTRING (60 220, 40 220, 40 240, 60 240), LINESTRING (120 260, 120 300, 120 320), LINESTRING (220 220, 240 220), LINESTRING (180 220, 200 220), LINESTRING (140 260, 140 300), LINESTRING (140 230, 140 250), LINESTRING (140 160, 140 180), LINESTRING (140 140, 140 150), LINESTRING (120 227.6135582092915, 120 248.9157415774952), LINESTRING (120 140, 120 152.3864417907085), LINESTRING (80 220, 100 220), LINESTRING (40 260, 60 260)) + + + + + + MULTISURFACE (CURVEPOLYGON (CIRCULARSTRING (100 160, 90 190, 100 220, 109.7594383790319 224.43870865546864, 120 227.6135582092915, 129.9290627990683 229.40128093752423, 140 230, 160.61552812808833 227.4621125123532, 180 220, 190 190, 180 160, 160.61552812808833 152.5378874876468, 140 150, 129.9290627990683 150.59871906247577, 120 152.3864417907085, 109.7594383790319 155.56129134453136, 100 160), COMPOUNDCURVE (CIRCULARSTRING (120 180, 125.85786437626905 165.85786437626905, 140 160, 154.14213562373095 165.85786437626905, 160 180), (160 180, 160 200), CIRCULARSTRING (160 200, 154.14213562373095 185.85786437626905, 140 180, 125.85786437626905 185.85786437626905, 120 200), (120 200, 120 180))), CURVEPOLYGON ((60 120, 60 220, 60 240, 60 260, 120 260, 140 260, 220 260, 220 240, 220 220, 220 120, 140 120, 120 120, 60 120), COMPOUNDCURVE ((80 140, 120 140, 140 140, 200 140, 200 220, 200 240), CIRCULARSTRING (200 240, 170.41381265149113 247.4828759089466, 140 250, 129.9853155 7752852 249.728736519033, 120 248.9157415774952, 99.75235892665049 245.5688992823261, 80 240), (80 240, 80 220, 80 140)))) + + + + + + GEOMETRYCOLLECTION (CURVEPOLYGON (CIRCULARSTRING (100 160, 90 190, 100 220, 109.7594383790319 224.43870865546864, 120 227.6135582092915, 129.9290627990683 229.40128093752423, 140 230, 160.61552812808833 227.4621125123532, 180 220, 190 190, 180 160, 160.61552812808833 152.5378874876468, 140 150, 129.9290627990683 150.59871906247577, 120 152.3864417907085, 109.7594383790319 155.56129134453136, 100 160), COMPOUNDCURVE (CIRCULARSTRING (120 180, 125.85786437626905 165.85786437626905, 140 160, 154.14213562373095 165.85786437626905, 160 180), (160 180, 160 200), CIRCULARSTRING (160 200, 154.14213562373095 185.85786437626905, 140 180, 125.85786437626905 185.85786437626905, 120 200), (120 200, 120 180))), CURVEPOLYGON ((60 120, 60 220, 60 240, 60 260, 120 260, 140 260, 220 260, 220 240, 220 220, 220 120, 140 120, 120 120, 60 120), COMPOUNDCURVE ((80 140, 120 140, 140 140, 200 140, 200 220, 200 240), CIRCULARSTRING (200 240, 170.41381265149113 247.4828759089466, 140 250, 129.9 8531557752852 249.728736519033, 120 248.9157415774952, 99.75235892665049 245.5688992823261, 80 240), (80 240, 80 220, 80 140))), LINESTRING (220 240, 240 240, 240 260, 220 260), LINESTRING (120 120, 120 80, 140 80, 140 120), LINESTRING (60 220, 40 220, 40 240, 60 240), LINESTRING (120 260, 120 300, 120 320), LINESTRING (220 220, 240 220), LINESTRING (180 220, 200 220), LINESTRING (140 260, 140 300), LINESTRING (140 230, 140 250), LINESTRING (140 160, 140 180), LINESTRING (140 140, 140 150), LINESTRING (120 227.6135582092915, 120 248.9157415774952), LINESTRING (120 140, 120 152.3864417907085), LINESTRING (80 220, 100 220), LINESTRING (40 260, 60 260)) + + + + + + + mLmA - A and B complex, overlapping and touching #2 + + MULTISURFACE (CURVEPOLYGON(COMPOUNDCURVE(CIRCULARSTRING(280 320, 140 340, 60 320, 70 220, 60 120), (60 120, 280 120, 280 320)), COMPOUNDCURVE((120 260, 120 180, 240 180), CIRCULARSTRING(240 180, 250 220, 240 260, 200 270, 120 260))), CURVEPOLYGON(CIRCULARSTRING(280 400, 300 420, 320 400, 340 380, 320 360, 300 340, 280 360, 260 380, 280 400)), CURVEPOLYGON(COMPOUNDCURVE(CIRCULARSTRING(300 240, 290 230, 300 220, 310 210, 320 220), (320 220, 320 240, 300 240)))) + + + MULTILINESTRING( + (80 300, 80 160, 260 160, 260 300, 80 300, 80 140), + (220 360, 220 240, 300 240, 300 340)) + + + + GEOMETRYCOLLECTION (LINESTRING (220 300, 260 300, 260 240), LINESTRING (80 160, 260 160, 260 240), LINESTRING (80 160, 80 300, 220 300), LINESTRING (260 240, 280 240), LINESTRING (247.6135582092915 240, 260 240), LINESTRING (220 300, 220 337.2281323269014), LINESTRING (220 266.3226580490168, 220 300), LINESTRING (80 140, 80 160), POINT (300 340), POINT (300 240)) + + + + + + GEOMETRYCOLLECTION (CURVEPOLYGON (COMPOUNDCURVE (CIRCULARSTRING (60 120, 70 220, 60 320, 138.78778867384904 339.872037051061, 220 337.2281323269014), CIRCULARSTRING (220 337.2281323269014, 250.46242685793356 330.2245490033514, 280 320), (280 320, 280 240, 280 120, 60 120)), COMPOUNDCURVE ((120 180, 240 180), CIRCULARSTRING (240 180, 249.3238307529279 209.29992676886894, 247.6135582092915 240, 244.43870865546864 250.2405616209681, 240 260, 230.09984033109484 263.4771466136326, 220 266.3226580490168, 169.5121975037094 270.87647813598767, 120 260), (120 260, 120 180))), CURVEPOLYGON (COMPOUNDCURVE (CIRCULARSTRING (300 220, 290 230, 300 240), (300 240, 320 240, 320 220), CIRCULARSTRING (320 220, 310 210, 300 220))), CURVEPOLYGON (CIRCULARSTRING (280 360, 260 380, 280 400, 300 420, 320 400, 340 380, 320 360, 314.14213562373095 345.85786437626905, 300 340, 285.85786437626905 345.85786437626905, 280 360)), LINESTRING (280 240, 300 240, 300 340), LINESTRING (220 266.32265804 90168, 220 240, 247.6135582092915 240), LINESTRING (220 337.2281323269014, 220 360)) + + + + + + MULTISURFACE (CURVEPOLYGON (COMPOUNDCURVE (CIRCULARSTRING (60 120, 70 220, 60 320, 138.78778867384904 339.872037051061, 220 337.2281323269014), CIRCULARSTRING (220 337.2281323269014, 250.46242685793356 330.2245490033514, 280 320), (280 320, 280 240, 280 120, 60 120)), COMPOUNDCURVE ((120 180, 240 180), CIRCULARSTRING (240 180, 249.3238307529279 209.29992676886894, 247.6135582092915 240, 244.43870865546864 250.2405616209681, 240 260, 230.09984033109484 263.4771466136326, 220 266.3226580490168, 169.5121975037094 270.87647813598767, 120 260), (120 260, 120 180))), CURVEPOLYGON (COMPOUNDCURVE (CIRCULARSTRING (300 220, 290 230, 300 240), (300 240, 320 240, 320 220), CIRCULARSTRING (320 220, 310 210, 300 220))), CURVEPOLYGON (CIRCULARSTRING (280 360, 260 380, 280 400, 300 420, 320 400, 340 380, 320 360, 314.14213562373095 345.85786437626905, 300 340, 285.85786437626905 345.85786437626905, 280 360))) + + + + + + GEOMETRYCOLLECTION (CURVEPOLYGON (COMPOUNDCURVE (CIRCULARSTRING (60 120, 70 220, 60 320, 138.78778867384904 339.872037051061, 220 337.2281323269014), CIRCULARSTRING (220 337.2281323269014, 250.46242685793356 330.2245490033514, 280 320), (280 320, 280 240, 280 120, 60 120)), COMPOUNDCURVE ((120 180, 240 180), CIRCULARSTRING (240 180, 249.3238307529279 209.29992676886894, 247.6135582092915 240, 244.43870865546864 250.2405616209681, 240 260, 230.09984033109484 263.4771466136326, 220 266.3226580490168, 169.5121975037094 270.87647813598767, 120 260), (120 260, 120 180))), CURVEPOLYGON (COMPOUNDCURVE (CIRCULARSTRING (300 220, 290 230, 300 240), (300 240, 320 240, 320 220), CIRCULARSTRING (320 220, 310 210, 300 220))), CURVEPOLYGON (CIRCULARSTRING (280 360, 260 380, 280 400, 300 420, 320 400, 340 380, 320 360, 314.14213562373095 345.85786437626905, 300 340, 285.85786437626905 345.85786437626905, 280 360)), LINESTRING (280 240, 300 240, 300 340), LINESTRING (220 266.32265804 90168, 220 240, 247.6135582092915 240), LINESTRING (220 337.2281323269014, 220 360)) + + + + + + mLmA - A and B complex, overlapping and touching #3 + + MULTISURFACE (CURVEPOLYGON(COMPOUNDCURVE(CIRCULARSTRING(120 180, 100 120, 60 80, 120 90, 180 80, 140 120, 120 180))), ((100 240, 140 240, 120 220, 100 240))) + + + MULTICURVE (CIRCULARSTRING(180 220, 120 180, 60 220, 120 270, 180 220), (60 300, 60 40), (100 100, 140 100)) + + + + GEOMETRYCOLLECTION (LINESTRING (100 100, 140 100), POINT (120 180), POINT (60 80)) + + + + + + GEOMETRYCOLLECTION (CURVEPOLYGON (CIRCULARSTRING (60 80, 100 120, 120 180, 140 120, 180 80, 120 90, 60 80)), CIRCULARSTRING (60 220, 120 270, 180 220, 156.0555127546399 190.91673086804016, 120 180, 83.94448724536011 190.91673086804016, 60 220), POLYGON ((100 240, 140 240, 120 220, 100 240)), LINESTRING (60 40, 60 80, 60 80.00000000000001, 60 220), LINESTRING (60 220, 60 300)) + + + + + + MULTISURFACE (CURVEPOLYGON (CIRCULARSTRING (60 80, 100 120, 120 180, 140 120, 180 80, 120 90, 60 80)), ((100 240, 140 240, 120 220, 100 240))) + + + + + + GEOMETRYCOLLECTION (CURVEPOLYGON (CIRCULARSTRING (60 80, 100 120, 120 180, 140 120, 180 80, 120 90, 60 80)), CIRCULARSTRING (60 220, 120 270, 180 220, 156.0555127546399 190.91673086804016, 120 180, 83.94448724536011 190.91673086804016, 60 220), POLYGON ((100 240, 140 240, 120 220, 100 240)), LINESTRING (60 40, 60 80, 60 80.00000000000001, 60 220), LINESTRING (60 220, 60 300)) + + + + + + ----------------------------------------------------------------------- Summary of changes: .../tests/general/TestOverlayCurvesLA.xml | 138 +++++++++++++++++++++ 1 file changed, 138 insertions(+) create mode 100644 tests/xmltester/tests/general/TestOverlayCurvesLA.xml hooks/post-receive -- GEOS From git at osgeo.org Wed Aug 12 12:40:23 2026 From: git at osgeo.org (git at osgeo.org) Date: Wed, 12 Aug 2026 12:40:23 -0700 (PDT) Subject: [geos-commits] [SCM] GEOS branch main updated. 5d214b1bb4104caedd5302225ce2b3870704a1ca Message-ID: <20260812194023.93C2F1DFF09@trac.osgeo.org> 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 5d214b1bb4104caedd5302225ce2b3870704a1ca (commit) from b76f534c34c7f281b884c03ff7f95423ab57ae3a (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 5d214b1bb4104caedd5302225ce2b3870704a1ca Author: Daniel Baston Date: Wed Aug 12 15:40:05 2026 -0400 Update download information for version 3.15.0beta3 diff --git a/web/content/usage/download.md b/web/content/usage/download.md index 34f0bf807..aa4ab1325 100644 --- a/web/content/usage/download.md +++ b/web/content/usage/download.md @@ -8,7 +8,7 @@ draft: false | Release | Release Date | First Release | Final Release | Download Link | Changes | | :--: | :--:| :--: |:--: | :--: | :--: | -| **3.15.0beta2** | 2026/07/14 | 2026/07/07 | *2030/10/01* | [geos-3.15.0beta2.tar.bz2](https://download.osgeo.org/geos/geos-3.15.0beta2.tar.bz2) | [Changes](https://github.com/libgeos/geos/blob/3.15.0beta2/NEWS.md) | +| **3.15.0beta3** | 2026/08/12 | 2026/07/07 | *2030/10/01* | [geos-3.15.0beta3.tar.bz2](https://download.osgeo.org/geos/geos-3.15.0beta3.tar.bz2) | [Changes](https://github.com/libgeos/geos/blob/3.15.0beta3/NEWS.md) | | **3.14.1** | 2025/10/27 | 2025/08/21 | *2029/10/01* | [geos-3.14.1.tar.bz2](https://download.osgeo.org/geos/geos-3.14.1.tar.bz2) | [Changes](https://github.com/libgeos/geos/blob/3.14.1/NEWS.md) | | **3.13.1** | 2025/03/03 | 2024/09/06 | *2028/10/01* | [geos-3.13.1.tar.bz2](https://download.osgeo.org/geos/geos-3.13.1.tar.bz2) | [Changes](https://github.com/libgeos/geos/blob/3.13.1/NEWS.md) | | **3.12.3** | 2025/03/03 | 2023/06/27 | *2027/07/01* | [geos-3.12.3.tar.bz2](https://download.osgeo.org/geos/geos-3.12.3.tar.bz2) | [Changes](https://github.com/libgeos/geos/blob/3.12.3/NEWS.md) | ----------------------------------------------------------------------- Summary of changes: web/content/usage/download.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) hooks/post-receive -- GEOS From git at osgeo.org Wed Aug 12 12:41:10 2026 From: git at osgeo.org (git at osgeo.org) Date: Wed, 12 Aug 2026 12:41:10 -0700 (PDT) Subject: [geos-commits] [SCM] GEOS branch main updated. da4de475f9b62990912f28a110aaadcf2de87dc3 Message-ID: <20260812194110.CD5701DFB4C@trac.osgeo.org> 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 da4de475f9b62990912f28a110aaadcf2de87dc3 (commit) from 5d214b1bb4104caedd5302225ce2b3870704a1ca (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 da4de475f9b62990912f28a110aaadcf2de87dc3 Author: Daniel Baston Date: Wed Aug 12 15:40:52 2026 -0400 Update GEOS_PATCH_WORD to 'rc1' diff --git a/Version.txt b/Version.txt index d419677e0..f052174e2 100644 --- a/Version.txt +++ b/Version.txt @@ -5,7 +5,7 @@ GEOS_VERSION_MINOR=15 GEOS_VERSION_PATCH=0 # OPTIONS: "", "dev", "rc1" etc. -GEOS_PATCH_WORD=beta3 +GEOS_PATCH_WORD=rc1 # GEOS CAPI Versions # ----------------------------------------------------------------------- Summary of changes: Version.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) hooks/post-receive -- GEOS From git at osgeo.org Wed Aug 12 13:03:23 2026 From: git at osgeo.org (git at osgeo.org) Date: Wed, 12 Aug 2026 13:03:23 -0700 (PDT) Subject: [geos-commits] [SCM] GEOS branch main updated. 737737dbb924f348da99cfe39c2a00f9e393f414 Message-ID: <20260812200323.E0A3D1DFE5A@trac.osgeo.org> 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 737737dbb924f348da99cfe39c2a00f9e393f414 (commit) from da4de475f9b62990912f28a110aaadcf2de87dc3 (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 737737dbb924f348da99cfe39c2a00f9e393f414 Author: Petr B?lohl?vek Date: Wed Aug 12 22:03:05 2026 +0200 OverlayNG: Fix intersection computation of slightly overlapping polygons (#1499) Signed-off-by: Petr Belohlavek diff --git a/src/edgegraph/HalfEdge.cpp b/src/edgegraph/HalfEdge.cpp index 54b5658e0..cdafbd734 100644 --- a/src/edgegraph/HalfEdge.cpp +++ b/src/edgegraph/HalfEdge.cpp @@ -179,17 +179,14 @@ HalfEdge::findLowest() const int HalfEdge::compareAngularDirection(const HalfEdge* e) const { - double dx = directionX(); - double dy = directionY(); - double dx2 = e->directionX(); - double dy2 = e->directionY(); + assert(orig().equals2D(e->orig())); // same vector - if (dx == dx2 && dy == dy2) + if (directionPt().equals2D(e->directionPt())) return 0; - int quadrant = geom::Quadrant::quadrant(dx, dy); - int quadrant2 = geom::Quadrant::quadrant(dx2, dy2); + int quadrant = geom::Quadrant::quadrant(directionX(), directionY()); + int quadrant2 = geom::Quadrant::quadrant(e->directionX(), e->directionY()); /** * If the direction vectors are in different quadrants, @@ -272,5 +269,3 @@ HalfEdge::toStringNode(const HalfEdge* he, std::ostream& os) } // namespace geos.edgegraph } // namespace geos - - diff --git a/src/geomgraph/EdgeEnd.cpp b/src/geomgraph/EdgeEnd.cpp index 18f9a9988..d9c094bea 100644 --- a/src/geomgraph/EdgeEnd.cpp +++ b/src/geomgraph/EdgeEnd.cpp @@ -160,7 +160,9 @@ int EdgeEnd::compareDirection(const EdgeEnd* e) const { assert(e); - if(dx == e->dx && dy == e->dy) { + assert(p0.equals2D(e->p0)); + + if(p1.equals2D(e->p1)) { return 0; } @@ -215,4 +217,3 @@ operator<< (std::ostream& os, const EdgeEnd& ee) } // namespace geos.geomgraph } // namespace geos - diff --git a/tests/unit/edgegraph/EdgeGraphTest.cpp b/tests/unit/edgegraph/EdgeGraphTest.cpp index 9d96139e3..a14d443a1 100644 --- a/tests/unit/edgegraph/EdgeGraphTest.cpp +++ b/tests/unit/edgegraph/EdgeGraphTest.cpp @@ -170,6 +170,25 @@ void object::test<5> () checkNextPrev(*graph); } +// testSimilarEdgesDirection +template<> +template<> +void object::test<6> () +{ + EdgeGraph graph; + HalfEdge* e1 = addEdge(graph, 1, 1, 0, 0.5); + addEdge(graph, 1, 1, 0, 0.49999999999999994); + addEdge(graph, 1, 1, 0, 1); + + HalfEdge* eUpper = findEdge(graph, 1, 1, 0, 0.5); + HalfEdge* eLower = findEdge(graph, 1, 1, 0, 0.49999999999999994); + ensure("edges with distinct direction points must not compare equal", eUpper->compareTo(eLower) != 0); + ensure("edge comparison must be antisymmetric", eUpper->compareTo(eLower) == -eLower->compareTo(eUpper)); + + checkNodeValid(e1); + checkNextPrev(graph); +} + } // namespace tut diff --git a/tests/unit/operation/overlayng/OverlayNGRobustTest.cpp b/tests/unit/operation/overlayng/OverlayNGRobustTest.cpp index d48518cf9..5a27cdeb7 100644 --- a/tests/unit/operation/overlayng/OverlayNGRobustTest.cpp +++ b/tests/unit/operation/overlayng/OverlayNGRobustTest.cpp @@ -61,6 +61,17 @@ struct test_overlayngrobust_data { ensure_NO_THROW( OverlayNGRobust::Overlay(geom_a.get(), geom_b.get(), opCode) ); } + void + checkOverlaySymmetricArea(const std::string& a, const std::string& b, int opCode, double expectedArea) + { + std::unique_ptr geom_a = r.read(a); + std::unique_ptr geom_b = r.read(b); + double areaAB = OverlayNGRobust::Overlay(geom_a.get(), geom_b.get(), opCode)->getArea(); + double areaBA = OverlayNGRobust::Overlay(geom_b.get(), geom_a.get(), opCode)->getArea(); + ensure_equals("overlay is not commutative", areaAB, areaBA, 1e-12); + ensure_equals("unexpected overlay area", areaAB, expectedArea, 1e-12); + } + std::unique_ptr double2geom(const std::vector& x, const std::vector& y) { @@ -109,7 +120,26 @@ void object::test<2> () checkOverlaySuccess(a, b, OverlayNG::INTERSECTION); } +// 2026-08-05 Intersection of polygons isn't commutative (https://github.com/libgeos/geos/issues/1405) +template<> +template<> +void object::test<3> () +{ + set_test_name("Intersection of triangles with an extremely similar edge"); + const std::string a = "POLYGON ((1 1, 0 0.5, 0 0, 1 1))"; + const std::string b = "POLYGON ((1 1, 0 0.49999999999999994, 0 1, 1 1))"; + checkOverlaySymmetricArea(a, b, OverlayNG::INTERSECTION, 0.0); +} +template<> +template<> +void object::test<4> () +{ + set_test_name("Union of triangles with an extremely similar edge"); + const std::string a = "POLYGON ((1 1, 0 0.5, 0 0, 1 1))"; + const std::string b = "POLYGON ((1 1, 0 0.49999999999999994, 0 1, 1 1))"; + checkOverlaySymmetricArea(a, b, OverlayNG::UNION, 0.5); +} #if 0 /** ----------------------------------------------------------------------- Summary of changes: src/edgegraph/HalfEdge.cpp | 13 +++------- src/geomgraph/EdgeEnd.cpp | 5 ++-- tests/unit/edgegraph/EdgeGraphTest.cpp | 19 ++++++++++++++ .../operation/overlayng/OverlayNGRobustTest.cpp | 30 ++++++++++++++++++++++ 4 files changed, 56 insertions(+), 11 deletions(-) hooks/post-receive -- GEOS From git at osgeo.org Thu Aug 20 09:17:12 2026 From: git at osgeo.org (git at osgeo.org) Date: Thu, 20 Aug 2026 09:17:12 -0700 (PDT) Subject: [geos-commits] [SCM] GEOS branch main updated. 7fa93a61e2d8fef9e79143bb6ac78850c735121f Message-ID: <20260820161712.B4C259A19@trac.osgeo.org> 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 7fa93a61e2d8fef9e79143bb6ac78850c735121f (commit) from 737737dbb924f348da99cfe39c2a00f9e393f414 (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 7fa93a61e2d8fef9e79143bb6ac78850c735121f Author: Daniel Baston Date: Thu Aug 20 12:16:47 2026 -0400 Update NEWS diff --git a/NEWS.md b/NEWS.md index a1f055e3b..d4be5b2fe 100644 --- a/NEWS.md +++ b/NEWS.md @@ -40,6 +40,7 @@ - Fix crash in GEOSConvexHull (GH-1358, Dan Baston) - Overlay performance improvements (GH-1353, arriopolis, Martin Davis) - Fix unintended ring rotation in Overlay results (GH-1412, Dan Baston) + - Fix intersection result for slightly overlapping polygons (GH-1499, Petr Belohlavek) ## Changes in 3.14.0 ----------------------------------------------------------------------- Summary of changes: NEWS.md | 1 + 1 file changed, 1 insertion(+) hooks/post-receive -- GEOS From git at osgeo.org Thu Aug 20 10:10:48 2026 From: git at osgeo.org (git at osgeo.org) Date: Thu, 20 Aug 2026 10:10:48 -0700 (PDT) Subject: [geos-commits] [SCM] GEOS branch main updated. fe7e16ab175d24cde782e23356e4c5f80a88499c Message-ID: <20260820171049.079D1B312@trac.osgeo.org> 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 fe7e16ab175d24cde782e23356e4c5f80a88499c (commit) from 7fa93a61e2d8fef9e79143bb6ac78850c735121f (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 fe7e16ab175d24cde782e23356e4c5f80a88499c Author: Daniel Baston Date: Thu Aug 20 13:10:24 2026 -0400 Update download information for version 3.15.0rc1 diff --git a/web/content/usage/download.md b/web/content/usage/download.md index aa4ab1325..f1eb30e47 100644 --- a/web/content/usage/download.md +++ b/web/content/usage/download.md @@ -8,7 +8,7 @@ draft: false | Release | Release Date | First Release | Final Release | Download Link | Changes | | :--: | :--:| :--: |:--: | :--: | :--: | -| **3.15.0beta3** | 2026/08/12 | 2026/07/07 | *2030/10/01* | [geos-3.15.0beta3.tar.bz2](https://download.osgeo.org/geos/geos-3.15.0beta3.tar.bz2) | [Changes](https://github.com/libgeos/geos/blob/3.15.0beta3/NEWS.md) | +| **3.15.0rc1** | 2026/08/20 | 2026/07/07 | *2030/10/01* | [geos-3.15.0rc1.tar.bz2](https://download.osgeo.org/geos/geos-3.15.0rc1.tar.bz2) | [Changes](https://github.com/libgeos/geos/blob/3.15.0rc1/NEWS.md) | | **3.14.1** | 2025/10/27 | 2025/08/21 | *2029/10/01* | [geos-3.14.1.tar.bz2](https://download.osgeo.org/geos/geos-3.14.1.tar.bz2) | [Changes](https://github.com/libgeos/geos/blob/3.14.1/NEWS.md) | | **3.13.1** | 2025/03/03 | 2024/09/06 | *2028/10/01* | [geos-3.13.1.tar.bz2](https://download.osgeo.org/geos/geos-3.13.1.tar.bz2) | [Changes](https://github.com/libgeos/geos/blob/3.13.1/NEWS.md) | | **3.12.3** | 2025/03/03 | 2023/06/27 | *2027/07/01* | [geos-3.12.3.tar.bz2](https://download.osgeo.org/geos/geos-3.12.3.tar.bz2) | [Changes](https://github.com/libgeos/geos/blob/3.12.3/NEWS.md) | ----------------------------------------------------------------------- Summary of changes: web/content/usage/download.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) hooks/post-receive -- GEOS