如何对PostGIS单栅格表的所有波段逐像素计算年平均值?
核心误区纠正:ST_Union的使用边界
ST_Union的栅格聚合功能仅针对跨栅格行(不同rid)的空间合并——比如把相邻栅格块(rid=1、rid=2)合并为大栅格,统计参数(如'MEAN')是针对重叠像素的跨栅格值统计,而非同一栅格(同一rid)内的波段维度统计。
你按rid分组后,每个分组仅对应1个栅格,无跨栅格合并需求,因此ST_Union会直接返回原栅格,波段数自然保持365个。
高效实现方案:用ST_MapAlgebra做跨波段像素统计
ST_MapAlgebra是PostGIS栅格代数引擎,直接操作栅格像素的二进制数组,完全避免转矢量的开销,速度远快于ST_DumpAsPolygons。
适配需求的查询语句
假设你每个rid的栅格(rast)的365个波段为连续编号1-365(逐日数据通常符合),直接使用内置跨波段统计重载:
SELECT rid, -- 对当前栅格的1-365波段执行逐像素平均,生成单波段年度栅格 ST_MapAlgebra( rast, -- 输入栅格(当前rid的块栅格) 1, -- 起始波段号(第1天) 365, -- 结束波段号(第365天) 'MEAN'::text -- 内置统计逻辑:逐像素跨波段取平均 ) AS annual_avg_rast FROM climate_table;
关键参数补充
- 若存在非连续编号的波段:先用
ST_BandNums(rast)获取所有有效波段号,替换1-365的范围; - 空值处理:若部分像素为无效值(如云层遮挡的空值),可添加空值过滤参数:
SELECT rid, ST_MapAlgebra( rast, 1, 365, 'MEAN'::text, NULL, -- 输出栅格的无效值(可选,默认继承输入) 'IGNORE' -- 统计时忽略空值(仅用有效像素计算平均) ) AS annual_avg_rast FROM climate_table;
标签权限补充说明
Stack Exchange的标签创建权限需账号声望达到150,可先通过参与回答、提问积累声望后,创建bands标签。
内容的提问来源于stack exchange,提问作者buck
相关产品推荐
相关产品推荐

