如何基于属性表而非单元格值将SpatRaster中urban类设为NA?
基于SpatRaster属性表分类并设置NA的正确方法
要实现基于属性表中cover字段而非单元格数值将"urban"类栅格设为NA,你可以通过以下两种方式完成:
方法1:从属性表映射对应ID后分类
先从栅格关联的属性表中找到cover="urban"对应的单元格ID,再用classify函数处理:
# 获取属性表中cover为"urban"对应的id值 urban_id <- cats(r)[[1]]$id[cats(r)[[1]]$cover == "urban"] # 执行分类:将对应id的单元格设为NA r_processed <- classify(r, cbind(urban_id, NA))
方法2:结合因子匹配与条件替换
先将单元格数值映射为cover标签,再用ifel函数进行条件替换:
# 把单元格数值转换为对应的cover标签 cover_labels <- factor(values(r), levels = cats(r)[[1]]$id, labels = cats(r)[[1]]$cover) # 条件替换:cover为urban的单元格设为NA,其余保留原数值 r_processed <- ifel(cover_labels == "urban", NA, r)
为什么之前的方法无效?
activeCat(r) <- 2仅设置了栅格显示时的默认分类列,但栅格底层存储的依然是id列的数值(11、12、13)。classify函数只能基于单元格的实际存储数值进行匹配,无法直接识别分类标签字符串(如"urban"),因此直接传入cbind("urban", NA)会失效。
验证结果
处理完成后,可通过以下代码查看栅格的分类表,确认"urban"对应的单元格已被设为NA:
cats(r_processed)
内容的提问来源于stack exchange,提问作者Ahmed El-Gabbas
相关产品推荐
相关产品推荐

