0

我正在尝试从 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(例如 2014,2015,2016)定义的文本,定义如下:

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

是否有可能做到这一点??这个问题并不新鲜,参考这里: https ://gis.stackexchange.com/questions/122167/export-band-names-with-netcdf-file-in-r

有一些复杂的解决方法可以得到所需的东西,但它们似乎效率很低(即将堆栈转换为矩阵,然后从这里操作它)。只是想知道是否有更优雅的方法,而无需编写大量额外代码并占用不必要的 RAM。

4

1 回答 1

3

我认为这与其他问题不是同一个问题。NetCDF 变量没有dimnames,因此您无法在此处以您想要的方式往返光栅堆栈。

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

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和slice,没有原始的“索引”抽象,至少还不够有用)。

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

Python 在 NetCDF 和 GDAL 中也很流行——但 GDAL 与栅格具有相同的“GIS-y”视角。这很复杂,我个人倾向于仅使用 R 和 GDAL 就可以达到 99%,但我确实在需要时使用其他工具。

于 2016-09-21T15:44:46.017 回答