PostGIS实现二进制转栅格数据应用实践【ST_RastFromWKB】

全部文章内容请转公众号【时空智能计算】,原创不易,求关注支持,更多开源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:批量还原与栅格镶嵌

  • 工作流程:
  1. 存储多个栅格的 WKB 二进制。
  2. 批量还原为栅格对象。
  3. 使用ST_Union进行镶嵌合并。

五、性能与兼容性

1. 大数据量处理:

  • 对于超过 1GB 的栅格 WKB,建议分块传输与还原,避免内存溢出:

六、应用场景

1. 栅格数据备份与恢复:

  • 将栅格转换为 WKB 二进制存储于文件或数据库,实现高效备份与跨库恢复。

2. 跨平台数据交换:

… …

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

gerrywhu

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值