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