使用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
相关产品推荐
相关产品推荐

