COOLJAPAN
← All posts

OxiGeo 0.2.4 Released — Three GitHub Issues Fixed, and the Browser COG Viewer Finally Works

OxiGeo 0.2.4 fixes three real user-filed issues — GeoPackage overflow-page cells (#17), GDAL's fractional VRT SrcRect/DstRect values (#18), and VRT mosaic nodata-skip compositing (#19) — plus a new buffered sync-over-fetch driver that makes the browser COG viewer work end to end for the first time, and two large embedded EPSG registry correctness passes.

release oxigeo gdal sqlite geospatial pure-rust wasm gis epsg

A GeoPackage reader that chokes on any row wide enough to spill onto a second SQLite page, and a VRT parser that rejects the exact sub-pixel coordinates GDAL itself writes, are not edge cases — they’re the common case for real-world files.

Today we released OxiGeo 0.2.4 — a correctness release built around three GitHub issues filed by real users: issue #17 (GeoPackage overflow-page cells), issue #18 (VRT fractional SrcRect/DstRect parsing), and issue #19 (VRT mosaic nodata-skip compositing) — plus the browser COG viewer (AdvancedCogViewer) working end to end for the first time, and two large embedded EPSG registry correctness passes.

No C. No C++. No Fortran. OxiGeo 0.2.4 still compiles to a single static binary (or WASM) and runs everywhere Rust runs — and every one of these fixes landed without picking up a single new native dependency.

Why 0.2.4 is a game changer

Three real bug reports, three real files that shouldn’t have failed:

OxiGeo 0.2.4 ends all of that:

Technical Deep Dive: what issues #17, #18, and #19 actually touched

  1. The overflow-page chain (oxigeo-gpkg). SqliteHeader gained a public reserved_bytes: u8 field (byte 20 of the SQLite header) and usable_size(). The local-payload threshold — how many bytes of a cell SQLite stores inline before spilling to an overflow page — is now computed from the usable page size, not the raw one, matching SQLite’s own K/M formula instead of the previous min(P, U − 35) approximation.
  2. SrcRect/DstRect as f64 (oxigeo-vrt). GDAL keeps warp/mosaic source and destination windows as doubles internally and rounds only at rasterization time, so real VRTs carry values like 9783.50000000003. A scientific-notation regression test now separately pins <WarpMemoryLimit>6.71089e+07</WarpMemoryLimit> — parsed as f64 since 0.2.3 — so the two are never conflated again.
  3. Per-band nodata comparison in mosaic compositing. The nodata check now runs on the decoded sample value for the band’s actual data type rather than raw bytes, so float nodata — including NaN — compares correctly across sources.
  4. buffered_source (oxigeo-wasm). pull_until_ready re-runs a synchronous parse operation, fetching only the ranges it’s missing between attempts, until a round makes no progress or the operation succeeds — bounded in every direction, and keyed on the CogReader’s own best-effort miss log rather than on Err, so a silently-swallowed failure (e.g. losing the file’s epsgCode) still triggers a retry.
  5. The EPSG registry’s epsg_unit_for helper. Previously every projected-CRS registration hardcoded its reported unit to "metre" regardless of what its own PROJ string declared — now the reported unit is derived from each entry’s real +units=/+to_meter= token.

Getting Started

[dependencies]
oxigeo = "0.2"  # GeoTIFF + GeoJSON + Shapefile by default
oxigeo-gpkg = { version = "0.2", features = ["geojson-convert"] }  # GeoPackage, opt-in convert
use oxigeo::Dataset;

fn main() -> oxigeo::Result<()> {
    // A GeoPackage with a long layer name (QGIS-style) no longer fails to open —
    // the sqlite_master row's overflow pages are now followed correctly.
    let gpkg = Dataset::open("wide_schema.gpkg")?;

    // A gdalbuildvrt mosaic with fractional SrcRect/DstRect windows now parses,
    // and overlapping sources composite with per-source <NODATA> honoured.
    let mosaic = Dataset::open("mosaic.vrt")?;
    println!("{}x{}, {} bands", mosaic.width(), mosaic.height(), mosaic.band_count());
    Ok(())
}

What’s New in 0.2.4

Tips

This is the foundation

OxiGeo 0.2.4 leans on the same Pure Rust COOLJAPAN stack as every release before it: CRS transforms through OxiProj (bumped to 0.1.5 this release, itself the authority-path correctness release that unblocked proj-db’s feature-invariance fix), HDF5/NetCDF through oxih5/oxinetcdf, SQLite via oxisql-sqlite-compat (Limbo) — now exercised even harder by the overflow-page fix — TLS via OxiTLS, XML via the new oxixml-quickxml-compat shim, compression across every format driver via the OxiArc family, and tensor math via SciRS2-Core. Every one of those is itself Pure Rust — which is how a 75-crate, ~814K-SLoC workspace fixes three overflow/parsing/compositing bugs and ships a working browser COG viewer without a single new native dependency.

Repository: https://github.com/cool-japan/oxigeo

Star the repo if you’d rather your GeoPackage reader followed the overflow chain than reject the file, and your VRT parser accepted the numbers GDAL actually writes instead of the ones it wishes GDAL wrote. Three real user-filed issues, three real fixes — grounded in files that were failing before today.

The era of “the format reader mostly works” is over. Pure Rust geospatial is here — fast, safe, and sovereign.

KitaSan at COOLJAPAN OÜ
August 18, 2026

↑ Back to all posts