duckdb / duckdb/duckdb-spatial

Add ST_Split

Open
#823 0 comments 0 reactions 0 assignees View on GitHub
Dominant language
C
Stars
708
Forks
96
Avg merge
1d 21h
Merged PRs (30d)
5

Description

ST_Split (split a geometry by a blade geometry, returning the pieces as a GEOMETRYCOLLECTION) is a common PostGIS function missing from duckdb-spatial.

**Important, the bundled GEOS is 3.14.1, and native `GEOSSplit` only landed in GEOS 3.15, so a native bind is not linkable today.** The PostGIS recipe composes the result entirely from primitives duckdb-spatial already ships, so it works on 3.14.1 now, and a native `GEOSSplit` bind can replace it later behind a version guard once the vcpkg baseline reaches 3.15.

Polygon by line recipe (mirrors PostGIS `lwgeom_split` in `lwgeom_geos_split.c`)

```mermaid
flowchart TD
A[target polygon] --> B[ST_Boundary]
C[blade line] --> D[ST_Union of boundary and blade]
B --> D
D --> E[ST_Polygonize rebuild faces]
E --> F[keep faces whose point on surface lies inside the original]
F --> G[GEOMETRYCOLLECTION of pieces]
```

Line by point or line recipe, ST_Node of the union then collect the parts, or ST_Difference for simple cases.

Implementer tips
- Every primitive above already exists as a registered function and a GeosGeometry wrapper (ST_Boundary, ST_Union, ST_Polygonize, ST_PointOnSurface, ST_Contains, ST_Difference, ST_Node), so a composed ST_Split chains existing wrappers in one Execute with no new GEOS calls.
- Return a GEOMETRYCOLLECTION of the pieces, matching PostGIS.
- **Path B**, a thin `GEOSSplit_r` bind behind `#if (GEOS_VERSION_MAJOR > 3) || (GEOS_VERSION_MAJOR == 3 && GEOS_VERSION_MINOR >= 15)`, switched on when the baseline advances.

This is adjacent to the ST_Subdivide work in #719 and #583. Both partition geometries, though split by a blade is distinct, so a shared note on scope may help.

Sharing this as research in case it helps whoever picks it up.

Contributor guide

No contributing guide indexed for this repository

Assessment

This issue has not been assessed yet.

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.