现在已经坚持了一段时间。到处寻找答案,但我似乎无法在Stack上找到任何东西。你们所有人都能给予的任何帮助都将非常感激。
我的主要问题是我需要导入许多很多netcdf4文件,创建每个文件的栅格砖,然后组合许多砖块来为每个变量制作一个“主砖”。为了给你一个更清晰的例子,我有40年(netcdf = 40)的许多气候变量(n = 15),它们是日常分辨率。目标是聚合到每月,但首先我必须得到这个函数,读取一个大堆栈中的一个变量的所有netcdf的年份。
我现在的内容如下:
# Libraries --------------------------------------------------------------
library(raster)
library(ncdf4)
# Directories -------------------------------------------------------------
tmp_dl <- list.files("/Users/NateM", pattern = "nc",
full.names = TRUE)
# Functions ---------------------------------------------------------------
rstlist = stack()
netcdf_import <- function(file) {
nc <- nc_open(file)
nc_att <- attributes(nc$var)$names
ncvar <- ncvar_get(nc, nc_att)
rm(nc)
proj <- "+proj=longlat +ellps=WGS84 +datum=WGS84 +no_defs"
rbrck <- brick(ncvar, crs= proj)
rm(ncvar)
extent(rbrck) <- c(-124.772163391113, -67.06383005778, 25.0626894632975,
49.3960227966309)
}
t <- for(i in 1:length(tmp_dl)) {
x <- netcdf_import(tmp_dl[i])
rstlist <- stack(rstlist, x)
}
allyears <- stack(t)
这里可以找到两年的数据:
https://www.northwestknowledge.net/metdata/data/pdsi_2016.nc https://www.northwestknowledge.net/metdata/data/pdsi_2015.nc
任何帮助都会受到欢迎。提前谢谢大家,如果这是一个重复的帖子,我道歉;我看得远远没有用。
答案 0 :(得分:1)
您的代码很好,您只需要return
来自您的函数的加载砖rbrck
,否则您将获得该范围。
至于加载和堆叠,我建议使用lapply
将函数应用于每个数据文件。这将为您提供一个整齐的列表,每个项目一年。在那里你可以做更多的处理,最后只需在列表上调用stack
来生成你的“主砖”。
请注意,我只使用两个文件进行此操作,所以当您使用40个文件时,我不确定整个内容的大小。
这是您修改后的代码:
# Libraries --------------------------------------------------------------
library(raster)
library(ncdf4)
# Directories -------------------------------------------------------------
tmp_dl <- list.files("/Users/NateM", pattern = "nc",
full.names = TRUE)
# Functions ---------------------------------------------------------------
netcdf_import <- function(file) {
nc <- nc_open(file)
nc_att <- attributes(nc$var)$names
ncvar <- ncvar_get(nc, nc_att)
rm(nc)
proj <- "+proj=longlat +ellps=WGS84 +datum=WGS84 +no_defs"
rbrck <- brick(ncvar, crs= proj)
rm(ncvar)
extent(rbrck) <- c(-124.772163391113, -67.06383005778, 25.0626894632975,
49.3960227966309)
return(rbrck)
}
# apply function
allyrs <- lapply(tmp_dl,netcdf_import)
# stack to master brick
allyrs <- do.call(stack,allyrs)
HTH