项目中遇到. Oracle Spatial GeoRaster 金字塔栅格存储 ,看了一些文档,下面是读书笔记。
1. Oracle Spatial GeoRaster简介
Oracle Spatial GeoRaster是Oracle Spatial 10g后的新特性。他允许存储、索引、查询、分析和传送栅格数据。GeoRaster使用一个基于组件的、逻辑分层并且多维的通用栅格数据模型。栅格中的核心数据是由栅格单元(或像素)组成的多维矩阵,且这些核心的栅格数据集可以进行分块,用于优化存储、检索和处理。
1.1 Oracle Spatial GeoRaster对象类型
在Oracle Spatial GeoRaster中主要使用两种新的对象类型SDO_GEORATSER和SDO_RATSER来存储栅格数据及其相关源数据。其中SDO_GEORATSER类型主要用于存储栅格数据集,SDO_RATSER对象包含一个BLOB字段,相关描述数据,SDO_Geometry对象,包含一个或者多个SDO_GEORATSER类型列的表称为栅格表(GeoRaster Table);而SDO_RATSER类型主要用于存储栅格对象对应的实际栅格数据,SDO_GEORATSER对象包含一个SDO_Geometry对象、相关元数据、RasterID、栅格数据表名,由SDO_RATSER类型生成的对象表称为栅格数据表(Raster Data Table,RDT)。栅格数据表用于存储一个栅格图像中的所有栅格数据,每条记录存储这个图像中的一个分块及这个分块的相关信息。
1.1.1 SDO_GEORATSER类型
Create TYPE SDO_GEORATSER as OBJECT
(
rasterType number, //5位整数,表示空间维数、分层和类型信息
spatialExtent SDO_Geometry, //数据覆盖的空间范围
rasterDataTable varchar2(32), //栅格数据表名
rasterID number, //标识栅格数据表编号
metadata XMlType //XML格式的元数据
);
1.1.2 SDO_RATSER类型
Create TYPE SDO_RATSER AS OBJECT
(
RasterID number, //数据块对应的编号
Pyramidlevel number, //数据块在金字塔模型中的级别
bandBlockNumber number, //数据块的层数
rowBlockNumber number, //数据块的行号
columnBlockNumber number, //数据块的列号
blockMBR SDO_Geometry, //数据块的最小外接矩形
rasterBlock BLOB //块数据
);
1.2 Oracle Spatial GeoRaster存储结构
GeoRatser使用一个系统数据表SDO_GEOR_SYSDATA_TABLE来维护栅格表和相应的栅格数据表及其它相关表格。每当一个新的栅格对象被创建的时候,要会使用SDO_GEOR.init函数给它指定一个栅格数据表并会分配一个RasterID值,所有的SDO_GEORATSER对象在创建时都会自动地记录在系统数据表 SDO_GEOR_SYSDATA_TABLE中。可通过栅格表中的栅格数据表名和RasterID唯一识别一个栅格对象。既可以将多个栅格对象的数据存储在同一个栅格数据表中,也可以分别单独存储。
通过对栅格表查找需要的那幅图像,找到该图的SDO_GEORATSER对象,得到所找图像的栅格数据表名及RasterID,再以此得到存储在栅格数据表中的SDO_RATSER对象,最后得到的SDO_RATSER对象存储了相关分块信息。
2. 金字塔栅格数据构建简介
栅格金字塔就是对原始栅格数据按照某种方法进行重新采样,以得到多种不同分辨率的栅格数据,但它们表示的地理区域是完全一样的。不同分辨率的栅格数据被分别组织在不同的层面内,最底层的是原始数据集上层数据量仅是相邻下层数据量的1/4。这样就可以针对不同数据精度的要求,提供不同分辨率的栅格数据。采用金字塔结构建立的栅格数据便于组织、存储和管理多尺度、多数据源的栅格数据,便于实现跨分辨率的索引与浏览。
3. 实现Oracle Spatial GeoRaster存储栅格金字塔
3.1 创建栅格表
CREATE TABLE georaster_jpgs_table
(
geoid number PRIMARY KEY NOT NULL,
georatser sdo_georaster
);
3.2 创建标准DML触发器
用于确保栅格对象的相关表及试图与栅格数据的协调性和完整性。
CALL SDO_GEOR_UTLCreateDMLTrigger (‘georaster_jpgs_table’,’ georatser’);
3.3 创建栅格数据表
CREATE TABLE ratser_data_table OF SDO_RASTER
(
PRIMARY KEY(RASTERID, PYRAMIDLEVEL, BANDBLOCKNUMBER, ROWBLOCKNUMBER, COLUMNBLOCKNUMBER)
);
3.4 地理参考系
DECLARE
geoobj sdo_georaster;
BEGIN
SELECT georatser INTO geoobj FROM georaster_jpgs_table
WHERE geoid=1 FOR UPDATE;
SDO_GEOR.georefernece( geoobj ,82394,1,
SDO_NUMBER_ARRAY(-28.5,0,1232804.04), SDO_NUMBER_ARRAY(0,13678.09) );
UPDATE georaster_jpgs_table set georaster= geoobj WHERE geoid=1;
COMMIT;
END;
3.5 构建栅格金字塔
DECLARE
geoobj sdo_georaster
BEGIN
SELECT georatser INTO geoobj FROM georaster_jpgs_table
WHERE geoid=1 FOR UPDATE;
SDO_GEOR.generatePyamid(geoobj , ’ resampling=NN’ ); --采用最邻近赋值法重新采样
UPDATE georaster_jpgs_table SET georatser= geoobj WHERE geoid=1;
COMMIT;
END;
3.6 对金字塔栅格数据入库
INSERT INTO georaster_jpgs_table (name, image) VALUES ('earth', SDO_GEOR.INIT(' ratser_data_table '));
4. 优势
基于Oracle Spatial GeoRaster 对栅格对象的金字塔式存储的实现,提供了功能强大的数据存储管理机制,且具有非常灵活的数据查询获取机制,对于海量遥感影像信息的存储和管理提供了有力的支持。