PostGIS实现栅格数据转二进制应用实践【ST_AsBinary】
ST_AsBinary解析与应用实践(同ST_AsWKB)
- 一、函数概述
- 二、核心参数解析
- 三、典型用法示例
- 四、Out-DB 波段处理机制
- 五、二进制格式与其他格式的转换
- 六、性能与存储优化
- 七、应用场景
- 八、注意事项
- 九、扩展应用:基于Python Web的栅格二进制数据的网络传输
- 十、总结
一、函数概述
ST_AsBinary和ST_AsWKB是 PostGIS 中用于将栅格数据(raster)转换为二进制格式的工具函数,主要用于:
- 高效存储与传输栅格数据(避免文本格式的冗余)。
- 支持二进制游标(Binary Cursor)从数据库中提取数据。
- 兼容 OGC 标准的栅格二进制表示,便于与其他 GIS 系统交互。
两者本质功能相同,ST_AsWKB是ST_AsBinary的别名,均遵循 PostGIS 自定义的栅格 WKB(Well-Known Binary)格式规范。
二、核心参数解析
bytea ST_AsBinary(raster rast, -- 输入栅格boolean outasin = FALSE -- 控制外存波段处理方式
);
参数说明:
1. outasin 参数:
- FALSE(默认):外存波段(Out-DB Bands)在二进制中存储文件路径。
- TRUE:外存波段数据直接嵌入二进制中(类似内存波段),避免客户端访问文件路径权限问题。
2. 二进制格式规范:
-
PostGIS 栅格 WKB 格式遵循RFC2 规范,主要包含:
- 栅格元数据(宽度、高度、波段数等)。
- 每个波段的像素数据(按波段顺序存储)。
- 空间参考信息(SRID、仿射变换参数)。
三、典型用法示例
示例 1:导出栅格为二进制数据(内存波段)
-- 将栅格转换为二进制,用于二进制流传输
SELECT ST_AsBinary(rast) AS raster_binary
FROM satellite_raster
WHERE acquisition_date = '2023-07-15' AND band_id = 1;
应用:通过网络接口传输栅格数据时,二进制格式比其他格式(如 GeoTIFF)更高效。
示例 2:处理外存波段
-- 外存波段栅格转换为自包含二进制
SELECT ST_AsBinary(rast := dem_rast,outasin := TRUE -- 嵌入外存波段数据
) AS self_contained_binary
FROM raster_catalog
WHERE storage_type = 'out-db';
场景:当客户端无法访问服务器文件系统时,确保栅格数据完整传输。
示例 3:二进制数据导入与验证
-- 从二进制还原栅格并验证元数据
WITH binary_data AS (SELECT ST_AsBinary(rast) AS bin FROM dummy_rast WHERE rid = 1
),
restored_rast AS (SELECT ST_FromWKB(bin) AS rast FROM binary_data
)
SELECT ST_Width(rast) AS width,ST_Height(rast) AS height,ST_NumBands(rast) AS band_count
FROM restored_rast;
输出:验证还原栅格的元数据与原始栅格一致,确保二进制转换无损失。
四、Out-DB 波段处理机制
1. Out-DB 存储模式:
- 栅格像素数据存储在文件系统,数据库仅记录文件路径(如/path/to/raster_123.dat)。
- 优点:减少数据库体积,适合大尺寸栅格。
2. outasin=TRUE 的影响:
- 强制将 Out-DB 波段的像素数据读取并嵌入二进制中,转换为 In-DB 存储模式(临时)。
- 注意:可能导致二进制数据量大幅增加(如 1GB 栅格文件嵌入后二进制大小约 1GB)。
五、二进制格式与其他格式的转换
1. 二进制→栅格对象:
- 使用ST_FromWKB(bytea)或ST_FromBinary(bytea)还原栅格:
SELECT ST_FromWKB(raster_binary) AS restored_rast
FROM binary_storage;
2. 与 GDAL 格式互转:
- 先转换为二进制,再通过ST_AsGDALRaster导出为其他格式:
SELECT ST_AsGDALRaster(ST_FromWKB(raster_binary), 'GTiff') AS tiff_data
FROM binary_table;
六、性能与存储优化
1. 二进制传输效率:
- 相比文本格式,二进制格式传输速度提升约 30-50%,存储空间减少约 40%。
2. Out-DB 波段策略:
- 若客户端可访问服务器文件系统,保持outasin=FALSE(仅存储路径,传输效率更高)。
- 若需跨服务器传输,使用outasin=TRUE确保数据自包含。
3. 大栅格处理:
- 对大尺寸栅格(如 10GB+),建议分块转换(ST_Tile)后再二进制化,避免内存溢出。
七、应用场景
1. 数据库备份与恢复:
- 二进制格式用于栅格数据的高效备份,减少存储空间和恢复时间。
2. 实时数据传输:
- 遥感卫星数据实时入库时,通过二进制流快速写入数据库。
3. 跨平台数据交换:
- 与非 PostGIS 系统(如 ArcGIS、QGIS)交换栅格数据时,使用标准 WKB 格式。
4. 二进制缓存:
- 将频繁访问的栅格数据缓存为二进制,加速后续查询。
八、注意事项
1. 权限问题:
- outasin=FALSE时,客户端需有服务器文件系统的读取权限,否则无法解析 Out-DB 波段。
2. 数据一致性:
- 若 Out-DB 波段文件被删除或移动,outasin=FALSE的二进制数据将无法还原。
3. 版本兼容性:
- PostGIS 栅格 WKB 格式可能随版本更新,建议使用ST_Version()确认兼容性。
4. 二进制解析:
- 自定义程序解析栅格 WKB 时,需严格遵循RFC2 规范,注意字节序(大端 / 小端)。
九、扩展应用:基于Python Web的栅格二进制数据的网络传输
… …
全部文章内容请转【PostGIS专栏】,原创不易,求关注支持,更多开源GIS相关知识技能分享,免费提供学习问答交流。