【问题标题】:Export raster names from raster stack to NetCDF file in R将栅格名称从栅格堆栈导出到 R 中的 NetCDF 文件
【发布时间】:2017-01-26 00:51:44
【问题描述】:

我正在尝试从 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。

【问题讨论】:

    标签: r raster netcdf netcdf4


    【解决方案1】:

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

    但是,Zdim 是 Z 维度上的 - 不是名称 - 至少我希望您在编写它之前先 setZ(rstack, &lt;zdimvals&gt;)。我对使用 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,要么只是带有基本元数据的哑数组。像这样的结构化对象很少见。一般来说,NetCDF 操作最好使用“nc 运算符”工具来完成,但我认为值得探索一些选项,如果你可以让 R 的栅格来做你需要的事情,那么你就遥遥领先。

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

    【讨论】:

      猜你喜欢
      • 2018-10-06
      • 2014-11-01
      • 2018-07-08
      • 2018-06-09
      • 1970-01-01
      • 1970-01-01
      • 2016-07-28
      • 1970-01-01
      • 2017-03-16
      相关资源
      最近更新 更多