写入带DBF的分类栅格时缺失像素计数及ArcGIS属性表问题
解决分类栅格属性表缺失像素计数的问题
你当前的代码仅将矢量的属性信息写入了DBF,但未统计栅格化后每个类别的像素数量,导致GIS软件无法识别完整的属性表。以下是修正后的代码及关键步骤:
修正代码
library(terra) library(foreign) # 加载矢量和栅格数据 f <- system.file("ex/lux.shp", package="terra") v <- vect(f) r <- rast(system.file("ex/elev.tif", package="terra")) # 栅格化矢量,基于NAME_2字段生成分类栅格 y <- rasterize(v, r, "NAME_2") # 1. 统计每个分类的像素数量 freq_table <- freq(y) # 2. 获取原矢量属性表 attr_table <- levels(y)[[1]] # 3. 合并属性表与像素计数(按ID匹配) attr_table_with_count <- merge(attr_table, freq_table, by = "ID", all.x = TRUE) # 补全无像素的分类计数为0 attr_table_with_count$count[is.na(attr_table_with_count$count)] <- 0 # 重命名字段以适配ArcGIS规范(ArcGIS默认识别Count字段) colnames(attr_table_with_count)[colnames(attr_table_with_count) == "count"] <- "Count" # 写入分类栅格,指定整数类型确保GIS识别 writeRaster(y, filename="Categorical_raster.tif", overwrite=TRUE, datatype="INT1U") # 写入带像素计数的属性表DBF write.dbf(attr_table_with_count, file = "Categorical_raster.tif.vat.dbf")
关键说明
freq(y):统计栅格中每个分类ID对应的像素数量,这是属性表缺失的核心数据。- 合并表时使用
all.x = TRUE:确保所有矢量中的分类都被保留,即使该分类在栅格中没有像素(计数设为0)。 - 指定
datatype="INT1U":将栅格保存为无符号整数类型,符合分类栅格的存储规范,帮助GIS软件正确识别属性表关联。 - 字段重命名为
Count:适配ArcGIS的属性表默认字段名规则,避免ArcGIS无法识别计数字段。
内容的提问来源于stack exchange,提问作者UseR10085
相关产品推荐
相关产品推荐

