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
相关产品推荐
相关产品推荐

