The Pure Rust GDAL reaches a milestone: not one line of C or C++ in the default build — including SQLite and TLS.
Today we released OxiGDAL 0.1.6 — the release that retires the last C dependencies from the workspace. SQLite moves to the Pure Rust OxiSQL (Limbo) engine, TLS moves to OxiTLS, and ring is gone. The default build is now 100% C/FFI-free, end to end.
No C. No C++. No Fortran. No PROJ/GEOS — and now no libsqlite3, no ring. Just memory-safe geospatial processing that compiles to a single static binary or a sub-1 MB WASM bundle and runs everywhere.
Why OxiGDAL 0.1.6 is a game changer
For most of the geospatial world, “Pure Rust” has an asterisk: somewhere down the dependency tree sits a C SQLite for GeoPackage/MBTiles and a C crypto library for TLS. OxiGDAL 0.1.6 removes that asterisk. With this release the workspace is 78 crates with 18 format drivers — GPX, KML, and TopoJSON join the lineup — backed by 14,605 passing tests (58 skipped, 0 failures) and 405 doc tests.
The defining change is sovereignty over the two hardest-to-replace native dependencies:
- SQLite, in Pure Rust.
rusqliteandlibsqlite3-sysare eliminated workspace-wide; all SQLite access — GeoPackage, MBTiles, PMTiles export, advanced drivers — now goes throughoxisql-sqlite-compaton the Limbo engine. - TLS, in Pure Rust. The security stack migrates off
ring/webpki-rootsto OxiTLS (oxitls-core+ the RustCrypto rustls adapter +oxitls-webpki-roots), with PBKDF2 moved to the Pure Rustpbkdf2crate.
Technical Deep Dive: what 0.1.6 rebuilt
-
Pure Rust SQLite migration (workspace-wide)
rusqliteandlibsqlite3-sysare fully removed from the default feature closure. The affected crates —oxigdal-db-connectors,oxigdal-gpkg,oxigdal-drivers-advanced,oxigdal-mbtiles,oxigdal-pmtiles— now useoxisql-sqlite-compat 0.1.5(Limbo). A newMbTilesConnadapter inoxigdal-pmtiles(open,open_memory,query_count,query_text,query_blob) backs the PMTiles MBTiles export path on OxiSQL. (One honest caveat: Limbo does not yet fireAFTER INSERT/UPDATE/DELETEtriggers, so 11 GeoPackage change-tracking tests are#[ignore]d with an explanatory note.) -
Pure Rust TLS & crypto (
oxigdal-security) The TLS stack moves fromring/webpki-rootstooxitls-core+oxitls-adapter-rustls-rustcrypto+oxitls-webpki-roots, 100% Pure Rust by default withtlsfeature gating preserved. PBKDF2 key derivation shifts fromring::pbkdf2topbkdf2::pbkdf2_hmac::<sha2::Sha256>, andargon2/aes-gcm/chacha20poly1305remain as the Pure Rust primitives.ringis removed from workspace dependencies entirely. -
New vector formats & encoding correctness The umbrella
open()and vector streaming now recognize GPX, KML, and TopoJSON by extension.oxigdal-shapefilegains non-UTF-8 DBF support viaencoding_rs:resolve_cpg()maps CPG labels,resolve_ldid()maps the LDID byte to an IANA encoding, andopen_with_encoding()/read_with_encoding()accept explicit overrides — so legacy Shapefiles in Shift-JIS, Latin-1, and friends read correctly.oxigdal-projaddswkt_to_proj_string(), lettingfrom_wktCRS objects flow directly into aTransformer. -
Analysis depth: terrain, indexing, QC, and time series
oxigdal-terrainadds GLCM texture derivatives (contrast, dissimilarity, homogeneity, energy, correlation, ASM), TPI annulus/standardized variants with parallel editions, the Jasiewicz & Stepinski geomorphons 10-class landform classifier, and cost-distance / least-cost-path.oxigdal-indexgains Delaunay triangulation (triangulate, Bowyer–Watson) with convex-hull extraction.oxigdal-qcadds aBatchRunnerover directories plus GeoPackage, STAC, and per-band radiometric validators (Sentinel-2, Landsat-8/9, custom profiles).oxigdal-temporalcompletes gap-filling with Whittaker and Savitzky–Golay smoothers;oxigdal-sensorsadds a Gaussian Maximum-Likelihood classifier;oxigdal-copcadds full-waveform LiDAR (point formats 9/10);oxigdal-drivers/hdf5adds the HDF5 v2/v3 superblock parser with Jenkins lookup3 checksum validation; andoxigdal-cache-advancedadds a W-TinyLFU eviction policy backed by a Count-Min Sketch.
Getting Started
cargo add oxigdal
The unified opener now reaches GPX, KML, and TopoJSON alongside everything else:
use oxigdal::Dataset;
fn main() -> oxigdal::Result<()> {
// Routed by extension to the GPX, KML, TopoJSON, or any other driver.
let dataset = Dataset::open("track.gpx")?;
println!("Format : {}", dataset.format());
println!("CRS : {}", dataset.crs().name());
Ok(())
}
Reading a legacy Shapefile in a non-UTF-8 codepage is now explicit and correct:
use oxigdal_shapefile::ShapefileReader;
// Force Shift-JIS for a DBF with no CPG sidecar.
let reader = ShapefileReader::open_with_encoding("japan.shp", "shift_jis")?;
What’s New in 0.1.6
- Pure Rust SQLite —
rusqlite/libsqlite3-syseliminated workspace-wide; all SQLite access viaoxisql-sqlite-compat(Limbo). NewMbTilesConnadapter. - Pure Rust TLS — security stack migrated from
ring/webpki-rootsto OxiTLS; PBKDF2 moved to thepbkdf2crate;ringremoved. - GPX, KML, TopoJSON — three new vector formats detected by extension in
open()and streaming. - Non-UTF-8 DBF encoding (
oxigdal-shapefile) —encoding_rs-backed CPG/LDID resolution and explicit-encoding readers. - WKT → PROJ string (
oxigdal-proj) —wkt_to_proj_string()bridgesfrom_wktCRS toTransformer. - Delaunay triangulation (
oxigdal-index) — Bowyer–Watsontriangulatewith CCW convex hull. - Terrain GLCM / geomorphons / cost-distance / TPI variants (
oxigdal-terrain), with parallel editions. - Batch QC + validators (
oxigdal-qc) — directoryBatchRunner, plus GeoPackage, STAC, and radiometric (Sentinel-2/Landsat) validation. - Gaussian Maximum-Likelihood classifier (
oxigdal-sensors), HDF5 v2/v3 superblocks (oxigdal-drivers/hdf5), full-waveform LiDAR (oxigdal-copc). - W-TinyLFU cache eviction (
oxigdal-cache-advanced) backed by a Count-Min Sketch. - Whittaker + Savitzky–Golay time-series smoothers (
oxigdal-temporal). - WebP compression with explicit params (
oxigdal-drivers/geotiff), OxiStore-backed streaming state (oxigdal-streaming). - MSRV raised 1.85 → 1.89 (required by
time 0.3.49); ~35 inline deps migrated to*.workspace = true.
Tips
- You can finally claim Pure Rust without a caveat. GeoPackage and MBTiles no longer pull in a C SQLite, and TLS no longer pulls in
ring— the default build is C/FFI-free, which matters forcargo audit, reproducible builds, and exotic cross-compilation targets. - Read legacy Shapefiles correctly. If a DBF predates UTF-8 or lacks a CPG sidecar, use
ShapefileReader::open_with_encoding(...)(orDbfReader::read_with_encoding) to name the encoding explicitly instead of getting mojibake. - Bridge WKT CRS into transforms in one call.
wkt_to_proj_string()turns an OGC WKT-1/WKT-2 string fromfrom_wktinto a PROJ string aTransformeraccepts directly. - Validate whole directories at once.
oxigdal-qc’sBatchRunnerproduces aBatchReportwithSeverityCountsacross a folder — pair it with the radiometric validator’s sensor profiles to QC Sentinel-2 or Landsat scenes by band range. - Tune the cache for skewed access. The new W-TinyLFU policy admits entries via a Count-Min Sketch frequency estimate, which holds hot tiles better than plain LRU under Zipfian tile-request patterns.
- Check your toolchain. The minimum supported Rust version is now 1.89; update CI images before upgrading.
This is the foundation
OxiGDAL is the geospatial layer of the COOLJAPAN Pure Rust ecosystem, and 0.1.6 deepens that integration more than any release before it. SQLite now runs on OxiSQL (oxisql-sqlite-compat, Limbo), TLS on OxiTLS (oxitls-core and the RustCrypto adapter), streaming state on OxiStore, ML inference on OxiONNX, compression on OxiArc, serialization on OxiCode, numerics on SciRS2-Core, and S3-compatible storage on RS3GW. Every one of those is itself Pure Rust — which is how OxiGDAL gets to a C-free default build with no hidden native dependency anywhere in the tree.
Repository: https://github.com/cool-japan/oxigdal
Star the repo if you want a geospatial stack with zero C — SQLite and TLS included.
Pure Rust cloud-native geospatial is here — fast, safe, and sovereign.
— KitaSan at COOLJAPAN OÜ June 16, 2026