Terra从分类栅格中提取不正确的值

Posted

技术标签:

【中文标题】Terra从分类栅格中提取不正确的值【英文标题】:Terra extracting incorrect value from categorical raster 【发布时间】:2021-11-30 15:40:54 【问题描述】:

我正在尝试更新以前使用 raster to terra 的旧代码。我遇到了从 LANDFIRE 栅格图层中提取主要植被类型的问题。在 ArcGIS 中,我为我的浓缩植被类型(即 1="Aspen"、2="Other" 等)创建了一个名为“CONDENSED”的新列,这是我想从中提取的活动类别。我有8个类别。由于某种原因,提取的值比应有的“高”一个类别。例如,对于 aspen,一个点的值应该是 1,但提取的值是 2/Other。这在所有蔬菜类型中都是一致的,无论我的观点是 sf 还是 SpatVector。我使用的是 terra 版本 1.4.11。

我尝试从头开始创建一个可重现的示例,与 raster::extract() 中的值相比,它工作得非常好,所以我不确定问题是否与我指定活动层的方式有关?一世 上传了我正在使用的栅格和点的小样本:https://github.com/Cara-Thompson/Elk-resource-selection

有人知道会发生什么吗?下面是我的 SpatRaster 和我的步骤的描述。

奖励:我注意到terra::extract() 在使用 Raster* 对象时可以处理完整形式的 sf 对象。所以我可以在不使用 SpatVect/SpatRast 格式的情况下正确提取它,但这是否比使用 raster::extract() 更快?

# Read in raster and define crs
Veg <- terra::rast("./Vegetation/veg_cond.tif")
crs(Veg) <- "EPSG:4326"

#> Veg
# class       : SpatRaster 
# dimensions  : 9401, 21368, 1  (nrow, ncol, nlyr)
# resolution  : 0.0003398576, 0.0003398576  (x, y)
# extent      : -113.7326, -106.4705, 32.44176, 35.63676  (xmin, xmax, ymin, ymax)
# coord. ref. : lon/lat WGS 84 (EPSG:4326) 
# source      : veg_cond.tif 
# categories  : COUNT, CONDENSED 
# name        :    COUNT 
# min value   :   135890 
# max value   : 77959803 

# Make the condensed category the active category so count isn't extracted
activeCat(Veg) <- is.factor("CONDENSED")

# Extract
Values <- terra::extract(Veg, st_coordinates(EP.sf))

# Verify using raster::extract()
Veg2 <- raster(Veg)
Values$raster <- raster::extract(Veg2, EP.sf)

【问题讨论】:

【参考方案1】:

这是一个与 ESRI VAT 和 GDAL 类别之间的差异相关的错误(请参阅this issue),现在似乎已修复。我现在明白了

library(terra)
#terra version 1.4.12
elk <- vect("elk subset/elk subset.shp")
veg <- rast("veg_sample/veg sample.tif")
# note the way to use activeCat!
activeCat(veg) <- 2

veg
#class       : SpatRaster 
#dimensions  : 933, 1272, 1  (nrow, ncol, nlyr)
#resolution  : 0.0003398576, 0.0003398576  (x, y)
#extent      : -109.554, -109.1217, 33.8277, 34.14478  (xmin, xmax, ymin, ymax)
#coord. ref. : lon/lat WGS 84 (EPSG:4326) 
#source      : veg sample.tif 
#categories  : COUNT, CONDENSED 
#name        : CONDENSED 
#min value   :     ASPEN 
#max value   : PONDEROSA 

plot(veg, mar=c(2,2,2,8))
points(elk)

head(extract(veg, elk))
#  ID      CONDENSED
#1  1          ASPEN
#2  2  OAK/SHRUBLAND
#3  3  OAK/SHRUBLAND
#4  4 PINYON-JUNIPER
#5  5 PINYON-JUNIPER
#6  6      PONDEROSA
 
e <- ext(-109.18688, -109.18483,   34.11579,   34.11798)
cveg <- crop(veg, e)
activeCat(cveg) <- 2
celk <- crop(elk, e)

plot(cveg, mar=c(2,2,2,8))
points(celk)

extract(veg, celk)
#  ID     CONDENSED
#1  1 OAK/SHRUBLAND

你可以安装开发版

install.packages('terra', repos='https://rspatial.r-universe.dev')

奖金:

extract 是一个通用函数。这意味着调用terra::extract(x)raster::extract(x) 没有区别,因为你得到的函数版本取决于x 的类。因此,如果您执行 terra::extract(x) 并且 x 是 RasterLayer,您将获得在 raster 包中定义的函数。在这种情况下,最好只使用extract(x) --- 因为这不会产生误导。

【讨论】:

感谢罗伯特的快速回复和回复。我已在要求的附加信息中添加;如果访问数据时出现问题和/或我是否应该在您提供的链接中创建错误报告,请告诉我。 那行得通,我相信现在已经解决了。 有没有办法在函数内“分解”活动类别中的值,以便提取的值是数字而不是字符串? 您可以对提取的值执行as.integer(as.factor(extractedvalue)) 。或者执行levels(x) &lt;- NULL 以从SpatRaster 中删除类别以从文件中获取数字。

以上是关于Terra从分类栅格中提取不正确的值的主要内容,如果未能解决你的问题,请参考以下文章

arcgis叠加的优先级

arcgistif没有值

ArcGIS实验教程——实验四十三:ArcGIS栅格重分类(Reclass)案例详解

ArcGIS实验教程——实验四十三:ArcGIS栅格重分类(Reclass)案例详解

ArcGIS实验教程——实验四十三:ArcGIS栅格重分类(Reclass)案例详解

在 terra 包中读取多个栅格