Geospatial computing finally has a home in Pure Rust — no C toolchain, no PROJ/GEOS, no 1 GB Docker images.
Today we released OxiGDAL 0.1.0 — the first public release of a Pure Rust reimplementation of GDAL, built from the ground up for cloud-native geospatial data abstraction.
No C. No C++. No Fortran. No PROJ, no GEOS, no libcurl as a system dependency. No build hell. No “install the right GDAL version and pray the C++ doesn’t segfault.” Just clean, memory-safe, fast geospatial processing that compiles to a single static binary (or a sub-1 MB WASM bundle) and runs everywhere — laptops, browsers, embedded boards, and cloud clusters alike.
Why OxiGDAL 0.1.0 matters
For decades, virtually every serious geospatial workflow has been built on the GDAL C/C++ library. It is extraordinary software — and it comes with a tax: a heavy C/C++ toolchain, PROJ and GEOS system libraries, fragile cross-compilation, manual memory management, thread-unsafe APIs, slow Python bindings, and Docker images that routinely cross a gigabyte.
OxiGDAL takes a different path. This first release already delivers a broad, production-shaped surface — and the numbers from the release itself tell the story:
- ~495,961 SLoC of Rust (474,600 lines across 1,739
.rsfiles) in 68 workspace crates - 11 format drivers out of the box, including GeoTIFF/COG, GeoParquet, Zarr, and NetCDF
- 211+ embedded EPSG definitions with O(1) lookup, and 20+ map projections
- Zero C/C++/Fortran dependencies in default features —
clippy::unwrap_used = "deny"enforced across all 68 crates
And on performance, the published 0.1.0 benchmarks are already competitive with — or ahead of — the C incumbents:
- COG tile access: < 10 ms (local SSD), < 100 ms (cloud S3/GCS)
- GeoTIFF metadata reading: < 5 ms for typical headers
- GeoParquet reading: 10× faster than GeoPandas on large datasets
- PROJ batch transforms: < 10 ms for 1 million points (WGS84 → UTM), within 0.001 m of reference PROJ
- Docker image: < 50 MB (vs 1 GB+ for traditional GDAL); WASM bundle < 1 MB gzipped
Technical Deep Dive: How OxiGDAL is built
The 68 crates are organized into clean, pay-for-what-you-use functional layers.
-
Core & algorithms (
oxigdal-core,oxigdal-proj,oxigdal-algorithms) The core defines the abstract data model —Dataset,RasterDataset,VectorDataset,BoundingBox,GeoTransform— plus async I/O traits and an Arrow-backedGeoBufferfor zero-copy columnar work.oxigdal-projis a from-scratch Pure Rust PROJ: 20+ projections (UTM 1–60, Web Mercator, Lambert Conformal Conic, Albers, Polar Stereographic, Japan Plane Rectangular I–XIX), a complete WKT2 (ISO 19162:2019) parser with WKT1/ESRI backward compatibility, and Helmert/Molodensky/NTv2/NADCON datum transformations.oxigdal-algorithmsbrings SIMD raster/vector kernels with feature-gated AVX2, AVX-512, and ARM NEON paths. -
Format drivers (11 formats) GeoTIFF/COG (BigTIFF > 4 GB, overviews, HTTP range, DEFLATE/LZW/ZSTD/PackBits/JPEG), GeoJSON (RFC 7946, streaming, GeoArrow), GeoParquet (Arrow-native, predicate pushdown), Zarr v2/v3 (sharding, codec pipeline), FlatGeobuf (packed Hilbert R-tree), Shapefile (SHP/SHX/DBF), NetCDF (CF conventions), HDF5, GRIB1/2, JPEG2000 (wavelet DWT, tier-1), and VRT.
-
Cloud & storage (
oxigdal-cloud,oxigdal-compress) First-class async backends for AWS S3, Google Cloud Storage, and Azure Blob, with HTTP range requests for byte-range COG access and aRangeCoalescerthat batches small requests. Compression is Pure Rust throughout via the OxiArc ecosystem (Deflate, LZ4, Zstd, BZip2, LZW, LZH). -
Platform & bindings A WebAssembly target (
oxigdal-wasm) with aWasmCogViewerJS/TS API under 1 MB gzipped, Python bindings (oxigdal-python, PyO3/Maturin, NumPy returns, manylinux/macOS/Windows wheels), Node.js N-API bindings, a Jupyter kernel, iOS/Android mobile crates, andno_stdembedded support.
The Rust advantages run through all of it: guaranteed memory safety, fearless concurrency, trivial cross-compilation, and rich typed Result<T, OxiError> instead of C error codes.
Getting Started
cargo add oxigdal
oxigdal ships with the GeoTIFF, GeoJSON, and Shapefile drivers enabled by default; add features = ["full"] for all eleven.
use oxigdal::Dataset;
fn main() -> oxigdal::Result<()> {
let dataset = Dataset::open("world.tif")?;
println!("Format : {}", dataset.format());
println!("Size : {}x{}", dataset.width(), dataset.height());
println!("CRS : {}", dataset.crs().name());
Ok(())
}
The same universal opener is available from Python via the PyO3 bindings, with NumPy arrays returned directly from read_geotiff(), read_geoparquet(), and read_zarr().
What’s inside
This is the Independence Release — the goal was a complete, end-to-end geospatial stack, not a thin wrapper. Highlights from the 0.1.0 changelog:
- Pure Rust PROJ — 20+ projections, 211+ embedded EPSG codes, full WKT2 parsing, and automatic transformation-path finding between arbitrary CRS pairs, accurate to within 0.001 m of reference PROJ.
- Eleven format drivers — GeoTIFF/COG, GeoJSON, GeoParquet, Zarr v2/v3, FlatGeobuf, Shapefile, NetCDF, HDF5, GRIB, JPEG2000, and VRT, with read/write where the formats allow.
- Cloud-native I/O — S3/GCS/Azure backends with range-request COG access, retries with exponential backoff, and a client-side caching layer.
- SIMD algorithms — resampling (nearest/bilinear/cubic/Lanczos), reprojection, hillshade/slope/aspect, terrain analysis, zonal statistics, and vector topology operations.
- Enterprise surface —
oxigdal-security(AES-256-GCM, ChaCha20-Poly1305, Argon2id, RBAC/ABAC, TLS 1.3 via rustls), OGC WMS 1.3.0 / WFS 2.0.0 services, Raft-based HA, and OpenTelemetry observability. - Broad bindings — WASM, Python, Node.js, Jupyter, iOS/Android, and
no_stdembedded. - Quality discipline — 1,143 of 1,145
unwrap()calls eliminated (99.83%), all Clippy warnings cleared, and every file kept under 2,000 lines.
Tips
- Stay lean by default. The default build pulls only GeoTIFF, GeoJSON, and Shapefile. Reach for CRS work with
features = ["proj"], raster math with["algorithms"], and cloud backends with["cloud"]— you only pay for what you enable. - Use range requests for cloud COGs. Pointing
Dataset::openat ans3://orhttps://COG triggers byte-range reads, and the built-inRangeCoalescermerges nearby requests so you fetch tiles, not whole files. - Prefer GeoParquet for analytics. It reads roughly 10× faster than GeoPandas on large datasets thanks to Arrow-native columnar execution and spatial predicate pushdown.
- Ship to the browser. The
oxigdal-wasmcrate compiles to a sub-1 MB gzipped bundle with aWasmCogViewerAPI — something the C-based GDAL simply cannot do. - Mind one known limit. JPEG2000 support in 0.1.0 is tier-1 only (no tier-2 optimizations yet); it reads codestreams but is not yet tuned for the heaviest workloads.
This is the foundation
OxiGDAL is the geospatial layer of the broader COOLJAPAN Pure Rust ecosystem, and 0.1.0 already builds directly on its siblings: compression rides on OxiArc (oxiarc-deflate, oxiarc-zstd, oxiarc-lz4, …) instead of the zip/flate2 C stack, binary serialization uses OxiCode in place of bincode, numerical pieces lean on SciRS2-Core, and S3-compatible access goes through the RS3GW gateway. The result is a geospatial foundation that is sovereign top to bottom — no hidden C dependency anywhere in the default build.
Repository: https://github.com/cool-japan/oxigdal
Star the repo if you want high-performance geospatial computing without the GDAL toolchain headaches.
The era of “just install GDAL and hope the C++ doesn’t segfault” is ending.
Pure Rust cloud-native geospatial is here — fast, safe, and sovereign.
— KitaSan at COOLJAPAN OÜ February 23, 2026