1:三維GIS發(fā)展現(xiàn)狀
三維GIS產(chǎn)業(yè)方興未艾,無論是從視覺效果,還是實(shí)際應(yīng)用功能都有了長(zhǎng)足的發(fā)展。然而人們已經(jīng)不僅僅滿足與絢麗的三維場(chǎng)景,而將更多的注意力將集中在三維GIS所實(shí)現(xiàn)的功能上。筆者歸納以下幾個(gè)方面依然還是業(yè)界努力的方向:
(1):三維批量數(shù)據(jù)的獲取
相對(duì)于二維GIS而言,三維GIS增加了城市空間對(duì)象的第三維信息,導(dǎo)致描述空間對(duì)象的幾何數(shù)據(jù)(形狀、位置、大小)劇增,如何快速自動(dòng)的獲取城市空間對(duì)象的3d幾何、影像紋理、語義屬性數(shù)據(jù)等。目前主要的方法集中在攝影測(cè)量、激光掃描、移動(dòng)測(cè)繪、多數(shù)據(jù)源集成等方面。
(2):城市三維可視化模型的建立
早期人們將航空影像和DEM疊加構(gòu)造地形景觀,可進(jìn)行任意瀏覽?,F(xiàn)在的三維模型利用二維GIS的平面位置及高度信息,另外添加一些信息(如房屋高度、墻面紋理),同時(shí)使用規(guī)則幾何體(如長(zhǎng)方體、三棱體等)來表達(dá)城市建筑物。但這種方法僅僅是對(duì)建筑物進(jìn)行了表達(dá),沒有考慮到地形DEM的因素,因而是不完整的。
(3):三維空間數(shù)據(jù)模型
上述三維城市模型的構(gòu)建還沒有完全具備GIS系統(tǒng)完備的數(shù)據(jù)模型,所作的工作主要側(cè)重于三維數(shù)據(jù)的采集及可視化,較少顧及三維空間實(shí)體及空間的相互關(guān)系。但是對(duì)于各種各樣的GIS用戶來說,往往需要直接將三維模型作為交互式查詢和分析的媒體。即GIS中的三維模型不僅僅可是實(shí)現(xiàn)可視化而且還能交互操作。因此,空間分析和交互操作才是三維模型的主要功能,而可視化只是其中不可缺少的組件。三維GIS所采用的數(shù)據(jù)模型,應(yīng)該不僅能表達(dá)幾何信息,而且能直接或間接地描述拓?fù)潢P(guān)系,在紋理映射方面,應(yīng)具有操縱柵格影像的能力。總而言之,迄今為止沒有一個(gè)比較成熟、得到人們公認(rèn)的數(shù)據(jù)模型,這嚴(yán)重制約著三維GIS的發(fā)展。
二維GIS具有很強(qiáng)的分析功能,例如緩沖分析、路徑分析、平面測(cè)量、空間索查詢、渲染分析等,但它缺乏有效地三維空間表達(dá)能力。三維GIS提供了二維GIS所不具備的功能,例如體積測(cè)量、三維建模、紋理貼圖、模擬飛行、視角判斷等。三維GIS在給用戶帶來可視化分析功能的同時(shí),卻失去了二維GIS分析特色。如何實(shí)現(xiàn)兩者的互動(dòng),很多學(xué)者進(jìn)行了相關(guān)的研究。本系統(tǒng)是基于.NET2.0框架下利用ArcEngine的二維功能和skyline的三維功能,將二維GIS和三維GIS進(jìn)行集成并實(shí)現(xiàn)聯(lián)動(dòng)。從而實(shí)現(xiàn)在同一框架體系下使兩者優(yōu)勢(shì)互補(bǔ),最大程度地發(fā)揮系統(tǒng)功能。
2:開發(fā)設(shè)計(jì)思路:
本系統(tǒng)的設(shè)計(jì)思路是將在arcgis中存儲(chǔ)并展示的二維數(shù)據(jù)與在TerraExplorer Pro中加載的三維數(shù)據(jù),依靠C#語言,以Microsoft Visual Studio為程序開發(fā)平臺(tái),集成ArcEngine和Skyline TerraExplorer API分別提供的接口和ActiveX控件統(tǒng)一到一個(gè)系統(tǒng)中,并且通過編程使得“將屏幕坐標(biāo)與地理坐標(biāo)相互聯(lián)接”的思想得以實(shí)現(xiàn),最終得到二三維聯(lián)動(dòng)的效果。設(shè)計(jì)思路如圖1:
圖1 二三維聯(lián)動(dòng)設(shè)計(jì)思路圖
二維空間數(shù)據(jù)主要是由Arcmap中得shp文件來組織。在二維GIS開發(fā)過程中,利用ArcEngine插件中Mapcontro控件調(diào)用shp文件來實(shí)現(xiàn)二維GIS功能。
三維空間數(shù)據(jù)由3DMAX建模最終導(dǎo)入Skyline的方式,地形建模的方法主要是采用在某地區(qū)的DEM數(shù)據(jù)的基礎(chǔ)上疊加遙感影像來完成三維地形的顯示。對(duì)于大區(qū)域的建筑群進(jìn)行三維建模時(shí),需要對(duì)不同類型的建筑物進(jìn)行分別建模,提高效率。對(duì)于城市片區(qū)內(nèi)部的建筑以簡(jiǎn)單紋理的體塊表示;沿街的主要建筑需要在體塊的基礎(chǔ)上添加照片紋理,增強(qiáng)真實(shí)感;對(duì)于結(jié)構(gòu)復(fù)雜或者重要的標(biāo)志性建筑可使用3DSMAX進(jìn)行單獨(dú)建模,賦以精細(xì)的結(jié)構(gòu)和紋理。
3:數(shù)據(jù)準(zhǔn)備
3.1:數(shù)據(jù)獲取及處理
3.1.1二維影像數(shù)據(jù)
二維數(shù)據(jù)影響采用航空攝影測(cè)量的方式獲取。通過拍攝規(guī)劃區(qū)域有重疊的航片,選取一定數(shù)量的控制點(diǎn),采用航天遠(yuǎn)景內(nèi)業(yè)加密軟件“APStudio”內(nèi)定向、外定向,最終實(shí)現(xiàn)絕對(duì)定向,拼接完成正攝影像圖。
3.1.2三維建筑模型紋理數(shù)據(jù)獲取與處理
建筑物的紋理包括側(cè)面和頂面兩部分,分別通過近景數(shù)碼照片提取和影像提取的方式。試驗(yàn)區(qū)內(nèi)拍攝有大量的建筑近景照片,需要在Photoshop中對(duì)近景照片進(jìn)行處理,主要是綜合利用裁剪、拼接、自由變換和拉伸等一些基本操作。根據(jù)試驗(yàn)可以得出:處理后的照片最好保存為JPG格式,以減少數(shù)據(jù)量,同時(shí)圖像的分辨率應(yīng)調(diào)整為2的冪次方,圖像的大小也應(yīng)該盡量小于100KB。而建筑模型的頂面紋理則是從遙感影像中采集的。
3.2:虛擬場(chǎng)景的構(gòu)建
3.2.1:3dmax建模流程
(1):導(dǎo)入矢量閉合多邊形,在CAD圖導(dǎo)入3DMAX中作底圖,在3DMAX中以導(dǎo)入的多邊形為基準(zhǔn)再勾畫相同的多邊形作為地基輪廓。
(2):如果沒有矢量文件,在影像上截取建筑物地圖,通過測(cè)量確定截取圖片的長(zhǎng)寬比例,按照這個(gè)比例在3DMAX中創(chuàng)建一個(gè)box,將截取的圖片貼在這個(gè)box上確定建筑物的長(zhǎng)寬比例。
(3):根據(jù)截取的影像進(jìn)行輪廓線的勾畫,確定建筑物的結(jié)構(gòu)。
(4):根據(jù)高度信息進(jìn)行擠壓(Extrude)建立模型,根據(jù)拍攝的建筑物照片制作貼圖并依附于建立的三維模型。具體步驟為:在次物體狀態(tài)下為物體的各個(gè)面賦材質(zhì):使用EDITPOLY選擇物體的面,而后將材質(zhì)賦予該面,然后在該面仍在選擇狀態(tài)下,加一UVWMAP修改器,調(diào)整坐標(biāo),而后加一EDITPOLY進(jìn)行一次塌陷,物體上每一個(gè)面如此往復(fù)操作。
3.2.2:導(dǎo)入skyline關(guān)鍵步驟
對(duì)于海量三維模型導(dǎo)入,Skyline采用的了將模型同點(diǎn)層矢量數(shù)據(jù)以名稱或ID進(jìn)行關(guān)聯(lián)方式,批量將大量模型一次導(dǎo)入到TerraExplorer Pro中。這種實(shí)現(xiàn)方式的關(guān)鍵,是獲取到每個(gè).X模型的中心點(diǎn)坐標(biāo)并記錄到相關(guān)點(diǎn)對(duì)象的屬性字段中,同時(shí),以模型唯一名稱為關(guān)聯(lián)字段,進(jìn)行點(diǎn)層數(shù)據(jù)關(guān)聯(lián)三維模型的導(dǎo)入。
模型工作流程:
(1):模型輸出。輸出格式為.X文件
(2):.xpl格式模型的獲取
(3):根據(jù)模型中心點(diǎn)坐標(biāo)制作shp文件
(4):在TEPro中根據(jù)Shp文件批量導(dǎo)入.XPL模型
4:系統(tǒng)功能實(shí)現(xiàn)
本系統(tǒng)二維部分在Visual Studio2008.net環(huán)境下,用C#與ArcGIS Engine組件實(shí)現(xiàn)。三維部分是采用的SkyLine的TerraExplorer Pro提供的部分二次開發(fā)接口,定義三維界面,并實(shí)現(xiàn)部分功能。它們都提供com組件,添加到工具箱直接加載即可。
ArcGIS Engine提供了ToMapPoint方法可以獲得當(dāng)前鼠標(biāo)所在位置的地理坐標(biāo),通過TerraExplorer Pro的TerraExplorerX.IPlane5接口的MovePosition方法可以將三維窗口的中心點(diǎn)移到該地理坐標(biāo),即可實(shí)現(xiàn)二維控制三維。同樣TerraExplorer Pro同樣提供了TerraExplorerX.IPlane5接口的ScreenToWorld方法獲得當(dāng)前鼠標(biāo)所在位置的地理坐標(biāo),而ArcGIS Engine提供的CenterAt的方法,不能對(duì)二維窗口比例尺縮放,必須重繪二維窗口的Extent,三維控制二維也完成了,整個(gè)系統(tǒng)的核心部分也就實(shí)現(xiàn)了。程序運(yùn)行的主界面如圖2所示:
圖2 程序運(yùn)行主界面
互動(dòng)關(guān)鍵代碼如下:
private void MainForm_Load(object sender, EventArgs e)
{
//get the MapControl
m_mapControl = (IMapControl3)axMapControl1.Object;
//disable the Save menu (since there is no document yet)
menuSaveDoc.Enabled = false;
//三維加載
objTerraExplorer = new TerraExplorerClass();
objTerraExplorer.Load(@"K:\***\***.fly");
}
private void axMapControl1_OnMouseDown(object sender, IMapControlEvents2_OnMouseDownEvent e)
{
int X = 0;
int Y = 0;
IPoint pt = axMapControl1.ToMapPoint(e.x, e.y);
MoveMapTo(pt.X, pt.Y);
//地圖刷新
this.axMapControl1.Refresh();
TerraExplorerX.TerraExplorer TE;
TE = new TerraExplorerX.TerraExplorer();
TerraExplorerX.IPlane5 pIPlane;
pIPlane = TE as TerraExplorerX.IPlane5;
//定義各個(gè)參數(shù)的變量
double dobjH = 20;
double dYaw = 30;
double dPitch = 320;
double dRoll = 0;
double dCameraDeltaYaw = 0;
double dCameraDeltaPitch = 0;
int Flags = 0;
double pX = Convert.ToDouble(pt.X);
double pY = Convert.ToDouble(pt.Y);
////將三維窗口中心點(diǎn)坐標(biāo)移到二維窗口中心點(diǎn)坐標(biāo)轉(zhuǎn)換到的地理坐標(biāo)上
pIPlane.MovePosition(pX, pY, dobjH, dYaw, dPitch, dRoll, dCameraDeltaYaw, dCameraDeltaPitch, Flags);
TerraExplorerX.IRender5 pIRender;
pIRender = TE as TerraExplorerX.IRender5;
TerraExplorerX.IObjectManager51 pIObjectManager;
pIObjectManager = TE as TerraExplorerX.IObjectManager51;
TerraExplorerX.ITENavigationMap5 pITENavigationMap;
pITENavigationMap = TE as TerraExplorerX.ITENavigationMap5;
TerraExplorerX.IInformationTree5 pIInformationTree;
pIInformationTree = TE as TerraExplorerX.IInformationTree5;
object objType = 63;
object objX = 0;
object objY = 0;
object objH = 0;
object objID = "";
////將地理坐標(biāo)轉(zhuǎn)換為屏幕坐標(biāo)
pIRender.ScreenToWorld(X, Y, ref objType, out objX, out objH, out objY, out objID);
string strobjx = Convert.ToString(objX);
string strobjy = Convert.ToString(objY);
double dobjx = Convert.ToDouble(objX);
double dobjy = Convert.ToDouble(objY);
//pCenterpoint.X = dobjx;
//pCenterpoint.Y = dobjy;
//三維和二維移動(dòng)
MoveMapTo(dobjx, dobjy);
//地圖刷新
this.axMapControl1.Refresh();
}
private void MoveMapTo(double X, double Y)
{
IPoint pPointt = new PointClass();
pPointt.X = X;
pPointt.Y = Y;
double dblWidth = this.axMapControl1.Extent.Width;
double dblHeight = this.axMapControl1.Extent.Height;
//畫一個(gè)矩形
IEnvelope IIEnvelope = new ESRI.ArcGIS.Geometry.EnvelopeClass();
IIEnvelope.UpperLeft.X = pPointt.X - dblWidth / 2;
IIEnvelope.UpperLeft.Y = pPointt.Y - dblHeight / 2;
IIEnvelope.LowerRight.X = pPointt.X + dblWidth / 2;
IIEnvelope.LowerRight.Y = pPointt.Y + dblHeight / 2;
//中心點(diǎn)移到矩形中心
axMapControl1.CenterAt(pPointt);
//將矩形作為二維窗口的窗口
axMapControl1.Extent = IIEnvelope;
5:結(jié)論
通過此系統(tǒng)的成功運(yùn)行,驗(yàn)證了二三維聯(lián)動(dòng)機(jī)制實(shí)現(xiàn)的可能性。但這只是Skyline二次開發(fā)中實(shí)現(xiàn)的其中一個(gè)功能,要實(shí)現(xiàn)“全功能”三維地理信息系統(tǒng),“萬里長(zhǎng)征只走了第一步”。更多的三維分析的理論和方法還需要做進(jìn)一步的研究。
參考文獻(xiàn)
-
萬劍華,潘正風(fēng),李清泉.城市三維地理信息系統(tǒng)研究的幾個(gè)焦點(diǎn)問題[J].測(cè)繪通報(bào).2002(7):11-13
-
李建成. 基于ArcEngine的三維GIS的設(shè)計(jì)與實(shí)現(xiàn)[J]. 遙感技術(shù)與應(yīng)用, 2009, 24(3): 395-398.
-
李佼. 基于TerraExplorer Pro的三維城市瀏覽系統(tǒng)開發(fā)[J]. 計(jì)算機(jī)技術(shù)與發(fā)展, 2009, 19(6): 240-242.
-
梁吉欣. Skyline在Web三維GIS中的應(yīng)用研究[J]. 昆明理工大學(xué)學(xué)報(bào)(理工版), 2009, 34(2).
-
王磊, 周云軒. GIS二維、三維空間信息查詢功能的實(shí)現(xiàn)與應(yīng)用[J]. 計(jì)算機(jī)應(yīng)用研究, 2001, 18(12): 145-148.
-
徐占華,梁建國(guó).基于 Skyline的最短路徑分析算法設(shè)計(jì)與實(shí)現(xiàn)[J].城市勘測(cè).2008(4):31-42.