Thêm nén vào tệp NetCDF bằng xarray
Tôi có một raster mà tôi đang cố nén và chuyển đổi sang NetCDFđịnh dạng có mức nén = 9 bằng cách sử dụng xarraygói. Tôi giả định rằng nén được thêm vào bằng cách sử dụng tham số mã hóa dưới dạng dict, nhưng tôi không chắc làm thế nào để hiểu những gì cần thêm hoàn toàn ở đây:
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)
Về cơ bản tôi gặp lỗi: KeyError: 'zlib'nhưng tôi không chắc mình nên sử dụng gì ở đây. Gợi ý? Mảng dữ liệu hiển thị một dải đơn và một biến x và y như sau:
<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)>
Trả lời
Lỗi cho thấy xarray đang cố gắng tìm một biến có tên là "zlib" trong dữ liệu của bạn. Cấu trúc đúng cho lệnh mã hóa sẽ như sau:
encode = {"precipitation": {'zlib': True, ...}}
Nhưng do cách tải dữ liệu, điều này rất phức tạp.
Những gì bạn có sau khi tải một tập tin bằng cách sử dụng open_rasteriomột DataArray. A DataArraykhông có cấu trúc với các biến. Khi ghi vào NetCDF, dữ liệu của bạn cần phải là DataSet.
Nếu bạn gọi to_netcdfa DataArray, nó sẽ tự động tạo một DataSetvới một biến cho dữ liệu được gọi là " __xarray_dataarray_variable__". Vì vậy, điều này sẽ hoạt động nhưng tệp kết quả sẽ xấu với tên như vậy ...:
encode = {"__xarray_dataarray_variable__": {'zlib': True, ...}} # yuck!
Khi bạn tạo Tập dữ liệu theo cách thủ công, bạn có thể chỉ định tên biến. Ví dụ: nếu băng tần của bạn chứa dữ liệu DEM, điều gì đó như thế này có thể hợp lý:
dem = t.to_dataset(name="dem")
Sau đó, bạn có thể chỉ định lệnh mã hóa cho điều đó và có một tên hợp lý trong kết quả:
encoding = {"dem": {'zlib': True, ...}}
dem.to_netcdf("dem.nc", encoding=encoding)
Đáng buồn thay, nén với xarray rất tốn RAM, hãy coi chừng công việc chưa được lưu của bạn trước khi bạn chạy nó trong trường hợp OOM hệ thống của bạn.
Người giới thiệu:
- 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