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

使用terra::mask()时touches=TRUE未保留所有多边形接触栅格单元格的问题

解决terra::mask() touches=TRUE未保留所有接触栅格单元的问题

问题重现

使用terra::mask()时设置touches = TRUE,预期保留所有与多边形接触的栅格单元格,但实际仅保留了部分单元格。已确认栅格与矢量的CRS一致,尝试过raster包但无对应参数。

可能原因与解决方案

1. 规范矢量对象转换

你的代码中矢量转换方式存在不规范之处,建议将sf对象直接转为terra的vect类型,确保处理逻辑统一:

# 读取矢量并转为terra对象
shp <- sf::read_sf("Z:/AG/Ph/GIS/statistics_subcatchments/catchment_GS6_2_4326.shp") 
shp_terra <- terra::vect(shp)

# 强制校验CRS一致性(避免潜在匹配问题)
stopifnot(terra::crs(shp_terra) == terra::crs(ras_raw))

# 重新执行裁剪与掩膜
ras_crop <- terra::crop(ras_raw, shp_terra)
ras_mask <- terra::mask(ras_crop, shp_terra, touches = TRUE)

2. 手动筛选接触单元格(兜底方案)

如果上述方法仍不生效,可直接通过terra::cells()获取所有接触的单元格索引,手动构建掩膜:

# 获取所有与多边形接触的单元格ID
contact_cells <- terra::cells(ras_crop, shp_terra, touches = TRUE)

# 创建与裁剪后栅格匹配的掩膜模板
mask_template <- terra::init(ras_crop, 0)
mask_template[contact_cells] <- 1

# 应用掩膜(保留值为1的单元格)
ras_mask <- ras_crop * mask_template

补充说明

  • terra中touches=TRUE的判定逻辑包含:单元格中心在多边形内,或单元格的边/角与多边形边界接触。若多边形边界与栅格线完全重合,需确认栅格的对齐方式是否影响判定。
  • 优先使用原生terra对象(而非sf对象)参与栅格操作,可减少跨对象类型的兼容问题。

内容的提问来源于stack exchange,提问作者Phil

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.12 20:32:43