如何计算海草区域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
相关产品推荐
相关产品推荐

