吳 鋒,毛新光
(杭州電子科技大學(xué)信息與控制研究所,浙江 杭州310018)
三維地理信息系統(tǒng)(GIS)的應(yīng)用領(lǐng)域十分廣泛,如城市交通調(diào)度、地質(zhì)災(zāi)害定位、地下管線、廠礦生產(chǎn)過程模擬等,相比二維GIS不僅能再現(xiàn)直觀的、真實(shí)的事物間縱橫交錯(cuò)、上下起伏的空間關(guān)系,具有較強(qiáng)的立體感和逼真感,而且能對(duì)構(gòu)建中的三維場(chǎng)景進(jìn)行三維空間的分析和操作等功能。可以說三維GIS的應(yīng)用開發(fā)已成為當(dāng)前GIS研究中的重點(diǎn)[1-3]。
縱觀國(guó)內(nèi)外三維GIS的研發(fā)現(xiàn)狀,有3種途徑實(shí)現(xiàn)三維GIS:一是基于底層庫函數(shù)開發(fā)實(shí)現(xiàn),如OpenGL和VC++的開發(fā)方式[4];二是在三維可視化系統(tǒng)上以插件形式加載數(shù)據(jù)顯示和查詢功能模塊,如Vega工具軟件[5];三是在現(xiàn)有GIS平臺(tái)提供的API上進(jìn)行二次開發(fā),如ArcGIS的ArcObjects組件[6]。底層庫函數(shù)開發(fā)方式效率較高,但代碼編程量較大。三維可視化系統(tǒng)在模型制作方面具有較好的逼真性,但在GIS方面的功能較弱?,F(xiàn)有GIS平臺(tái)軟件中,三維可視化方面的功能較為欠缺,但隨著三維空間分析功能的日趨完善,在現(xiàn)有GIS軟件中進(jìn)行二次開發(fā)將是三維GIS系統(tǒng)研究、開發(fā)的主流方式。
要實(shí)現(xiàn)三維GIS,必須解決三維場(chǎng)景如何建模和應(yīng)用支撐平臺(tái)的模型數(shù)據(jù)管理。從研究現(xiàn)狀來看,目前三維場(chǎng)景的快速動(dòng)態(tài)建模主要有統(tǒng)一規(guī)范法、標(biāo)準(zhǔn)模型符號(hào)法、非仿真功能寫景法、二維GIS法和CAD方法等[7-11]。通過比較分析,這些方法或建模工作量大、效率低,或要求編寫大量的程序代碼,或建立的三維場(chǎng)景缺乏較好的空間查詢和分析功能。
本文提出一種基于ArcGIS Engine組件技術(shù)和數(shù)據(jù)庫技術(shù)的快速動(dòng)態(tài)建模方法,即預(yù)先建立對(duì)應(yīng)的三維場(chǎng)景模型庫并保存在ArcGIS Engine組件的數(shù)據(jù)庫中,通過地理描述和數(shù)據(jù)管理獲取模型構(gòu)件、組裝構(gòu)件而成需要的三維場(chǎng)景,從而大大降低三維場(chǎng)景建模的工作量;另外,將地理描述信息與場(chǎng)景精確模型結(jié)合起來,大大提高了場(chǎng)景模型的真實(shí)感,而且數(shù)據(jù)編輯、空間分析能力也得到了體現(xiàn)。
目前三維場(chǎng)景中的實(shí)體,大部分都是通過外部三維制作軟件制作好后以點(diǎn)、線、面的形式導(dǎo)入到三維場(chǎng)景中來,如3ds Max制作的三維實(shí)體。這種數(shù)據(jù)集成要求CAD模型與GIS二者之間的數(shù)據(jù)能夠相互轉(zhuǎn)換或在GIS中可以直接讀寫CAD文件。
目前常見的數(shù)據(jù)集成有文件轉(zhuǎn)換、數(shù)據(jù)庫共享和直接訪問3種方式。文件轉(zhuǎn)換方式是指數(shù)據(jù)文件格式從一種到另一種的轉(zhuǎn)換,如ArcGISEngine的控件SceneControl支持SHP文件,3ds Max支持*.dwg文件,*.dwg和*.shp可以通過*.dxf(CAD格式)進(jìn)行轉(zhuǎn)換。數(shù)據(jù)庫共享方式通過在系統(tǒng)中嵌入應(yīng)用程序API接口訪問其他系統(tǒng)的數(shù)據(jù),如ArcSDE就具有識(shí)別CAD文件的擴(kuò)展程序,允許用戶在數(shù)據(jù)庫管理系統(tǒng)中存儲(chǔ)、提取CAD文件要素或GIS特征,這是一種新型方式。直接訪問方式則是直接讀入另一系統(tǒng)的數(shù)據(jù)而無須經(jīng)過中介,如ArcGIS直接讀取3ds Max制作的*.3ds文件來構(gòu)建三維場(chǎng)景,從而實(shí)現(xiàn)CAD與GIS的數(shù)據(jù)集成。直接訪問方式也是本文采用的主要集成方式。
三維場(chǎng)景中的實(shí)體結(jié)構(gòu)可以分為單一模型和組合模型。單一模型就是該模型結(jié)構(gòu)復(fù)雜,不能拆分為單一模型的組合,在向三維場(chǎng)景中添加模型時(shí),作為單一的模型;組合模型就是場(chǎng)景中的三維模型可以拆分為單一的組合,從模型庫中調(diào)用該單一模型,組成該組合模型。
依據(jù)三維場(chǎng)景中實(shí)體的分類表達(dá)規(guī)則和組成要素的不同,三維對(duì)象模型數(shù)據(jù)庫可分為以下幾類:建筑物模型庫、建筑物紋理庫、地面覆蓋模型庫、獨(dú)立對(duì)象模型庫。建筑物模型庫主要存儲(chǔ)以3ds Max軟件導(dǎo)出的*.3ds文件;建筑物紋理庫主要存儲(chǔ)建筑物墻面紋理、窗戶紋理等;地面覆蓋模型庫主要存儲(chǔ)地面江河、道路、植被的紋理庫;獨(dú)立對(duì)象模型庫主要存儲(chǔ)一些地面上設(shè)施如樹木、路燈、交通站臺(tái)、電話亭等標(biāo)志性建筑物。三維對(duì)象模型庫的組成結(jié)構(gòu)如圖1所示。
圖1 三維對(duì)象模型庫的組成結(jié)構(gòu)
各個(gè)對(duì)象模型庫的建立方法如下:
1)典型建筑物模型庫和獨(dú)立對(duì)象模型庫:該模型庫主要存儲(chǔ)一些不能分解的結(jié)構(gòu)模型,對(duì)于結(jié)構(gòu)復(fù)雜的典型三維建筑和獨(dú)立對(duì)象,反復(fù)調(diào)用模型庫中的一些簡(jiǎn)單實(shí)體,并通過組合方法建立起三維場(chǎng)景中的實(shí)體,從而達(dá)到簡(jiǎn)捷、快速建模的目的。
2)紋理庫的設(shè)計(jì):對(duì)于一些結(jié)構(gòu)簡(jiǎn)單、規(guī)則幾何體的三維實(shí)體如長(zhǎng)方體、正方體等,利用多片來建立三維場(chǎng)景。但利用多片建立的只是三維場(chǎng)景幾何模型,還需要進(jìn)一步對(duì)模型的表面進(jìn)行貼圖、渲染。針對(duì)這種情況,需要建立建筑物紋理庫。該庫以大量圖片為基礎(chǔ),并配合圖片處理軟件如PhotoShop工具對(duì)圖片進(jìn)行預(yù)處理。
3)地面覆蓋模型庫的設(shè)計(jì):三維場(chǎng)景的地面覆蓋物模型庫主要存儲(chǔ)地表中的綠地、地形、水系類別的地面覆蓋物紋理。入庫的紋理數(shù)據(jù)文件,必須存在數(shù)據(jù)庫的表中,當(dāng)編輯或更新地面覆蓋物紋理時(shí),直接從數(shù)據(jù)庫的數(shù)據(jù)表中調(diào)用相應(yīng)的數(shù)據(jù)紋理。
在完成建筑物數(shù)據(jù)庫、建筑物紋理庫、地面覆蓋紋理庫、獨(dú)立對(duì)象數(shù)據(jù)庫和數(shù)據(jù)采集的基礎(chǔ)上,結(jié)合.NET的編程環(huán)境與ArcGIS Engine中的Scene-Control、ToCControl、ToolbarControl、MapControl等控件進(jìn)行二次開發(fā),實(shí)現(xiàn)三維數(shù)據(jù)模型的快速建模。
在三維場(chǎng)景構(gòu)建時(shí),針對(duì)場(chǎng)景三維實(shí)體模型的不同,需要采取不同的模型方法。針對(duì)典型的模型,可直接調(diào)用典型模型數(shù)據(jù)庫中的典型模型;用組合模型構(gòu)建復(fù)雜三維建筑模型時(shí),調(diào)用建筑模型數(shù)據(jù)庫中*.3ds中的數(shù)據(jù)模型;對(duì)于簡(jiǎn)單的模型,可以Multipatch來構(gòu)建,調(diào)用紋理數(shù)據(jù)庫中的紋理圖片,進(jìn)行紋理貼圖,可以建模逼真的三維場(chǎng)景中的實(shí)體。根據(jù)三維場(chǎng)景中三維實(shí)體的不同情況,調(diào)用不同模型庫,起到快速建模三維場(chǎng)景的效果。三維場(chǎng)景快速建模流程如圖2所示。
圖2 三維場(chǎng)景快速建模流程
在ArcGIS Engine中可以通過二維的點(diǎn)、線、面二維要素和坐標(biāo)Z經(jīng)過拉伸來建模三維場(chǎng)景中的三維模型。通過對(duì)Z坐標(biāo)或要素屬性字段值進(jìn)行拉伸,點(diǎn)要素構(gòu)成三維場(chǎng)景中垂直的線,線要素構(gòu)成面,面要素構(gòu)成塊。而Multipatch對(duì)象,則通過該實(shí)體頂點(diǎn)在三維場(chǎng)景中X、Y、Z坐標(biāo)值來構(gòu)建三維實(shí)體各個(gè)面,再經(jīng)過貼圖來構(gòu)建三維場(chǎng)景中的實(shí)體。以下是二維矢量數(shù)據(jù)如何生成三維模型的算法:
1)獲取三維場(chǎng)景要拉伸的圖層。
2)添加紋理,即定義地理要素圖層對(duì)象并獲取圖層對(duì)象、創(chuàng)建要渲染的符號(hào)、創(chuàng)建要填充的紋理符號(hào)、從path變量中填充要填充紋理符號(hào)的紋理、設(shè)置要渲染的psimplerenderer的紋理符號(hào)。
3)對(duì)要渲染的地理要素圖層對(duì)象pGeoFeature-Layer,設(shè)置為psimplerenderer并進(jìn)行渲染。
4)設(shè)置矢量圖層基準(zhǔn)高,得到頂點(diǎn)空間坐標(biāo)
式中,R為圓弧半徑;α為圓弧上各頂點(diǎn)與原點(diǎn)連線到x軸的角度;ProLayer3D.Zfactor為使矢量數(shù)據(jù)拉伸到某一固定值的拉伸因子。
5)應(yīng)用三維屬性到ppLayer矢量圖層,使圖層具有三維顯示效果。
(1)典型單一模型和對(duì)象模型的重建方法
針對(duì)三維場(chǎng)景中的獨(dú)立對(duì)象實(shí)體、典型標(biāo)志性建筑、結(jié)構(gòu)復(fù)雜而風(fēng)格獨(dú)特的建筑物,通過三維制作軟件3ds Max制作獨(dú)立的和典型的三維模型,包括相關(guān)紋理信息,一塊導(dǎo)出為*.3ds文件,然后入庫。在建立三維場(chǎng)景時(shí),可以反復(fù)從建筑數(shù)據(jù)庫中調(diào)用該模型,加載到SceneControl控件中,從而達(dá)到快速建模的目的。具體算法的基本流程如下:
1)創(chuàng)建一個(gè)新圖層,然后把新圖層添加到三維場(chǎng)景的SceneControl控件對(duì)象中。
2)設(shè)立一個(gè)點(diǎn)的新元素,該點(diǎn)就是三維模型要加載的位置。
3)利用IMarker3DSymbol創(chuàng)建一個(gè)接口對(duì)象,然后利用該對(duì)象方法CreateFromFile讀取數(shù)據(jù)庫中建筑物和獨(dú)立對(duì)象的模型對(duì)象。
4)創(chuàng)建一個(gè)SceneControl控件容器對(duì)象,然后將該對(duì)象加載到在圖層對(duì)應(yīng)的容器中,起到動(dòng)態(tài)加載三維場(chǎng)景的目的。
(2)利用模型庫組合模型的建模方法
在三維場(chǎng)景構(gòu)建中,非典型的建筑物具有相似的結(jié)構(gòu)和紋理。針對(duì)這種情況,先建立一個(gè)可以組成這種三維場(chǎng)景中建筑物的基本實(shí)體單位,并將這樣的單位實(shí)體入庫。在建模這樣的三維實(shí)體時(shí),可直接調(diào)用模型庫中的單位實(shí)體模型。通過組合建模方法,達(dá)到快速構(gòu)建三維場(chǎng)景的目的。
具體算法的基本流程如下:
1)創(chuàng)建一個(gè)新圖層,然后把新圖層添加到三維場(chǎng)景的SceneControl控件對(duì)象中。
2)設(shè)定一個(gè)點(diǎn)的新元素,該點(diǎn)就是三維模型要加載的位置。
3)確定底層元素顯示的Symbol和Geometry:
IPoint pt=new PointClass();
double longtitude=double.Parse(textBox1.Text);
double latitude=double.Parse(textBox2.Text);
pt.PutCoords(longtitude,latitude);
4)再分別確定中間層、頂層元素顯示的Symbol和Geometry。
對(duì)于結(jié)構(gòu)簡(jiǎn)單的、規(guī)則的、逼真度要求不是很高的三維場(chǎng)景中的實(shí)體,可以通過對(duì)規(guī)則三維模型如長(zhǎng)方體、正方體等進(jìn)行貼圖來表示現(xiàn)實(shí)世界中的三維實(shí)體。通過多片Multipatch制作規(guī)則實(shí)體的大致模型,模型的位置通過輸入規(guī)則模型在平面的投影坐標(biāo)和實(shí)體模型的長(zhǎng)、寬、高3個(gè)參數(shù)來確定三維實(shí)體模型各個(gè)頂點(diǎn)的坐標(biāo),然后通過對(duì)三維實(shí)體模型的前面、后面、左面、右面、頂部進(jìn)行紋理貼圖來構(gòu)造三維模型。
用Multipatch構(gòu)建三維實(shí)體模型的基本算法如下:
1)指定紋理對(duì)象。
2)創(chuàng)建材質(zhì)列表。
3)創(chuàng)建Multipatch第一面的各個(gè)頂點(diǎn)及其紋理頂點(diǎn):
IPoint pPoint1=new PointClass();
pPoint1.X=x;
pPoint1.Y=y;
pPoint1.Z=0;
4)繼續(xù)創(chuàng)建Multipatch其余面的各個(gè)頂點(diǎn)及其紋理頂點(diǎn)。
5)給各個(gè)頂點(diǎn)的坐標(biāo)(X,Y,Z)賦值。
6)創(chuàng)建其余的紋理坐標(biāo)頂點(diǎn)并賦值。
7)創(chuàng)建其余面的頂點(diǎn)及其紋理頂點(diǎn)并賦值。
8)給各個(gè)面的頂點(diǎn)指定頂點(diǎn)坐標(biāo)和需要紋理貼圖的各個(gè)頂點(diǎn)坐標(biāo):
IGeneralMultiPatchCreator PCreator=new GeneralMulti-PatchCreatorClass();
PCreator.Init(30,6,false,false,false,24,materialList);
PCreator.SetPatchType(0,esriPatchType.esriPatchTypeRing);
PCreator.SetPatchPointIndex(0,0);
PCreator.SetMaterialIndex(0,0);
PCreator.SetPatchTexturePointIndex(0,0);
PCreator.SetPoint(0,pPoint1);
利用規(guī)則幾何體如正方體、立方體,對(duì)三維幾何體的各個(gè)面進(jìn)行貼圖,利用Multipatch向三維場(chǎng)景添加幾何體。
隨著石化能源產(chǎn)業(yè)的高速增長(zhǎng)、石化產(chǎn)品運(yùn)輸量的不斷增高,石化產(chǎn)品交通運(yùn)輸事故也日益增多。針對(duì)運(yùn)輸安全問題,筆者以ArcGIS Engine為工具,結(jié)合GIS、GPS、3G等技術(shù),研發(fā)了基于GIS/GPS/3G的危險(xiǎn)品運(yùn)輸車輛監(jiān)控三維GIS系統(tǒng)。該系統(tǒng)提供了一個(gè)三維可視化平臺(tái),幫助用戶從不同的角度來監(jiān)控三維場(chǎng)景中的地物,并實(shí)時(shí)獲取車輛的軌跡。
對(duì)危險(xiǎn)品車輛的監(jiān)控即實(shí)時(shí)跟蹤車輛位置。GPS發(fā)送的經(jīng)緯度存入數(shù)據(jù)庫,系統(tǒng)需要從數(shù)據(jù)庫實(shí)時(shí)解析GPS數(shù)據(jù)并顯示在三維虛擬場(chǎng)景中,如圖3所示的小圓點(diǎn)。根據(jù)圓點(diǎn)軌跡即可實(shí)時(shí)監(jiān)控危險(xiǎn)品車輛在三維場(chǎng)景中的行駛狀況。
圖3 實(shí)時(shí)顯示車輛軌跡的三維場(chǎng)景效果
在車輛監(jiān)控三維GIS系統(tǒng)的開發(fā)中充分運(yùn)用了快速動(dòng)態(tài)建模方法:
1)地形建模:地形表面主要由矢量數(shù)據(jù)生成的不規(guī)則三角網(wǎng)數(shù)據(jù)模型生成,為其他地物提供一個(gè)模擬表面。由于三維車輛監(jiān)控場(chǎng)景的地形高程為0,地形場(chǎng)景模擬可以用衛(wèi)星掃描的圖片進(jìn)行柵格配準(zhǔn)。
2)復(fù)雜地物建模:對(duì)于典型而復(fù)雜的地表人工實(shí)體和獨(dú)立對(duì)象,采用建模軟件3ds Max來構(gòu)建三維實(shí)體模型,然后轉(zhuǎn)換為ArcGISEngine支持的格式來建模三維模型。
3)規(guī)則幾何體建模:通過多片構(gòu)建規(guī)則三維實(shí)體模型,然后對(duì)三維外表進(jìn)行貼圖,逼真構(gòu)建三維場(chǎng)景中的對(duì)象實(shí)體。
本文提出了一種基于ArcGIS Engine的三維場(chǎng)景快速動(dòng)態(tài)建模方法,該方法根據(jù)場(chǎng)景的地物分為點(diǎn)、線、面3類不同的特點(diǎn),提出了聯(lián)合拉伸、模型庫、多片Multipatch等多種快速建模方法,從而實(shí)現(xiàn)了三維場(chǎng)景的快速生成和渲染。該方法的關(guān)鍵在于GIS組件技術(shù)的利用和基于數(shù)據(jù)庫技術(shù)的對(duì)象、紋理等模型庫的建立,它是快速建模三維場(chǎng)景的基礎(chǔ)。為大規(guī)模開發(fā)三維可視化系統(tǒng)提供了一種新的思路。該方法成功應(yīng)用于危險(xiǎn)品運(yùn)輸車輛監(jiān)控三維GIS的快速開發(fā),有效地提高了開發(fā)效率,降低了勞動(dòng)強(qiáng)度和開發(fā)成本。
本文主要側(cè)重基于ArcGIS組件的三維建模和數(shù)據(jù)顯示研究,下一步的工作是基于ArcGIS的空間分析工作。隨著現(xiàn)代空間數(shù)據(jù)定位與分析的需要,三維快速建模技術(shù)的應(yīng)用會(huì)越來越廣泛,相信基于GIS組件技術(shù)和數(shù)據(jù)庫技術(shù)的三維實(shí)體速建模方法會(huì)為其他行業(yè)三維GIS應(yīng)用提供一定的借鑒和參考。
[1] 王金宏,朱軍,尹靈芝,等.基于線性參照系統(tǒng)的虛擬高速鐵路場(chǎng)景建模方法簡(jiǎn)述[J].地球信息科學(xué)學(xué)報(bào),2014,16(1):23-30.
[2] TANG A Y,ADAMST M,USERY E L.A Spatial Data Model Design for Feature-based Geographical Information Systems[J].IJGIS,1996,10(5):643-659.
[3] ROYAN J.Network-based Visualization of 3DLandscapes and City Models[J].IEEE Computer Graphics and Applications,2007,27(6):70-79.
[4] SUN W T,LI Q,QIAN B.Track Simulation of Flexible Roll Forming Based on VC++and OpenGL[J].Advanced Materials Research,2012,457-458:304-307.
[5] ZHOU X N.3D Campus Simulation Based on Vega and Creator[C]∥2010 International Conference on Computer and Communication Technologies in Agriculture Engineering,2010,3(12-13):512-514.
[6] 張文元,付仲良.基于ArcGISEngine的綜合管線三維可視化研究[J].測(cè)繪通報(bào),2008(8):28-31.
[7] TIAN X.Quick 3D Modeling of Machining Environment by Means of On-machine Stereo Vision with Digital Decomposition[J].CIRP Annals-Manufacturing Technology,2007,56(1):411-414.
[8] 何垂杰,鄧克裹,袁懷月.基于ArcGIS Engine的工業(yè)廠區(qū)快速三維建模與可視化[C]∥現(xiàn)代空間定位技術(shù)應(yīng)用研討交流會(huì)論文集.廣州:中國(guó)測(cè)繪學(xué)會(huì),2007:264-274.
[9] 高睿,劉修國(guó),熊威.城市三維景觀可視化研究與應(yīng)用[J].計(jì)算機(jī)應(yīng)用研究,2005,22(3):160-164.
[10] 劉玉春.應(yīng)急指揮信息系統(tǒng)中三維模型快速構(gòu)建方法研究[J].測(cè)繪科學(xué),2008,33(S1):117-119.
[11] 鄧非,張祖勛,張劍清.基于序列影像的城市三維建模[J].計(jì)算機(jī)工程,2007,33(8):208-210.