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