全部文章内容请转公众号【时空智能计算】,原创不易,求关注支持,更多开源GIS相关知识技能分享,免费提供学习问答交流。
一、函数概述
ST_RastFromWKB是 PostGIS 中用于将二进制表示(WKB,Well-Known Binary)转换为栅格对象(raster)的工具函数。作为ST_AsBinary/ST_AsWKB的逆函数,它支持从二进制数据中恢复完整的栅格元数据(如范围、分辨率、波段数)和像素值,是栅格数据跨平台传输、存储和序列化的关键工具。
二、核心参数与返回值
raster ST_RastFromWKB(bytea wkb);
参数说明:
- wkb:符合 PostGIS 栅格 WKB 格式的二进制数据(通过ST_AsWKB或ST_AsBinary生成)。
- 返回值:
还原后的raster对象,包含完整的栅格元数据和像素值。
三、WKB 格式与还原原理
1. 栅格 WKB 格式规范:
PostGIS 栅格 WKB 遵循RFC2 规范,结构如下:
- 字节序标记:大端(0x00)或小端(0x01)。
版本号:当前为 1。 - 元数据块:包含栅格尺寸、分辨率、仿射变换参数、SRID 等。
- 波段块:每个波段的像素数据(按波段顺序存储)。
2. 还原流程:
- 解析二进制头文件,获取栅格基本元数据(宽度、高度、波段数等)。
- 读取仿射变换参数,重建栅格空间参考。
- 按波段解析像素数据,恢复每个波段的数值。
四、典型用法示例
示例 1:从二进制还原栅格并验证元数据
-- 定义WKB二进制数据(示例数据,实际应通过[ST_AsWKB](https://blog.csdn.net/laowe4535fdvdsa4t6qe/article/details/148197940?spm=1001.2014.3001.5501)生成)
WITH wkb_data AS (
SELECT '\001\000\000\000\000\000\000\000\000\000\000\000@\000\000\000\000\000\000\010@\000\000\000\000\000\000\340?\000\000\000\000\000\000\340?\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\012\000\000\000\012\000\024\000'::bytea AS wkb
),
-- 还原栅格并获取元数据
restored_rast AS (
SELECT ST_RastFromWKB(wkb) AS rast FROM wkb_data
)
SELECT
(ST_Metadata(rast)).* AS metadata,
ST_NumBands(rast) AS band_count,
ST_Value(rast, 1, 1, 1) AS sample_value
FROM restored_rast;
-- 输出结果:
Name |Value|
------------+-----+
upperleftx |0.5 |
upperlefty |0.5 |
width |10 |
height |20 |
scalex |2.0 |
scaley |3.0 |
skewx |0.0 |
skewy |0.0 |
srid |10 |
numbands |0 |
band_count |0 |
sample_value| |
- 输出解析:
元数据显示还原栅格的左上角坐标为 (0.5, 0.5),宽度 10,高度 20,分辨率为 2×3,无倾斜,SRID=10,无波段(numbands=0可能为示例数据特性)。
示例 2:基于Python Web开发的网络传输场景下的栅格还原,开发中较为常见
运行
# Python示例:通过HTTP接收栅格WKB并还原
import psycopg2
from flask import request, jsonify
@app.route('/restore-raster', methods=['POST'])
def restore_raster():
wkb_data = request.data # 接收二进制数据
conn = psycopg2.connect("dbname=gis")
cur = conn.cursor()
cur.execute(
"SELECT ST_AsText(ST_Envelope(ST_RastFromWKB(%s)))",
(psycopg2.Binary(wkb_data),)
)
envelope = cur.fetchone()[0]
return jsonify({"envelope": envelope})
- 应用场景:
客户端将栅格 WKB 通过 API 传输至服务器,服务器还原后返回栅格范围,用于快速预览或空间查询。
示例 3:批量还原与栅格镶嵌
- 工作流程:
- 存储多个栅格的 WKB 二进制。
- 批量还原为栅格对象。
- 使用ST_Union进行镶嵌合并。
五、性能与兼容性
1. 大数据量处理:
- 对于超过 1GB 的栅格 WKB,建议分块传输与还原,避免内存溢出:
…
六、应用场景
1. 栅格数据备份与恢复:
- 将栅格转换为 WKB 二进制存储于文件或数据库,实现高效备份与跨库恢复。
2. 跨平台数据交换:
… …