Aggiunta di compressione a un file NetCDF utilizzando xarray
Ho un raster che sto cercando di comprimere e convertire in un NetCDFformato con livello di compressione = 9 utilizzando il xarraypacchetto. Presumo che la compressione venga aggiunta utilizzando il parametro di codifica come un dict, ma non sono abbastanza sicuro di come capire cosa aggiungere completamente qui:
f = directory + "/D_Passaic_F02_NBR_E0001_WGS84_comp"
t = xarray.open_rasterio(f)
encode = {'zlib': True, 'complevel': 9}
t.to_netcdf(output_dir+"/Test2.nc", encoding=encode)
Fondamentalmente ottengo un errore:, KeyError: 'zlib'ma non sono sicuro di cosa dovrei usare qui. Suggerimenti? L'array di dati mostra una singola banda e una variabile x e y come questa:
<xarray.DataArray (band: 1, y: 9635, x: 14564)>
or, in more detail:
<bound method ImplementsArrayReduce._reduce_method.<locals>.wrapped_func of
<xarray.DataArray (band: 1, y: 9635, x: 14564)>
[140324140 values with dtype=float32]
Coordinates:
* band (band) int32 1
* y (y) float64 41.06 41.06 41.06 41.06 ... 40.74 40.74 40.74 40.74
* x (x) float64 -74.45 -74.45 -74.45 -74.45 ... -73.97 -73.97 -73.97
Attributes:
transform: (3.2670488250568696e-05, 0.0, -74.447024371179...
crs: +init=epsg:4326
res: (3.2670488250568696e-05, 3.2670488250568696e-05)
is_tiled: 1
nodatavals: (-9999.0,)
scales: (1.0,)
offsets: (0.0,)
AREA_OR_POINT: Area
HISTOGRAM: 9090|9307|9097|9209|8729|8864|8744|8864|9181|9...
TIFFTAG_ARTIST: HEC-RAS
TIFFTAG_IMAGEDESCRIPTION: Depth (Max)>
Risposte
L'errore suggerisce che xarray provi a trovare una variabile chiamata "zlib" nei tuoi dati. La struttura corretta per il dict di codifica sarebbe qualcosa del tipo:
encode = {"precipitation": {'zlib': True, ...}}
Ma a causa del modo in cui i dati sono stati caricati, questo è complicato.
Quello che hai dopo aver caricato un file usando open_rasterioè un file DataArray. A DataArraynon ha una struttura con variabili. Quando scrivi su NetCDF i tuoi dati devono essere un file DataSet.
Se si chiama to_netcdfa DataArray, verrà automaticamente generato a DataSetcon una variabile per i dati denominata " __xarray_dataarray_variable__". Quindi questo funzionerà ma il file risultante sarà brutto con un nome del genere ...:
encode = {"__xarray_dataarray_variable__": {'zlib': True, ...}} # yuck!
Quando si crea manualmente un DataSet, è possibile specificare il nome della variabile. Ad esempio, se la tua band contiene dati DEM, qualcosa del genere potrebbe avere senso:
dem = t.to_dataset(name="dem")
Successivamente puoi specificare il dettato di codifica per quello e avere un nome ragionevole nel risultato:
encoding = {"dem": {'zlib': True, ...}}
dem.to_netcdf("dem.nc", encoding=encoding)
Purtroppo la compressione con xarray è molto affamata di RAM, fai attenzione al tuo lavoro non salvato prima di eseguirlo nel caso in cui il tuo sistema OOMs.
Riferimenti:
- https://xarray.pydata.org/en/stable/generated/xarray.open_rasterio.html
- https://xarray.pydata.org/en/stable/generated/xarray.DataArray.to_netcdf.html#xarray.DataArray.to_netcdf
- https://xarray.pydata.org/en/stable/generated/xarray.Dataset.to_netcdf.html