
一、函数概述
ST_Tile 用于将单张栅格分割为多个瓦片(Tile)。通过指定目标瓦片的宽度和高度,可将原始栅格按规则网格切割,支持边缘瓦片填充 NoData 值以确保所有瓦片尺寸一致。适用于栅格数据分布式存储、网络地图服务(如切片地图)及大规模数据分块处理。
二、函数变体
函数共有 3 种变体,核心差异在于波段选择和参数传递方式:
sql
-- 变体1:指定多波段分块
setof raster ST_Tile(raster rast, int[] nband, integer width, integer height, boolean padwithnodata=FALSE, double precision nodataval=NULL);
-- 变体2:指定单波段分块
setof raster ST_Tile(raster rast, integer nband, integer width, integer height, boolean padwithnodata=FALSE, double precision nodataval=NULL);
-- 变体3:默认处理所有波段
setof raster ST_Tile(raster rast, integer width, integer height, boolean padwithnodata=FALSE, double precision nodataval=NULL);
关键参数说明:
1. 分块尺寸(width/height):
- 目标瓦片的像素宽度和高度(如width=256, height=256)。
2. 填充模式(padwithnodata):
- FALSE(默认):边缘瓦片允许尺寸不一致(如原始栅格宽度 = 300,分块宽度 = 256,则最后一个瓦片宽度 = 44)。
- TRUE:边缘瓦片通过填充nodataval扩展至指定尺寸,确保所有瓦片尺寸统一。
3. NoData 值(nodataval):
- 填充时使用的 NoData 值,若未指定则沿用原始栅格的 NoData 值;多波段时按顺序应用(不足时重复最后一个值)。
三、典型示例
示例 1:默认分块(不填充边缘瓦片)
sql
-- 将9x9像素的栅格分割为3x3的瓦片(共9块,边缘无填充)
WITH source_rast AS (
SELECT ST_MakeEmptyRaster(9, 9, 0, 0, 1, -1, 0, 0) AS rast
)
SELECT ST_Tile(rast, 3, 3) FROM source_rast;
输出:生成 9 个 3x3 瓦片,无填充,边缘瓦片与中心瓦片尺寸一致(因原始尺寸为分块尺寸整数倍)。
示例 2:填充边缘瓦片(统一尺寸)
sql
-- 将10x10像素的栅格分割为3x3瓦片,边缘填充NoData(值为0)
SELECT ST_Tile(
rast,
width := 3,
height := 3,
padwithnodata := TRUE,
nodataval := 0
) AS tiled_rast
FROM (SELECT ST_MakeEmptyRaster(10, 10, 0, 0, 1, -1, 0, 0) AS rast) AS src;
- 输出:横向切割为 4 列(3+3+3+1→填充为 3+3+3+3),纵向 4 行。
- 最后一列和最后一行瓦片通过填充 0 值扩展至 3x3。
示例 3:指定单波段分块
sql
-- 仅分割第2波段,填充NoData值为255
SELECT ST_Tile(
rast,
nband := 2,
width := 512,
height := 512,
padwithnodata := TRUE,
nodataval := 255
) AS band2_tiles
FROM multispectral_raster;
使用场景:多光谱影像中仅处理特定波段(如红外波段),节省计算资源。
四、分块逻辑与瓦片编号
1. 切割顺序:
- 从左上(原点)开始,按行优先顺序切割(先横向切割列,再纵向切割行)。
2. 编号规则:
- 无显式编号字段,瓦片顺序由切割顺序决定,可通过ST_Envelope获取瓦片空间范围关联其他数据。
3. 空间参考继承:
- 每个瓦片继承原始栅格的 SRID、像素尺寸和原点偏移,确保空间位置正确。
五、性能优化
1. 大尺寸栅格处理:
- 避免对超大型栅格(如 10 万 ×10 万像素)直接分块,建议先通过ST_Clip分区域处理。
sql
WITH clipped_rast AS (
SELECT ST_Clip(rast, ST_MakeEnvelope(0, 0, 1000, 1000, 26986)) AS rast
FROM large_raster
)
SELECT ST_Tile(rast, 256, 256) FROM clipped_rast;
2. NoData 值兼容性:
- 填充值需与波段数据类型兼容(如8BUI波段不能填充负数)。
- 多波段填充时,nodataval可指定数组(如ARRAY[0, 255]分别对应波段 1 和波段 2)。
3. 内存管理:
- 分块过程中内存占用与瓦片数量成正比,建议分批处理或增加 PostgreSQL 共享内存配置。
4. 分布式存储:
- 分块后瓦片可存储于分布式文件系统(如 HDFS),将其注册为外部栅格(Out-DB Raster)。
六、应用场景
1. 网络地图服务(WMS/WMTS):
- 将影像栅格切割为 256×256 像素的瓦片,按金字塔层级存储,支持前端地图快速加载。
sql
-- 生成金字塔层级瓦片(层级1:512x512,层级2:256x256,这里用到with递归查询)
WITH pyramid_levels AS (
SELECT 512 AS size UNION ALL SELECT 256 AS size
)
SELECT ST_Tile(rast, size, size) AS tile
FROM raster_source, pyramid_levels;
2. 并行计算预处理:
- 将大型栅格分块后,利用 PostgreSQL 并行查询或外部计算框架(如 Spark)并行处理每个瓦片。
3. 栅格数据分发:
- 分块后瓦片可独立传输或存储,适用于离线数据共享或移动设备部署。
七、总结
通过ST_Tile的灵活分块能力,可高效实现栅格数据的切分与管理,是构建空间数据基础设施和高性能地理信息系统的关键工具。合理设置分块尺寸与填充策略,能显著提升数据处理效率与系统扩展性。