實習(xí)指導(dǎo)書ArcGIS Engine三維開發(fā)_第1頁
實習(xí)指導(dǎo)書ArcGIS Engine三維開發(fā)_第2頁
實習(xí)指導(dǎo)書ArcGIS Engine三維開發(fā)_第3頁
實習(xí)指導(dǎo)書ArcGIS Engine三維開發(fā)_第4頁
實習(xí)指導(dǎo)書ArcGIS Engine三維開發(fā)_第5頁
已閱讀5頁,還剩12頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)

文檔簡介

1、第八章 ArcGIS Engine的三維開發(fā)8.1 ArcGIS三維分析及其控件簡介8.1.1 ArcGIS三維分析簡介ArcGIS三維分析提供了對表面數(shù)據(jù)有效的可視化和分析。使用三維分析,可以從多個角度來瀏覽表面數(shù)據(jù),查詢表面,從表面上一選定的位置來確定什么對象可見,以及通過疊加?xùn)鸥窈褪噶繑?shù)據(jù)來創(chuàng)建一幅逼真的透視圖。三維分析(3D Analyst)添加了兩個專用的三維可視化應(yīng)用程序:ArcScene和ArcGlobe,它們擴(kuò)展了ArcGIS Desktop的功能,并且擴(kuò)展了ArcCatalog和ArcMap的三維功能。ArcScene允許用戶制作具有透視效果的場景,在這個場景中可以對地理信息

2、系統(tǒng)數(shù)據(jù)進(jìn)行瀏覽和交互。用戶可以在表面上疊加?xùn)鸥窈褪噶繑?shù)據(jù),并從矢量數(shù)據(jù)源創(chuàng)建線、面和體。用戶也可以使用ArcScene中的三維分析工具創(chuàng)建和分析表面。ArcGlobe提供在標(biāo)準(zhǔn)計算機(jī)硬件上對巨型三維柵格、地形和矢量數(shù)據(jù)集進(jìn)行實時漫游和縮放,在此過程中基本不會感覺到速度上的問題。這主要是依靠一種新引入的索引和快速檢索數(shù)據(jù)的方法實現(xiàn)的。利用三維分析擴(kuò)展ArcCatalog,從而實現(xiàn)對三維數(shù)據(jù)的管理并且創(chuàng)建具有三維視覺屬性的圖層。用戶可以在ArcCatalog中使用與ArcScene中相同的瀏覽工具預(yù)覽三維場景和數(shù)據(jù)。利用三維分析擴(kuò)展ArcMap,從而可以由GIS數(shù)據(jù)生成新的表面,以及分析表面、查

3、詢表面某一位置的屬性值和分析表面不同位置的可見性。用戶還可以計算表面面積和表面之上或者表面之下的體積,并沿表面上的三維線生成剖面。8.2 ArcGIS三維顯示簡介ArcGIS Desktop中,可用于三維場景展示的程序為ArcGlobe和ArcScene,由于兩者的差別,在三維場景展示中適用的情況有所不同。由于Engine與Desktop底層技術(shù)都是基于AO的,因此該比較結(jié)果在功能性和整體效率方面同樣適用與GlobeControl和SceneControl。ArcScene簡介:ArcScene是一個適合于展示三維透視場景的平臺,可以在三維場景中漫游并與三維矢量與柵格數(shù)據(jù)進(jìn)行交互。ArcSce

4、ne是基于OpenGL的,支持TIN數(shù)據(jù)顯示。顯示場景時,ArcScene會將所有數(shù)據(jù)加載到場景中,矢量數(shù)據(jù)以矢量形式顯示,柵格數(shù)據(jù)默認(rèn)會降低分辨率來顯示以提高效率。圖1 ArcScene界面ArcGlobe簡介:ArcGlobe是ArcGIS9.0之后出現(xiàn)的新產(chǎn)品,設(shè)計用于展示大數(shù)據(jù)量的場景,支持對柵格和矢量數(shù)據(jù)無縫的顯示。ArcGlobe基于全球視野,所有數(shù)據(jù)均投影到全球立方投影(World Cube Projection)下,并對數(shù)據(jù)進(jìn)行分級分塊顯示。為提高顯示效率,ArcGlobe按需將數(shù)據(jù)緩存到本地,矢量數(shù)據(jù)可以進(jìn)行柵格化。圖2 ArcGlobe界面ArcGlobe和ArcScene

5、的主要區(qū)別:(1)投影坐標(biāo)系統(tǒng)的不同:ArcGlobe將所有數(shù)據(jù)投影到球體表面上,使場景顯示更接近現(xiàn)實世界。適合于全市,全省,全國甚至全球大范圍內(nèi)的數(shù)據(jù)展示。ArcScene將所有數(shù)據(jù)投影到當(dāng)前場景所定義的空間參考中,默認(rèn)情況下,場景的空間參考由所加入的第一個圖層空間參考決定。ArcScene中場景表現(xiàn)為平面投影,適合于小范圍內(nèi)精細(xì)場景刻畫。(2)緩存與內(nèi)存管理機(jī)制的不同:ArcGlobe和ArcScene最重要的區(qū)別在于此。ArcGlobe設(shè)計用于海量數(shù)據(jù)展示,所以為提高顯示效率而進(jìn)行數(shù)據(jù)緩存是很必要的。ArcGlobe將數(shù)據(jù)分塊并按級別建立緩存和索引,才使得即使在ArcGlobe中顯示海量

6、數(shù)據(jù)仍可以高速的展示與漫游。ArcScene會將所有數(shù)據(jù)讀入場景中完全顯示,因此會占用大量顯存,物理內(nèi)存和虛擬內(nèi)存,這也是ArcScene適于小數(shù)據(jù)量小場景精細(xì)展示的原因之一。(3)分析功能的不同:ArcGlobe可以極好的展示大數(shù)據(jù)的場景,同時提供高速的漫游。但ArcScene對傳統(tǒng)的三維分析功能支持的更好。例如Desktop中3D Analyst工具條在ArcScene中被很好的支持,并支持Tin模型的顯示。ArcGlobe不支持Tin的顯示,但支持其作為高程數(shù)據(jù)加入場景。ArcGlobe支持Terrain數(shù)據(jù)集但ArcScene不支持。(4)顯示差別ArcGlobe中用戶可以選擇是否將矢

7、量數(shù)據(jù)柵格化后顯示,該功能對注記數(shù)據(jù)的顯示也有很大幫助。用戶可以選擇將注記(Annotation)附著顯示于地球表面或像廣告牌一樣面向當(dāng)前用戶。ArcScene中不支持注記(Annotation)數(shù)據(jù)的顯示。在ArcGlobe中矢量數(shù)據(jù)柵格化后可以大幅提高顯示效率,我們在ArcGlobe 場景建設(shè)中采取“能夠柵格化的矢量數(shù)據(jù)盡量柵格化”的策略也來自于此。1. ArcGIS 三維系統(tǒng)的設(shè)計該系統(tǒng)分為四個模塊,分別是文件的操作、場景的瀏覽、點查詢和矢量文件生成TIN。下面分別對這四個模塊做詳細(xì)介紹,其參考代碼請參閱“例子程序”中的Chapter8。122.1 文件操作該模塊包括打開工程文件(打開s

8、xd文件)、打開柵格文件(打開Raster文件)和保存圖片文件。所用到的控件有:SceneControl控件(用于顯示打開的工程文件和柵格文件)、Button控件、OpenFileDialog控件、SaveFileDialog控件、TabControl控件(頁面布局控件)、TOCControl控件(用于顯示圖層)。其布局如下:圖3 文件操作的界面布局(紅線內(nèi)的)表1 控件的名稱和類型對照表控件類型Text屬性控件名稱備注SceneControl無mSceneControl顯示數(shù)據(jù)TOCControl無mTOCControl 顯示圖層Button打開sxd文件OpenSxdFile打開工程的文件

9、Button打開Raster文件OpenRasterFile打開柵格的文件Button保存圖片文件SaveImage抓圖TabControl兩個頁面分別為“基本操作”和“圖層”tabControl1分為兩個頁面,“基本操作”和“圖層”除了上述表所列出的屬性需要設(shè)置,另外還要將TOCControl的Buddy屬性設(shè)置為mSceneControl,其方法如下:(1) 選中TOCControl控件,右擊彈出菜單并選擇“屬性”。(2) 彈出對話框,選擇General頁面,并找到Buddy復(fù)選框,選擇mSceneControl,如下圖。圖4 設(shè)置TOCControl控件的Buddy屬性將控件的屬性設(shè)置完

10、畢之后,為三個Button控件添加Click事件,并添加以下處理代碼:OpenSxdFile按鈕控件的Click事件代碼:/*/ /* 打開sxd文件按鈕按下事件 */ /*/ /打開sxd工程文件 private void OpenSxdFile_Click(object sender, EventArgs e) /文件過濾 mOpenFileDialog.Filter = sxd文件|*.sxd; /打開文件對話框打開事件 if (mOpenFileDialog.ShowDialog() = DialogResult.OK) /從打開對話框中得到打開文件的全路徑,并將該路徑傳入到mScen

11、eControl中 mSceneControl.LoadSxFile(mOpenFileDialog.FileName); OpenRasterFile按鈕控件的Click事件代碼:/*/ /* 打開Raster文件按鈕按下事件 */ /*/ /向工程中添加?xùn)鸥駭?shù)據(jù) private void OpenRasterFile_Click(object sender, EventArgs e) string sFileName = null; /新建柵格圖層 IRasterLayer pRasterLayer = null; pRasterLayer = new RasterLayerClass()

12、; /取消文件過濾 mOpenFileDialog.Filter = 所有文件|*.*; /打開文件對話框打開事件 if (mOpenFileDialog.ShowDialog() = DialogResult.OK) /從打開對話框中得到打開文件的全路徑 sFileName = mOpenFileDialog.FileName; /創(chuàng)建柵格圖層 pRasterLayer.CreateFromFilePath(sFileName); /將圖層加入到控件中 mSceneControl.Scene.AddLayer(pRasterLayer,true); /將當(dāng)前視點跳轉(zhuǎn)到柵格圖層 ICamera

13、 pCamera = mSceneControl.Scene.SceneGraph.ActiveViewer.Camera; /得到范圍 IEnvelope pEenvelop = pRasterLayer.VisibleExtent; /添加z軸上的范圍 pEenvelop.ZMin = mSceneControl.Scene.Extent.ZMin; pEenvelop.ZMax = mSceneControl.Scene.Extent.ZMax; /設(shè)置相機(jī) pCamera.SetDefaultsMBB(pEenvelop); mSceneControl.Refresh(); SaveI

14、mage按鈕控件的Click事件代碼: /*/ /* 保存圖片文件按鈕按下事件 */ /*/ /抓圖,將場景保存成圖片文件 private void SaveImage_Click(object sender, EventArgs e) string sFileName = ; /保存對話框的標(biāo)題 mSaveFileDialog.Title = 保存圖片; /保存對話框過濾器 mSaveFileDialog.Filter = BMP圖片|*.bmp|JPG圖片|*.jpg; /圖片的高度和寬度 int Width = mSceneControl.Width; int Height = mSce

15、neControl.Height; if( mSaveFileDialog.ShowDialog() = DialogResult.OK) sFileName = mSaveFileDialog.FileName; if(mSaveFileDialog.FilterIndex = 1)/保存成BMP格式的文件 mSceneControl.SceneViewer.GetSnapshot(Width, Height, esri3DOutputImageType.BMP, sFileName); else/保存成JPG格式的文件 mSceneControl.SceneViewer.GetSnapsh

16、ot(Width, Height, esri3DOutputImageType.JPEG, sFileName); MessageBox.Show(保存圖片成功!); mSceneControl.Refresh(); 2.2 場景瀏覽有兩種方法定制場景的瀏覽,第一種方法是利用arcgis的向?qū)?,定制常用的瀏覽方法,如漫游、放大、縮小等等,該方法簡單,并且不需要編寫代碼,第二種方法是通過添加代碼的方法更改場景的CurrentTool屬性,從而實現(xiàn)場景瀏覽的功能,下面對以上兩種方法一一介紹:第一種方法:第一步:添加ToolbarControl控件,該控件位于“工具箱”中的“ArcGIS Windo

17、ws Forms”選項中,把它的名字設(shè)置為 ”mToolbarControl”,將“Dock”屬性設(shè)置為“Top”,并將其Buddy屬性設(shè)置為mSceneControl,設(shè)置方法與mTOCControl控件相同。第二步:進(jìn)入“mToolbarControl”屬性對話框中的“items”頁面,并單擊“Add”按鈕。彈出Control Commands對話框,在Control Commands對話框中選中“Category”列表框中的“Scene”選項,在“Commands”列表中就會出現(xiàn)與“Scene”關(guān)聯(lián)的命令,雙擊命令就可以將該命令加入到“mToolbarControl”工具條中,如下圖:圖

18、5 mToolbarControl屬性對話框圖6 Control Commands對話框第二種方法:第一步,加入C#工具條(ToolStrip控件),并將其“Dock”屬性設(shè)置為“Top”,第二步,在工具條中加入按鈕,并為按鈕添加事件,并寫入事件處理程序,其代碼如下:/*/ /* 工具條“ZoomIn”按鈕按下事件 */ /*/ /將場景的縮放 private void ZoomIn_Click(object sender, EventArgs e) /創(chuàng)建命令 ICommand pCommand = new ControlsSceneZoomInTool(); pCommand.OnCrea

19、te(mSceneControl.Object); /將當(dāng)前工具設(shè)置為縮放工具 mSceneControl.CurrentTool = pCommand as ITool; pCommand = null; /刷新 mSceneControl.Refresh(); 本例僅以縮放為例,其他瀏覽工具與此相同。SceneControl控件中常用的瀏覽功能如下:類名功能ControlsSceneFlyTool (Controls)飛行ControlsSceneFullExtentCommand (Controls)全景視圖ControlsSceneNavigateTool (Controls)導(dǎo)航Co

20、ntrolsSceneOpenDocCommand (Controls)打開文檔ControlsScenePanTool (Controls)漫游ControlsSceneZoomInTool (Controls)放大ControlsSceneZoomOutTool (Controls)縮小2.3 點查詢功能點查詢是通過鼠標(biāo)點擊事件來獲取要素的方法,該功能是三維系統(tǒng)最常見的方法,arcgis中提供的LocateMultiple可以很方便的實現(xiàn)點查詢功能,以下對點查詢功能做詳細(xì)的介紹:第一步,在主窗口中添加一個CheckBox控件,并命名為mPointSearch,如圖7所示,該控件控制是否進(jìn)行

21、點查詢操作。圖7 添加CheckBox控件第二步,新建一個Windows窗口,命名為ResultForm,并將Text屬性改為“查詢結(jié)果”ResultForm窗口中有一個TreeView控件,該控件以樹狀形式顯示了查詢的結(jié)果,如圖8所示:圖8 ResultForm窗口布局第三步,為MainFrom添加私有成員函數(shù)private ResultForm mResultForm,并初始化。為mSceneControl控件添加鼠標(biāo)按下事件OnMouseDown,并加入如下代碼: /*/ /* mSceneControl的OnMouseDown事件 */ /*/ /處理點查詢 private void

22、OnMouseDown(object sender, ISceneControlEvents_OnMouseDownEvent e) if(mPointSearch.Checked)/check按鈕處于打勾狀態(tài) /查詢 mSceneControl.SceneGraph.LocateMultiple(mSceneControl.SceneGraph.ActiveViewer, e.x, e.y, esriScenePickMode.esriScenePickAll, false, out mHit3DSet); mHit3DSet.OnePerLayer(); if (mHit3DSet = n

23、ull)/沒有選中對象 MessageBox.Show(沒有選中對象); else /顯示在ResultForm控件中。mHit3DSet為查詢結(jié)果集合 mResultForm.Show(); mResultForm.refeshView(mHit3DSet); mSceneControl.Refresh(); 第四步,在ResultForm中顯示結(jié)果結(jié)合,其代碼如下:/顯示結(jié)果集合 public void refeshView(IHit3DSet pHit3Dset) /用tree控件顯示查詢結(jié)果 mTreeView.BeginUpdate(); /清空tree控件的內(nèi)容 mTreeView

24、.Nodes.Clear(); IHit3D pHit3D; int i; /遍歷結(jié)果集 for (i = 0; i pHit3Dset.Hits.Count; i+) pHit3D = pHit3Dset.Hits.get_Element(i) as IHit3D; if(pHit3D.Owner is ILayer) ILayer pLayer = pHit3D.Owner as ILayer; /將圖層的名稱和坐標(biāo)顯示在樹節(jié)點中 TreeNode node = mTreeView.Nodes.Add(pLayer.Name); node.Nodes.Add(X= + pHit3D.Poi

25、nt.X.ToString(); node.Nodes.Add(Y= + pHit3D.Point.Y.ToString(); node.Nodes.Add(Z= + pHit3D.Point.Z.ToString(); /將該圖層中的所有元素顯示在該樹節(jié)點的子節(jié)點 if(pHit3D.Object != null) if (pHit3D.Object is IFeature) IFeature pFeature = pHit3D.Object as IFeature; int j; /顯示Feature中的內(nèi)容 for (j = 0; j pFeature.Fields.FieldCount

26、; j+) node.Nodes.Add(pFeature.Fields.get_Field(j).Name + : + pFeature.get_Value(j).ToString(); mTreeView.EndUpdate(); 2.4 矢量文件生成TIN本例主要是利用大量的矢量文件生成不規(guī)則三界網(wǎng)TIN,并顯示到mSceneControl控件中.其控件布局如下圖所示:圖9 矢量文件構(gòu)造Tin界面布局(紅線框內(nèi))表2 控件的名稱和類型對照表控件類型Text屬性控件名稱備注ComboBox無mLayerCombox選擇圖層ComboBox無mFeildCombox選擇與圖層對應(yīng)的字段Com

27、boBox無mTINType選擇生成Tin文件的類型Button刷新圖層RefreshLayer將當(dāng)前工程的圖層顯示到mLayerCombox中去Button構(gòu)建TINConstructTin創(chuàng)建TIN另外,由于生成Tin文件的類型是固定的,不需要從場景中獲得,所以mTINType復(fù)選框下拉菜單的內(nèi)容也是固定的,可以通過修改ComboBox控件的Items屬性來設(shè)定下拉菜單的內(nèi)容,如圖10。本文主要介紹以下“點”、“直線”、“光滑線”三種構(gòu)建TIN的類型,其他的類型請參閱arcgis幫助文檔。 圖10 設(shè)定mTINType復(fù)選框下拉菜單的內(nèi)容為RefreshLayer按鈕添加Click事件,其

28、代碼如下: /*/ /* RefreshLayer按鈕Click事件 */ /*/ /刷新圖層 private void RefreshLayer_Click(object sender, EventArgs e) mLayerCombox.Items.Clear(); /得到當(dāng)前場景中所有圖層 int nCount = mSceneControl.Scene.LayerCount; if (nCount = 0)/沒有圖層的情況 MessageBox.Show(場景中沒有圖層,請加入圖層); return; int i; ILayer pLayer = null; /將所有的圖層的名稱顯示到

29、復(fù)選框中 for (i = 0; i nCount; i+) pLayer = mSceneControl.Scene.get_Layer(i); mLayerCombox.Items.Add(pLayer.Name); /將復(fù)選框設(shè)置為選中第一項 mLayerCombox.SelectedIndex = 0; addFieldNameToCombox(mLayerCombox.ItemsmLayerCombox.SelectedIndex.ToString(); 為mLayerCombox控件添加SelectedIndexChanged事件,其代碼如下:/*/ /* mLayerCombox

30、的SelectedIndexChanged事件 */ /*/ private void OnSelectIndexChange(object sender, EventArgs e) addFieldNameToCombox(mLayerCombox.ItemsmLayerCombox.SelectedIndex.ToString(); /更加圖層的名字將該圖層的字段加入到combox中 private void addFieldNameToCombox(string layerName) mFeildCombox.Items.Clear(); int i; IFeatureLayer pFe

31、atureLayer = null; IFields pField = null; int nCount = mSceneControl.Scene.LayerCount; ILayer pLayer = null; /尋找名稱為layerName的FeatureLayer; for (i = 0; i nCount; i+) pLayer = mSceneControl.Scene.get_Layer(i) as IFeatureLayer; if (pLayer.Name = layerName)/找到了layerName的Featurelayer pFeatureLayer = pLay

32、er as IFeatureLayer; break; if(pFeatureLayer != null)/判斷是否找到 pField = pFeatureLayer.FeatureClass.Fields; nCount = pField.FieldCount; /將該圖層中所用的字段寫入到mFeildCombox中去 for (i = 0; i nCount; i+ ) mFeildCombox.Items.Add(pField.get_Field(i).Name); mFeildCombox.SelectedIndex = 0; 為ConstructTin按鈕添加Click事件,其代碼如

33、下: /*/ /* ConstructTin按鈕的Click事件 */ /*/ /創(chuàng)建Tin private void ConstructTin_Click(object sender, EventArgs e) if(mLayerCombox.Text = | mFeildCombox.Text = )/判斷輸入合法性 MessageBox.Show(沒有相應(yīng)的圖層); return; ITinEdit pTin = new TinClass(); /尋找Featurelayer IFeatureLayer pFeatureLayer = mSceneControl.Scene.get_La

34、yer(mLayerCombox.SelectedIndex) as IFeatureLayer; if(pFeatureLayer != null) IEnvelope pEnvelope = new EnvelopeClass(); IFeatureClass pFeatureClass = pFeatureLayer.FeatureClass; IQueryFilter pQueryFilter = new QueryFilterClass(); IField pField = null; /找字段 pField = pFeatureClass.Fields.get_Field(pFeat

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論