一、栅格数据类型概述
在 PostGIS 中,raster 是用于存储和处理栅格数据的核心数据类型,支持从多种格式(如JPEG、GeoTIFF、PNG、DEM)导入数据,每个栅格由一个或多个波段(Band)组成,每个波段包含规则排列的像素值矩阵,且栅格可通过空间参考信息(SRID、原点坐标、像素尺寸)实现地理配准。
二、栅格数据结构核心要素
-
波段(Band):
- 栅格的基本组成单元,每个波段存储特定类型的数据(如 RGB 图像包含红、绿、蓝三个波段)
- 支持多种像素类型(如 8 位无符号整数、32 位浮点等),可通过 ST_BandPixelType 查询
-
空间参考:
- SRID:栅格数据坐标系
- 原点坐标(ULX/ULY):栅格左上角像素的地理坐标
- 像素尺寸(ScaleX/ScaleY):每个像素代表的地理单位(如 1 米、0.001 度)
-
元数据:
- 存储在系统表 raster_columns 和 raster_overviews 中,包含栅格范围、波段数、NoData 值等信息
三、栅格与几何类型的转换
1. 自动转换
-- 栅格自动转换为 geometry(不推荐使用)
SELECT rast::geometry AS geom
FROM raster_table;
-- 等价于,(推荐使用 ST_ConvexHull)
SELECT ST_ConvexHull(rast) AS geom
FROM raster_table;
注意: 此自动转换可能在未来版本中移除,建议显式调用 ST_ConvexHull 或其他几何提取函数
2. 显式转换函数
| 函数 | 作用 | 示例 |
|---|---|---|
| ST_ConvexHull(rast) | 获取栅格外包络凸多边形 | SELECT ST_ConvexHull(rast) FROM ... |
| ST_Envelope(rast) | 获取栅格外包矩形 | SELECT ST_Envelope(rast) FROM ... |
| ST_AsRaster(geom) | 将几何转换为栅格(栅格化) | SELECT ST_AsRaster(geom, 10, 10) ... |
| ST_Polygon(rast) | 将栅格转换为等值面多边形 | SELECT ST_Polygon(rast, 1, 100) ... |
在栅格外接几何章节中会详细讲解栅格外接几何
四、栅格与几何交互操作
1. 空间查询
-- 查询与多边形相交的栅格
SELECT rast
FROM raster_table
WHERE ST_Intersects(rast, ST_GeomFromText('POLYGON(...)'));
-- 裁剪栅格至指定区域
SELECT ST_Clip(rast, ST_GeomFromText('POLYGON(...)')) AS clipped_rast
FROM raster_table;
2. 栅格化几何对象
-- 将多边形转换为100x100像素的栅格,值为1
SELECT ST_AsRaster(
ST_GeomFromText('POLYGON(...)'),
100, 100, -- 宽度和高度
ARRAY['8BUI'], -- 像素类型
ARRAY[1], -- 像素值
ARRAY[0] -- NoData值
) AS rasterized_polygon;
五、最佳实践与注意事项
-
避免依赖自动转换:
- 现有代码中若使用 rast::geometry,应替换为显式函数调用(如 ST_ConvexHull(rast) )
-
栅格与几何性能差异:
- 栅格操作(如 ST_MapAlgebra )适合并行计算,但存储空间需求大
- 几何操作(如 ST_Buffer )适合精确分析,但处理大规模数据时性能较低
-
GDAL依赖:
- 需确保 PostGIS 编译时启用 GDAL 支持(通过 SELECT postgis_full_version() 检查)
六、总结
raster作为PostGIS存储和处理栅格数据的核心类型,使得PostgreSQL可以存储处理栅格数据,也是GIS从业者更偏向使用PostgreSQL的一大原因,可以很方便的实现从矢量数据分析到遥感影像数据管理分析的全流程空间数据处理。