韋 波,王熙宇,楊東興
(1.桂林理工大學廣西礦冶與環境科學實驗中心,廣西 桂林 541004;2.桂林理工大學測繪地理信息學院,廣西 桂林 541004)
Oracle Spatial三維模型存儲與可視化
韋 波1,2,王熙宇1,2,楊東興2
(1.桂林理工大學廣西礦冶與環境科學實驗中心,廣西 桂林 541004;2.桂林理工大學測繪地理信息學院,廣西 桂林 541004)
論述Oracle Spatial三維空間數據模型,以存儲表面的方式設計了三維模型的數據庫存儲方案,同時引入Hibernate對象持久化技術并自行設計開發了SDO_GEOMETRY映射類,結合Java 3D實現了三維模型的可視化。結果表明構建的存儲與可視化方案可行。
Oracle Spatial;三維空間數據存儲;可視化
Oracle Spatial作為對象-關系型數據庫的典型代表,一直是地理信息系統(GIS)研究與應用的主要對象之一。王云帆探討了Oracle Spatial的特點,并應用數據庫技術實現了空間數據管理與操作[1];盧廷軍等以Oracle Spatial為工具,建立了海量柵格數據的空間索引[2];Bianca等提出了Oracle Spatial 3D點云數據的四叉樹索引方法[3];馬奎等在.NET環境下,基于OO4O核心實現了對Oracle Spatial空間數據的互操作[4];鄔群勇等使用Oracle Spatial SDO_GEOMETRY抽象幾何數據類型存儲環境空間數據,實現了OLAP和GIS的完全集成[5];錢華明、戴建旺、高光大、馮興杰等分別應用Oracle Spatial建立了WebGIS車輛監控系統[6]、土地調查國家級數據庫[7]、鐵礦資源潛力數據庫[8]、航油公司EAM系統[9]。
雖然目前對Oracle Spatial的研究與應用取得了較多的成果,但主要集中于二維空間數據方面。Oracle從11g版本開始支持對三維空間數據的存儲與管理,因此,本文結合Hibernate對象持久化和Java 3D,討論Oracle Spatial的三維空間數據存儲與可視化技術。
1.三維存儲模型
如圖1所示,表面、形體和組合類型是三維存儲模型中所特有的,在二維存儲模型中不支持。表面和構成形體的表面目前只能是三維平面,不能是三維曲面。組合類型不同于二維的復合線串、復合多邊形等復合類型[1],組合類型只能是表面、形體等同類型三維對象間的組合,復合類型在三維存儲模型中不支持。多邊形類型包括含洞的多邊形。集合可以是點、線、多邊形的集合,也可以是表面、形體的集合,包括由同類型對象構成的(同質)集合和由不同類型對象構成的(異質)集合。

圖1 Oracle Spatial三維存儲模型
2.SDO_GEOMETRY三維對象存儲
SDO_GEOMETRY在Oracle Spatial中被定義為一個對象類型,共包含5個屬性:

與二維版本相比,SDO_GEOMETRY及其5個屬性的定義形式均沒有發生變化,只是將它們擴展到三維的應用環境。
圖2中多邊形的SDO_GEOMETRY二維、三維空間存儲表示如下,可對比看出二者的明顯異同。


圖2 多邊形示例
圖3為Google Earth上的兩個建筑物三維模型,其中一個為教堂(右下角),而另一個為辦公大樓。

圖3 3D模型實例
1.總體框架
總體分為3層:數據庫層、持久化層、可視化層,如圖4所示。數據庫層使用Oracle Spatial存儲三維模型數據。持久化層通過對象-關系映射(object-relation mapping,ORM),處理面向對象和面向關系二者之間的映射,實現模型的面向對象操作,采用Hibernate技術實現。可視化層由Java 3D構建虛擬場景,完成三維模型的顯示。
引入Hibernate的原因在于當將空間對象從數據庫重新加載至內存時,由于Java、C++、C#等高級程序設計語言缺乏與SDO_GEOMETRY直接映射的數據類型,不能直接構建空間對象對應的類,進而不能直接實現面向對象的操作;而Hibernate則能夠方便而快速地建立持久化層和ORM[10],解決對象持久化問題,實現對空間對象的面向對象操作。

圖4 三維模型可視化總體框架
2.數據庫表設計與數據導入
從Google Earth位置工具欄可以看出,教堂模型共包括15個屋頂和48個墻面,而辦公大樓模型共包括14個屋頂和131個墻面。如果將模型整體存儲,會造成SDO_GEOMETRY的坐標數據太長,不方便模型的解析。因此采用分解策略,設計兩個數據庫表分別用于存儲模型的屋頂和墻面的表面數據。表1為屋頂的表結構,表2為墻面的表結構。

表1 屋頂表(BUILDING_ROOF_3D)結構

表2 墻面表(BUILDING_FACADE_3D)結構
由于三維模型數據量大,采用SDO_GEOMETRY構造函數導入數據的方法并不可行。本文首先利用Google Earth將兩個建筑物的墻面和屋頂的表面逐一轉換成KML文件,然后利用Oracle Spatial的FROM_KMLGEOMETRY函數編程將KML格式的三維數據導入到兩個數據庫表中。
3.三維模型Hibernate POJO
POJO(plain old java objects,簡單的Java對象),是Hibernate的一種持久化類。通常,一個持久化類和一個表對應,POJO的字段和屬性則分別與表的字段和記錄相對應。因此,需要創建兩個POJO:BuildingRoof3d和BuildingFacade3d類,分別與表BUILDING_ROOF_3D和BUILDING_FACADE_3D相對應。
以表BUILDING_ROOF_3D為例,根據其表結構(限于篇幅,以字段ROOF_ID、GEOM為例,下同),創建的BuildingRoof3d類為:

4.Hibernate POJO ORM文件
將Oracle表數據類型映射為Java數據類型,如NUMBER映射為Long,需要建立它們之間的映射關系。Hibernate的ORM文件為一個XML文件,一個POJO對應一個ORM文件。BuildingRoof3d類的ORM文件(BuildingRoof3d.hbm.xml)為:

5.SDO_GEOMETRY映射類
Hibernate POJO和ORM文件都使用了一個J3D_ GeometryType類作為SDO_GEOMETRY的映射類型,J3D_GeometryType類并不是Java定義的,而需要自行設計和開發。本文基于Oracle Spatial提供的JGeometry和J3D_Geometry類,實現了該類,創建的主要步驟如下。
(1)定義Hibernate方言類
該方言類為Hibernate Oracle10gDialect方言類的子類,在其構造函數中注冊SDO_GEOMETRY為

(2)定義Java映射類
即J3D_GeometryType類。Hibernate提供了UserType接口用于用戶實現自定義的Java映射類。自定義的Java映射類包含一個Oracle Spatial J3D_ Geometry類實例,并且還必須實現UserType接口中的11個方法。其中的nullSafeGet()方法、nullSafe-Set()方法實現的關鍵語句如下:

nullSafeGet()方法負責從SDO_GEOMETRY讀取數據存儲到J3D_Geometry實例中,nullSafeSet()方法則負責將J3D_Geometry實例存儲到SDO_GEOMETRY中,具體實現借助了Oracle Spatial JGeometry類實例作為SDO_GEOMETRY和J3D_Geometry實例數據轉換的中間對象。
6.模型Java 3D可視化
可視化大致分兩步:首先從數據庫中獲取三維模型的數據,然后生成模型的Java 3D對象。
獲取三維模型數據,以面向對象的方式進行。如獲取紋理、坐標的程序為(event為BuildingRoof3d或BuildingFacade3d類對象):

坐標獲取后需要先利用SDO_GEOMETRY的SDO_ELEM_INFO屬性對其進行解析,然后將其傳遞給Java 3D。
構建Java 3D對象,即創建三維形體Shape3D對象,包括定義它的幾何信息和外觀。幾何信息使用GeometryInfo類設置,外觀主要是設置紋理貼圖,使用Appearance類實現。Shape3D對象創建后,將其加入到Java 3D的TransformGroup節點中。
圖5為可視化后的效果圖,與圖3模型三維效果一致,表明構建的存儲與可視化方案可行。

圖5 Java 3D模型可視化效果
Oracle Spatial通過增加對表面、形體等三維空間對象類型的支持,從對二維空間數據的存儲擴展到對三維空間數據的存儲。本文通過存儲兩個三維模型表面的方式設計和實踐了Oracle Spatial的三維存儲;同時引入Hibernate對象持久化技術,結合Java 3D實現了三維模型的可視化,結果表明構建的存儲與可視化方案可行。通過自行設計開發的SDO_ GEOMETRY映射類,實現了對包含SDO_GEOMETRY數據類型字段的Oracle數據庫表的對象-關系映射,解決了其建立對應Hibernate POJO的問題,從而實現了對數據庫中三維模型的面向對象操作,也為實現對Oracle Spatial中二維或三維空間對象的面向對象操作(加載、保存、更新、刪除、查詢等)提供了一種可行的思路。
[1] 王云帆.Oracle Spatial空間數據存儲管理技術的應用研究[J].測繪通報,2011(6):76-79.
[2] 盧廷軍,黃明.海量柵格數據空間索引與存儲的研究[J].測繪通報,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空間數據互操作[J].計算機應用,2009,29(S1):205-208.
[5] 鄔群勇,劉夢鑫,李細杰,等.面向環境數據集的Spatial OLAP系統集成[J].地球信息科學學報,2013,15(1):90-96.
[6] 錢華明,施麗娟,王雯升.WebGIS車輛監控系統的空間數據存儲技術研究[J].計算機工程與科學,2009,31(4):124-129.
[7] 戴建旺,白曉飛.第二次全國土地調查國家級數據庫管理系統關鍵技術研究[J].中國土地科學,2010,24(6):74-80.
[8] 高光大,王永志,張道勇,等.基于GIS和SOA的我國鐵礦資源潛力數據庫開發與應用[J].吉林大學學報:地球科學版,2010,40(6):1515-1520.
[9] 馮興杰,許亞娟,王輝.基于Oracle Spatial技術的地理信息管理與優化[J].計算機工程與設計,2011,32(5):1706-1709.
[10] 王海濤,賈宗璞.基于Struts和Hibernate的Web應用開發[J].計算機工程,2011,37(9):112-114.
《數字測圖原理與技術》(第二版)內容簡介
本書由楊曉明等編著,系統地介紹了數字測圖的理論、技術和方法。其主要內容包括:數字測圖概論、數字測圖的數學基礎、硬件設備、圖根控制測量、野外數據采集、計算機繪圖原理、數字測圖內業、地圖數字化、數字測圖質量控制、數字測圖成果的應用、數字地籍測繪、數字地下管線圖測繪等。
本書為高等學校測繪工程、GIS及相關專業的教材,亦可供相關技術人員學習參考。
本書為16開本,240頁,定價34.00元。測繪出版社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
廣西自然科學基金(2012GXNSFGA060001;桂科自0991248);桂林理工大學博士基金(GUT1996015)
韋 波(1974—),男,瑤族,廣西荔浦人,博士,副教授,主要研究方向為空間信息處理理論與方法。
韋波,王熙宇,楊東興.Oracle Spatial三維模型存儲與可視化[J].測繪通報,2014(11):88-91.
10.13474/j.cnki.11-2246.2014.0371