wxylib
  • Start
  • Capabilities
  • How-tos
  • Explainers
  • Demos
  • Reference
  • Design
  • Contribute

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.

11 crates~11.2k lines of library source3 CLI verbs: warp, points, zonal65 test functions
built and GDAL-checked built with known gaps planned in a numbered stage type slot or aspiration not there yet

The ladder

The position ladder R0 to R6, coloured by how much of each rung wxylib core implements R0 index only built R1 regular built R2 rectilinear built R3 curvilinear built, gaps R3' fitted type slot only R4 implicit mesh type slot only R5 explicit mesh staged (S8) R6 features as queries one family: logically rectangular, topology from the (i, j) index one family: no (i, j) index conversions to R1 that run today normalise R3 to R1 in another frame (a test; not automatic) rasterize, or exact coverage: features to R1 cells

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

S3c, first slice in core

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.

S6, spikes exist

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.

S7

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.

S8 and later

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.
R1 to R3 gaps (m07)

Index-space depth

  • CF grid_mapping, so rotated-pole and geos read in their frame.
  • Periodic and folded dims; cubed-sphere patches.
  • Vertical formula_terms as R3' with field terms.
  • netCDF input, 1D CF bounds, NaN in geolocation.
cross-cutting

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.

wxylib: MIT OR Apache-2.0

 
  • Edit this page
  • Report an issue

Built with Quarto