在大栅格堆栈中查找最大值需要太多时间
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
我有一个包含 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