如何用R语言terra包对SpatRaster进行子集筛选?
问题描述
我有一个包含多个类别的SpatRaster,仅关注其中vegClass类别。已执行以下代码加载并设置类别:
veg <- terra::rast("~/SVTM_NSW_Extant_PCT_vC2_0_M2_0_106/SVTM_NSW_Extant_PCT_vC2_0_M2_0_5m.tif") activeCat(veg) <- 4 # 设置关注类别为vegClass veg
该SpatRaster的信息如下:
class : SpatRaster dimensions : 1207, 1463, 1 (nrow, ncol, nlyr) resolution : 0.0002777778, 0.0002777778 (x, y) extent : 142.2135, 142.6199, -31.33736, -31.00208 (xmin, xmax, ymin, ymax) coord. ref. : lon/lat GDA94 source(s) : memory varname : 1_Second_DEM_MNP_N categories : PCTID, PCTName, vegForm, vegClass, form_PCT, labels name : vegClass min value : Not classified max value : Riverine Sandhill Woodlands
我希望仅保留以下指定值,其余设为NA:
values_to_keep <- c("Stony Desert Mulga Shrublands", "Gibber Chenopod Shrublands", "Inland Rocky Hill Woodlands")
尝试转为数据框筛选但丢失了坐标信息,求解决方法。
解决方案
无需转换为数据框,直接在SpatRaster对象上操作即可完整保留空间属性,以下是两种高效方法:
方法1:条件赋值筛选
利用terra包的向量化特性,直接对栅格值进行过滤:
# 复制原栅格避免修改原始数据 veg_filtered <- veg # 将不在目标列表中的值设为NA veg_filtered[!veg_filtered %in% values_to_keep] <- NA
方法2:使用classify()函数
如果需要更复杂的分类规则,推荐使用terra::classify()函数:
# 获取所有vegClass类别,筛选出需要排除的类别 exclude_classes <- setdiff(levels(veg)[[1]]$vegClass, values_to_keep) # 创建重分类矩阵:排除类映射为NA reclass_matrix <- matrix(c(exclude_classes, rep(NA, length(exclude_classes))), ncol = 2) # 执行重分类 veg_filtered <- terra::classify(veg, reclass_matrix)
验证结果
可以通过以下命令确认结果:
freq(veg_filtered):查看保留类别的像素频率plot(veg_filtered):可视化筛选后的栅格veg_filtered:查看栅格的空间属性(范围、分辨率、坐标系均与原栅格一致)
内容的提问来源于stack exchange,提问作者user24984035
相关产品推荐
相关产品推荐

