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