对 terra 中非常大的栅格进行操作会导致 std::bad_alloc

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

我有一个很大的光栅,我不明白如何处理它。我的假设是我可以将其切成块,制作一个 vrt,然后处理 vrt 以获得答案。但事实并非如此(至少没有使用我的代码),所以我希望在这里找到一些指导。

我的代码:

f <- system.file("ex/lux.shp", package = "terra")
v <- vect(f)
r <- rast(v)
values(r) <- 1:ncell(r)
r2 <- disagg(r, fact = c(4000, 5000)) # make a really big raster

tester <- zonal(r2, v, summary = "range") # calculation that is too big to handle
# this throws Error: std::bad_alloc

filename <- "test_tile/test_.tif"
ff <- makeTiles(r2, 1000, filename) # make it into many small tiles, hopefully to process
vrtfile <- "test_tile/testing.vrt"
vrt_thing <- vrt(ff, vrtfile)

tester <- zonal(vrt_thing, v, summary = "range") 
# this also throws Error:std::bad_alloc

简而言之,我认为每个图块都会在后台通过该调用进行处理,一次处理一个,并将结果神奇地缝合在一起。这不是它的工作原理,这表明我误解了一些东西。非常感谢任何帮助我找到一种方法来进行区域计算的帮助。 (注意,这是一个可重现的示例,不是我的数据...我不是在寻找该文件的字面结果...)。最终,我需要使用许多不同的多边形一一静态栅格多次执行此计算。

bigdata raster terra
1个回答
0
投票

由于您的代码无法运行,因此不清楚您在做什么。

library(terra)
# terra 1.7.72
f <- system.file("ex/lux.shp", package = "terra")
v <- vect(f)
r <- rast(v)
values(r) <- 1:ncell(r)
test <- zonal(r, v, summary = "range")
# Error in .local(x, z, ...) : unused argument (summary = "range")

terra::zonal
中,争论会很“有趣”,但这也不被接受

test <- zonal(r, v, fun="range")
# Error: [zonal] Unknown function
test <- zonal(r, v, fun=range)
# Error: [zonal] this 'fun' is not supported. You can use extract instead

但是,你可以做

rvmin <- zonal(r, v, fun="min")
rvmax <- zonal(r, v, fun="max")

e <- extract(r, v, fun=range, ID=FALSE)

结果是一样的

head(e)
     lyr.1 lyr.1.1
[1,]     4      25
[2,]    35      47
[3,]    41      63
[4,]    36      36
[5,]    23      34
[6,]    58      60

head(cbind(rvmin, rvmax))
  lyr.1 lyr.1
1     4    25
2    35    47
3    41    63
4    36    36
5    23    34
6    58    60

如果这没有帮助,您可以使用

terraOptions

更改有关内存可用性的假设
© www.soinside.com 2019 - 2024. All rights reserved.