R terra 相当于 raster::overlay 具有两个栅格的函数 - 栅格越大速度越慢?

问题描述 投票:0回答:1

我希望将一个栅格的值设置为 NA,而在另一个栅格中它们的值为 NA。我有使用

raster::overlay
和带有
terra
的功能代码块来执行此操作的代码,如下所示,具有两种不同大小的栅格。

library(raster)
library(terra)
library(tictoc)

# small raster
r1 <- rast(system.file("ex/elev.tif", package="terra"))

# large raster
r1 <- rast(vals=runif(n=9e6,min=100,max=200),nrows = 3e3, ncols = 3e3, resolution = 0.5)

# second raster
r2 <- r1+100

# randomly set some values to NA in r1
r1[sample(x=seq(1,4000),size = 1000,replace=FALSE)] <- NA
terra::plot(r1,colNA='blue')

# set values of r2 to NA where r1 is NA using raster
tic()
rr <- raster::overlay(raster::raster(r1),raster::raster(r2),fun=function(r1,r2) {
  r2[is.na(r1[])] <- NA
  return(r2)
})
toc()

terra::plot(r1,colNA='blue')
terra::plot(rr,colNA='blue')

# same operation but with terra
rm(rr) # remove for fairness in memory allocation speeds
tic()
rr <- terra::app(x=c(r1,r2),fun=function(x) {
  x[2][is.na(x[1])] <- NA
  return(x[2])
})
toc()

在此示例中,对于小栅格,terra 版本似乎比 raster 快得多(~0.03 秒到 0.4 秒)。然而,对于更大的光栅,情况似乎正好相反(大约 0.77 秒到 0.58 秒)。有什么想法为什么会出现这种情况吗?是否有更优化的方法来编码 terra 代码块?预先感谢。

尝试了上面的代码块,并期望 terra 版本在所有情况下都更快。然而,光栅越大,速度就越慢。

r gis raster terra
1个回答
0
投票

随着您使用

app
我明白了

toc()
#1.82 sec elapsed

实现此目的更快的方法是使用

terra::mask
:

tic(); rr <- mask(r2, r1); toc()
#0.01 sec elapsed

您还可以像这样加快速度

app

tic()
rr <- terra::app(x=c(r1,r2),fun=function(x) {
  x[,2][is.na(x[,1])] <- NA
  return(x[,2])
})
toc()
#0.12 sec elapsed
© www.soinside.com 2019 - 2024. All rights reserved.