r 多类别栅格的 Terra 问题。如何在不丢失数据的情况下正确地将类别及其值提取到图层中?

r Terra issue with multicategorical raster. How to properly extract the categories and their values into layers without losing data?

我正在使用 rTerra 并在此处找到来自 LANDFIRE 的 CONUS 历史扰动数据集有问题:https://landfire.gov/version_download.php(HDist 是名称)。总结一下我想做的事情,我想在我的范围内使用这个数据集、裁剪和投影,然后获取单元格的值并将它们分离为图层。所以我想要一层表示严重性,一层表示扰动类型等。历史扰动数据将这些都包含在一个属性中 table。在 terra 中,这个属性 table 是在类别下设置的,这会带来很多问题。我没有遇到裁剪问题,也没有重新投影,它正在进入价值并将类别分成几层。我有以下代码

library(terra)


setwd("your pathway to historical disturbance tif here")

h1 <- terra::rast("LC16_HDst_200.tif")  #read in the Hdist tif
h2 <- terra::project(h1, "EPSG:5070", method = "near") #project it using nearest neighbor
h3 <- crop(h2, ext([xmin,xmax,ymin,ymax]) #crop to the extent
h3

然后给出我想要的范围和投影的输出,但主要关注的是类别

categories  : Count, HDIST_ID, DISTCODE_V, DIST_TYPE, TYPE_CONFI, SEVERITY, SEV_CONFID, HDIST_CAT, FDIST, R, G, B

所以我了解到,对于这些类型的数据集,值存储在这些类别下。 如果我用 plot(h3) 绘图 我只得到计数类别的第一行。为了切换该类别,我可以使用

activeCat(h3) <- 4
h3

我会得到

name       :   DIST_TYPE
min value  :   Clearcut
max value  : Wildland Fire Use

默认的活动类别是计数,但现在是 DIST_TYPE,第四个类别,没什么太疯狂的。我尝试绘图

plot(h3)

我只绘制了 NoData。 None 其他人。有一个名为 catalyze() 的函数声称可以获取您的类别并将它们全部转换为数字层

h4 <- catalyze(h3)

这给了我一个 13 层数据集,这是有道理的,因为有 13 个类别,它接受它们并将它们转换为数字层。我试过绘图

plot(h4, 4) #plot h4 layer 4, which would correspond to DIST_TYPE category

它只绘制了 8 的值,并且看起来只显示了可能的 noData 值。该地图大部分为绿色,与 HDist 的 NoData 一致。 每当我尝试直接访问值时,它都会崩溃。当我查看最小值和最大值时,我得到 8 和 8 的最小值和最大值的“名称”names: DIST_TYPE min values: 8 max values: 8。其他类别显示类似的模式。所以它似乎只取每个类别的第一行值并使其成为整个图层。

总而言之,很明显,如果将数据集引入 arcgis,terra 会存储很容易在属性 table 中看到的所有值。然而,每当我尝试绘制或使用它时,即使在任何真正的操作之前,它也只会访问该属性的第一行 table,而当我催化时,它似乎只会把一切搞得更糟。我知道这在 arcgis pro 中很容易解决,但我想从文档一致性的角度保留 r 中的所有内容。任何 terra whizzes 知道该怎么做?我认为它必须非常简单,但我真的不知道还能尝试什么。也许这也是一些重大问题。我对 LANDFIRE evt 数据有同样的问题。我没有遇到简单栅格的问题,例如 dem、树冠覆盖等。只有这些栅格具有多个类别(或属性中的列 table)

编辑 这是中断图像

失败,因为 (ESRI) VAT ID 不在预期的(对于 GDAL 类别)0..255 范围内。现在已经修复,我得到:

library(terra)
#terra version 1.4.6
r <- rast("LC16_HDst_200.tif")
activeCat(r) <- 4
r <- crop(r, ext(-93345, -57075, 1693125, 1716735))
plot(r)