You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

基于多边形生成最大/最小栅格掩码的内存友好方法求助

大规模栅格的两种掩码生成方案(低内存占用)

需求回顾

需要基于给定栅格和多边形生成两类掩码:

  • 最大栅格掩码:包含多边形内部及所有与边界接触的单元格
  • 最小栅格掩码:仅保留完全处于多边形内部、不接触任何边界的单元格

原方案中,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.

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.06 02:22:43