我试图从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。但我需要的是按年份定义的文本(例如,2014,201,2016),其定义如下:
names(rstack)<-c("2014","2015","2016")可以这样做吗??此问题并不是新问题,请参阅此处:https://gis.stackexchange.com/questions/122167/export-band-names-with-netcdf-file-in-r
有一些复杂的解决方案可以得到所需的东西,但它们似乎很低效率(即将堆栈转换为一个矩阵,然后从这里操作它)。只是想知道是否有一种更优雅的方法,而不必编写大量额外的代码并占用不必要的RAM。
发布于 2016-09-21 15:44:46
我不认为这和另一个问题是同一个问题。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模型之间的脱节。我不知道有什么简单的方法去理解它,只是原始的残酷的经历。NetCDF非常通用,功能非常强大,但是库本身非常低级,有点过于简单。(这都是块和切片,没有原始的“索引”抽象,至少不够有用)。
光栅提供的工具是非常高的水平,所以不太灵活。唯一接近高级别的其他工具是Ferret,不管出于什么原因,大量使用NetCDF要么只会保持非常集中,要么只是简单的带有基本元数据的哑数组。像这样的结构化对象很少见。一般来说,使用"nc操作员“工具进行NetCDF操作更好,但我认为值得探索几个选项,如果您可以让R的光栅来做您需要的事情,那么您将遥遥领先。
Python在NetCDF和GDAL中也很受欢迎,但是GDAL与GIS有着同样的“GIS”视角。这很复杂,就我个人而言,我只使用R和GDAL就能获得99%的收益,但是当我需要的时候,我确实会使用其他的工具。
https://stackoverflow.com/questions/39554411
复制相似问题