PostGIS实现栅格分块与瓦片生成【ST_Tile】

一、函数概述

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的灵活分块能力,可高效实现栅格数据的切分与管理,是构建空间数据基础设施和高性能地理信息系统的关键工具。合理设置分块尺寸与填充策略,能显著提升数据处理效率与系统扩展性。

相关推荐
gerrywhu2 天前
PostGIS实现栅格数据可视化-单波段映射为多波段彩色栅格【ST_ColorMap】
postgis·栅格分析·栅格数据可视化·st_colormap·多波段彩色栅格·彩色栅格
gerrywhu19 天前
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
梦想画家4 个月前
PostGIS实战指南:从环境搭建到LBS周边查询(含常用函数)
postgresql·postgis·lbs