在大栅格堆栈中查找最大值需要太多时间

Finding maximum value in a big raster stack take too much time

我有一个包含 7 个光栅的光栅堆栈。每个栅格具有以下属性

class      : RasterLayer 
dimensions : 21600, 43200, 933120000  (nrow, ncol, ncell)
resolution : 0.008333333, 0.008333333  (x, y)
extent     : -180, 180, -90, 90  (xmin, xmax, ymin, ymax)
crs        : +proj=longlat +datum=WGS84 +no_defs 
source     : tmax.tif 
names      : tmax 
values     : 1, 100  (min, max)
  

我想创建一个栅格,每个栅格具有 7 个栅格中的最大值。我想我会按照此处提出的解决方案来执行此操作:

max_raster <- which.max(my_raster_stack)
df <- reshape2::melt(as.matrix(max_raster))
df$value <- factor(var_name[df$value], var_name)

但是,由于光栅堆栈的大小,我需要花费数小时才能完成(仍在等待它完成)。有谁知道更快的方法吗?

您可以使用max来获取每个单元格的最大值。这里用terra(替换光栅,但作用与光栅相同)

示例数据

library(terra)
f <- system.file("ex/logo.tif", package="terra")
r <- rast(f, f) * 1:6
r
#class       : SpatRaster 
#dimensions  : 77, 101, 6  (nrow, ncol, nlyr)
#resolution  : 1, 1  (x, y)
#extent      : 0, 101, 0, 77  (xmin, xmax, ymin, ymax)
#coord. ref. : +proj=merc +lon_0=0 +k=1 +x_0=0 +y_0=0 +datum=WGS84 +units=m +no_defs 
#source      : memory 
#names       : lyr1, lyr2, lyr3, lyr4, lyr5, lyr6 
#min values  :    0,    0,    0,    0,    0,    0 
#max values  :  255,  510,  765, 1020, 1275, 1530 

解决方案

x <- max(r)
x
#class       : SpatRaster 
#dimensions  : 77, 101, 1  (nrow, ncol, nlyr)
#resolution  : 1, 1  (x, y)
#extent      : 0, 101, 0, 77  (xmin, xmax, ymin, ymax)
#coord. ref. : +proj=merc +lon_0=0 +k=1 +x_0=0 +y_0=0 +datum=WGS84 +units=m +no_defs 
#source      : memory 
#name        :  max 
#min value   :    0 
#max value   : 1530 

要找出每个网格单元的哪一层具有最大值(如果有关系,则为第一层),您可以这样做

w <- which.max(r)
w
#class       : SpatRaster 
#dimensions  : 77, 101, 1  (nrow, ncol, nlyr)
#resolution  : 1, 1  (x, y)
#extent      : 0, 101, 0, 77  (xmin, xmax, ymin, ymax)
#coord. ref. : +proj=merc +lon_0=0 +k=1 +x_0=0 +y_0=0 +datum=WGS84 +units=m +no_defs 
#source      : memory 
#name        : which.max 
#min value   :         1 
#max value   :         6