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

如何用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.24 05:48:22