libera_utils.footprint_matching.readers.nsidc#

NISE sea ice reader plugin for the footprint matching pipeline.

Data source: NSIDC Near-real-time Ice and Snow Extent (NISE) Product

  • Product: NISE_A2 (AMSR-2, v1)

  • Format: HDF-EOS4 (.HDFEOS), opened via pyhdf

  • Spatial resolution: 25 km nominal (NSIDC EASE-Grid North & South)

  • Grid: two 721 × 721 polar azimuthal equal-area grids — Northern Hemisphere (NSIDC EASE-Grid North, EPSG:3408) and Southern Hemisphere (EASE-Grid South, EPSG:3409), both carried in the single granule

  • Temporal coverage: 2012-present (NISE_A2)

  • Spatial coverage: Northern and Southern Hemispheres (both grids are read and merged into one geolocated point cloud)

  • Data variable: Extent SDS, one per hemisphere (uint8 category codes 0–255)

NISE Extent encoding#

The authoritative per-code meaning is the data_grid_key attribute embedded in every granule:

Code

Meaning

0

Snow-free land

1–100

Sea ice concentration in percent (1 = 1%, 100 = 100%)

101

Permanent ice (Greenland Ice Sheet, Antarctic ice shelves)

102

Not used (belongs to no class — missing, NaN, in every layer)

103

Dry snow on land

104

Wet snow on land

105–251

Not used

252

Mixed pixels at coastlines (microwave algorithm unreliable)

253

Suspect ice value

254

Off-Earth corner fill — the square grid’s corners fall outside the projection disk; these pixels are dropped (see “Two hemispheres” below)

255

Ocean (open water, no ice)

Per-code output layers#

Rather than collapse the Extent SDS into a single sea ice field, this reader splits it into five independent float32 coverage layers, one per surface class. Each layer carries a per-pixel value that the PSF aggregation engine turns into a footprint-level fraction via weighted_mean; Sea_Ice_Concentration also preserves sub-pixel concentration magnitude:

Variable

Codes

Per-pixel value

Sea_Ice_Concentration

1–100

code / 100.0 (0.01–1.0 concentration)

Snow_Free_Land

0

1.0 else 0.0

Permanent_Ice

101

1.0 else 0.0

Snow_On_Land

103–104

1.0 else 0.0 (dry + wet snow)

Open_Ocean

255

1.0 else 0.0

Design notes#

  • Codes that belong to no surface class are missing (NaN) in all five layers: 102 and 105–251 (“not used”), plus the quality flags 252 (coastline mixed pixels) and 253 (suspect ice value). The weigher counts such a pixel as missing, so it lowers a footprint’s coverage rather than pulling every class fraction toward zero. Code 254 (off-Earth corners) is dropped from the point cloud entirely (see below).

  • The five layers do not sum to exactly 1.0: Sea_Ice_Concentration holds a fractional concentration (intended), while the other four are 0/1 indicators. This is by design — four surface-class fractions plus a mean ice concentration.

  • Snow_Free_Land (code 0) and Open_Ocean (code 255) are distinct classes: the granule separates snow-free land from open water, so neither subsumes the other. Code 255 is ocean, the single largest class in each polar grid.

The first axis of the returned values array follows VARIABLES order exactly (the multi-variable reader contract; see PointSamples and ERA5SurfaceReader).

Two hemispheres in one granule#

A NISE granule holds two grids — Northern (EPSG:3408) and Southern (EPSG:3409) — each with its own Extent SDS. Both fields are named Extent, so they are addressed by their HDF-EOS dimension-name hemisphere label, not by SDS name (see _read_extent_sds). This reader reads both, reprojects each with its own CRS, and concatenates the results into a single point cloud; a footprint’s box query downstream keeps only the points inside its box, so each hemisphere’s footprints draw from the correct grid automatically.

Each square 721 × 721 grid’s corners fall outside the projection’s Earth disk and reproject into the opposite hemisphere; every such corner pixel carries Extent code 254. These are dropped before merging (_load_native) so they cannot contaminate the other hemisphere’s footprints.

Geolocation: native pixels, not a regular grid#

The EASE-Grid projections are azimuthal – both latitude and longitude vary in two dimensions across the pixel grid, so a 1-D row/column mean of the pixel coordinates places no real pixel and mis-geolocates the data. Every pixel is therefore served at its own reprojected center as a PointSamples point, and the PSF weigher is the first place a pixel is weighted. Pixels whose EASE-Grid -> WGS84 transform falls outside the projection domain reproject to non-finite coordinates (pyproj yields inf) and are dropped by the reader base class’s point index.

References

Product page: https://nsidc.org/data/nise User guide: https://nsidc.org/sites/default/files/nise5-v001-userguide.pdf Data access: https://n5eil01u.ecs.nsidc.org/NISE/ (Earthdata login required) File naming: NISE_AMSR2_{YYYYMMDD}.HDFEOS (NISE_A2 v1) EPSG:3408 desc: https://epsg.io/3408 (North) / https://epsg.io/3409 (South) EASE-Grid ref: https://nsidc.org/ease

Classes

NISEReader(file_paths)

Read NISE surface-class coverage layers from an HDF-EOS4 file.