Terra 从分类栅格中提取不正确的值
Terra extracting incorrect value from categorical raster
我正在尝试更新我以前使用光栅到 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)
这是一个与 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
的 class。因此,如果您执行 terra::extract(x)
并且 x
是一个 RasterLayer,您将获得在 raster 包中定义的函数。因此,在这种情况下,最好只使用 extract(x)
--- 因为那样不会产生误导。
我正在尝试更新我以前使用光栅到 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)
这是一个与 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
的 class。因此,如果您执行 terra::extract(x)
并且 x
是一个 RasterLayer,您将获得在 raster 包中定义的函数。因此,在这种情况下,最好只使用 extract(x)
--- 因为那样不会产生误导。