
一、函数概述
上一节介绍了栅格数据分块 ST_Tile 函数,本节介绍栅格数据的合并 ST_Union 函数(注意和矢量函数 ST_Union 区分)。该函数用于合并多个栅格瓦片为单一栅格,支持将分块的栅格数据拼接成完整的数据集,可处理单波段或多波段栅格,并提供多种重叠区域处理策略,是遥感影像拼接、生成镶嵌图、DEM 数据整合和栅格数据库构建的核心函数,使用率非常高,应熟练掌握该函数。
二、参数变体
函数共有 5 种变体,核心差异在于合并规则的配置方式:
sql
-- 基础变体:合并所有波段,默认使用LAST规则(后覆盖前)
raster ST_Union(setof raster rast);
-- 指定波段与合并规则(数组形式)
raster ST_Union(setof raster rast, unionarg[] unionargset);
-- 合并指定波段(如第2波段),默认LAST规则
raster ST_Union(setof raster rast, integer nband);
-- 为所有波段指定统一合并规则(如MAX)
raster ST_Union(setof raster rast, text uniontype);
-- 为指定波段设置特定规则(如第1波段用SUM,第2波段用MEAN)
raster ST_Union(setof raster rast, integer nband, text uniontype);
关键参数说明:
- rast:待合并的栅格集合(需具有相同的空间对齐方式,即像素大小、原点、旋转参数一致)。
- unionargset:unionarg数组,每个元素定义一个波段的合并规则,格式为:
ROW(band_number, 'union_type')(如 ARRAY[ROW(1, 'SUM'), ROW(2, 'MAX')])。 - uniontype:合并规则(适用于单波段或所有波段):
| 策略 | 描述 | 适用场景 |
|---|---|---|
| LAST | 取最后一个栅格的值(默认) | 时间序列数据最新值保留 |
| FIRST | 取第一个栅格的值 | 优先保留先输入的数据 |
| MIN | 取最小值 | 最低温度、海拔等场景 |
| MAX | 取最大值 | 最高温度、植被指数等场景 |
| COUNT | 计算重叠次数 | 数据可靠性评估 |
| SUM | 求和 | 累计降水量、人口总数等 |
| MEAN | 求平均值 | 气候数据平均化 |
| RANGE | 计算值域(max-min) | 数据波动范围分析 |
三、核心限制与预处理
- 空间对齐要求:
输入栅格必须具有相同的scalex、scaley、skewx、skewy、upperleftx、upperlefty(即对齐方式一致)。 - 检查方法:使用 ST_SameAlignment(rast1, rast2) 返回布尔值,或 ST_NotSameAlignmentReason(rast1, rast2) 获取具体差异原因。
- 修复方法:通过 ST_Resample 函数以某一栅格为参考,重采样其他栅格使其对齐。
- 波段数一致性:
输入栅格的波段数需一致,否则合并时会忽略多余波段或补零(可能导致数据错误)。
四、典型示例
示例 1:单波段合并(默认 LAST 规则)
sql
-- 合并分块的高程数据为完整DEM
SELECT
'完整DEM' AS name,
ST_Union(rast) AS merged_dem
FROM dem_tiles
WHERE region = '喜马拉雅山脉';
示例 2:多波段合并(自定义各波段规则)
sql
-- 合并航空影像的3个波段(RGB),分别设置不同规则
SELECT
ST_Union(
rast,
ARRAY[
ROW(1, 'LAST'), -- 红色波段:后拍摄覆盖前
ROW(2, 'MAX'), -- 绿色波段:取最大值(增强亮度)
ROW(3, 'MEAN') -- 蓝色波段:求均值(均衡色彩)
]::unionarg[]
) AS aerial_mosaic
FROM
aerials.boston
-- 取特定区域
WHERE
ST_Intersects(rast, ST_GeomFromText('POLYGON(...)', 26986));
使用场景:处理多时相遥感影像,不同波段采用不同融合策略。
示例 3:按空间范围过滤并合并
sql
-- 合并与城市边界相交的遥感瓦片
WITH city_boundary AS (
SELECT geom FROM cities WHERE name = '北京'
),
matching_tiles AS (
SELECT rast FROM satellite_tiles
WHERE ST_Intersects(rast, city_boundary.geom)
)
SELECT ST_Union(rast, 'SUM') AS urban_heat_rast
FROM matching_tiles;
五、优化建议
1. 预处理对齐:
- 提前通过 ST_Resample 对齐所有栅格,避免合并时动态调整带来的性能损耗。示例:
sql
WITH aligned_rasters AS (
SELECT ST_Resample(rast, ref_rast) AS rast -- ref_rast为参考栅格
FROM raster_tiles
)
SELECT ST_Union(rast) FROM aligned_rasters;
2. 空间过滤:
- 使用 ST_Intersects 过滤掉无关栅格,减少参与合并的数据量。
sql
SELECT ST_Union(rast)
FROM raster_tiles
WHERE ST_Intersects(rast, ST_Envelope(ST_GeomFromText('POLYGON(...)')));
3. 分块合并:
- 对超大数据集,先按区域分块合并(如按图幅编号),再合并分块结果,ST_Tile + ST_Union
- 使用临时表分步处理中间结果
4. 错误排查:
sql
-- 检查栅格对齐问题
SELECT
rid,
ST_SameAlignment(rast, (SELECT rast FROM raster_tiles LIMIT 1)) AS is_aligned,
ST_NotSameAlignmentReason(rast, (SELECT rast FROM raster_tiles LIMIT 1)) AS reason
FROM raster_tiles;
六、注意事项
1. 数据类型兼容性:
- 输入栅格的波段数据类型需一致(如均为16BUI),否则合并时可能触发隐式转换导致精度损失。
2. 无数据值处理:
- 输入栅格的NODATA值会被自动忽略,重叠区域中仅非NODATA像素参与计算。
若需保留NODATA,可先通过 ST_SetBandNoDataValue 统一设置。
3. 多版本差异:
- PostGIS 2.1.0 后,ST_Union(rast) 会合并所有波段(旧版本仅合并第 1 波段),需注意兼容性。
七、应用场景
1. 遥感影像镶嵌:
- 将多景卫星 / 航空影像拼接为大范围影像,支持色彩均衡(如MEAN规则)或时间序列最新值(LAST规则)。
2. 气象数据聚合:
- 合并不同时段的雷达回波数据,计算累计降水量(SUM规则)或最大强度(MAX规则)。
3. 矢量转栅格后处理:
- 结合 ST_AsRaster 生成的分块栅格,通过ST_Union合并为完整栅格数据集。
通过ST_Union函数,可高效实现栅格数据的拼接与合并,为大规模空间数据分析提供基础支持。合理处理栅格对齐、选择合适的合并策略,并结合并行计算技术,能显著提升栅格数据处理的效率和质量,满足遥感应用、地形分析和环境监测等领域的专业需求。