PostGIS实现栅格数据合并—影像拼接、镶嵌【ST_Union】

一、函数概述

上一节介绍了栅格数据分块 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) 数据波动范围分析

三、核心限制与预处理

  1. 空间对齐要求:
    输入栅格必须具有相同的scalex、scaley、skewx、skewy、upperleftx、upperlefty(即对齐方式一致)。
  2. 检查方法:使用 ST_SameAlignment(rast1, rast2) 返回布尔值,或 ST_NotSameAlignmentReason(rast1, rast2) 获取具体差异原因。
  3. 修复方法:通过 ST_Resample 函数以某一栅格为参考,重采样其他栅格使其对齐。
  4. 波段数一致性:
    输入栅格的波段数需一致,否则合并时会忽略多余波段或补零(可能导致数据错误)。

四、典型示例

示例 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函数,可高效实现栅格数据的拼接与合并,为大规模空间数据分析提供基础支持。合理处理栅格对齐、选择合适的合并策略,并结合并行计算技术,能显著提升栅格数据处理的效率和质量,满足遥感应用、地形分析和环境监测等领域的专业需求。

相关推荐
gerrywhu4 天前
PostGIS实现栅格分块与瓦片生成【ST_Tile】
postgis·栅格数据分析·栅格分块·遥感影像分块·栅格瓦片生成·st_tile·瓦片生成
gerrywhu6 天前
PostGIS实现栅格数据可视化-单波段映射为多波段彩色栅格【ST_ColorMap】
postgis·栅格分析·栅格数据可视化·st_colormap·多波段彩色栅格·彩色栅格
gerrywhu23 天前
PostGIS实现栅格数据坐标系转换【ST_Transform】
postgis·坐标转换·栅格分析·栅格数据坐标转换·栅格坐标转换·st_transform
丷丩1 个月前
第 2 篇:入门实操|3dtubetilecreater 环境搭建全教程(零踩坑版)
3d·gis·postgis·管线·自动建模·管网
GIS兵墩墩1 个月前
postgis--PostgreSQL16及其plpython3u扩展
python·postgis
GISBox2 个月前
PostGIS数据通过GISBox发布WFS/WMS全攻略
数据库·postgresql·wms·gis·postgis·矢量·gisbox
我是小超人-雨石花3 个月前
postgresql + postgis安装
数据库·postgresql·postgis·空间数据库
gis分享者4 个月前
使用postgresql、postgis数据库作为存储仓库,发布geoserver矢量切片服务(pbf切片)、矢量切片图层组服务
postgresql·geoserver·postgis·矢量切片·服务·pbf·图层组
❀͜͡傀儡师4 个月前
基于提供的镜像构建PostGIS、pgvector 的 PostgreSQL 18镜像的Dockerfile
数据库·postgresql·postgis