4

我正在与 rTerra 合作,并且在此处发现了来自 LANDFIRE 的 CONUS 历史干扰数据集的问题:https ://landfire.gov/version_download.php (HDist 是名称)。总结一下我想做的事情,我想把这个数据集,裁剪和投影到我的范围内,然后取单元格的值并将它们分离为层。所以我想要一个严重性层,一个用于干扰类型等。历史干扰数据将这些东西都放在一个属性表中。在 terra 中,此属性表是在类别下设置的,这带来了很多问题。我没有遇到裁剪或重新投影的问题,它正在进入值并将类别分成层。我有以下代码

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。其他都没有。有一个名为catalyze()That 声称可以获取您的类别并将它们全部转换为数字层的功能

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 的 min 和 max 的“名称” names: DIST_TYPE min values: 8 max values: 8。其他类别显示类似的模式。所以它似乎只取每个类别的第一行值并使其成为整个层。

总之,很明显,如果将数据集引入 arcgis,则 terra 存储了属性表中很容易看到的所有值。但是,每当我尝试绘制它或使用它时,即使在任何真正的操作之前,它也只会访问该属性表的第一行,而当我催化时,它似乎只会让一切变得更加混乱。我知道这在 arcgis pro 中很容易解决,但是从文档一致性的角度来看,我想将所有内容都保留在 r 中。任何 terra 高手知道该怎么做吗?我认为它必须非常简单,但我真的不知道还有什么可以尝试的。也许这也是一些重大问题。我对 LANDFIRE evt 数据有同样的问题。对于简单的栅格,例如 dem、树冠盖等,我没有遇到过这个问题。

编辑这是中断图像 这张图片显示了即使在现在修复之后它正在绘制的内容

4

1 回答 1

1

失败是因为(ESRI)增值税 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)

在此处输入图像描述

于 2021-09-30T18:27:00.467 回答