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

rasterize函数栅格化小型多边形输出全0空栅格问题咨询

问题原因

该问题由rasterize函数默认判定规则导致:默认仅当栅格像元的中心点落入多边形范围内时,才会给该像元赋值。面积过小的多边形无法覆盖任何像元的中心点,因此会输出全0的空栅格。

解决方案

无需额外设置容差参数,只需修改rasterize的判定规则即可,分两种使用场景:

1. 使用raster包的场景

添加getCover = TRUE参数,该参数会计算每个像元被多边形覆盖的比例,只要比例大于0就返回非0值,之后将非0值统一转为1即可满足二值栅格需求,修改后代码如下:

for (i in 1:length(shape)) {
  # getCover=TRUE返回值为像元被多边形覆盖的百分比,取值范围0-100
  shape.r <- rasterize(shape[i,], snap, background = 0, getCover = TRUE)
  # 覆盖度大于0的像元统一赋值为1
  shape.r[shape.r > 0] <- 1
  # 建议补充.tif后缀,避免生成无后缀文件
  writeRaster(shape.r, filename = paste0(shape[i,]$binomial, ".tif"), format = "GTiff", overwrite = TRUE)
}

2. 使用terra包的场景(更推荐处理大型数据)

terra是raster包的后续迭代版本,处理速度更快,对应的rasterize函数提供了专门的touches = TRUE参数,直接实现「只要多边形触及像元任意区域就赋值」的需求,代码如下:

library(terra)
# 先将原始数据转为terra兼容的对象格式
shape_terra <- vect(shape)
snap_terra <- rast(snap)

for (i in 1:nrow(shape_terra)) {
  shape.r <- rasterize(shape_terra[i,], snap_terra, fun = "count", background = 0, touches = TRUE)
  # 覆盖次数大于0的像元统一赋值为1
  shape.r[shape.r > 0] <- 1
  writeRaster(shape.r, filename = paste0(shape_terra[i,]$binomial, ".tif"), overwrite = TRUE)
}

补充说明

  • 两种方案均无需调整原有snap栅格的像元参数,完全兼容0.5×0.5度的设置
  • 处理大量多边形时,terra包的运行效率比raster包高3-10倍,数据量大时优先选择第二种方案

内容的提问来源于stack exchange,提问作者Javi Nori

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.26 23:57:02