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

Terra提取土地覆盖数据问题:如何获取网格内占比最大的类别?

解决方案

一、自动子网格的来源解释

调用extract(LC, Grid)时,Terra会自动把每个90x90m的Grid多边形切割成与30x30m的LC栅格像素对齐的子网格(也就是你看到的9个小网格)。这是因为两个数据集像素未对齐,Terra必须通过切割多边形来精确计算每个LC像素在Grid中的覆盖面积比例——默认逻辑是用这些比例加权计算均值,但对分类数据来说这个结果毫无意义。

二、获取每个网格内占比最大的土地覆盖类别

你需要自定义加权众数函数,替换extract()的默认计算逻辑,结合面积权重统计占比最高的类别:

步骤1:定义加权众数函数

weighted_mode <- function(values, weights) {
  # 过滤NA值
  valid_idx <- !is.na(values)
  vals <- values[valid_idx]
  wts <- weights[valid_idx]
  
  if (length(vals) == 0) return(NA)
  
  # 按类别汇总权重总和
  category_weights <- tapply(wts, vals, sum)
  # 返回权重最大的类别
  as.numeric(names(category_weights)[which.max(category_weights)])
}

步骤2:调用extract函数计算

LCValues <- extract(LC, Grid, fun = weighted_mode, weights = TRUE, exact = TRUE)
  • weights=TRUE:让Terra返回每个子网格的面积权重(即该子网格在对应Grid中的面积占比)
  • exact=TRUE:确保Terra精确计算多边形与栅格的重叠面积,而非近似估算
  • fun=weighted_mode:替换默认的均值计算逻辑,改用自定义函数统计占比最高的类别

备选方案:用terra::zonal(若允许栅格化Grid)

如果可以接受将Grid转换为与LC同分辨率的栅格(保持90x90m网格边界),这个方法效率更高:

# 将Grid转换为栅格(分辨率与LC一致,需Grid有唯一标识列)
grid_rast <- rasterize(Grid, LC, field = "Grid_ID")
# 按网格ID统计众数
mode_zonal <- zonal(LC, grid_rast, fun = weighted_mode)

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.15 11:19:59