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

如何计算SpatRasterDataset中子数据集的平均栅格数据

计算SpatRasterDataset中子数据集的单元格平均值

问题背景

我创建了一个SpatRasterDataset对象,代码如下:

library(terra)

r = rast(system.file("ex/logo.tif", package="terra"))   

s = terra::sds(r, r/2, r/3)

names(s) = letters[1:3]

该对象的信息:

> s
class       : SpatRasterDataset 
subdatasets : 3 
dimensions  : 77, 101 (nrow, ncol)
nlyr        : 3, 3, 3 
resolution  : 1, 1  (x, y)
extent      : 0, 101, 0, 77  (xmin, xmax, ymin, ymax)
coord. ref. : Cartesian (Meter) 
source(s)   : logo.tif, memory 
names       : a, b, c 

我需要计算这个对象中3个SpatRaster的平均值,结果要求是一个维度为77×101的单个SpatRaster(单图层),每个单元格的值是三个子数据集对应位置所有单元格值的平均值。

我尝试了terra::app(s, mean),但得到的是一个3图层的SpatRaster,不符合预期:

> terra::app(s, mean)
class       : SpatRaster 
dimensions  : 77, 101, 3  (nrow, ncol, nlyr)
resolution  : 1, 1  (x, y)
extent      : 0, 101, 0, 77  (xmin, xmax, ymin, ymax)
coord. ref. : Cartesian (Meter) 
source(s)   : memory
varname     : logo 
names       :      red,    green,     blue 
min values  :   0.0000,   0.0000,   0.0000 
max values  : 155.8333, 155.8333, 155.8333 

解决方案

terra::app()对SpatRasterDataset操作时,默认是按对应图层分别计算平均值(比如三个子数据集的红色通道取平均,绿色通道取平均,以此类推),所以得到3图层结果。要实现所有值的全局单元格平均,需要先将SpatRasterDataset转换为一个包含所有图层的SpatRaster,再计算每个单元格的平均值:

# 将SpatRasterDataset转换为包含所有子图层的SpatRaster
combined_raster <- rast(s)

# 计算每个单元格的平均值(所有9个图层的均值)
mean_raster <- app(combined_raster, mean, na.rm = TRUE)

查看结果:

> mean_raster
class       : SpatRaster 
dimensions  : 77, 101, 1  (nrow, ncol, nlyr)
resolution  : 1, 1  (x, y)
extent      : 0, 101, 0, 77  (xmin, xmax, ymin, ymax)
coord. ref. : Cartesian (Meter) 
source(s)   : memory
names       :     mean 
min values  :   0.0000 
max values  : 116.8750 

如果你的需求是保留三个通道(每个通道取三个子数据集对应通道的平均),那terra::app(s, mean)的结果其实符合预期,只需明确需求即可。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.18 14:22:46