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

如何使用terra包基于像素面积转换栅格单位为每公顷值?

如何用cellSize实现栅格值的每公顷单位转换?

可以用cellSize实现,但结果和你自己写的px2ha函数不一致是因为两者的像素面积计算逻辑不同,以下是具体分析和修正方法:

核心逻辑回顾

你的需求是将像素总值转换为单位公顷值,公式为:

转换后值 = 原像素值 / 像素面积(公顷)

你的px2ha函数本质是通过分辨率乘积计算平面近似面积:

# 像素面积(平方米)= 分辨率宽 × 分辨率高
# 转换为公顷需除以10000,公式等价于 原值 / (像素面积/10000) = 原值 * 10000 / 像素面积
px2ha <- function(raster) {
  raster * 10000/prod(res(raster))
}

这个函数假设像素是完美正方形,属于简化的平面近似计算。

cellSize的差异原因

cellSize(r2, unit='ha')计算的是每个像素的实际地表面积,会考虑投影变形或地球曲率:

  • 若原栅格是地理坐标系(经纬度),投影到epsg:2950(UTM米单位投影)后,cellSize会计算更精确的椭球面面积,和prod(res(r2))的平面面积存在细微差异。
  • 即使是投影坐标系,不同区域的投影变形也会导致cellSize的结果和分辨率乘积不完全一致。

用cellSize实现需求的正确方式

方式1:精确的地表面积转换

直接使用cellSize的公顷结果,这是更贴合实际地表的单位值计算:

# 正确逻辑:原像素值 ÷ 像素面积(公顷)= 单位公顷值
r2_per_ha <- r2 / cellSize(r2, unit = 'ha')

这个结果和px2ha的差异是合理的,前者是实际地表面积,后者是平面近似面积。

方式2:和px2ha得到完全一致的结果

如果需要和px2ha的近似逻辑对齐,用cellSize计算平方米面积后再转换为公顷:

# 用cellSize计算平方米面积,再转换为公顷
r2_per_ha_approx <- r2 / (cellSize(r2, unit = 'm') / 10000)
# 此时结果和px2ha(r2)完全一致
all.equal(r2_per_ha_approx, px2ha(r2))

验证差异的代码

你可以查看两种面积计算方式的差值:

# 计算px2ha用的近似公顷面积
approx_area <- prod(res(r2)) / 10000
# 计算cellSize的精确公顷面积
exact_area <- cellSize(r2, unit = 'ha')
# 查看两者的差值分布
plot(exact_area - approx_area)

内容的提问来源于stack exchange,提问作者M. Beausoleil

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.14 23:31:01