R语言 获取栅格的平均值

9gm1akwq  于 2023-09-27  发布在  其他
关注(0)|答案(2)|浏览(123)

我想从下面的3.nc文件中获得叶绿素a的平均值,我想知道使用马赛克是否正确?
https://oceandata.sci.gsfc.nasa.gov/cgi/getfile/AQUA_MODIS.20020101_20021231.L3m.YR.NSST.sst.4km.nchttps://oceandata.sci.gsfc.nasa.gov/cgi/getfile/AQUA_MODIS.20030101_20031231.L3m.YR.NSST.sst.4km.nchttps://oceandata.sci.gsfc.nasa.gov/cgi/getfile/AQUA_MODIS.20040101_20041231.L3m.YR.NSST.sst.4km.nc

#List of .nc files in directory
fls <- list.files("/folder/with/files", ".nc$", full.names = TRUE)

#list of rast objects
r_list <- lapply(fls, rast)

#create spatial raster collection
coll <- sprc(r_list)

#Get the mean values across all rasters
chla_m<-mosaic(coll, fun="mean")
s4chpxco

s4chpxco1#

可以使用以下代码

library(terra)

#List of .nc files in directory
fls <- list.files("/folder/with/files", ".nc$", full.names = TRUE)

#list to SpatRaster object conversion
r_list <- rast(fls)

#For global mean calculation i.e. single mean for the entire SpatRaster
global(r_list, mean, na.rm=TRUE)

#For local mean calculation i.e. pixel-wise mean calculation
mean(r_list, na.rm=TRUE)
zynd9foi

zynd9foi2#

terra::mosaic()用于在空间上合并一组光栅。在重叠的单元格中,您可以应用一个函数来确定要将单元格设置为的值,默认值为mean。所以,是的,你的方法会起作用,但效率非常低。
R中,你可以这样做:

library(abind)

# Get a list of all files to be merged
lf <- list.files("/folder/with/files", "^AQUA.*nc$", full.names = T)

# Read in all the data
d <- apply(lf, function(f) {n <- nc_open(f); x <- ncvar_get(n, "sst"); nc_close(n); x})

# Turn the list of data matrices into an array
arr <- abind(d, along = 3)

# Calculate the mean over the 3rd dimension of the array to create a matrix
sst <- rowMeans(arr, na.rm = T, dims = 2)

如果需要,可以将sst矩阵转换为terraSpatRaster
这段代码可以满足你的所有需求,非常高效。

内存限制

如果您必须以这种方式合并许多文件,或者使用不同的数据集,其维度更大,则可能会遇到内存问题,这将极大地减慢该过程。如果是这种情况,请使用循环。循环开销与其余代码(主要是阅读数据)相比将完全相形见绌。

# Get a list of all files to be merged
lf <- list.files("/folder/with/files", "^AQUA.*nc$", full.names = T)

# Function to calculate mean SST from multiple MODIS AQUA files
sst <- function(lf) {
  for (ndx in 1:length(lf)) {
    n <- nc_open(lf[[ndx]])
    if (ndx == 1) {
      data <- ncvar_get(n, "sst")
    } else {
      data <- data + ncvar_get(n, "sst")
    }
    nc_close(n)
  }
  data / length(lf)
}

这里的技巧是,没有比两个矩阵更大的内存需求了:data对象和ncvar_get()读入的数据。

相关问题