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

时间:2016-09-18 05:26:05

标签: r raster netcdf netcdf4

我正在尝试从之前从光栅堆栈中写入的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维(即Year)。 E.g:

#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。但我要求的是按年份定义的文本(例如2014,2015,2016):

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

有可能这样做吗?这个问题不是新问题,请参考: https://gis.stackexchange.com/questions/122167/export-band-names-with-netcdf-file-in-r

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

1 个答案:

答案 0 :(得分: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非常通用,而且非常强大,但是库本身非常低级且有点过于简单化。 (它是所有的板块和切片,没有原始的&#34;索引&#34;抽象,至少不足以使用)。

栅格提供的工具非常高,因此灵活性较差。唯一可以接近高级别的其他工具是Ferret,无论出于何种原因,大量使用NetCDF只是非常关注NetCDF,或者只是基本元数据的哑阵。像这样的结构化物体很少见。通常使用&#34; nc运算符&#34;可以更好地完成NetCDF操作。工具,但值得探索我认为的一些选项,如果你能让R&R的光栅做你需要的事情,你就会前进。

Python也非常受NetCDF和GDAL的欢迎 - 但GDAL也受到同样的影响......#GIS; y&#34;视角为栅格。这很复杂,我个人倾向于只用R和GDAL获得99%,但是在需要时我会使用其他工具。