无法合并没有唯一 ID 值但确实具有其他唯一属性值的栅格

问题描述 投票:0回答:1

我尝试通过特定属性(即土地覆盖)而不是通过主键索引(即 OID)将许多栅格合并在一起,因为 OID 值对于不同栅格中的特定土地覆盖来说并不是唯一的。当我尝试合并具有不同土地覆盖量的栅格时,将仅使用第一个栅格的值。此外,如果 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

#Now try to merge rasters
Merge <- merge(rast1, rast2)

问题:合并的栅格仅包含第一个栅格输入中的“覆盖”类别,就我的数据而言,非唯一 ID 被错误地分类到不同的组中。在这里,rast2 的“农业”类别被归类为“贫瘠”。

我尝试过手动更改光栅级别,但这不起作用。

merge raster terra
1个回答
0
投票

这有点复杂,也许“terra”应该自动完成。但现在你可以用这两个栅格来做到这一点

cat1 <- cats(r1)[[1]]
cat2 <- cats(r2)[[1]]

m <- match(cat1$cover, cat2$cover)
rc <- cbind(cat1$id, cat2$id[m])
r1c <- classify(r1, rc)
levels(r1c) <- levels(r2)

r12 <- merge(r1c, r2)

如果你有很多栅格,你也许可以使用这样的循环。

r2
是我们用作模板的最完整的栅格。

x <- list(r2, r1)
mcat <- cats(r2)[[1]]

for (i in 2:length(x)) {
    r <- x[[i]]
    xcat <- cats(r)[[1]]
    m <- match(xcat$cover, mcat$cover)
    rc <- cbind(xcat$id, mcat$id[m])
    r <- classify(r, rc)
    levels(r) <- mcat
    x[[i]] <- r
}

s <- sprc(x)
m <- merge(s)
© www.soinside.com 2019 - 2024. All rights reserved.