terra::freq函数遇过小无重叠像素多边形报错问题咨询
terra::freq函数Bug:小多边形重叠不足时报错,extract可正常运行
怀疑terra::freq函数存在Bug:当多边形过小、与SpatRaster的像素重叠不足(即使位于像素上方)时,该函数会返回错误,但terra::extract函数可正常运行。
我的场景仅需统计每个多边形的像素数量,freq函数速度远快于extract,但extract速度慢且需额外步骤处理结果。我可以接受返回NA,但无法接受报错!
复现代码
# 创建栅格 r <- rast(nrows=10, ncols=10) set.seed(2) values(r) <- sample(5, ncell(r), replace=TRUE) freq(r) # 创建第二个栅格并转换为矢量,设置大重叠范围 r2 <- rast(ncols=2, nrows=2) values(r2) <- 1:ncell(r2) ext(r2) <- ext(-100, -20, 0, 50) # 大量重叠 p <- as.polygons(r2) # 对比两者(存在重叠) plot(r) plot(p, add=TRUE) # freq可正常运行 freq(x = r, zone = p) # Extract可正常运行 extract(x = r, y = p, exact=TRUE) # 创建第三个栅格并转换为矢量,设置极小重叠范围 r3 <- rast(ncols=2, nrows=2) values(r3) <- 1:ncell(r3) ext(r3) <- ext(-25, -20, 0, 2) # 几乎无重叠 p <- as.polygons(r3) p plot(r) plot(p, add=TRUE) # 尝试获取频率,出现报错 freq(x = r, zone = p)
错误信息
Error in
$<-.data.frame(*tmp*, "zone", value = 1L) :
replacement has 1 row, data has 0
此时extract仍可正常运行:
extract(x = r, y = p, exact=TRUE)
编辑补充
实际使用的是sf对象,通过vect(sf::st_as_sf(p))转换为SpatVector作为分区,此情况似乎不存在分辨率问题:
s <- sf::st_as_sf(p) plot(r) plot(s, add=TRUE) freq(x = r, zone = vect(s))
内容的提问来源于stack exchange,提问作者M. Beausoleil
相关产品推荐
相关产品推荐

