基于多边形生成最大/最小栅格掩码的内存友好方法求助
大规模栅格的两种掩码生成方案(低内存占用)
需求回顾
需要基于给定栅格和多边形生成两类掩码:
- 最大栅格掩码:包含多边形内部及所有与边界接触的单元格
- 最小栅格掩码:仅保留完全处于多边形内部、不接触任何边界的单元格
原方案中,terra::mask可高效生成最大掩码,但terra::extract(exact=TRUE)因栅格规模过大(42893×52031)导致内存溢出,无法生成最小掩码。
解决方案
1. 生成最大栅格掩码
直接使用terra::mask,通过touches=TRUE参数保留所有与多边形接触的单元格,该方法内存效率高,适合大规模栅格:
library(terra) # 加载你的栅格与多边形数据(替换为实际路径/对象) # r <- rast("your_raster.tif") # poly <- vect("your_polygon.shp") # 生成最大掩码 mask_max <- mask(r, poly, touches = TRUE, inverse = FALSE)
2. 低内存生成最小栅格掩码
核心思路:先标记所有与多边形边界接触的单元格,再从最大掩码中剔除这些单元格,得到完全内部的最小掩码。全程采用栅格分块操作,避免内存过载:
# 提取多边形的边界线 poly_boundary <- as.lines(poly) # 生成标记栅格:标记所有与边界接触的单元格(值设为1,其余为NA) boundary_mask <- mask(r, poly_boundary, touches = TRUE, inverse = FALSE) boundary_mask <- classify(boundary_mask, matrix(c(NA, 0, Inf, 1), ncol=2, byrow=TRUE)) # 从最大掩码中剔除边界接触单元格,得到最小掩码 mask_min <- mask_max # 将所有接触边界的单元格设为NA mask_min[!is.na(boundary_mask)] <- NA
验证示例(小数据测试)
用terra内置数据验证效果:
# 加载示例数据 f <- system.file("ex/lux.shp", package="terra") v <- vect(f)[1:2,] z <- rast(v, resolution=.05, names="test") values(z) <- 1:ncell(z) # 生成最大掩码 mask_max <- mask(z, v, touches=TRUE, inverse=FALSE) # 生成最小掩码 v_boundary <- as.lines(v) boundary_mask <- mask(z, v_boundary, touches=TRUE, inverse=FALSE) boundary_mask <- classify(boundary_mask, matrix(c(NA,0,Inf,1), ncol=2, byrow=TRUE)) mask_min <- mask_max mask_min[!is.na(boundary_mask)] <- NA # 可视化验证 par(mfrow=c(1,2)) plot(mask_max, main="最大掩码(含边界接触单元格)") plot(v, add=TRUE) plot(mask_min, main="最小掩码(仅完全内部单元格)") plot(v, add=TRUE)
内容的提问来源于stack exchange,提问作者we need a Mat. Stat.
相关产品推荐
相关产品推荐

