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相关知识技能分享,免费提供学习问答交流。

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.pswp.cn/web/81090.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

线性回归原理推导与应用(七):逻辑回归原理与公式推导

逻辑回归是一种分类算法,常用于二分类,也就是得出的结果为是和不是,例如通过各种因素判断一个人是否生病,信用卡是否违约等。逻辑回归在社会和自然科学中应用非常广泛, 前置知识 线性回归 逻辑回归的底层方法就是线…

Fastrace:Rust 中分布式追踪的现代化方案

原文链接:Fastrace: A Modern Approach to Distributed Tracing in Rust | FastLabs / Blog 摘要 在微服务架构中,分布式追踪对于理解应用程序的行为至关重要。虽然 tokio-rs/tracing 在 Rust 中被广泛使用,但它存在一些显著的挑战&#xf…

水果系列数据集- 葡萄grapes>> DataBall

该数据集可以用于目标检测,水果分类 ,文生图相关项目。 以下是图片样例:

HTTP协议接口三种测试方法之-postman

HTTP协议作为现代Web开发的基石,其接口测试是开发过程中不可或缺的环节。Postman作为最流行的API测试工具之一,能够极大提升我们的测试效率。本文将详细介绍如何使用Postman进行HTTP接口测试。 一、HTTP协议基础回顾 在开始使用Postman之前&#xff0c…

佰力博科技与您探讨半导体电阻测试常用的一些方法

一、两探针法​ 两探针法是一种较为基础的测试方法。该方法将两根探针与半导体样品表面紧密接触,通过电源在两根探针之间施加电压,同时使用电流表测量通过样品的电流,再根据欧姆定律计算电阻。​这种方法的优点在于操作简单、设备要求较低&a…

机器学习的一些基本概念

看了b站一个清华博士的视频做的笔记,对于人工智能的底层原理,训练方式,以及生成式文本输出,图片生成的底层原理有了一个了解,算是一个还不错的科普文。之前一直想要了解一下机器学习的入门原理,神经网络相关…

Python爬虫实战:研究Grab 框架相关技术

1. 引言 1.1 研究背景与意义 随着互联网的快速发展,网络上的数据量呈爆炸式增长。如何高效地获取和利用这些数据成为了当前的研究热点。网络爬虫作为一种自动获取网页内容的技术,能够按照一定的规则,自动地抓取万维网信息,在搜索引擎、数据挖掘、信息整合等领域有着广泛的…

uniapp 嵌入鸿蒙原生组件 具体步骤

关于怎么使用uniapp 嵌入鸿蒙原生组件 HBuilder X 版本 4.64 app-harmony文件下新建 index.uts button.ets button.ets里面复制uniapp 官方提供的 示例代码 https://uniapp.dcloud.net.cn/tutorial/harmony/native-component.html button.ets import { NativeEmbedBuilderO…

阿里云 OS Copilot 使用指南

安装: AlibabaCloudLinux: sudo yum install -y os-copilotUbuntu: curl -#S https://mirrors.aliyun.com/os-copilot/os-copilot-all-in-one-latest.sh | bash添加RAM用户 打开 https://ram.console.aliyun.com/users 复制AccessKey,Ac…

枚举类扩充处理

问题背景 由于 Java 不允许枚举继承另一个枚举(enum cannot extend enum),但可以通过 组合方式 或 工具类 来实现类似功能。 ✅ 解决方案一:组合方式引入原始枚举值 示例代码: public enum CustomErrorCodeEnum imp…

Spring Security探索与应用

Spring Security核心概念 框架定位与核心能力 Spring Security是Spring生态中实现应用级安全的核心框架,其官方定义为"强大且高度可定制的认证与访问控制框架"。作为Spring应用程序安全防护的事实标准解决方案,它通过模块化设计提供以下核心能力: 认证(Authenti…

蓝桥杯国14 不完整的算式

!!!!!!!!!!!!!!!理清思路 然后一步步写 问题描述 小蓝在黑板上写了一个形如 AopBC 的算式&#x…

扫描电镜:打开微观世界的“超维相机“

当你用手机拍摄一朵花的微距照片时,放大100倍已足够惊艳。但如果告诉你,科学家手中的"相机"能将物体放大百万倍,连病毒表面的蛋白突触都清晰可见,你是否会好奇这背后的黑科技?这把打开微观宇宙的钥匙&#x…

JVM学习(四)--对象内存布局

目录 一、对象内存布局 1、对象的实例化 1.1、你有几种方式创建对象? 1.2、创建对象的步骤 1.2.1、从字节码角度看待对象创建过程 1.2.2、从执行步骤角度分析 2、对象的内存布局 2.1、对象头 2.2、实例数据 2.3、对齐填充 3、对象的访问定位 3.1、句柄访…

SQL每日一题(4)

前言:第四更 虽然已经全部做完了,这套卷子非常推荐! 根据题目还原出来的原始表 employees表 idnameagestatus1张三28在岗2李四35在岗3王五42在岗4赵六NULL在岗5钱七58在岗6孙八24在岗7周九31离职8吴十-5在岗9郑十一45在岗10王十二52在岗 题…

如何做好一份技术文档?

文章目录 前言一、技术文档的核心原则二、技术文档的类型与场景三、技术文档的写作流程3.1 需求分析阶段(文档生产的基础)3.2 架构设计阶段(文档的骨架搭建)3.3 内容开发阶段(血肉填充)3.4 质量保障阶段&am…

怎么判断一个Android APP使用了KMM这个跨端框架

要判断一个 Android 应用是否使用了 KMM(Kotlin Multiplatform Mobile) 框架,可以通过以下方法逐步验证: 一、安装包结构分析 解压 APK 将 .apk 文件重命名为 .zip 并解压,检查以下特征: • kotlin/ 目录&a…

Axure系统原型设计列表版方案

列表页面是众多系统的核心组成部分,承担着数据呈现与基础交互的重要任务。一个优秀的列表版设计,能够极大提升用户获取信息的效率,优化操作体验。下面,我们将结合一系列精心设计的列表版方案图片,深入探讨如何打造出实…

HarmonyOS优化应用内存占用问题性能优化四

一、使用purgeable优化C内存 Purgeable Memory是HarmonyOS中native层常用的内存管理机制,可用于图像处理的Bitmap、流媒体应用的一次性数据、图片等。应用可以使用Purgeable Memory存放其内部的缓存数据,并由系统根据淘汰策略统一管理全部的purgeable内存…

第一课如何学习课程

读薄就这些东西 读厚细节;实现了还是很混沌(内功心法)-》有个项目;在听的过程中写博客:我学了什么,敲代码; 第二章 网络-》9.1kv存储 第三章 基础组件 (API函数、最基础的底层架构…