求助:如何提取SpatRaster对象CLASS_NAME类别中的特定作物子集?
提取USDA作物覆盖SpatRaster中CLASS_NAME特定类别
问题描述
我有一个来自USDA的作物覆盖SpatRaster对象,该栅格为单图层分类栅格,附带RED、GREEN、BLUE、CLASS_NAME、OPACITY五类属性信息。尝试提取CLASS_NAME中的特定作物(如"CORN")时失败,原栅格对象信息如下:
> usda class : SpatRaster dimensions : 15133, 24345, 1 (nrow, ncol, nlyr) resolution : 30, 30 (x, y) extent : 1204695, 1935045, 1829055, 2283045 (xmin, xmax, ymin, ymax) coord. ref. : +proj=aea +lat_0=23 +lon_0=-96 +lat_1=29.5 +lat_2=45.5 +x_0=0 +y_0=0 +datum=NAD83 +units=m +no_defs source : CDL_2023_clip_20240401121659_1498934739.tif color table : 1 categories : RED, GREEN, BLUE, CLASS_NAME, OPACITY name : RED min value : NA max value : NA
尝试使用terra::subset时出现以下问题:
- 执行
usda_sub <- subset(usda, "RED"),输出与原对象无变化; - 执行
usda_sub <- subset(usda, "CLASS_NAME")或usda_sub <- subset(usda, "Corn")均报错:
> usda_sub <- subset(usda, "CLASS_NAME") Error: [subset] invalid name(s) > usda_sub <- subset(usda, "Corn") Error: [subset] invalid name(s)
我理解如何按name元素子集化SpatRaster图层,但不清楚如何基于CLASS_NAME这类分类属性提取特定作物。
解决方案
你的核心误区是混淆了SpatRaster的图层(name)和分类属性(categories):该对象是单图层栅格,name显示为"RED"是因为该图层关联了颜色属性,而categories是该图层像元数值对应的分类标签集合,并非独立图层。因此不能用subset提取分类属性,需通过以下步骤操作:
- 查看分类数值与标签的对应关系
使用terra::cats()函数获取栅格的分类映射表:
cat_table <- cats(usda)[[1]] print(cat_table)
输出会是一个数据框,包含ID(像元数值)、RED、GREEN、BLUE、CLASS_NAME、OPACITY列,你可以从中找到目标作物(如"CORN")对应的ID值。
- 提取目标作物的像元
找到目标作物的ID值后,通过逻辑运算提取对应像元:
# 假设CORN对应的ID是1(替换为实际ID) corn_mask <- usda == 1 # 若需要保留原栅格的分类属性,可使用classify函数 usda_corn <- classify(usda, matrix(c(1, 1, NA, NA), ncol=2, byrow=TRUE))
corn_mask会生成一个二值栅格(1表示CORN,0表示其他);classify方法会保留CORN的像元值,将其他像元设为NA,同时保留原分类属性。
- 批量提取多个作物(如CORN和CRANBERRIES)
如果需要提取多个作物,先找到它们对应的ID列表,再用%in%运算:
# 假设CORN对应ID=1,CRANBERRIES对应ID=2 target_ids <- c(1, 2) multi_crop_mask <- usda %in% target_ids
内容的提问来源于stack exchange,提问作者schneider_41042
相关产品推荐
相关产品推荐

