Skip to content

Releases: GEOINT/grdl

v0.4.3

19 Apr 23:15

Choose a tag to compare

New readers / metadata

  • EO NITF: parse CSEPHA (commercial ephemeris) and RSMGGA (RSM ground-to-image grid) TREs per STDI-0002; add CSEPHAMetadata, RSMGGAMetadata, RSMGGAGridPlane, RSMSegmentGrid (with segment_for_pixel() helper)
  • EO NITF geolocation: create_geolocation() factory now prefers RSM over RPC when both TREs are present
  • NISAR: extract the Doppler centroid 2-D LUT (zero-Doppler time × slant range) from RSLC processingInformation per JPL D-102268
  • CRSD: typed CRSDMetadata, CRSDChannelParameters, CRSDDwellPolynomialSet, CRSDReferenceGeometry, wired through CRSDReader (parses DwellPolynomials, channel parameters, Doppler rate slopes, reference geometry)

Performance

  • RPC/RSM ground-to-image inversion: closed-form analytic Jacobian replaces finite differences. Halves per-iteration evaluator cost, removes step-size tuning, eliminates cancellation error
  • Orthorectifier: batched output-grid iteration with per-batch DEM pre-sample (configurable via orthorectify(batch_size=...) or OrthoBuilder.with_batch_size(), default 2,000,000 points). Caps peak memory on large grids and stops the inverse projection from re-querying the DEM on every Newton iteration

Detection

  • ImageDetector.detect() and CFARDetector.detect() accept a new valid_mask keyword for ROI cueing. CFAR background statistics remain computed from the full image so the adaptive noise floor stays physically meaningful; only the final candidate set is gated
  • DetectionSet.filter_by_region(shape, geolocation, mode=...) — centroid / intersects / contained spatial post-filter. Shape is duck-typed on .to_pixels(geolocation), so no hard dependency on external modules

Fixes

  • SICDGeolocation: explicit per-point height arrays now take precedence over DEM lookup (array → DEM → default_hae). The previous DEM-first ordering silently overrode caller-provided heights and re-queried the DEM on every inverse call
  • COAProjection: RGAZCOMP now raises on missing RgAzComp section and derives AzSF from KazPoly evaluated at SCP COA time when AzSF is absent (SICD Vol3 §4.3 / Vol1 §15)
  • Geolocation.latlon_to_image ABC: base-class fast path now honors array heights, short-circuiting DEM lookup consistently with the subclasses

Convenience

  • ImageReader.read_band(index) — 2-D single-band read that normalizes (bands, rows, cols) vs (rows, cols, bands) layouts

v0.4.2

19 Apr 18:53

Choose a tag to compare

New readers

  • Sentinel-1 L0 RAW — SAFE product parsing and burst decoding (2326e53)
  • EO NITF — full TRE suite (RPC00B, multi-segment RSMPCA, RSMIDA, CSEXRA, USE00A, ICHIPB, BLOCKA, AIMIDB, STDIDC, PIAIMC), parallel IO (b8f4c66)

SAR readers — multi-pol

  • Multi-pol CYX data cube support across SAR readers (65c6fd8)
  • Channel-aware metadata propagation through SAR processing pipeline (9a50d84)
  • StokesVector and KennaughMatrix polarimetric matrix products (a044b51)
  • Readers now return metadata alongside array data (4f76045)
  • from_reader() convenience constructor (9daeb7b)

Geolocation

  • Unified DEM height resolution and NaN fill across all geolocation types (3c8437c)

Image processing

  • DataType enum for typed workflow edges (5a10a86)

Fixes

  • Per-thread dataset handles for parallel band read + chunked parallel read (concurrency bug — 16518e5)
  • Compression bug (1361c2f)

Docs / examples

  • SICD orthorectification example with slant-range vs. orthorectified PNGs in README (cbfb14b)
  • NISAR Pauli decomposition example (a95392e)
  • Sentinel-1 H/Alpha decomposition example (ccb18c4)
  • Markdown files now shipped in the PyPI sdist (711f169)

Maintenance

  • Author email replaced with GitHub noreply across source headers + PyPI metadata (be0578a, 93e5b0b)

v0.4.1

29 Mar 23:27

Choose a tag to compare

What's Changed

Security

  • Fix zip path traversal in remote_utils.py — validates member paths before extraction
  • Fix OData query injection in Sentinel-1/Sentinel-2 catalog modules — input validation on string and bbox parameters

Bug Fixes

  • Add sarpy runtime fallback to SIDDReader when sarkit fails to parse a file
  • Fix get_shape() return type annotations in 8 readers to match ABC contract (Tuple[int, ...])

API Improvements

  • Export EONITFMetadata, RPCCoefficients, RSMIdentification, RSMCoefficients from grdl.IO.models
  • Export all 7 writers (GeoTIFFWriter, HDF5Writer, NITFWriter, NumpyWriter, PngWriter, SICDWriter, SIDDWriter) from grdl.IO
  • Export EONITFReader and Sentinel1SLCReader from grdl.IO

New Modules

  • grdl.discovery — file scanning, metadata catalog, and synthesis
  • grdl.geolocation._numba_projection — numba-accelerated R/Rdot projection
  • TiledGeoTIFFDEM — multi-tile GeoTIFF DEM with LRU cache
  • UTMGrid, WebMercatorGrid — new ortho output grids
  • ChipGeolocation — offset wrapper for chipped images

Documentation

  • Updated IO README and ARCHITECTURE for all 7 catalog implementations, SIDD fallback, EONITFReader, SIDDWriter
  • Added READMEs for geolocation, interpolation, data_prep, coregistration, transforms, ortho, discovery modules
  • Added top-level ARCHITECTURE.md

v0.4.0

23 Mar 10:14
39b80b8

Choose a tag to compare

What's New

Breaking Changes

  • Geolocation API refactored to (N, M) stacked ndarray conventionimage_to_latlon returns (N, 3), latlon_to_image accepts (N, 3) with embedded height and returns (N, 2). Scalar shorthand with tuple unpacking preserved.
  • Coordinate utilities refactoredgeodetic_to_ecef, ecef_to_geodetic, geodetic_to_enu, enu_to_geodetic all use (N, 3) stacked arrays.

New Features

  • TiledGeoTIFFDEM — multi-tile DEM support (FABDEM, SRTM, Copernicus) with cross-tile interpolation and LRU cache
  • UTMGrid — UTM projection output grid for orthorectification
  • WebMercatorGrid — Web Mercator output grid for orthorectification
  • _handles_dem_internally flag prevents double DEM iteration in SICD/SIDD R/Rdot
  • _latlon_to_image_with_dem wrapper for consistent inverse DEM handling
  • Per-point DEM iteration replaces old mean-height approach

Documentation

  • New geolocation/README.md with full use-case examples for every modality
  • New READMEs for data_prep, interpolation, coregistration, transforms modules
  • Updated ARCHITECTURE.md, README.md, CLAUDE.md for stacked ndarray convention

v0.3.0

20 Mar 03:17
bcc436b

Choose a tag to compare

What's New

  • OrthoBuilder — renamed from OrthoPipeline, fluent builder API with OutputGridProtocol, apply_from_reader, tiled processing via sub_grid()
  • Geolocation ARCHITECTURE.md — full module documentation covering class hierarchy, data flow, backend selection, DEM refinement
  • Ortho ARCHITECTURE.md + README.md — ortho subpackage documentation
  • SIDD geolocation — R/Rdot refinement, cylindrical/geographic projection fixes
  • RSM geolocation — Newton-Raphson iteration improvements
  • Plotly examples — all ortho examples migrated from matplotlib to plotly
  • New examplecompare_sidd_ortho.py for dual-SIDD ortho comparison
  • Packaging.md files (CLAUDE.md, ARCHITECTURE.md, etc.) now included in PyPI distribution

32 files changed, +2,528 / -706

v0.2.1

08 Mar 19:02

Choose a tag to compare

What's New

  • ENU Orthorectification — Local East-North-Up grids in meters via ENUGrid and OrthoPipeline.with_enu_grid()
  • Accelerated Resampling — Multi-backend dispatch: numba (JIT parallel) > torch GPU > torch CPU > scipy parallel > scipy
  • Parallel Coordinate Mapping — ThreadPoolExecutor row-strip chunking for grids >1M pixels
  • Geodetic Coordinate Utilities — ECEF, ENU conversions in geolocation.coordinates
  • Updated Example Scripts — All ortho examples now use ChipExtractor, FABDEM auto-discovery, acceleration display, and timing breakdowns
  • New SIDD & Combined Examplesortho_sidd.py and ortho_combined.py (auto-detects SICD vs SIDD)

v0.2.0

08 Mar 14:29

Choose a tag to compare

What's New

  • SIDD GeolocationSIDDGeolocation with polynomial and planar projection support
  • GDAL Fallback ReaderGDALFallbackReader opens any GDAL-supported raster with automatic modality classification (SAR, EO, IR, MSI, HSI)
  • Invasive Probe ReaderInvasiveProbeReader performs deep non-cooperative file probing (magic bytes, HDF5 tree walking, ENVI headers, NetCDF, FITS, binary structure analysis)
  • Universal File Openeropen_any() with 5-phase cascade: specialized readers → base format readers → GDAL fallback → retry → invasive probing
  • Comprehensive test coverage for all new modules

v0.1.2 GEOINT Rapid Development Library

24 Feb 02:43
5fa9674

Choose a tag to compare

Updates for compatibility with new GRDK release

v.0.1.1

23 Feb 03:14

Choose a tag to compare

fix optional package imports, unit tests

v0.1.0 release

21 Feb 19:24

Choose a tag to compare

initial release! Hello World!