Ajout d'une compression à un fichier NetCDF à l'aide de xarray
J'ai un raster que j'essaie de compresser et de convertir dans un NetCDFformat avec un niveau de compression = 9 en utilisant le xarraypackage. Je suppose que la compression est ajoutée en utilisant le paramètre d'encodage comme dict, mais je ne sais pas trop comment je comprends ce qu'il faut ajouter complètement ici:
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)
J'obtiens essentiellement une erreur:, KeyError: 'zlib'mais je ne suis pas sûr de ce que je suis censé utiliser ici. Suggestions? Le tableau de données montre une seule bande et une variable x et y comme ceci:
<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)>
Réponses
L'erreur indique que xarray tente de trouver une variable appelée "zlib" dans vos données. La structure correcte pour le dict d'encodage serait quelque chose comme:
encode = {"precipitation": {'zlib': True, ...}}
Mais en raison de la façon dont les données ont été chargées, c'est délicat.
Qu'est - ce que vous avez après le chargement d' un fichier à l' aide open_rasterioest DataArray. A DataArrayn'a pas de structure avec des variables. Lorsque vous écrivez sur NetCDF, vos données doivent être au format DataSet.
Si vous appelez to_netcdfa DataArray, il générera automatiquement un DataSetavec une variable pour les données appelées " __xarray_dataarray_variable__". Donc, cela fonctionnera mais le fichier résultant sera moche avec un nom comme celui-là ...:
encode = {"__xarray_dataarray_variable__": {'zlib': True, ...}} # yuck!
Lorsque vous avez créé manuellement un DataSet, vous pouvez spécifier le nom de la variable. Par exemple, si votre bande contient des données DEM, quelque chose comme ceci pourrait avoir du sens:
dem = t.to_dataset(name="dem")
Ensuite, vous pouvez spécifier le dict de codage pour cela et avoir un nom raisonnable dans le résultat:
encoding = {"dem": {'zlib': True, ...}}
dem.to_netcdf("dem.nc", encoding=encoding)
Malheureusement, la compression avec xarray est très gourmande en RAM, faites attention à votre travail non enregistré avant de l'exécuter au cas où les MOO de votre système.
Références:
- 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