sabato 28 febbraio 2026

Conversione Emit L2A in Envi

Attenzione : la struttura dei file netcdf ha subito una variazione intorno al 2025 

Da EarthData si possono scaricare i dati  

https://search.earthdata.nasa.gov/search/granules?p=C2408750690-LPCLOUD

https://earth.jpl.nasa.gov/emit/data/data-portal/coverage-and-forecasts/ 

Piccola nota: bande Emit per true color

Red: ~650 nm → Band 29
Green: ~550 nm → Band 19
Blue: ~460 nm → Band 11


i dati sono in formato netcfd ma non risulta georiferito , si apre tranquillamente in Esa Snap ma la cosa migliore e' trasformarlo in formato Envi per avere tutte le informazioni spettrali

 

In fondo alla pagina lo script per effettuare l'operazione..attenzione che a seconda che l'orbita sia discendente od ascendente si deve ruotare la matrice di 90 grafi  

Il file viene georiferito nel senso che ogni pixel ha le sue coordinate ma l'immagine non e' ruotata come dovrebbe essere


 

https://github.com/nasa/EMIT-Data-Resources 

import xarray as xr
import numpy as np
import rasterio
from rasterio.transform import from_origin

ds = xr.open_dataset('grosseto2.nc', engine='netcdf4')
ds_bands = xr.open_dataset('grosseto2.nc', engine='netcdf4', group='sensor_band_parameters')
wavelengths = ds_bands['wavelengths'].values
fwhm = ds_bands['fwhm'].values

gt = ds.attrs['geotransform']
reflectance = ds['reflectance'].values
data = np.transpose(reflectance, (2, 0, 1))
data = np.rot90(data, k=1, axes=(1, 2))

nrows, ncols = data.shape[1], data.shape[2]
nbands = data.shape[0]

transform = from_origin(gt[0], gt[3], gt[1], abs(gt[5]))

with rasterio.open(
'grosseto2.envi', 'w',
driver='ENVI',
height=nrows, width=ncols,
count=nbands,
dtype=data.dtype,
crs='EPSG:4326',
transform=transform,
) as dst:
dst.write(data)

# Rewrite the entire .hdr cleanly
with open('grosseto2.hdr', 'w') as hdr:
hdr.write('ENVI\n')
hdr.write('description = { EMIT L2A Reflectance - Grosseto }\n')
hdr.write(f'samples = {ncols}\n')
hdr.write(f'lines = {nrows}\n')
hdr.write(f'bands = {nbands}\n')
hdr.write('header offset = 0\n')
hdr.write('file type = ENVI Standard\n')
hdr.write('data type = 4\n')
hdr.write('interleave = bsq\n')
hdr.write('byte order = 0\n')
hdr.write(f'map info = {{Geographic Lat/Lon, 1, 1, {gt[0]}, {gt[3]}, {gt[1]}, {abs(gt[5])}, WGS-84}}\n')
hdr.write('wavelength units = Nanometers\n')
hdr.write('wavelength = {\n')
hdr.write(',\n'.join(f' {w:.6f}' for w in wavelengths))
hdr.write('}\n')
hdr.write('fwhm = {\n')
hdr.write(',\n'.join(f' {f:.6f}' for f in fwhm))
hdr.write('}\n')
hdr.write('band names = {\n')
hdr.write(',\n'.join(f' Band_{i+1}_{w:.2f}nm' for i, w in enumerate(wavelengths)))
hdr.write('}\n')

print(f"Done! {nbands} bands, {wavelengths[0]:.2f}-{wavelengths[-1]:.2f} nm")



 

 

Nessun commento:

Posta un commento

Kernel Panic QrCode

 In tanti anni ho visto qualche kernel panic, ma in questo formato non mi era mai successo    la cosa curiosa che al riavvio successivo ness...