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_Concentrationholds 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) andOpen_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
|
Read NISE surface-class coverage layers from an HDF-EOS4 file. |