韋 波,王熙宇,楊東興
(1.桂林理工大學(xué)廣西礦冶與環(huán)境科學(xué)實(shí)驗(yàn)中心,廣西 桂林 541004;2.桂林理工大學(xué)測(cè)繪地理信息學(xué)院,廣西 桂林 541004)
Oracle Spatial三維模型存儲(chǔ)與可視化
韋 波1,2,王熙宇1,2,楊東興2
(1.桂林理工大學(xué)廣西礦冶與環(huán)境科學(xué)實(shí)驗(yàn)中心,廣西 桂林 541004;2.桂林理工大學(xué)測(cè)繪地理信息學(xué)院,廣西 桂林 541004)
論述Oracle Spatial三維空間數(shù)據(jù)模型,以存儲(chǔ)表面的方式設(shè)計(jì)了三維模型的數(shù)據(jù)庫(kù)存儲(chǔ)方案,同時(shí)引入Hibernate對(duì)象持久化技術(shù)并自行設(shè)計(jì)開發(fā)了SDO_GEOMETRY映射類,結(jié)合Java 3D實(shí)現(xiàn)了三維模型的可視化。結(jié)果表明構(gòu)建的存儲(chǔ)與可視化方案可行。
Oracle Spatial;三維空間數(shù)據(jù)存儲(chǔ);可視化
Oracle Spatial作為對(duì)象-關(guān)系型數(shù)據(jù)庫(kù)的典型代表,一直是地理信息系統(tǒng)(GIS)研究與應(yīng)用的主要對(duì)象之一。王云帆探討了Oracle Spatial的特點(diǎn),并應(yīng)用數(shù)據(jù)庫(kù)技術(shù)實(shí)現(xiàn)了空間數(shù)據(jù)管理與操作[1];盧廷軍等以O(shè)racle Spatial為工具,建立了海量柵格數(shù)據(jù)的空間索引[2];Bianca等提出了Oracle Spatial 3D點(diǎn)云數(shù)據(jù)的四叉樹索引方法[3];馬奎等在.NET環(huán)境下,基于OO4O核心實(shí)現(xiàn)了對(duì)Oracle Spatial空間數(shù)據(jù)的互操作[4];鄔群勇等使用Oracle Spatial SDO_GEOMETRY抽象幾何數(shù)據(jù)類型存儲(chǔ)環(huán)境空間數(shù)據(jù),實(shí)現(xiàn)了OLAP和GIS的完全集成[5];錢華明、戴建旺、高光大、馮興杰等分別應(yīng)用Oracle Spatial建立了WebGIS車輛監(jiān)控系統(tǒng)[6]、土地調(diào)查國(guó)家級(jí)數(shù)據(jù)庫(kù)[7]、鐵礦資源潛力數(shù)據(jù)庫(kù)[8]、航油公司EAM系統(tǒng)[9]。
雖然目前對(duì)Oracle Spatial的研究與應(yīng)用取得了較多的成果,但主要集中于二維空間數(shù)據(jù)方面。Oracle從11g版本開始支持對(duì)三維空間數(shù)據(jù)的存儲(chǔ)與管理,因此,本文結(jié)合Hibernate對(duì)象持久化和Java 3D,討論Oracle Spatial的三維空間數(shù)據(jù)存儲(chǔ)與可視化技術(shù)。
1.三維存儲(chǔ)模型
如圖1所示,表面、形體和組合類型是三維存儲(chǔ)模型中所特有的,在二維存儲(chǔ)模型中不支持。表面和構(gòu)成形體的表面目前只能是三維平面,不能是三維曲面。組合類型不同于二維的復(fù)合線串、復(fù)合多邊形等復(fù)合類型[1],組合類型只能是表面、形體等同類型三維對(duì)象間的組合,復(fù)合類型在三維存儲(chǔ)模型中不支持。多邊形類型包括含洞的多邊形。集合可以是點(diǎn)、線、多邊形的集合,也可以是表面、形體的集合,包括由同類型對(duì)象構(gòu)成的(同質(zhì))集合和由不同類型對(duì)象構(gòu)成的(異質(zhì))集合。
圖1 Oracle Spatial三維存儲(chǔ)模型
2.SDO_GEOMETRY三維對(duì)象存儲(chǔ)
SDO_GEOMETRY在Oracle Spatial中被定義為一個(gè)對(duì)象類型,共包含5個(gè)屬性:
與二維版本相比,SDO_GEOMETRY及其5個(gè)屬性的定義形式均沒(méi)有發(fā)生變化,只是將它們擴(kuò)展到三維的應(yīng)用環(huán)境。
圖2中多邊形的SDO_GEOMETRY二維、三維空間存儲(chǔ)表示如下,可對(duì)比看出二者的明顯異同。
圖2 多邊形示例
圖3為Google Earth上的兩個(gè)建筑物三維模型,其中一個(gè)為教堂(右下角),而另一個(gè)為辦公大樓。
圖3 3D模型實(shí)例
1.總體框架
總體分為3層:數(shù)據(jù)庫(kù)層、持久化層、可視化層,如圖4所示。數(shù)據(jù)庫(kù)層使用Oracle Spatial存儲(chǔ)三維模型數(shù)據(jù)。持久化層通過(guò)對(duì)象-關(guān)系映射(object-relation mapping,ORM),處理面向?qū)ο蠛兔嫦蜿P(guān)系二者之間的映射,實(shí)現(xiàn)模型的面向?qū)ο蟛僮?,采用Hibernate技術(shù)實(shí)現(xiàn)??梢暬瘜佑蒍ava 3D構(gòu)建虛擬場(chǎng)景,完成三維模型的顯示。
引入Hibernate的原因在于當(dāng)將空間對(duì)象從數(shù)據(jù)庫(kù)重新加載至內(nèi)存時(shí),由于Java、C++、C#等高級(jí)程序設(shè)計(jì)語(yǔ)言缺乏與SDO_GEOMETRY直接映射的數(shù)據(jù)類型,不能直接構(gòu)建空間對(duì)象對(duì)應(yīng)的類,進(jìn)而不能直接實(shí)現(xiàn)面向?qū)ο蟮牟僮鳎欢鳫ibernate則能夠方便而快速地建立持久化層和ORM[10],解決對(duì)象持久化問(wèn)題,實(shí)現(xiàn)對(duì)空間對(duì)象的面向?qū)ο蟛僮鳌?/p>
圖4 三維模型可視化總體框架
2.數(shù)據(jù)庫(kù)表設(shè)計(jì)與數(shù)據(jù)導(dǎo)入
從Google Earth位置工具欄可以看出,教堂模型共包括15個(gè)屋頂和48個(gè)墻面,而辦公大樓模型共包括14個(gè)屋頂和131個(gè)墻面。如果將模型整體存儲(chǔ),會(huì)造成SDO_GEOMETRY的坐標(biāo)數(shù)據(jù)太長(zhǎng),不方便模型的解析。因此采用分解策略,設(shè)計(jì)兩個(gè)數(shù)據(jù)庫(kù)表分別用于存儲(chǔ)模型的屋頂和墻面的表面數(shù)據(jù)。表1為屋頂?shù)谋斫Y(jié)構(gòu),表2為墻面的表結(jié)構(gòu)。
表1 屋頂表(BUILDING_ROOF_3D)結(jié)構(gòu)
表2 墻面表(BUILDING_FACADE_3D)結(jié)構(gòu)
由于三維模型數(shù)據(jù)量大,采用SDO_GEOMETRY構(gòu)造函數(shù)導(dǎo)入數(shù)據(jù)的方法并不可行。本文首先利用Google Earth將兩個(gè)建筑物的墻面和屋頂?shù)谋砻嬷鹨晦D(zhuǎn)換成KML文件,然后利用Oracle Spatial的FROM_KMLGEOMETRY函數(shù)編程將KML格式的三維數(shù)據(jù)導(dǎo)入到兩個(gè)數(shù)據(jù)庫(kù)表中。
3.三維模型Hibernate POJO
POJO(plain old java objects,簡(jiǎn)單的Java對(duì)象),是Hibernate的一種持久化類。通常,一個(gè)持久化類和一個(gè)表對(duì)應(yīng),POJO的字段和屬性則分別與表的字段和記錄相對(duì)應(yīng)。因此,需要?jiǎng)?chuàng)建兩個(gè)POJO:BuildingRoof3d和BuildingFacade3d類,分別與表BUILDING_ROOF_3D和BUILDING_FACADE_3D相對(duì)應(yīng)。
以表BUILDING_ROOF_3D為例,根據(jù)其表結(jié)構(gòu)(限于篇幅,以字段ROOF_ID、GEOM為例,下同),創(chuàng)建的BuildingRoof3d類為:
4.Hibernate POJO ORM文件
將Oracle表數(shù)據(jù)類型映射為Java數(shù)據(jù)類型,如NUMBER映射為L(zhǎng)ong,需要建立它們之間的映射關(guān)系。Hibernate的ORM文件為一個(gè)XML文件,一個(gè)POJO對(duì)應(yīng)一個(gè)ORM文件。BuildingRoof3d類的ORM文件(BuildingRoof3d.hbm.xml)為:
5.SDO_GEOMETRY映射類
Hibernate POJO和ORM文件都使用了一個(gè)J3D_ GeometryType類作為SDO_GEOMETRY的映射類型,J3D_GeometryType類并不是Java定義的,而需要自行設(shè)計(jì)和開發(fā)。本文基于Oracle Spatial提供的JGeometry和J3D_Geometry類,實(shí)現(xiàn)了該類,創(chuàng)建的主要步驟如下。
(1)定義Hibernate方言類
該方言類為Hibernate Oracle10gDialect方言類的子類,在其構(gòu)造函數(shù)中注冊(cè)SDO_GEOMETRY為
(2)定義Java映射類
即J3D_GeometryType類。Hibernate提供了UserType接口用于用戶實(shí)現(xiàn)自定義的Java映射類。自定義的Java映射類包含一個(gè)Oracle Spatial J3D_ Geometry類實(shí)例,并且還必須實(shí)現(xiàn)UserType接口中的11個(gè)方法。其中的nullSafeGet()方法、nullSafe-Set()方法實(shí)現(xiàn)的關(guān)鍵語(yǔ)句如下:
nullSafeGet()方法負(fù)責(zé)從SDO_GEOMETRY讀取數(shù)據(jù)存儲(chǔ)到J3D_Geometry實(shí)例中,nullSafeSet()方法則負(fù)責(zé)將J3D_Geometry實(shí)例存儲(chǔ)到SDO_GEOMETRY中,具體實(shí)現(xiàn)借助了Oracle Spatial JGeometry類實(shí)例作為SDO_GEOMETRY和J3D_Geometry實(shí)例數(shù)據(jù)轉(zhuǎn)換的中間對(duì)象。
6.模型Java 3D可視化
可視化大致分兩步:首先從數(shù)據(jù)庫(kù)中獲取三維模型的數(shù)據(jù),然后生成模型的Java 3D對(duì)象。
獲取三維模型數(shù)據(jù),以面向?qū)ο蟮姆绞竭M(jìn)行。如獲取紋理、坐標(biāo)的程序?yàn)?event為BuildingRoof3d或BuildingFacade3d類對(duì)象):
坐標(biāo)獲取后需要先利用SDO_GEOMETRY的SDO_ELEM_INFO屬性對(duì)其進(jìn)行解析,然后將其傳遞給Java 3D。
構(gòu)建Java 3D對(duì)象,即創(chuàng)建三維形體Shape3D對(duì)象,包括定義它的幾何信息和外觀。幾何信息使用GeometryInfo類設(shè)置,外觀主要是設(shè)置紋理貼圖,使用Appearance類實(shí)現(xiàn)。Shape3D對(duì)象創(chuàng)建后,將其加入到Java 3D的TransformGroup節(jié)點(diǎn)中。
圖5為可視化后的效果圖,與圖3模型三維效果一致,表明構(gòu)建的存儲(chǔ)與可視化方案可行。
圖5 Java 3D模型可視化效果
Oracle Spatial通過(guò)增加對(duì)表面、形體等三維空間對(duì)象類型的支持,從對(duì)二維空間數(shù)據(jù)的存儲(chǔ)擴(kuò)展到對(duì)三維空間數(shù)據(jù)的存儲(chǔ)。本文通過(guò)存儲(chǔ)兩個(gè)三維模型表面的方式設(shè)計(jì)和實(shí)踐了Oracle Spatial的三維存儲(chǔ);同時(shí)引入Hibernate對(duì)象持久化技術(shù),結(jié)合Java 3D實(shí)現(xiàn)了三維模型的可視化,結(jié)果表明構(gòu)建的存儲(chǔ)與可視化方案可行。通過(guò)自行設(shè)計(jì)開發(fā)的SDO_ GEOMETRY映射類,實(shí)現(xiàn)了對(duì)包含SDO_GEOMETRY數(shù)據(jù)類型字段的Oracle數(shù)據(jù)庫(kù)表的對(duì)象-關(guān)系映射,解決了其建立對(duì)應(yīng)Hibernate POJO的問(wèn)題,從而實(shí)現(xiàn)了對(duì)數(shù)據(jù)庫(kù)中三維模型的面向?qū)ο蟛僮?,也為?shí)現(xiàn)對(duì)Oracle Spatial中二維或三維空間對(duì)象的面向?qū)ο蟛僮?加載、保存、更新、刪除、查詢等)提供了一種可行的思路。
[1] 王云帆.Oracle Spatial空間數(shù)據(jù)存儲(chǔ)管理技術(shù)的應(yīng)用研究[J].測(cè)繪通報(bào),2011(6):76-79.
[2] 盧廷軍,黃明.海量柵格數(shù)據(jù)空間索引與存儲(chǔ)的研究[J].測(cè)繪通報(bào),2010(10):24-26.
[3] BIANCA S,MO HAMMAD M,DEBRA F L,et al.Octree-based Indexing for 3D Pointclouds within an Oracle Spatial DBMS[J].Computers&Geosciences,2013(51):430-438.
[4] 馬奎,李宏偉,李勤超,等..NET下基于OO4O核心的Oracle Spatial空間數(shù)據(jù)互操作[J].計(jì)算機(jī)應(yīng)用,2009,29(S1):205-208.
[5] 鄔群勇,劉夢(mèng)鑫,李細(xì)杰,等.面向環(huán)境數(shù)據(jù)集的Spatial OLAP系統(tǒng)集成[J].地球信息科學(xué)學(xué)報(bào),2013,15(1):90-96.
[6] 錢華明,施麗娟,王雯升.WebGIS車輛監(jiān)控系統(tǒng)的空間數(shù)據(jù)存儲(chǔ)技術(shù)研究[J].計(jì)算機(jī)工程與科學(xué),2009,31(4):124-129.
[7] 戴建旺,白曉飛.第二次全國(guó)土地調(diào)查國(guó)家級(jí)數(shù)據(jù)庫(kù)管理系統(tǒng)關(guān)鍵技術(shù)研究[J].中國(guó)土地科學(xué),2010,24(6):74-80.
[8] 高光大,王永志,張道勇,等.基于GIS和SOA的我國(guó)鐵礦資源潛力數(shù)據(jù)庫(kù)開發(fā)與應(yīng)用[J].吉林大學(xué)學(xué)報(bào):地球科學(xué)版,2010,40(6):1515-1520.
[9] 馮興杰,許亞娟,王輝.基于Oracle Spatial技術(shù)的地理信息管理與優(yōu)化[J].計(jì)算機(jī)工程與設(shè)計(jì),2011,32(5):1706-1709.
[10] 王海濤,賈宗璞.基于Struts和Hibernate的Web應(yīng)用開發(fā)[J].計(jì)算機(jī)工程,2011,37(9):112-114.
《數(shù)字測(cè)圖原理與技術(shù)》(第二版)內(nèi)容簡(jiǎn)介
本書由楊曉明等編著,系統(tǒng)地介紹了數(shù)字測(cè)圖的理論、技術(shù)和方法。其主要內(nèi)容包括:數(shù)字測(cè)圖概論、數(shù)字測(cè)圖的數(shù)學(xué)基礎(chǔ)、硬件設(shè)備、圖根控制測(cè)量、野外數(shù)據(jù)采集、計(jì)算機(jī)繪圖原理、數(shù)字測(cè)圖內(nèi)業(yè)、地圖數(shù)字化、數(shù)字測(cè)圖質(zhì)量控制、數(shù)字測(cè)圖成果的應(yīng)用、數(shù)字地籍測(cè)繪、數(shù)字地下管線圖測(cè)繪等。
本書為高等學(xué)校測(cè)繪工程、GIS及相關(guān)專業(yè)的教材,亦可供相關(guān)技術(shù)人員學(xué)習(xí)參考。
本書為16開本,240頁(yè),定價(jià)34.00元。測(cè)繪出版社2014年10月出版。
Storage and Visualization of 3D Model in Oracle Spatial
WEI Bo,WANG Xiyu,YANG Dongxing
P208
B
0494-0911(2014)11-0088-04
2013-11-18
廣西自然科學(xué)基金(2012GXNSFGA060001;桂科自0991248);桂林理工大學(xué)博士基金(GUT1996015)
韋 波(1974—),男,瑤族,廣西荔浦人,博士,副教授,主要研究方向?yàn)榭臻g信息處理理論與方法。
韋波,王熙宇,楊東興.Oracle Spatial三維模型存儲(chǔ)與可視化[J].測(cè)繪通報(bào),2014(11):88-91.
10.13474/j.cnki.11-2246.2014.0371