Terra 1.7-23中多边形栅格化赋值异常问题求助
问题原因与解决方案
核心误解:Terra rasterize 默认行为不是取面积占比最高值
Terra 的 rasterize 函数在设置 fun=NULL 时,默认规则是保留最后一个与栅格单元相交(含边界接触)的多边形的值,而非像素内面积占比最高的类别。你遇到的问题,本质是编码为1的多边形在shapefile中的存储/绘制顺序靠后,覆盖了先处理的0类多边形。
正确实现“取像素内占比最高类别”的方法
要实现按面积占比赋值,需要分别统计每个类别在像素内的覆盖面积,再选择占比最高的类别:
# 加载terra包 library(terra) # 分别统计0和1类在每个像素中的覆盖面积 r0 <- rasterize(shp[shp$comp_cat_cl == 0, ], template.rast, field = 1, fun = sum, touches = TRUE) r1 <- rasterize(shp[shp$comp_cat_cl == 1, ], template.rast, field = 1, fun = sum, touches = TRUE) # 将NA替换为0(表示该类别未覆盖此像素) r0 <- subst(r0, NA, 0) r1 <- subst(r1, NA, 0) # 生成占比最高的类别栅格:0或1 r_max <- ifel(r0 >= r1, 0, 1)
验证多边形顺序的影响
你可以查看shapefile的属性表,确认编码为1的多边形是否排在0类之后。若将0类多边形调整为shapefile中的最后一批,再执行原始代码:
r <- rasterize(shp, template.rast, "comp_cat_cl", touches=TRUE)
会发现原本被赋值为1的像素会变成0,这直接验证了“顺序优先”的默认规则。
关于touches=TRUE的说明
该参数会让所有与多边形边界接触的栅格单元都被赋值,可能会引入边缘小面积多边形的干扰。如果你的需求仅关注完全包含或主要覆盖的像素,可以考虑移除该参数,但如果需要保留边界接触的情况,保留即可。
内容的提问来源于stack exchange,提问作者Nico
相关产品推荐
相关产品推荐

