The Pure Rust GDAL gains a vector-tile writer and a proper geometry toolkit.
Today we released OxiGDAL 0.1.2 — a feature release that adds PMTiles v3 writing, a complete geometry validation-and-operations module, and a unified conversion API on the umbrella crate.
No C. No C++. No Fortran. No PROJ/GEOS system libraries. No build hell, no 1 GB Docker images — 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.2 is a meaningful step
GDAL has historically pushed vector-tile generation and geometry predicates out to a constellation of separate tools (tippecanoe, GEOS, shapely). OxiGDAL pulls them in-tree, in Pure Rust. With this release the workspace has grown to 76 crates (~540K Rust SLoC) and ships 15 format drivers — adding COPC/LAS, GeoPackage, MBTiles, and PMTiles to the original eleven — with 10,935 passing tests (45 skipped, 0 failures) backing it.
The headline additions:
- A PMTiles v3 writer — single-file, cloud-friendly vector-tile archives with Hilbert-curve tile ordering and content deduplication.
- A geometry operations module with the predicates and measures you actually reach for: centroid, area, perimeter, point-in-polygon, simplification, and convex hull.
- A unified
oxigdalumbrella that detects 12 dataset formats and plans conversions between them through one API.
Technical Deep Dive: what changed under the hood
-
PMTiles v3 writer (
oxigdal-pmtiles)PmTilesBuilderprovides a simpleadd_tile/buildflow. Internally it encodes tile IDs along a Hilbert curve (hilbert.rs), serializes directories with LEB128 varints (varint.rs), and deduplicates identical tiles by FNV-1a hash before writing the PMTiles v3 header and directory structure. The result is a single, range-request-friendly archive that drops straight onto S3 or any static host. -
Geometry validation & operations (
oxigdal-index) A newvalidation.rssurfaces sevenValidationIssuevariants — unclosed ring, self-intersection, wrong hole orientation, and more — whileoperations.rsadds centroid, Shoelace area, perimeter, ray-casting point-in-polygon, Douglas–Peucker simplification, Graham-scan convex hull,is_convex,distance, and bounding-box helpers. It is the geometry toolkit that vector pipelines need, without a GEOS link. -
Umbrella crate integration (
oxigdal) The top-level crate adds seven feature-gated re-exports (gpkg,pmtiles,mbtiles,copc,index,noalloc,services) and a newconvert.rswithDatasetFormatdetection across 12 formats, aConversionPlan, andcan_convert/supported_conversionsqueries — so one dependency exposes the whole stack. -
Refactoring for maintainability Two large modules were split to honor the 2,000-line ceiling with zero breaking changes: the 1,981-line
ogc_features.rsinoxigdal-servicesbecame seven focused modules, and the 1,873-lineepsg.rsinoxigdal-projbecame five.
Getting Started
cargo add oxigdal
Open any supported dataset through the unified entry point:
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(())
}
Or drive format conversion straight from the CLI:
oxigdal convert input.shp output.fgb
What’s New in 0.1.2
- PMTiles v3 writer (
oxigdal-pmtiles) —PmTilesBuilderwithadd_tile/build, Hilbert tile IDs, LEB128 varint directories, and FNV-1a content dedup. - Geometry validation & operations (
oxigdal-index) — 7 validation issue types plus centroid, area, perimeter, point-in-polygon, Douglas–Peucker simplify, convex hull, and distance/bbox helpers. - Umbrella conversion API (
oxigdal) —DatasetFormatdetection for 12 formats,ConversionPlan,can_convert,supported_conversions, and three new format variants (PMTiles,MBTiles,Copc). - New subcrate READMEs for oxigdal-copc, -geojson, -gpkg, -index, -mbtiles, -noalloc, and -pmtiles.
- Refactors —
ogc_features.rs(1,981 lines → 7 modules) andepsg.rs(1,873 lines → 5 modules), zero breaking changes. - Clippy fix (
oxigdal-netcdf) — renamedCfVersion::from_str→parse_versionandCellMethodName::from_str→parse_methodto avoidstd::str::FromStrconfusion.
Tips
- Build vector tiles without leaving Rust.
PmTilesBuilder::add_tilefollowed bybuildgives you a single PMTiles archive — no tippecanoe, no Node toolchain. Because tiles are deduplicated by content hash, repeated or empty tiles cost nothing on disk. - Validate before you write. Run geometries through
oxigdal-index’svalidation.rsto catch unclosed rings and self-intersections up front, rather than discovering them downstream in a renderer. - Pick the right tile container. 0.1.2 ships both MBTiles and PMTiles drivers; prefer PMTiles when you want range-request reads from object storage with no database engine in the loop.
- Let the umbrella plan conversions. Use
supported_conversionsandcan_convertto discover valid format pairs programmatically before committing to aConversionPlan. - Enable only what you need. The new re-exports (
gpkg,pmtiles,copc,index, …) are all feature-gated, keeping default builds small.
This is the foundation
OxiGDAL is the geospatial layer of the COOLJAPAN Pure Rust ecosystem, and 0.1.2 keeps every byte of it C-free. PMTiles archives are written through OxiArc compression, binary serialization uses OxiCode, numerical building blocks come from SciRS2-Core, and S3-compatible storage is reached via the RS3GW gateway — no zip, no flate2, no bincode anywhere in the default closure.
Repository: https://github.com/cool-japan/oxigdal
Star the repo if you want vector tiles and geometry operations without the C++ toolchain.
Pure Rust cloud-native geospatial is here — fast, safe, and sovereign.
— KitaSan at COOLJAPAN OÜ March 17, 2026