【问题标题】:NetCDF to Raster Brick "Unable to find inherited method for function 'brick' for 'ncdf4'"NetCDF 到光栅砖“无法为‘ncdf4’找到函数‘砖’的继承方法”
【发布时间】:2017-04-06 10:26:08
【问题描述】:

光栅包的问题非常简单,也使用 ncdf4 加载 ECMWF Era-Interim Netcdf 文件。

只需这样做:

a <- nc_open("SSTs.nc")
B <- brick(a, varname="sst")

返回这个:

    Error in (function (classes, fdef, mtable)  : 
  unable to find an inherited method for function ‘brick’ for signature ‘"ncdf4"’

该文件只是全球 1 个月(2016 年 1 月)的 SST 数据。当我将其转换为数组(即提取维度/变量,并将时间转换为 UTC,将其推入数组)时,我没有收到相同的错误,但 raster 包说它直接支持 .nc 文件(这么久因为它们与 cf-1 兼容,而 Era-Interim .nc 是)

非常感谢任何帮助,已经尝试过许多 Netcdf 文件(非 Era Interim 也是如此)。

【问题讨论】:

  • 能否提供示例数据集,也可以尝试使用stack 或使用以前的ncdf package
  • 同样的问题【读取Netcdf子分类并转为网格】stackoverflow.com/questions/33784940/…
  • 感谢您的回复。使用堆栈返回:data.frame 中的错误(values = unlist(unname(x)), ind = factor(rep.int(names(x), : arguments imply different number of rows: 1654, 16 示例数据集是这样的: drive.google.com/open?id=0Bz0W7Ut_SNfjcjg1ODVrc2FhN2s
  • @Ndharwood 使用s &lt;- stack("SSTs.nc")应该没有问题

标签: r raster netcdf


【解决方案1】:

感谢Renaud Lancelot,他给出了清晰的源代码。我已经修改了他的代码以适应你的数据

 # load package
 library(sp)
 library(raster)
 library(ncdf4)

 # read ncdf file
 nc<-nc_open('D:/SSTs.nc')

 # extract variable name, size and dimension
 v <- nc$var[[1]]
 size <- v$varsize
 dims <- v$ndims
 nt <- size[dims]              # length of time dimension
 lat <- nc$dim$latitude$vals   # latitude position
 lon <- nc$dim$longitude$vals  # longitude position

 # read sst variable
 r<-list()
 for (i in 1:nt) {
   start <- rep(1,dims)     # begin with start=(1,1,...,1)
   start[dims] <- i             # change to start=(1,1,...,i) to read    timestep i
   count <- size                # begin with count=(nx,ny,...,nt), reads entire var
   count[dims] <- 1             # change to count=(nx,ny,...,1) to read 1 tstep

   dt<-ncvar_get(nc, varid = 'sst', start = start, count = count)

   # convert to raster
   r[i]<-raster(dt)
 }

 # create layer stack with time dimension
 r<-stack(r)

 # transpose the raster to have correct orientation
 rt<-t(r)
 extent(rt)<-extent(c(range(lon), range(lat)))

 # plot the result
 spplot(rt)

【讨论】:

  • 感谢 Eko - 这太棒了。特别感谢方向校正。我能否请您澄清一下 For 循环的步骤是做什么的?这会很有帮助,所以我可以按照 cmets 的建议开始处理它。
  • 关于您的 ncdf 有 3 个维度(经度、纬度和时间),For 循环将读取时间序列数据(取决于时间维度)并将值分配给 r[i],结果将是重新堆叠以获取栅格文件中的所有数据
  • 嗨 Eko,再次感谢 - 你能告诉我 For 循环内的第 2 行和第 4 行是做什么的吗?第一行通过变量中的维数复制时间步长 1,但为什么第二行子集变暗 - 即 start[dims]?同样,第三行是告诉 ncvar_get 函数计算变量的大小,但是第 4 行( count[dims] )是做什么的?非常感谢
  • 我们需要先定义startcount参数:start一个索引向量,指示从哪里开始读取传递的值(从1开始),长度必须等于数字维度(顺序是 X-Y-Z-T(即时间是最后一个)count 整数向量,指示要沿每个维度读取的值的计数(顺序是 X-Y-Z-T),长度必须等于变量的维度数
  • Eko - 在这段代码中,没有提取时间变量,这意味着层被命名为“layer 1”等而不是日期。无论如何将日期设置为图层名称?我尝试使用以 POSIXlt 格式提取的“日期”对象 setNames(),但它不起作用。
猜你喜欢
  • 2016-12-25
  • 2015-01-28
  • 2020-03-22
  • 1970-01-01
  • 2020-03-06
  • 2017-07-20
  • 2017-02-06
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多