首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >将光栅名称从光栅堆栈导出到R中的NetCDF文件

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

Stack Overflow用户
提问于 2016-09-18 05:26:05
回答 1查看 1.8K关注 0票数 0

我试图从netcdf文件中提取光栅层名称,就像以前从光栅堆栈中写的那样。将光栅堆栈导出到ncdf可以工作得很好。例如:

代码语言:javascript
复制
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维(即年份)不会被保留。例如:

代码语言:javascript
复制
#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),其定义如下:

代码语言:javascript
复制
names(rstack)<-c("2014","2015","2016")

可以这样做吗??此问题并不是新问题,请参阅此处:https://gis.stackexchange.com/questions/122167/export-band-names-with-netcdf-file-in-r

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

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-09-21 15:44:46

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

但是,Zdim是Z维上的,而不是名称,至少在编写它之前,我希望您能够使用setZ(rstack, <zdimvals>)。我在使用writeRaster生成3D vars方面还不够经验,但这似乎是可行的。

代码语言:javascript
复制
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%的收益,但是当我需要的时候,我确实会使用其他的工具。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/39554411

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档