使用terra::as.polygons忽略图层选择

nukf8bse  于 2023-05-20  发布在  Go
关注(0)|答案(1)|浏览(112)

我使用的是Terra版本1.7-29(以前在1.6-17中也有同样的问题)。

我的数据

我有一个双层栅格数据集(download it here):

prediction <- terra::rast('path/to/raster.tif')
names(prediction) <- c('prediction', 'validation')

它看起来像这样:

class       : SpatRaster 
dimensions  : 202, 294, 2  (nrow, ncol, nlyr)
resolution  : 2, 2  (x, y)
extent      : 1978598, 1979186, 889666, 890070  (xmin, xmax, ymin, ymax)
coord. ref. : WGS 84 / NSIDC Sea Ice Polar Stereographic North (EPSG:3413) 
source      : 000.tif 
names       : prediction, validation

问题

我想从第二层“验证”创建一个矢量多边形数据集,但as.polygons()似乎从第一层“预测”开始工作。

val_poly <- as.polygons(subset(prediction, 'validation'))
plot(val_poly)

我尝试过的其他事情

我还尝试先将验证层设为子集,然后将其提供给as.polygons()(允许我检查子集是否按预期工作),但它对多边形输出没有影响。

val_layer <- subset(prediction, 'validation')
val_poly <- as.polygons(val_layer)

subset(prediction, 'validation')
plot(subset(prediction, 'validation'))
class       : SpatRaster 
dimensions  : 202, 294, 1  (nrow, ncol, nlyr)
resolution  : 2, 2  (x, y)
extent      : 1978598, 1979186, 889666, 890070  (xmin, xmax, ymin, ymax)
coord. ref. : WGS 84 / NSIDC Sea Ice Polar Stereographic North (EPSG:3413) 
source      : 000.tif 
name        : validation

不可复制

  • (至少使用手工SpatRaster)*

当我手工制作一个2层SpatRaster并将第2层转换为多边形时,它可以按预期工作。这让我考虑了两个选择:
1.我的数据集可能有问题,或者
1.有一些与terra如何处理磁盘上的文件有关的错误(但这超出了我的编码知识舒适区)。

r1 <- rast(ncol=4, nrow=4)
names(r1) <- c('r1')
r2 <- deepcopy(r1)
names(r2) <- c('r2')
set.seed(0)
values(r1) <- c(0, 0, 0, 0,
                0, 1, 0, 0,
                0, 1, 1, 0,
                0, 0, 0, 0)
set.seed(1)
values(r2) <- c(0, 0, 0, 1,
                0, 0, 1, 1,
                0, 0, 1, 1,
                0, 0, 0, 0)
r <- c(r1, r2)
plot(r)

test <- as.polygons(r[['r2']])
plot(test)

n9vozmp4

n9vozmp41#

下面的工作与terra 1.7-32(目前的开发版本);但是对于当前的CRAN版本,存在需要简单解决的问题。

library(terra)
# terra 1.7.29

x <- rast("000.tif")
x
#class       : SpatRaster 
#dimensions  : 202, 294, 2  (nrow, ncol, nlyr)
#resolution  : 2, 2  (x, y)
#extent      : 1978598, 1979186, 889666, 890070  (xmin, xmax, ymin, ymax)
#coord. ref. : WGS 84 / NSIDC Sea Ice Polar Stereographic North (EPSG:3413) 
#source      : 000.tif 
#names       : 000_1, 000_2 

x2 <- x[[2]] 
#x2 <- x[["000_2"]]
#x2 <- subset(x, "000_2")

## Work around for current version
x2 <- x2 * 1

p <- as.polygons(x2)
plot(x2); lines(p)

x1c 0d1x您可能希望为值为1的单元格创建多边形,但不希望为零的单元格创建多边形。那样的话,你可以做

x2 <- subst(x2, 0, NA)
p <- as.polygons(x2)

该问题与此文件具有特定数据类型有关。这就是为什么您无法使用在内存中具有值的SpatRaster来复制它的原因。谢谢你揭露这个bug!
开发版本可从

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

相关问题