王 玮
(中铁第一勘察设计院集团有限公司,陕西西安 710043)
栅格数据是一种重要的空间数据。随着计算机、传感器、空间技术的高速发展,影像、格网数字地面模型等栅格数据在急速增长,建立完善、易于应用的栅格数据库成为迫切的需要。栅格数据库建立方式有很多种,可以直接采用二进制对象存储,也可以采用空间数据引擎如Oracle spatial、ArcSDE等。从成本、效率、功能上各种方法都有自己的特点,在应用过程中要根据项目的需求及成本控制来选择栅格数据库的建立方式。在仅使用Oracle数据库的情况下,常用的方式包括:二进制对象存储和GeoRaster模型存储。前者简单方便,后者功能强大,对多源数据的支持完善。本文针对大范围的栅格数据,提出一种新的存储模型:统一瓦片分块模型。本模型简化GeoRaster模型分块方式,建立统一的分块方法,便于索引,易于应用,是一种高效、低成本的解决方案。
二进制对象(BLOB,Binary Large Object)是oracle的一种数据类型,用于存储二进制格式的数据,如:影像、音频、视频等。Oracle发布到11g版本,已经能支持大于4G byte的二进制对象的存储,因此使用BOLB对象能存储任意大小的栅格数据。使用二进制对象存储栅格数据是一个整体,其内部的信息不能被解析,需建立相应的表格存储坐标系及空间参考、数据类型等。
直接使用Blob建立栅格数据库结构简单,适合做数据存储,特别是按图幅存储的栅格数据。这种方式不具备空间分析及索引能力,而且获取栅格数据的子区域数据较为困难,需将数据完全下载后进行截取。
Oracle Spatial是Oracle内置的一款空间数据引擎。GeoRaster 是Oracle Spatial的一个子集,它提供了栅格数据类型及关系对象方案,使得Oracle Spatial具备存储、索引、查询和分析空间栅格数据的能力。GeoRaster采用了金字塔影像、R-tree索引、瓦片分块等技术,对多数据源的数据有良好的兼容性。利用Oracle Spatial的空间索引,GeoRaster同样具备良好的查询性能。同时GeoRaster提供一系列的程序集,能完成基本的空间分析功能。GeoRaster是一个完整的,集存储、查询、分析于一体的空间栅格数据引擎。
GeoRaster在存储方式上采用了瓦片分块的方法。该方法将影像分为多个瓦片块进行存储,具体的实施方式是:以SDO_GEORASTER数据类型定义栅格对象的类型、空间范围及元数据,在影像坐标系下将数据按行和列划分为多个瓦片,由多个SDO_RASTER对象分别存储(如图1所示)。
图1 GeoRaster的分块结构
瓦片式的栅格数据存储,能提高数据访问的效率,在数据使用时,可根据需要获取所需的栅格瓦片,大大降低了传输数据量。同时在数据显示时,基于2n的瓦片分块能最大程度的提高纹理存储和显示效率。
GeoRaster瓦片分块是以图像坐标系为基础进行的,与空间坐标系存在一个转换关系。因此存储多个在空间上不连续或存在旋转的图像时,各图像分块在空间上是独立的。在某些数据应用中,总是希望数据是以统一的分块进行存储,这样可以降低应用的复杂度,例如在数据融合时,统一分块的图像可以按分块各自进行运算(如图2所示)。
图2 统一瓦片分块
因此,本文提出统一瓦片分块的存储模型。基于统一瓦片分块的存储,是将空间划分为连续多层的格网,然后以格网对影像进行划分和重新采样,进行存储。如一般瓦片存储一样,本方法虽然在物理上采取分块,但是在逻辑上,各栅格数据仍然是独立的整体。采用本方法时数据需满足如下条件:(1)同一种分块方法存储的栅格数据采用的像素分辨率必须相同或互为2n倍。(2)所存储的栅格数据需在统一的坐标系之下;如数据范围较广,需要分带,则每个分带需建立各自空间的格网分块。
采用统一划分的瓦片存储基本思路如下:
①确定坐标系和分块基点。确定坐标系和基点,就是确定分块的空间及原点位置,一般可采用(0,0)点作为基点,也可采用特殊的点作为基点。
②确定基本像素分辨率和瓦片分块大小。在确定这两个要素之后,空间划分的间距也就可以确定了。如:采用像素分辨率为0.5 m,分块为256×256个像素。
③确定层数,建立栅格数据金字塔。为了便于数据在不同尺度空间下的应用,建立栅格数据金字塔是非常必要的。确定了金字塔层数,也就确定了栅格数据的尺度范围及划分(如图3所示)。
图3 统一瓦片分块模型的空间及尺度划分
④对栅格数据进行分块存储。首先计算栅格数据落入那些分块的范围,然后在各分块内对栅格数据进行划分,并进行存储。如影像存在旋转角或分辨率不一致,则需进行重采样。
⑤建立金字塔数据。从0层起向上建立金字塔数据,按照区域对应关系,上一层的瓦片对应下一层4个瓦片,通过合并和提取,可得到每层的瓦片数据。
至此统一瓦片分块的栅格数据存储体系建立完毕。采用本模型可以对数据进行快速检索。由于坐标和分块之间存在数学关系,通过坐标即可获得块行列号,以此进行检索即可获得落入该区域的影像,并能获得其栅格瓦片。由坐标计算分块行列号的公式为
(1)
式中(X0,Y0)表示基点坐标;(X,Y)表示要检索的位置;INT表示向下取整;m表示分块行号;n表示分块列号。
在对不同栅格数据的同一区域进行数据处理时,本模型也有明显的性能优势。由于采用相同的瓦片划分,在研究区域内的不同栅格数据的瓦片能一一对应,非常易于处理。
根据统一划分瓦片模型的原理,本文在Oracle中建立相应的统一瓦片划分栅格模型。
本模型定义了C_GeoRaster对象和C_RASTER对象,对应于栅格数据对象和瓦片分块对象,同时定义了rasterGrid 表,对应于坐标系分块定义。
C_GeoRaster定义了栅格数据对象,一个栅格对象即代表一个栅格数据,如一幅影像。栅格对象可作为一列放置到任意表中,用来表示栅格数据。含有C_GeoRaster对象的表称为栅格数据表,C_GeoRaster结构定义如下:
CREATE TYPE C_Georaster AS OBJECT (
rasterTable VARCHAR2(32),
rasterID NUMBER,
maxColumnNumber NUMBER,
minColumnNumber NUMBER,
maxRowNumber NUMBER,
minRowBlockNumber NUMBER,
rasterGridID NUMBER);
其中rasterTable为瓦片存储表名称,rasterID为栅格数据对象的唯一标示符,maxColumnNumber,minColumnNumber,maxRowNumber,minRowBlockNumber表示该栅格数据对象对应的分块范围,rasterGridID表示该栅格对象对应的坐标系分块方法。
C_Raster定义了瓦片分块对象。瓦片分块对象存储在单独的瓦片数据表中,其结构如下:
CREATE TYPE C_Raster AS OBJECT (
rasterID NUMBER,
pyramidLevel NUMBER,
bandBlockNumber NUMBER,
rowBlockNumber NUMBER,
columnBlockNumber NUMBER,
rasterBlock BLOB);
其中rasterID为所属栅格数据对象编号,pyramidLevel表示所处金字塔层号,bandBlockNumber表示波段号, rowBlockNumber表示行号,columnBlockNumber表示列号,rasterBlock为存储的栅格数据。C_Raster对象以rasterID、pyramidLevel、bandBlockNumber、rowBlockNumber、columnBlockNumber为联合主键。
rasterGrid坐标系分块定义表定义如下:
CREATE TABLE rasterGrid_table(
rasterGridID NUMBER,
SRID NUMBER,
baseX NUMBER,
baseY NUMBER,
blockSize NUMBER,
pixSize NUMBER)
表中rasterGridID 为坐标系分块唯一标示符,SRID 为坐标系标识符,baseX、baseY 表示分块基点,blockSize表示分块大小,pixSize表示0层像素分辨率。
在定义了以上对象和表格之后,统一瓦片分块模型也就建立起来了,其结构如图4所示。
图4 统一瓦片分块模型数据库结构
为证明本方法的可行性与实用性,以正射影像的存储和拼接为例进行了试验。以某铁路航测数据为试验对象,在Oracle 11g中建立栅格数据存储模型,并以C++和OCI编写了数据导入、合并及显示程序。
在正射影像生产过程中,由于范围广阔,各航带的正射影像都是单独生成的,航带间存在一定的转角,图5为航带正射影像覆盖范围。为方便各测段影像的存储,并方便合并成一整幅的正射影像,故采用统一划分瓦片模型来存储正射影像。
图5 航带覆盖区域
首先采用本文介绍的方法在Oracle中建立栅格数据表OrthoTable作为正射影像表,并建立瓦片表ortho_rt存储瓦片数据。然后采用OCI编写导入程序,将正射影像导入到表格中。
要获得全航线完整的正射影像,需要对航带影像进行拼接。拼接只涉及航带的重叠区域。因此,利用两个航带相交部分所处的瓦片分块行列号相同,可很快查询到航带重叠的区域。取出该区域各航带的瓦片,经过拼接后再按分块导入到全线正射影像。对于不重叠的航带正射影像瓦片区域可以直接复制到全线正射影像。如图6(a)展示了航带H4与H5的重叠区域,图中显示的是H4瓦片将H5瓦片覆盖的情形,图6(b)为拼接后的瓦片影像。
图6 瓦片拼接实例
实验证明:采用本模型存储的影像,查询速度快,在图像的拼接处理过程中最大限度的减少了涉及的数据量,是一种高效简洁的模型。
在Oracle中建立栅格数据库有多种方式可以选择,统一瓦片分块模型是一种面向应用的模型,特别是涉及面积广泛,数据源尺度较为接近的数据应用。在此情况下,本模型相比于GeoRaster模型更为简单高效,索引简单,查询快速,适用于各种数据应用。而且本模型不需要Oracle Spatial模块的支持,标准版的Oracle数据库就能建立本模型,更能节约成本。本模型也具有一定的局限性,对于多源数据和多尺度数据需要建立多重坐标系分块,具体实施变得较为复杂,通用性上不及GeoRaster模型。
[1]ORACLE. Oracle Spatial GeoRaster Developer’s Guide 11g Release1[M]. ORACLE, 2008
[2]ORACLE. Oracle Call Interface Programmer’s Guide 11g Release1 [M]. ORACLE, 2008
[3]孙 婷,张立朝,唐汉松,等.基于Oracle的高光谱影像数据库研究[J].北京测绘,2007(2):1-8
[4]陶治宇,马东洋,徐 青,等.基于Oracle多分辨率遥感影像数据库的设计[J].测绘学院学报,2005,22(1):65-68
[5]蒋波涛,朱 强,钱旭东.WebGIS开发实践手册:基于ArcIMS、OGC和瓦片式GIS[M].北京:电子工业出版社,2009
[6]王 密,龚建雅,李德仁.大型无缝影像数据库管理系统的设计与实现[J].武汉大学学报:信息科学版,2003,28(3):294-299