Capability map
What is built on each rung of the ladder, and through which way in
Statuses read from wxylib/core at 3abd248, 2026-10-18
wxylib/core is now at 16a14c1; these statuses were last reviewed at 3abd248 (what changed). Counts below are from 16a14c1.
The structured half of the ladder (R0 to R3) is built end to end and matches GDAL 3.12 on every fixture. R6 features are in as inputs to extraction, not yet as data the model holds. R3', R4 and R5 exist only as type slots. The full API lives in Rust and the CLI; Python and R bind three in-memory functions, and the browser binds COG warping.
The ladder
Each rung stores strictly more than the one before (design doc 02, section 3). Every Positions variant in wxy-domain exists, so types will not change when rungs arrive; only R0 to R3 evaluate positions. Arrows are the conversions that run today.
Rung by verb
Rows are rungs; columns are the things the library does. The warp, points and zonal columns all go through one plan seam in wxy-warp, so a rung that warps also extracts.
| Rung | Model | Read | Normalise | Warp from | Points | Zonal / burn | Write | Virtual refs |
|---|---|---|---|---|---|---|---|---|
| R0index only | IndexOnly
|
unmapped dims (TIFF band, any Zarr dim)
|
n/a
|
needs a CRS frame
|
n/a
|
n/a
|
leading 1D coords copied byte for byte
|
arrays referenced whatever their georef
|
| R1regular | Affine, Regular1
|
tiled GeoTIFF/COG, chunky or planar, overviews; Zarr with GeoZarr spatial:/proj:
|
target of normalisation
|
chunked like gdalwarp, scaled kernels, -ovr auto, -wm, globe wrap, extra dims streamed
|
near, bilinear, cubic, cubicspline
|
centre, all-touched, exact coverage
|
GeoZarr grid, windowed writer
|
TIFF scan (no LZW, no predictor); mdim-refs table to Icechunk
|
| R2rectilinear | Rectilinear
|
CF 1D coordinate arrays in Zarr
|
to R1 within float32/f64/absolute tolerance, also through a frame (Mercator y), with a report
|
as R1 when regular, else expanded to geolocation
|
same path as warp
|
same path as warp
|
writes an affine only
|
inline coords from mdim-refs
|
| R3curvilinear | Curvilinear, centre or edge
|
CF 2D lon/lat in Zarr, bounds as edges; no netCDF, no 1D CF bounds, no grid_mapping
|
R3 to R1 in another frame: test exists, caller supplies the projection
|
GDAL geolocation-array parity, swaths and polar grids
|
inverse of the geolocation arrays
|
index-space areas
|
not yet
|
not yet
|
| R3'fitted | FittedModel trait
|
no GCP, RPC or TPS reader
|
n/a
|
rejected as unsupported
|
||||
| R4implicit mesh | CellScheme trait (centre from id)
|
DGGS and L3 bins sit under the mesh umbrella, "a home in time, not day 1". No stage yet.
|
||||||
| R5explicit mesh | Elements trait, opaque
|
S8: meshspec v0.1, UGRID through existing readers, conversion first; topology module and overlay after.
|
||||||
| R6features | Elements trait; GeoArrow chosen, not wired
|
CLI parses GeoJSON polygons and x,y points; not a Collection
|
n/a
|
n/a
|
points are the query
|
polygons are the zones (controlledburn for coverage)
|
CSV results only
|
S7 scheme covers features
|
API surface
What each way in can do today. Python and R are spikes pinned to core 39b07bb (S5), so they predate mdim streaming, curvilinear warp, extraction and plans.
| Capability | Rust crates | wxy CLI |
Python (pyo3) | R (extendr) | Browser (wasm) |
|---|---|---|---|---|---|
| Open GeoTIFF / COG | wxy-tiff: path, any object_store
|
local file
|
HTTP range requests
|
||
| Open Zarr | wxy-zarr via zarrs, v2/v3, sharding
|
store directory, --array
|
Send/Sync bound blocks wasm
|
||
| Domain model, R2 to R1 test | wxy-domain, normalise
|
affine, regular
|
wxy_affine, wxy_regular
|
||
| Warp to a grid | wxy-warp: plan, warp, WarpPlan, warp_pyramid
|
wxy warp to GeoZarr
|
2D array in, array out, affine source only
|
same as Python
|
COG to the canvas, per view
|
| Multidim streaming |
leading dims batched under one plan
|
time/depth coords copied
|
|||
| Curvilinear warp | geoloc, centres or edges
|
--bounds
|
|||
| Points, zonal | extract_points, zonal_stats
|
wxy points, wxy zonal --coverage
|
|||
| Plans as values | Explain, serde options
|
--dry-run JSON
|
|||
| Write GeoZarr | GridWriter, wxy-geozarr standalone
|
warp output
|
n/a
|
||
| Virtual references | scan_tiff, from_refs_table, Icechunk write/read
|
example only
|
|||
| Byte-range cache | wxy-cache, Parquet rows
|
--cache, GeoTIFF only
|
|||
| CRS input |
Pure Rust proj4rs everywhere: EPSG codes and PROJ strings, no WKT or PROJJSON. wxy warp --crs takes EPSG only, since GeoZarr proj: has nowhere to record a PROJ string. Real PROJ is the open question (rust-proj-capability); proj4rs lacks polar LAEA and AEQD. See Which CRS strings work where.
|
||||
| Packaging |
Docker images for the CLI, Python and R (wxylib/images). No crates.io release yet by choice; rwarp is a git dependency. CI on Ubuntu only.
|
||||
| Shared layers |
C ABI ( wxy-ffi) and Arrow interchange are the intended base for Julia, DuckDB, Go and JS hosts. Neither exists yet.
|
||||
Potential: what the next steps open up
Flat refs store
A zarrs storage over the mdim-refs Parquet export. Virtual data reads without writing an Icechunk repo first, plans report real stored bytes, and the cache sees every virtual read. It is also the cheapest route to bindings, since a table is all a host needs to hand over.
Bindings of the real surface
Python and R move from in-memory functions to open, warp, points, zonal and explain on files and stores. Most of the work is a repin and a thin layer, because plans and options already serialise.
The virtual scheme
Select, remap, combine and compute, serialised and written by the library: the VRT replacement, mosaics with gdalbuildvrt-style validation, and the place features and meshes join grids.
Mesh half of the ladder
- R5 explicit meshes via UGRID, conversion first.
- R6 as GeoArrow inside the model, so features are data and not only queries.
- R4 schemes (HEALPix, H3, L3 bins) as a
CellScheme.
Index-space depth
- CF
grid_mapping, so rotated-pole and geos read in their frame. - Periodic and folded dims; cubed-sphere patches.
- Vertical
formula_termsas R3' with field terms. - netCDF input, 1D CF bounds, NaN in geolocation.
The transform verb and PROJ
transform (positions on every rung) is decided but not built; today positions only move inside warp and extraction. A PROJ-backed frame would lift the EPSG-only limit, WKT and PROJJSON with it, and the missing projections.
Statuses are a reading of the source of wxylib/core, py, r and web on their default branches, and design docs 02, 03 and m07; the test suite was not rerun for this page. "GDAL-checked" means the crate's tests compare against outputs in wxylib/fixtures made with GDAL 3.12. Edit capabilities.yml to update this page.