xarray를 사용하여 NetCDF 파일에 압축 추가

Oct 23 2020

패키지를 NetCDF사용하여 압축 수준이 9 인 형식으로 압축 하고 변환하려는 래스터가 xarray있습니다. 압축이 인코딩 매개 변수를 dict로 사용하여 추가되었다고 가정하지만 여기에 무엇을 완전히 추가해야하는지 이해하는 방법을 잘 모르겠습니다.

 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)

기본적으로 오류가 발생합니다 : KeyError: 'zlib',하지만 여기서 무엇을 사용해야할지 잘 모르겠습니다. 제안? 데이터 배열은 단일 밴드와 다음과 같은 x 및 y 변수를 보여줍니다.

 <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)>

답변

2 bugmenot123 Oct 23 2020 at 03:14

데이터에서 "zlib"라는 변수를 찾으려고하는 xarray의 오류 힌트입니다. 인코딩 dict의 올바른 구조는 다음과 같습니다.

encode = {"precipitation": {'zlib': True, ...}}

그러나 데이터가로드 된 방식 때문에 이것은 까다 롭습니다.

를 사용하여 파일을로드 한 후 가지고 open_rasterio있는 것은 DataArray. A DataArray에는 변수가있는 구조가 없습니다. NetCDF에 쓸 때 데이터는 DataSet.

당신이 호출하면 to_netcdfA의 DataArray, 그것은 자동으로 생성됩니다 DataSet"라는 데이터의 변수로 __xarray_dataarray_variable__". 따라서 이것은 작동하지만 결과 파일은 다음과 같은 이름으로 추악 할 것입니다 ... :

encode = {"__xarray_dataarray_variable__": {'zlib': True, ...}}  # yuck!

데이터 세트를 수동으로 빌드 할 때 변수 이름을 지정할 수 있습니다. 예를 들어 밴드에 DEM 데이터가 포함 된 경우 다음과 같은 것이 의미가있을 수 있습니다.

dem = t.to_dataset(name="dem")

나중에 인코딩 사전을 지정하고 결과에 적절한 이름을 가질 수 있습니다.

encoding = {"dem": {'zlib': True, ...}}
dem.to_netcdf("dem.nc", encoding=encoding)

슬프게도 xarray를 사용한 압축은 RAM이 매우 많이 소모됩니다. 시스템 OOM이 발생할 경우를 대비하여 실행하기 전에 저장되지 않은 작업을 조심하십시오.

참조 :

  • 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