王 瑋
(中鐵第一勘察設(shè)計(jì)院集團(tuán)有限公司,陜西西安 710043)
柵格數(shù)據(jù)是一種重要的空間數(shù)據(jù)。隨著計(jì)算機(jī)、傳感器、空間技術(shù)的高速發(fā)展,影像、格網(wǎng)數(shù)字地面模型等柵格數(shù)據(jù)在急速增長(zhǎng),建立完善、易于應(yīng)用的柵格數(shù)據(jù)庫(kù)成為迫切的需要。柵格數(shù)據(jù)庫(kù)建立方式有很多種,可以直接采用二進(jìn)制對(duì)象存儲(chǔ),也可以采用空間數(shù)據(jù)引擎如Oracle spatial、ArcSDE等。從成本、效率、功能上各種方法都有自己的特點(diǎn),在應(yīng)用過(guò)程中要根據(jù)項(xiàng)目的需求及成本控制來(lái)選擇柵格數(shù)據(jù)庫(kù)的建立方式。在僅使用Oracle數(shù)據(jù)庫(kù)的情況下,常用的方式包括:二進(jìn)制對(duì)象存儲(chǔ)和GeoRaster模型存儲(chǔ)。前者簡(jiǎn)單方便,后者功能強(qiáng)大,對(duì)多源數(shù)據(jù)的支持完善。本文針對(duì)大范圍的柵格數(shù)據(jù),提出一種新的存儲(chǔ)模型:統(tǒng)一瓦片分塊模型。本模型簡(jiǎn)化GeoRaster模型分塊方式,建立統(tǒng)一的分塊方法,便于索引,易于應(yīng)用,是一種高效、低成本的解決方案。
二進(jìn)制對(duì)象(BLOB,Binary Large Object)是oracle的一種數(shù)據(jù)類型,用于存儲(chǔ)二進(jìn)制格式的數(shù)據(jù),如:影像、音頻、視頻等。Oracle發(fā)布到11g版本,已經(jīng)能支持大于4G byte的二進(jìn)制對(duì)象的存儲(chǔ),因此使用BOLB對(duì)象能存儲(chǔ)任意大小的柵格數(shù)據(jù)。使用二進(jìn)制對(duì)象存儲(chǔ)柵格數(shù)據(jù)是一個(gè)整體,其內(nèi)部的信息不能被解析,需建立相應(yīng)的表格存儲(chǔ)坐標(biāo)系及空間參考、數(shù)據(jù)類型等。
直接使用Blob建立柵格數(shù)據(jù)庫(kù)結(jié)構(gòu)簡(jiǎn)單,適合做數(shù)據(jù)存儲(chǔ),特別是按圖幅存儲(chǔ)的柵格數(shù)據(jù)。這種方式不具備空間分析及索引能力,而且獲取柵格數(shù)據(jù)的子區(qū)域數(shù)據(jù)較為困難,需將數(shù)據(jù)完全下載后進(jìn)行截取。
Oracle Spatial是Oracle內(nèi)置的一款空間數(shù)據(jù)引擎。GeoRaster 是Oracle Spatial的一個(gè)子集,它提供了柵格數(shù)據(jù)類型及關(guān)系對(duì)象方案,使得Oracle Spatial具備存儲(chǔ)、索引、查詢和分析空間柵格數(shù)據(jù)的能力。GeoRaster采用了金字塔影像、R-tree索引、瓦片分塊等技術(shù),對(duì)多數(shù)據(jù)源的數(shù)據(jù)有良好的兼容性。利用Oracle Spatial的空間索引,GeoRaster同樣具備良好的查詢性能。同時(shí)GeoRaster提供一系列的程序集,能完成基本的空間分析功能。GeoRaster是一個(gè)完整的,集存儲(chǔ)、查詢、分析于一體的空間柵格數(shù)據(jù)引擎。
GeoRaster在存儲(chǔ)方式上采用了瓦片分塊的方法。該方法將影像分為多個(gè)瓦片塊進(jìn)行存儲(chǔ),具體的實(shí)施方式是:以SDO_GEORASTER數(shù)據(jù)類型定義柵格對(duì)象的類型、空間范圍及元數(shù)據(jù),在影像坐標(biāo)系下將數(shù)據(jù)按行和列劃分為多個(gè)瓦片,由多個(gè)SDO_RASTER對(duì)象分別存儲(chǔ)(如圖1所示)。
圖1 GeoRaster的分塊結(jié)構(gòu)
瓦片式的柵格數(shù)據(jù)存儲(chǔ),能提高數(shù)據(jù)訪問(wèn)的效率,在數(shù)據(jù)使用時(shí),可根據(jù)需要獲取所需的柵格瓦片,大大降低了傳輸數(shù)據(jù)量。同時(shí)在數(shù)據(jù)顯示時(shí),基于2n的瓦片分塊能最大程度的提高紋理存儲(chǔ)和顯示效率。
GeoRaster瓦片分塊是以圖像坐標(biāo)系為基礎(chǔ)進(jìn)行的,與空間坐標(biāo)系存在一個(gè)轉(zhuǎn)換關(guān)系。因此存儲(chǔ)多個(gè)在空間上不連續(xù)或存在旋轉(zhuǎn)的圖像時(shí),各圖像分塊在空間上是獨(dú)立的。在某些數(shù)據(jù)應(yīng)用中,總是希望數(shù)據(jù)是以統(tǒng)一的分塊進(jìn)行存儲(chǔ),這樣可以降低應(yīng)用的復(fù)雜度,例如在數(shù)據(jù)融合時(shí),統(tǒng)一分塊的圖像可以按分塊各自進(jìn)行運(yùn)算(如圖2所示)。
圖2 統(tǒng)一瓦片分塊
因此,本文提出統(tǒng)一瓦片分塊的存儲(chǔ)模型?;诮y(tǒng)一瓦片分塊的存儲(chǔ),是將空間劃分為連續(xù)多層的格網(wǎng),然后以格網(wǎng)對(duì)影像進(jìn)行劃分和重新采樣,進(jìn)行存儲(chǔ)。如一般瓦片存儲(chǔ)一樣,本方法雖然在物理上采取分塊,但是在邏輯上,各柵格數(shù)據(jù)仍然是獨(dú)立的整體。采用本方法時(shí)數(shù)據(jù)需滿足如下條件:(1)同一種分塊方法存儲(chǔ)的柵格數(shù)據(jù)采用的像素分辨率必須相同或互為2n倍。(2)所存儲(chǔ)的柵格數(shù)據(jù)需在統(tǒng)一的坐標(biāo)系之下;如數(shù)據(jù)范圍較廣,需要分帶,則每個(gè)分帶需建立各自空間的格網(wǎng)分塊。
采用統(tǒng)一劃分的瓦片存儲(chǔ)基本思路如下:
①確定坐標(biāo)系和分塊基點(diǎn)。確定坐標(biāo)系和基點(diǎn),就是確定分塊的空間及原點(diǎn)位置,一般可采用(0,0)點(diǎn)作為基點(diǎn),也可采用特殊的點(diǎn)作為基點(diǎn)。
②確定基本像素分辨率和瓦片分塊大小。在確定這兩個(gè)要素之后,空間劃分的間距也就可以確定了。如:采用像素分辨率為0.5 m,分塊為256×256個(gè)像素。
③確定層數(shù),建立柵格數(shù)據(jù)金字塔。為了便于數(shù)據(jù)在不同尺度空間下的應(yīng)用,建立柵格數(shù)據(jù)金字塔是非常必要的。確定了金字塔層數(shù),也就確定了柵格數(shù)據(jù)的尺度范圍及劃分(如圖3所示)。
圖3 統(tǒng)一瓦片分塊模型的空間及尺度劃分
④對(duì)柵格數(shù)據(jù)進(jìn)行分塊存儲(chǔ)。首先計(jì)算柵格數(shù)據(jù)落入那些分塊的范圍,然后在各分塊內(nèi)對(duì)柵格數(shù)據(jù)進(jìn)行劃分,并進(jìn)行存儲(chǔ)。如影像存在旋轉(zhuǎn)角或分辨率不一致,則需進(jìn)行重采樣。
⑤建立金字塔數(shù)據(jù)。從0層起向上建立金字塔數(shù)據(jù),按照區(qū)域?qū)?yīng)關(guān)系,上一層的瓦片對(duì)應(yīng)下一層4個(gè)瓦片,通過(guò)合并和提取,可得到每層的瓦片數(shù)據(jù)。
至此統(tǒng)一瓦片分塊的柵格數(shù)據(jù)存儲(chǔ)體系建立完畢。采用本模型可以對(duì)數(shù)據(jù)進(jìn)行快速檢索。由于坐標(biāo)和分塊之間存在數(shù)學(xué)關(guān)系,通過(guò)坐標(biāo)即可獲得塊行列號(hào),以此進(jìn)行檢索即可獲得落入該區(qū)域的影像,并能獲得其柵格瓦片。由坐標(biāo)計(jì)算分塊行列號(hào)的公式為
(1)
式中(X0,Y0)表示基點(diǎn)坐標(biāo);(X,Y)表示要檢索的位置;INT表示向下取整;m表示分塊行號(hào);n表示分塊列號(hào)。
在對(duì)不同柵格數(shù)據(jù)的同一區(qū)域進(jìn)行數(shù)據(jù)處理時(shí),本模型也有明顯的性能優(yōu)勢(shì)。由于采用相同的瓦片劃分,在研究區(qū)域內(nèi)的不同柵格數(shù)據(jù)的瓦片能一一對(duì)應(yīng),非常易于處理。
根據(jù)統(tǒng)一劃分瓦片模型的原理,本文在Oracle中建立相應(yīng)的統(tǒng)一瓦片劃分柵格模型。
本模型定義了C_GeoRaster對(duì)象和C_RASTER對(duì)象,對(duì)應(yīng)于柵格數(shù)據(jù)對(duì)象和瓦片分塊對(duì)象,同時(shí)定義了rasterGrid 表,對(duì)應(yīng)于坐標(biāo)系分塊定義。
C_GeoRaster定義了柵格數(shù)據(jù)對(duì)象,一個(gè)柵格對(duì)象即代表一個(gè)柵格數(shù)據(jù),如一幅影像。柵格對(duì)象可作為一列放置到任意表中,用來(lái)表示柵格數(shù)據(jù)。含有C_GeoRaster對(duì)象的表稱為柵格數(shù)據(jù)表,C_GeoRaster結(jié)構(gòu)定義如下:
CREATE TYPE C_Georaster AS OBJECT (
rasterTable VARCHAR2(32),
rasterID NUMBER,
maxColumnNumber NUMBER,
minColumnNumber NUMBER,
maxRowNumber NUMBER,
minRowBlockNumber NUMBER,
rasterGridID NUMBER);
其中rasterTable為瓦片存儲(chǔ)表名稱,rasterID為柵格數(shù)據(jù)對(duì)象的唯一標(biāo)示符,maxColumnNumber,minColumnNumber,maxRowNumber,minRowBlockNumber表示該柵格數(shù)據(jù)對(duì)象對(duì)應(yīng)的分塊范圍,rasterGridID表示該柵格對(duì)象對(duì)應(yīng)的坐標(biāo)系分塊方法。
C_Raster定義了瓦片分塊對(duì)象。瓦片分塊對(duì)象存儲(chǔ)在單獨(dú)的瓦片數(shù)據(jù)表中,其結(jié)構(gòu)如下:
CREATE TYPE C_Raster AS OBJECT (
rasterID NUMBER,
pyramidLevel NUMBER,
bandBlockNumber NUMBER,
rowBlockNumber NUMBER,
columnBlockNumber NUMBER,
rasterBlock BLOB);
其中rasterID為所屬柵格數(shù)據(jù)對(duì)象編號(hào),pyramidLevel表示所處金字塔層號(hào),bandBlockNumber表示波段號(hào), rowBlockNumber表示行號(hào),columnBlockNumber表示列號(hào),rasterBlock為存儲(chǔ)的柵格數(shù)據(jù)。C_Raster對(duì)象以rasterID、pyramidLevel、bandBlockNumber、rowBlockNumber、columnBlockNumber為聯(lián)合主鍵。
rasterGrid坐標(biāo)系分塊定義表定義如下:
CREATE TABLE rasterGrid_table(
rasterGridID NUMBER,
SRID NUMBER,
baseX NUMBER,
baseY NUMBER,
blockSize NUMBER,
pixSize NUMBER)
表中rasterGridID 為坐標(biāo)系分塊唯一標(biāo)示符,SRID 為坐標(biāo)系標(biāo)識(shí)符,baseX、baseY 表示分塊基點(diǎn),blockSize表示分塊大小,pixSize表示0層像素分辨率。
在定義了以上對(duì)象和表格之后,統(tǒng)一瓦片分塊模型也就建立起來(lái)了,其結(jié)構(gòu)如圖4所示。
圖4 統(tǒng)一瓦片分塊模型數(shù)據(jù)庫(kù)結(jié)構(gòu)
為證明本方法的可行性與實(shí)用性,以正射影像的存儲(chǔ)和拼接為例進(jìn)行了試驗(yàn)。以某鐵路航測(cè)數(shù)據(jù)為試驗(yàn)對(duì)象,在Oracle 11g中建立柵格數(shù)據(jù)存儲(chǔ)模型,并以C++和OCI編寫了數(shù)據(jù)導(dǎo)入、合并及顯示程序。
在正射影像生產(chǎn)過(guò)程中,由于范圍廣闊,各航帶的正射影像都是單獨(dú)生成的,航帶間存在一定的轉(zhuǎn)角,圖5為航帶正射影像覆蓋范圍。為方便各測(cè)段影像的存儲(chǔ),并方便合并成一整幅的正射影像,故采用統(tǒng)一劃分瓦片模型來(lái)存儲(chǔ)正射影像。
圖5 航帶覆蓋區(qū)域
首先采用本文介紹的方法在Oracle中建立柵格數(shù)據(jù)表OrthoTable作為正射影像表,并建立瓦片表ortho_rt存儲(chǔ)瓦片數(shù)據(jù)。然后采用OCI編寫導(dǎo)入程序,將正射影像導(dǎo)入到表格中。
要獲得全航線完整的正射影像,需要對(duì)航帶影像進(jìn)行拼接。拼接只涉及航帶的重疊區(qū)域。因此,利用兩個(gè)航帶相交部分所處的瓦片分塊行列號(hào)相同,可很快查詢到航帶重疊的區(qū)域。取出該區(qū)域各航帶的瓦片,經(jīng)過(guò)拼接后再按分塊導(dǎo)入到全線正射影像。對(duì)于不重疊的航帶正射影像瓦片區(qū)域可以直接復(fù)制到全線正射影像。如圖6(a)展示了航帶H4與H5的重疊區(qū)域,圖中顯示的是H4瓦片將H5瓦片覆蓋的情形,圖6(b)為拼接后的瓦片影像。
圖6 瓦片拼接實(shí)例
實(shí)驗(yàn)證明:采用本模型存儲(chǔ)的影像,查詢速度快,在圖像的拼接處理過(guò)程中最大限度的減少了涉及的數(shù)據(jù)量,是一種高效簡(jiǎn)潔的模型。
在Oracle中建立柵格數(shù)據(jù)庫(kù)有多種方式可以選擇,統(tǒng)一瓦片分塊模型是一種面向應(yīng)用的模型,特別是涉及面積廣泛,數(shù)據(jù)源尺度較為接近的數(shù)據(jù)應(yīng)用。在此情況下,本模型相比于GeoRaster模型更為簡(jiǎn)單高效,索引簡(jiǎn)單,查詢快速,適用于各種數(shù)據(jù)應(yīng)用。而且本模型不需要Oracle Spatial模塊的支持,標(biāo)準(zhǔn)版的Oracle數(shù)據(jù)庫(kù)就能建立本模型,更能節(jié)約成本。本模型也具有一定的局限性,對(duì)于多源數(shù)據(jù)和多尺度數(shù)據(jù)需要建立多重坐標(biāo)系分塊,具體實(shí)施變得較為復(fù)雜,通用性上不及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的高光譜影像數(shù)據(jù)庫(kù)研究[J].北京測(cè)繪,2007(2):1-8
[4]陶治宇,馬東洋,徐 青,等.基于Oracle多分辨率遙感影像數(shù)據(jù)庫(kù)的設(shè)計(jì)[J].測(cè)繪學(xué)院學(xué)報(bào),2005,22(1):65-68
[5]蔣波濤,朱 強(qiáng),錢旭東.WebGIS開發(fā)實(shí)踐手冊(cè):基于ArcIMS、OGC和瓦片式GIS[M].北京:電子工業(yè)出版社,2009
[6]王 密,龔建雅,李德仁.大型無(wú)縫影像數(shù)據(jù)庫(kù)管理系統(tǒng)的設(shè)計(jì)與實(shí)現(xiàn)[J].武漢大學(xué)學(xué)報(bào):信息科學(xué)版,2003,28(3):294-299