将netCDF变量展开为其他维或多个变量

时间:2017-06-29 20:54:05

标签: r raster netcdf

我正在使用三维非常大的netCDF文件(lat / lon / time)。分辨率为300米,时间变量有25步,通向64800x129600x25单元。

文件中包含的一个变量是一个整数(范围从-36到120)但是代表一个潜在因素,这就是问题所在。 它是一个土地覆盖数据集,例如:-20表示该单元属于土地类型 森林 或10表示该单元格由

我想重塑netCDF文件,以便有一个额外的维度代表原始变量的每个因子级别。然后变量将仅为每个单元1或0,表示在某个纬度/经度/时间存在每个因子水平。 那么尺寸将是纬度/经度/时间/ 土地类型

Here是一个示例数据集,它不涉及土地类型,但足够小,可以用于测试。这里有一些代码可供阅读:

library(ncdf4)
# Download the data
download.file("http://schubert.atmos.colostate.edu/~cslocum/code/air.sig995.2012.nc", 
          mode="wb", destfile = "test.nc")
test.ncdf <- nc_open("test.nc", write=TRUE)
# See the lon,lat,time dimensions
print(test.ncdf)
tmp.array <- ncvar_get(test.ncdf, varid="air")

我不确定raster包是否更适合此任务。对于非常小的netCDF文件,我通过提取数据然后将其堆叠为data.frame来在一定程度上管理了预期的结果。

任何帮助或指向正确的方向将不胜感激。 提前谢谢。

1 个答案:

答案 0 :(得分:0)

如果我理解正确,您希望为每个类型设置一组字段,这些字段为1或0,作为lat / long / time的函数。例如如果你正在寻找一个森林,你想要一个数组,当因子= 20时为1,否则为0。

我知道你想在一个4维数组中这样做,因为你需要使用R我期望你标记问题。但是如果你不介意为类型设置一系列3D数组,那么快速简单的方法是使用CDO来处理整数数组

cdo eqc,-20 air.sig995.2012.nc test.nc

这个问题是输出变量仍然具有相同的名称 (你没有说它叫什么,所以我把它称为 sfctype ),所以你需要用nco来改变元数据。

因此,更好的方法是在cdo中使用 expr

cdo expr,"forest=sfctype==-20" air.sig995.2012.nc forest.nc

这使得一个名为 forest 的新变量为1或0。 您现在可以处理所需的所有类型,然后将它们合并到一个文件中:

 cdo expr,"forest=(sfctype==-20)" air.sig995.2012.nc type_forest.nc
 cdo expr,"forest=(sfctype==10)" air.sig995.2012.nc type_water.nc
 ...etc...
 cdo merge type_*.nc combined_file.nc

(我认为你不需要大括号,但语法更清晰)

... 几乎你想要的几行,但不完全......我不知道如果你真的如何将这些新变量“堆叠”成一个4D阵列需要这个,但也许nco可以做到。