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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.10 15:18:55