将栅格名称从栅格堆栈导出到 R 中的 NetCDF 文件

Export raster names from raster stack to NetCDF file in R

我正在尝试从之前从栅格堆栈写入的 netcdf 文件中提取栅格图层名称。将栅格堆栈导出到 ncdf 工作正常。例如:

library(raster)
library(ncdf4)
library(RNetCDF)

#Create some rasters (x3)
r1<-raster(system.file("external/test.grd", package="raster"))
r2<-r1*2
r3<-r2*3

#Stack them
rstack<-stack(r1,r2,r3)

#Give each raster layer a name - in this instance years 2014 to 2016
names(rstack)<-c("2014","2015","2016")

#Write out to netcdf format
writeRaster(rstack, "rstack.nc", overwrite=TRUE, format="CDF", varname="Temperature", varunit="degC", 
        longname="Temperature -- raster stack to netCDF", xname="X", yname="Y",zname="Year",
        zunit="numeric")

但是,当我将 ncdf 文件读回 R 时,Z 维度(即年份)未保留。例如:

#Open the new netcdf dataset and look at the Z dimention, i.e. "Year"
data.nc<- open.nc("rstack.nc")
Zdim = var.get.nc(ncfile=data.nc,variable="Year")
print(Zdim)
#[1] 1 2 3

所以我们得到的是波段编号,即 1,2,3。但我需要的是 Year (e.g. 2014,2015,2016) 中定义的文本:

names(rstack)<-c("2014","2015","2016")

这可以吗??这个问题并不新鲜,请参考这里: https://gis.stackexchange.com/questions/122167/export-band-names-with-netcdf-file-in-r

有一些复杂的解决方法来获得所需的东西,但它们似乎效率很低(即将堆栈转换为矩阵,然后从此处对其进行操作)。只是想知道有没有更优雅的方式,既不用写大量额外的代码,又不用占用不必要的RAM。

我认为这与另一个问题不同。 NetCDF 变量没有 dimnames,因此您不能按照您想要的方式在此处往返栅格堆栈。

但是,Zdim 是 Z 维度上的 - 不是名称 - 至少我希望你在 setZ(rstack, <zdimvals>) 之前你写吧。我对使用 writeRaster 生成 3D vars 的经验不足,但这似乎可行。

library(raster)
library(ncdf4)
library(RNetCDF)

#Create some rasters (x3)
r1<-raster(system.file("external/test.grd", package="raster"))
r2<-r1*2
r3<-r2*3

#Stack them
rstack<-stack(r1,r2,r3)
rstack <- setZ(rstack, 2014:2016)
#names(rstack)<-c("2014","2015","2016")

#Write out to netcdf format
writeRaster(rstack, "rstack.nc", overwrite=TRUE, format="CDF",     varname="Temperature", varunit="degC", 
        longname="Temperature -- raster stack to netCDF", xname="X",   yname="Y",zname="Year",
        zunit="numeric")

## your ncdf4 code was not right, looked like RNetCDF (which is fine)
data.nc<- nc_open("rstack.nc")
Zdim = ncvar_get(data.nc,varid="Year")
#print(Zdim)  ## now it's numeric
##[1] 2014 2015 2016

您可能想要探索用于存储这些年份值的单位和元数据。

最后,这非常令人困惑,但归结为 NetCDF 与更多 GIS-y 模型之间的脱节。除了原始的残酷体验,我不知道有什么简单的方法可以理解它。 NetCDF 非常通用,也非常强大,但库本身非常低级,有点过于简单。 (全是 slab 和 slices,没有原始的 "index" 抽象,至少不够有用)。

raster 提供的工具非常高级,因此不太灵活。唯一接近高级的其他工具是 Ferret,无论出于何种原因,大量使用 NetCDF 要么非常专注于 NetCDF,要么只是具有基本元数据的哑数组。像这样的结构化对象很少见。通常,使用 "nc operator" 工具可以更好地完成 NetCDF 操作,但我认为值得探索一些选项,如果您可以让 R 的栅格执行您需要的操作,那么您就遥遥领先了。

Python 也很受 NetCDF 和 GDAL 的欢迎——但 GDAL 与光栅有相同的 "GIS-y" 视角。这很复杂,就我个人而言,仅使用 R 和 GDAL 就可以达到 99%,但我确实会在需要时使用其他工具。