Skip to content

NASA EMIT netCDF conversion - #2

Open
kllewers wants to merge 4 commits into
isofit:mainfrom
kllewers:nasa-emit-conversion
Open

NASA EMIT netCDF conversion#2
kllewers wants to merge 4 commits into
isofit:mainfrom
kllewers:nasa-emit-conversion

Conversation

@kllewers

Copy link
Copy Markdown

Adds isoio/emit_nc.py, a converter from NASA EMIT L1B netCDF files
(radiance + observation geometry) to the three ENVI binary + .hdr files
expected by apply_oe, matching the same output contract as neon_h5.py
(#1):
...

kllewers and others added 3 commits June 2, 2026 16:18
@kllewers

Copy link
Copy Markdown
Author

More detail:

.rad — at-sensor radiance, BIL float32
.loc — per-pixel location (longitude/latitude/elevation), BIL float32
.obs — observation geometry (angles, path length, time), BIP float32

EMIT ships radiance and observation geometry as two separate granule
files (EMIT_L1B_RAD_.nc and EMIT_L1B_OBS_.nc), so convert_emit_nc()
takes both paths. Unlike NEON, EMIT radiance is already physically
scaled float32 (no integer + scale-factor reconstruction needed), and
the OBS time band is already decimal hours — so this converter is
mostly a reshape/copy rather than a decode step.

EMIT's native RAD/OBS/location data lives on a non-orthorectified
pushbroom grid; the accompanying GLT (glt_x/glt_y) maps that grid to
a map-projected output and is only needed to orthorectify results
after running apply_oe. This converter does not use the GLT and
does not write ENVI map info, since the native grid isn't map
projected.

OBS band names are read directly from the file's own
sensor_band_parameters/observation_bands dataset rather than
hardcoded, so the converter stays correct across EMIT product
versions.

Tests
isoio/tests/test_emit_nc.py — 18 pytest tests using synthetic H5
fixtures built in tmp_path (no real EMIT file used for CI), matching
the real EMIT_L1B_RAD/OBS structure. Also spot-verified against a
real EMIT L1B RAD/OBS granule pair (location values match the file's
documented scene bounds, UTC time matches capture time, radiance
round-trips exactly on a real data slice).

@kllewers

Copy link
Copy Markdown
Author

I am adding a utility for it to spit out orthorectified reflectance and hope to have that in if I finish it tonight or tomorrow

…es index correctly and around 50% nodata cells show up outside of the swath
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant