无法合并ID不唯一但含其他唯一属性的栅格问题求助
按土地覆被属性合并分类栅格的问题解决
问题说明
在使用terra包合并分类栅格时,直接调用merge()函数会默认基于栅格的主键索引(ID/OID)匹配类别,但不同栅格的ID并不对应唯一的土地覆被类型,会引发以下问题:
- 合并后仅保留第一个输入栅格的类别定义
- 不同栅格中ID对应不同覆被的情况会出现错误归类,例如示例中
rast2的"agriculture"会被错误归为rast1中ID=3对应的"barren"
手动修改栅格levels无法解决该问题,核心矛盾是不同栅格的ID与覆被类型的映射规则不统一。
问题复现代码
library(terra) set.seed(0) rast1 <- rast(nrows=10, ncols=10) values(rast1) <- sample(3, ncell(rast1), replace=TRUE) d1 <- data.frame(id=1:3, cover=c("conifer", "water", "barren"), letters=letters[1:3]) levels(rast1) <- d1 rast2 <- rast(nrows=10, ncols=10) values(rast2) <- sample(4, ncell(rast2), replace=TRUE) d2 <- data.frame(id=1:4, cover=c("conifer", "water", "agriculture","barren"), letters=c("a","b","d","c")) levels(rast2) <- d2 # 直接合并会出现错误归类 Merge <- merge(rast1, rast2)
解决方案
要解决这个问题,需要基于土地覆被名称(cover字段)为所有栅格创建统一的编码规则,让相同覆被类型对应相同的数值ID,再进行合并:
具体步骤
- 收集所有栅格中唯一的土地覆被类型,创建统一的映射表
- 将每个栅格的原有数值ID替换为统一编码后的数值
- 重新设置栅格的levels为统一的映射表
- 执行合并操作
代码实现
# 1. 创建统一的覆被类型映射表 all_covers <- unique(c(d1$cover, d2$cover)) unified_map <- data.frame( cover = all_covers, unified_id = 1:length(all_covers), # 可根据需求统一处理附属属性,此处取对应字母的匹配值 letters = c("a", "b", "c", "d") ) # 2. 重新编码rast1的数值 rast1_vals <- values(rast1) # 通过原有cover匹配统一ID rast1_new_vals <- unified_map$unified_id[match(d1$cover[rast1_vals], unified_map$cover)] values(rast1) <- rast1_new_vals levels(rast1) <- unified_map # 3. 重新编码rast2的数值 rast2_vals <- values(rast2) rast2_new_vals <- unified_map$unified_id[match(d2$cover[rast2_vals], unified_map$cover)] values(rast2) <- rast2_new_vals levels(rast2) <- unified_map # 4. 基于统一覆被类型合并 merged_rast <- merge(rast1, rast2) # 查看合并后的类别规则 levels(merged_rast)
此方法会保留所有土地覆被类型,且不会出现错误归类。如果需要处理其他附属属性(如letters),可在unified_map中根据业务需求自定义规则(如取同一覆被类型的第一个属性值、合并所有对应值等)。
内容的提问来源于stack exchange,提问作者JamieW
相关产品推荐
相关产品推荐

