You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.12 23:49:59