文章信息
- 刘峻明, 孙培基, 朱德海.
- Liu Junming, Sun Peiji, Zhu Dehai.
- 基于Oracle的林业应用影像数据库设计方案探讨
- Discussion on Design of Oracle-Based Image Library for Application to Forestry
- 林业科学, 2006, 42(增刊1): 90-95.
- Scientia Silvae Sinicae, 2006, 42(增刊1): 90-95.
-
文章历史
- 收稿日期:2005-06-24
-
作者相关文章
影像数据是林业系统中空间信息的重要来源, 林业资源监测、分析和预测以及退耕还林、天然林保护等国家重大林业建设工程也需要海量的影像数据作为支撑。近几年来, 使用大型关系型数据库来存贮和管理空间数据(包括矢量数据和影像数据)和属性数据是地理信息系统和遥感应用领域研究的重要课题。刘鹏等(2005)对基于大型关系型数据库进行影像数据和元数据的一体化管理和结构化存贮, 陶治宇等(2005)则基于Oracle的Spatial和interMedia模块采用分区方式进行多尺度影像数据组织的方法, 将多尺度影像数据库分影像集合、影像金字塔分层、影像分幅和影像分块4个工作区。软件产品方面, 国内外已有一些较为成熟的产品出现, 如Image Server System、TerraServer、TerraShare、Image Web Server、Image Map Library等(罗睿等, 2001), 有些是采用文件系统, 也有一些是采用关系型数据库, 如SQL Server等来存贮管理影像数据。
在Oracle 10g发布以前, 关系型数据库本身并不直接支持影像数据类型, 研究人员通常采用二进制大对象(binary large object, 简称BLOB)类型来存贮影像, 并在数据库上层开发中间件产品来解释BLOB的内容。2003年11月, Oracle公司发布了Oracle 10g, 其中一个很重要的特点是在其原来的空间数据支持模块(Spatial模块)中增加了对栅格数据的基本支持, 称为GeoRaster模块。正如对矢量数据的支持一样, Oracle 10g利用强大的面向对象功能定义了栅格数据的对象数据结构, 并提供了访问这些对象的PL/SQL工具包。这使得栅格和影像数据类型和整数、字符串等简单类型一样在数据库内部得到支持, 用户无需使用任何第三方软件即可查询和使用这些数据。
本文讨论在Oracle 10g环境中基于GeoRaster模块的支持如何设计影像数据库, 提出对影像的物理存贮和影像数据库的组织管理的可行方案, 并针对在Oracle中建立影像的金字塔、实现影像的压缩、影像索引等方面说明了具体的实现办法。
1 Oracle GeoRaster的数据模型 1.1 影像分块存贮技术影像数据的自然组织形式是像素矩阵, 按行或列存贮, 但这种方式对于海量数据存贮不是一种高效的存贮方式。为了提高海量遥感影像管理系统的存贮性能, 一般都要对遥感影像进行分块处理, 形成影像块, 以影像块为单位进行存贮, 并建立影像块的索引。这种数据组织方式对提高系统的性能很有帮助, 比如多磁盘数据分布、并行数据服务等。
Oracle GeoRaster模块采用影像分块存贮技术。它将一幅影像看成是一个三维矩阵, 三维分别是行、列、波段。为了能够存贮大数据量的影像, 也为了检索和处理方便, 将影像分割成许多个影像块(Block)来存贮, 每一块以BLOB类型来表示, 并使用Spatial模块中定义的几何对象类型(SDO-GEOMETRY对象类型)来定义每个块的范围。每个影像块是一个小的三维(行、列、波段)立方体。在进行分割时, 首先确定影像块的大小, 然后将影像分割成若干个完全等大的影像块, 当到了影像某一维的边界上不能正好形成一个影像块时, 就在影像块的空白处补0, 从而保证每个影像块总是等大的。假设影像总大小为M×N×K (行×列×波段), 影像块的大小为m×n×k, 那么可以按照式(1)来计算分割后行、列、波段各维的影像块数
![]() |
(1) |
式中:「⌉表示向上取整操作; Brow、Bcolumn、Bband分别表示行、列、波段维分割后的影像块数。
比如一个影像大小为5 000×4 000, 波段数为7, 如果定义Block的大小为25×256×3, 那么按照式(1)计算可得, 在行向将被分割成20块, 纵向被分割成16块, 波段维方向被分割成3块, 整个影像则被分割成20×16×3 = 960块。
1.2 SDO-GEORASTER对象和SDO-RASTER对象(Oracle公司, 2003a; 2003b)基于影像分块技术思想, Oracle定义了2个重要的对象类型:SDO-GEORASTER和SDO-RASTER。SDO-GEORASTER用于表示影像, 包括栅格数据集和相关的元数据; SDO-RASTER则用于表示被分割出来的影响块。如果一个表包含一个或多个SDO-GEORASTER字段, 那么这个表就称为GeoRaster表。用SDO-RASTER对象定义的对象表被称为Raster Data Table, 简称RDT表。SDO-GEORASTER对象的定义如下:
CREATE TYPE sdo-georaster AS OBJECT (
rasterType NUMBER,
spatialExtent SDO-GEOMETRY,
rasterDataTable VARCHAR2 (32),
rasterID NUMBER,
metadata XMLType);
其中:rasterType是Oracle定义的由5位数字组成的栅格类型值, 主要用于内部使用; spatialExtent是影像覆盖的地理空间范围; rasterDataTable是RDT表的名字, RDT表存贮栅格数据; rasterID是影像ID, 用于在SDO-GEORASTER和SDO-RASTER之间建立关联, 它必须与SDO-RASTER中存贮的rasterID匹配; Metadata是影像的元数据, 使用XML格式表达。SDO-RASTER对象的定义如下:
CREATE TYPE sdo-raster AS OBJECT (
rasterID NUMBER,
pyramidLevel NUMBER,
bandBlockNumber NUMBER,
rowBlockNumber NUMBER,
columnBlockNumber NUMBER,
BlockMBR SDO-GEOMETRY,
rasterBlock BLOB);
其中:rasterID是影像ID, 用于在SDO-GEORASTER和SDO-RASTER之间建立关联, 它必须与SDO-GEORASTER中存贮的rasterID匹配; pyramidLevel是金字塔层号, 表示这个BLOCK所属的影像金字塔层; bandBlockNumber是BLOCK在波段维方向的顺序号, 从1起算; rowBlockNumber是BLOCK在行方向的顺序号, 从1起算; columnBlockNumber是BLOCK在列方向的顺序号, 从1起算; blockMBR用于存贮BLOCK在影像中的行列方向的起止象素位置; rasterBlock保存了BLOCK的所有像素数据。
2 影像数据库的设计林业研究地域的范围通常从几百到几万平方千米, 场景大, 影像数据量也就大, 使用的影像数据分辨率也根据需要会从1米甚至到几百米。影像数据库的设计必须满足以下需求:支持海量、多分辨率、多波段影像数据库的存贮和管理; 支持快速定位和提取制定区域、指定波段的影像; 支持大场景影像的快速飞行浏览。
2.1 按影像层方式组织影像数据库影像数据库中包含了许许多多的影像数据。参照GIS中分层的管理方式, 将影像数据按照层的概念来管理, 比如某一地区某个时间的Landsat影像可以作为一个影像层, 同一地区某个时间的Spot影像可以作为另一个影像层, 或者通过RGB合成后形成的彩色图像也可以作为一个图层。
在林业应用中, 影像数据通常是由数据接收和生产单位进行过几何纠正后成果数据, 这些数据按照矩形网格划分成多个等大的影像图幅, 也就是说每一幅影像具有相同的地理范围跨度和相同的像素行列数。所以说, 一个影像层是由很多个影像图幅共同构成的。但是, 在真实地理空间中, 这些影像图幅实际上是连续的, 图幅划分主要是从文件大小和处理方便角度考虑。在Oracle数据库中, 考虑可以有2种方式来存贮和管理影像层:无缝影像层模式和分幅影像层模式。在实际应用时, 这2种模式可以混合起来使用。
2.1.1 无缝影像层模式将影像按照上面所述的存贮模型存入Oracle数据库, 不再受单个文件大小的限制, 从理论上说, 只要有足够多的物理磁盘空间, 就可以存贮非常巨大的影像。将所有的影像图幅拼接形成一个整体影像图, 这个过程只需要在影像入库时按照这种逻辑结构存入即可。这样, 一个影像层就对应了一个影像图, 只由一个GeoRaster对象管理。假如原来有10×10幅5 000×4 000的影像, 那么拼接之后就形成了一个50 000×40 000的影像。设计如下规则来管理影像层:同一影像数据库的所有影像层存在同一张表中, 不同的影像数据库存在不同的表中; 每个影像层分别对应一个RDT表, 这主要是考虑到由于影像可能非常大, RDT表中的记录数会很多, 为了提高搜索效率, 将不同图层的RDT表分开。按这种模式, 以图 1层次来管理影像数据库。
![]() |
图 1 无缝影像层模式下的影像数据库层次结构 Fig. 1 Hierarchy of image library under seamless layer model |
一级:影像数据库, 存贮影像数据库信息, 包括库名、描述信息等; 二级:影像层, 存贮影像层信息, 包括层名、描述信息等以及与图层对应的GeoRaster对象; 三级:RDT表, 是由SDO-RASTER对象生成的表, 包含了一个影像层所有分割后的影像块。
无缝存贮方式消除了图幅的概念, 在建立金字塔的时候, 由于有了更大范围的原始整体图像, 所以可以生成更多层次的金字塔结构。这对于快速的影像浏览漫游来说是有优势的。
2.1.2 分幅影像层模式所谓分幅存贮管理模式, 就是沿用文件模式下影像图幅的组织结构, 一个影像层由多个图幅构成。图幅除了作为图层的一个局部之外, 还隐藏了一些其他的信息, 比如影像图幅可能是基于某种标准而划分的, 这样图幅的编号就可能隐含了地理位置信息, 人们也习惯以图幅为单位进行影像的查询、定位、更新等操作。所以, 采用分幅存贮管理模式可以较好地迎合人们的习惯。在这种模式下, 不同的图幅分别由不同的GeoRaster对象来表示。设计如下规则来管理影像层:同一影像层的所有图幅存在同一张表中, 不同的影像层存在不同的表中; 每个影像层分别对应一个RDT表, 也就是说同一影像层的所有图幅共用相同的RDT表。这样, 整个影像数据库就可以按四级结构来管理, 见图 2。
![]() |
图 2 分幅影像层模式下的影像数据库层次结构 Fig. 2 Hierarchy of image library under tiled layer model |
一级:影像数据库, 存贮影像数据库信息, 包括库名、描述信息等; 二级:影像层, 存贮影像层信息, 包括层名、描述信息等; 三级:影像图幅, 包括层名、图幅名、描述信息等以及与图幅对应的GeoRaster对象; 四级:RDT表, 是由SDO-RASTER对象生成的表, 包含了一个影像层所有分割后的影像块。
2.1.3 影像块大小的确定计算机存贮以字节为单位, 通常在进行存贮空间划分时, 是以2的整数次幂个字节为单位的, 所以将影像块的大小确定为2的整数次幂将可以减少磁盘读写次数, 从而提高效率。另外, 2的整数次幂也可以简化构建金字塔的复杂度和便于构建空间索引。
分块大小对于读写性能是有影响的, 太小或者太大都会降低性能。根据张永生等(2004)提供的分块大小对磁盘性能的影响试验结果, 当块大小为32~64 k时可以获得最高的磁盘性能。这样, 如果将影像块大小(行数×列数×波段数)定为128×128×1B、128×128×2B、128×128×3B、256×256×1B、256×256×2B等几种情况都是比较合适的分块方式。Oracle公司也建议分块的行列数大小设在128×128或者256×256比较合适。根据测试, 当采用128×128时, 如果场景非常大, 则会生成非常多的影像块, 由于同一幅影像的影像块都是存贮在同一数据表中, 这样会使单表的记录数非常多, 影响到搜索性能, 所以建议采用256×256比较合适。
2.2 创建金字塔考虑到林业影像数据量大的特点, 为了加快影像显示速度, 必须创建影像金字塔。金字塔是一种多分辨率层次模型, 影像金字塔采用倍率方法构建, 从而形成多个分辨率层次, 从金字塔的底层到顶层分辨率越来越低, 金字塔级别为0表示原始影像数据, 没有任何的数据损失, 大于0的值表示分辨率越来越减低, 需要存储空间也越来越少。每一层金字塔的大小取决于原始影像的大小, 可以根据式(2)计算得来:
![]() |
(2) |
其中: r (0)、c (0)是原始影像的行数、列数; r (n)、c (n)是第n层金字塔的行数、列数; 「⌉表示向上取整。
每一层金字塔信息都是根据上一层金字塔计算得来, 第1层金字塔由第0层(原始影像)计算得来, 第2层金字塔由第1层金字塔计算得来, 依此类推, 当某一层金字塔的行数或列数在64与128之间时则停止。由此规则可以推算最大的金字塔层号的计算公式如式(3) :
![]() |
(3) |
其中:min表示取2个数中的更小数; ⌊」表示向下取整操作。
根据式(3)可知, 一个5 000×4 000的影像, 最大金字塔层号为5。Oracle提供了最邻近像素法、双线性插值法、立方卷积法、4邻域平均值法、16邻域平均值法等构建金字塔的方法。至于采用哪种方法更为合适, 则应根据实际应用中的精度要求而定。下面的PL/SQL程序实现对影像采用最邻近像素法创建金字塔:
declare
gr mdsys.sdo-georaster;
begin
--选定要创建金字塔的影像
select georaster into gr from georaster-table where georid=1 for update;
--生成金字塔
sdo-geor.generatePyramid (gr, 'resampling=NN');
--更新影像
update georaster-table set georaster = gr where georid=1;
commit;
end;
2.3 建立影像空间索引 2.3.1 无缝影像层模式下的空间索引一幅5 000×4 000的影像, 如果分波段存贮, 按256×256的方式进行分块, 那么在建立金字塔之后, 总共会生成960 + 240 + 60 + 18 + 6 + 3 = 1 287个Block, 分别对应了RDT表中的1 287条记录。而一个影像层通常都会包含成百上千个图幅, 所以, RDT表中的记录数将是以百万计的。当采用无缝存贮方式时, 为了加快影像块的搜索速度, 可以对RDT表创建空间索引。从前面可知, RDT表的BlockMBR成员是SDO-GEOMETRY类型, 用于保存每个Block在影像中的像素起止范围, 所以, 对BlockMBR字段建立空间索引可以极大地加速按空间范围搜索Block的能力。采用下面的SQL语句来对BlockMBR创建R树索引:
--将RDT表的BlockMBR字段注册到mdsys元数据表
insert into mdsys.user-sdo-geom-metadata
values ('GEORASTER-TABLE', 'BlockMBR',
sdo-dim-array (sdo-dim-element ('X', 0, 50 000, 0.005),
sdo-dim-element ('Y', 0, 40 000, 0.005)), null);
--创建R树索引
create index rtidx-geor-rdt on geor-rdt (BlockMBR)
indextype is mdsys.spatial-index;
2.3.2 分幅影像层模式的空间索引这种模式下, 所有影像图幅存贮在同一RDT表中, 尽管RDT表中的记录数会很多, 但由于单幅影像不会很大, 单幅影像所涉及到的记录数不会很多, 所以不需要对RDT表创建索引。但是当图幅数量很大时, 可以对图幅表创建空间索引, 以提高按图幅搜索的效率。由于图幅表中GeoRaster对象的空间范围不是作为一个独立字段存在, 而是利用sdo-geor.generateSpatialExtent ()函数来获取范围, 所以无法直接按常规的字段来创建空间索引, 而是需要用到Oracle中的根据函数创建索引的能力。
--将generateSpatialExtent ()函数注册到mdsys元数据表
insert into mdsys.user-sdo-geom-metadata
values ('GEORASTER-TABLE',
'sdo-geor.generateSpatialExtent (TOS-GEOR)',
sdo-dim-array (sdo-dim-element ('X', 0, 5 000, 0.005),
sdo-dim-element ('Y', 0, 4 000, 0.005)), null);
--使用generateSpatialExtent ()的返回结果创建R树索引
create index rtidx-geor-rdt on
georaster-table ('sdo-geor.generateSpatialExtent (geor)')
indextype is mdsys.spatial-index;
2.4 数据压缩目前的Oracle版本中并未提供影像压缩功能, 尽管元数据中定义了压缩类型这一项, 但GeoRaster的元数据中压缩类型的内容总是NONE。传输数据量的多少是影响性能的重要因素, 为了提高影像的快速提取和浏览能力, 在遵循Oracle框架结构的基础上加入数据压缩存贮功能。方案如下:1)在0层存贮无压缩的数据, 1层以上金字塔存贮压缩数据; 2)分别提供ZIP无损压缩和JPEG2000有损压缩方法; 3)压缩以栅格块进行, 即对RDT表中的每个BLOB分别压缩, 压缩后仍以BLOB类型存贮在数据表中; 4)扩展GeoRaster元数据中的压缩类型, 定义2个标识常量分别表示ZIP和JPEG2000压缩方法。如下:
<compression>
<type>JPEG2000</type>
</compression>
<compression>
<type>ZIP</type>
</compression>
在对进行过压缩的数据进行读取时, 必须首先调用解压缩模块进行还原, 解压缩过程也会耗去一定的时间, 但总的效率相对于压缩前还是要提高很多。如果采用有损压缩方式, 解压缩后会有失真, 但由于只是针对金字塔层才做有损压缩, 原始数据不压缩, 而金字塔层的数据主要是为快速显示服务, 在进行影像分析时可以采用未失真的原始数据, 不会影响分析结果的正确性。
3 原型系统实现基于上述设计方案, 实现了一个原型系统, 这里简单介绍该系统的实现方法。该系统大概可分为以下几个部分:数据导入模块、影像数据库访问模块、影像显示模块。
影像导入模块:使用开放源代码gdal软件包来读取tiff、img、bmp等格式的影像数据文件, 调用gdal中的zlib函数包对影像数据进行压缩, 然后使用Oracle公司(2003c)提供的底层访问工具包Oracle Call Interface (OCI)来将影像数据存入Oracle数据库, 数据导入后建立影像金字塔。gdal和OCI都是C语言接口。
影像数据库访问模块:提供对影像数据库建库、查询和修改影像库元数据、读取影像块等操作。使用Oracle公司(2003d)提供的面向对象工具包Oracle Objects for OLE (OO4O)来实现, OO4O简单易用, 适宜快速开发, 但只支持Windows平台, 且效率比OCI要低。
影像显示模块:提供显示影像库中的影像数据的功能, 自动根据显示比例尺计算出最佳显示分辨率, 然后对应到影像金字塔层, 再根据当前显示范围, 利用空间索引计算出要提取的影像数据块, 最后使用OCI来读取那些影像数据块, 使用Windows图形设备接口函数(graphics device interfaces, GDI)来将数据显示到窗口中。测试导入40 G的原始img格式影像到Oracle中, 建立金字塔和空间索引后, 基本上在1 s内能显示出来。
4 讨论本文着重讨论了基于Oracle 10g环境建立影像数据库的问题, 包括影像数据库的组织、影像块的大小确定、金字塔的建立、影像空间索引、影像压缩等。本文所阐述的影像数据库的存贮与管理以及性能优化技术能够满足无论是局域网还是因特网环境下的影像快速提取、显示、查询等需求。
对于影像数据库可能涉及到的其他问题, 如影像数据库更新、基于影像的分析等, 本文并未涉及。在目前的技术水平下, 基于大型的关系型数据库建立影像数据库主要是充分利用数据库所拥有的在共享、安全、多用户并发等优势来实现网络分布式环境下的影像数据显示、发布、查询以及与矢量的叠加等功能, 而对于基于影像的分析和处理基本上还是采取文件的方式来进行。当需要频繁对影像进行分析操作并将结果进行共享时, 会导致大量数据的转换操作, 从而使系统性能降低, 对于这种情形, 需要综合考虑, 利用数据库和文件的各自优势, 尽量提高性能, 这实际上是一个更高层次的问题, 也就是建立异构影像数据库的问题。
本文未涉及影像数据库的评价, 只是在导入部分测试数据后进行了简单的性能测试, 并没有从理论上提出相关指标。在这方面, 邓雪清等(2002)从系统体系结构以及抽象系统描述的角度, 研究视频数据存储系统和图像数据存储系统之间在要求上的差异, 并提出了海量数据存储系统的抽象代数模型与相应的评价指标。林业影像数据库作为一个对软件和硬件都要求比较高的专业数据库系统, 对其如何进行评价, 需要考虑到哪些指标, 是一个值得深入探讨的问题。
邓雪清, 罗睿, 李学友. 2002. 遥感图像海量存储系统的设计与分析. 遥感信息, (4): 5-9. DOI:10.3969/j.issn.1000-3177.2002.04.002 |
刘鹏, 毕建涛, 曹彦荣. 2005. 遥感影像数据库引擎设计与实现. 地球信息科学, 7(2): 105-110. DOI:10.3969/j.issn.1560-8999.2005.02.022 |
罗睿, 张永生, 李颖, 等. 2001. 一个基于数字地球框架的遥感图象信息系统. 信息工程大学学报, 2(1): 1-4. |
陶治宇, 马东洋, 徐青, 等. 2005. 基于Oracle多分辨率遥感影像数据库的设计. 测绘学院学报, 22(1): 65-68. |
张永生, 巩丹超, 刘军, 等. 2004. 高分辨率遥感卫星应用———成像模型、处理算法及应用技术. 北京: 科学出版社, 195-200.
|
Oracle公司.2003a. Oracle Spatial GeoRaster 10g Release 1
|
Oracle公司.2003b. Spatial User' s Guide and Reference 10g Release 1
|
Oracle公司.2003c. Oracle Call Interface Pragrammer' s Guide 10g Release 1
|
Oracle公司.2003d. Oracle Objects for OLE C ++ Class Library Developer' s Guide 10g Release 1
|