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

如何计算海草区域Spatraster内各土地覆被类型的面积及占比?

解决方法

你已经通过terra::crop(..., mask=T)得到了仅海草区域内的土地覆被栅格land.sub,无需再用exact_extractr或extract,直接用terra自带函数就能快速计算各类别的面积与占比:

步骤1:统计各类别像元数

用freq()函数统计每个土地覆被类型的像元数量,再关联类别名称:

# 统计像元频率
land_freq <- freq(land.sub)
# 合并类别名称映射
land_freq <- merge(land_freq, levels(land.sub)[[1]], by.x="value", by.y="id")

步骤2:计算各类别面积

你的栅格用的是CEA投影(单位:米),有两种计算面积的方式:

# 方法1:基于分辨率计算统一像元面积(适合无投影变形的区域)
cell_area <- prod(res(land.sub)) # 单个像元面积(平方米)
land_freq$area_m2 <- land_freq$count * cell_area
land_freq$area_km2 <- land_freq$area_m2 / 1e6 # 转换为平方公里

# 方法2:用cellSize计算精准像元面积(适合投影有局部变形的场景)
cell_sizes <- cellSize(land.sub)
# 按土地覆被类别求和面积
area_stats <- zonal(cell_sizes, land.sub, sum, na.rm=T)
area_stats <- merge(area_stats, levels(land.sub)[[1]], by.x="zone", by.y="id")
colnames(area_stats) <- c("value", "area_m2", "cover")
area_stats$area_km2 <- area_stats$area_m2 / 1e6

步骤3:计算占比

基于总面计算各类别的占比:

# 基于land_freq计算
total_area <- sum(land_freq$area_m2)
land_freq$proportion <- land_freq$area_m2 / total_area

# 或者基于area_stats计算
total_area <- sum(area_stats$area_m2)
area_stats$proportion <- area_stats$area_m2 / total_area

关于exact_extractr报错的说明

你遇到的"columns undefined"错误,大概率是因为该函数要求传入sf格式的多边形对象,但你传入了terra的vect对象,或参数使用不符合要求。不过既然已经完成栅格裁剪与掩膜,直接统计掩膜后的栅格是最高效的方案,无需再用多边形提取。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.26 06:57:14