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

下載本文檔

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

文檔簡(jiǎn)介

ArcGISArcGISEngine的三維開發(fā)10第八章ArcGISEngine的三維開發(fā)ArcGISArcGIS三維分析簡(jiǎn)介一幅逼真的透視圖。〔3DAnalyst〕添加了兩個(gè)專用的三維可視化應(yīng)用程序:ArcScene和ArcGlobe,它們擴(kuò)展了ArcGISDesktop的功能,并且擴(kuò)展了ArcCatalog和ArcMap的三維功能。ArcScene允許用戶制作具有透視效果的場(chǎng)景對(duì)地理信息系統(tǒng)數(shù)據(jù)進(jìn)展掃瞄和交互ArcScene中的三維分析工具創(chuàng)立和分析外表。ArcGlobe供給在標(biāo)準(zhǔn)計(jì)算機(jī)硬件上對(duì)巨型三維柵格題。這主要是依靠一種引入的索引和快速檢索數(shù)據(jù)的方法實(shí)現(xiàn)的。利用三維分析擴(kuò)展ArcCatalog,從而實(shí)現(xiàn)對(duì)三維數(shù)據(jù)的治理并且ArcCatalog中使用與ArcScene中一樣的掃瞄工具預(yù)覽三維場(chǎng)景和數(shù)據(jù)。沿外表上的三維線生成剖面。ArcGIS三維顯示簡(jiǎn)介ArcGISDesktopArcGlobe和ArcScen由于Engine與Desktop底層技術(shù)都是基于AO的,因此該比較結(jié)果在功GlobeControl和SceneControl。ArcScene簡(jiǎn)介:ArcScene是一個(gè)適合于呈現(xiàn)三維透視場(chǎng)景的平臺(tái)景中漫游并與三維矢量與柵格數(shù)據(jù)進(jìn)展交互ArcScene是基于OpenGL示以提高效率。ArcGlobe簡(jiǎn)介:

圖1ArcScene界面ArcGlobe是ArcGIS9.0之后消滅的產(chǎn)品,設(shè)計(jì)用于呈現(xiàn)大數(shù)據(jù)ArcGlobe基于全球視ArcGlobe按需將數(shù)據(jù)緩存到本地,矢量數(shù)據(jù)可以進(jìn)展柵格化。圖2 ArcGlobe界面ArcGlobe和ArcScene的主要區(qū)分:投影坐標(biāo)系統(tǒng)的不同:ArcGlobe將全部數(shù)據(jù)投影到球體外表上世界。適合于全市,全省,全國甚至全球大范圍內(nèi)的數(shù)據(jù)呈現(xiàn)。ArcScene將全部數(shù)據(jù)投影到當(dāng)前場(chǎng)景所定義的空間參考中狀況下,場(chǎng)景的空間參考由所參與的第一個(gè)圖層空間參考打算。ArcScene中場(chǎng)景表現(xiàn)為平面投影,適合于小范圍內(nèi)精細(xì)場(chǎng)景刻畫。緩存與內(nèi)存治理機(jī)制的不同:ArcGlobe和ArcSceneArcGlobe設(shè)計(jì)用于海量數(shù)據(jù)呈現(xiàn),所以為提高顯示效率而進(jìn)展數(shù)據(jù)緩存是很必要的。ArcGlobe將數(shù)據(jù)分塊并按級(jí)別建立緩存和索引,才使得即使在ArcGlobe中顯示海量數(shù)據(jù)仍可以高速的呈現(xiàn)與漫游。ArcScene會(huì)將全部數(shù)據(jù)讀入場(chǎng)景中完全顯示ArcScene適于小數(shù)據(jù)量小場(chǎng)景精細(xì)呈現(xiàn)的緣由之一。分析功能的不同:ArcGlobe可以極好的呈現(xiàn)大數(shù)據(jù)的場(chǎng)景,同時(shí)供給高速的漫游。但ArcSceneDesktop中3DArcGlobe不支持Tin的顯示,但支持其作為高程數(shù)據(jù)參與場(chǎng)景。ArcGlobe支持Terrain數(shù)據(jù)集但ArcScene不支持。顯示差異ArcGlobe中用戶可以選擇是否將矢量數(shù)據(jù)柵格化后顯示(Annotation)附著顯示于地球外表或像廣告牌一樣面對(duì)當(dāng)前用戶ArcScene中不支持注記(AnnotationArcGlobe中矢量數(shù)據(jù)柵格化后可ArcGlobe場(chǎng)景建設(shè)中實(shí)行“能夠柵格化的矢量數(shù)據(jù)盡量柵格化”的策略也來自于此。1.ArcGISTIN。下面分別對(duì)這四個(gè)模塊做具體介紹,其參考代Chapter8。文件操作該模塊包括翻開工程文件〔sxd文件〕、翻開柵格文件〔打控件〔用于顯示翻開的工程文件和柵格文件〕Button控件、OpenFileDialog控件、SaveFileDialog控件、TabControl控件〔頁面布局控件〕、TOCControl控件〔用于顯示圖層〕。其布局如下:表1控件的名稱和類型比照表控件類型Text屬性控件名稱控件類型Text屬性控件名稱備注SceneControl無mSceneControl顯示數(shù)據(jù)TOCControl無mTOCControl顯示圖層Button翻開sxd文件OpenSxdFile翻開工程的文件Button翻開Raster文件OpenRasterFile翻開柵格的文件Button保存圖片文件SaveImage抓圖TabControl兩個(gè)頁面分別為tabControl1分為兩個(gè)頁面,“基“根本操作”和本操作”和“圖層”“圖層”Buddy屬性設(shè)置為mSceneControl,其方法如下:選中TOCControl控件,右擊彈出菜單并選擇“屬性”。彈出對(duì)話框,選擇General頁面,并找到Buddy復(fù)選框,選擇mSceneControl,如以以下圖。圖4TOCControl控件的Buddy屬性Button控件添加Click大事,并添加以下處理代碼:OpenSxdFile按鈕控件的Click大事代碼:/************************************************************************//* “翻開sxd文件“按鈕按下大事 *//************************************************************************///翻開sxd工程文件privatevoidOpenSxdFile_Click(objectsender,EventArgse){//文件過濾mOpenFileDialog.Filter=“sxd文件|*.sxd“;//翻開文件對(duì)話框翻開大事if(mOpenFileDialog.ShowDialog==DialogResult.OK){//從翻開對(duì)話框中得到翻開文件的全路徑,并將該路徑傳入到mSceneControl中mSceneControl.LoadSxFile(mOpenFileDialog.FileName);}}OpenRasterFile按鈕控件的Click大事代碼:/************************************************************************//* “翻開Raster文件“按鈕按下大事 *//************************************************************************///向工程中添加?xùn)鸥駭?shù)據(jù)privatevoidOpenRasterFile_Click(objectsender,EventArgse){stringsFileName=null;//建柵格圖層IRasterLayerpRasterLayer=null;pRasterLayer=newRasterLayerClass;//取消文件過濾mOpenFileDialog.Filter=“全部文件|*.*“;//翻開文件對(duì)話框翻開大事if(mOpenFileDialog.ShowDialog==DialogResult.OK){//從翻開對(duì)話框中得到翻開文件的全路徑sFileNamemOpenFileDialog.FileName;//創(chuàng)立柵格圖層pRasterLayer.CreateFromFilePath(sFileName);//將圖層參與到控件中mSceneControl.Scene.AddLayer(pRasterLayer,true);//將當(dāng)前視點(diǎn)跳轉(zhuǎn)到柵格圖層ICamerapCamera=mSceneControl.Scene.SceneGraph.ActiveViewer.Camera;//得到范圍IEnvelopepEenvelop=pRasterLayer.VisibleExtent;//添加z軸上的范圍pEenvelop.ZMin=mSceneControl.Scene.Extent.ZMin;pEenvelop.ZMax=mSceneControl.Scene.Extent.ZMax;//設(shè)置相機(jī)pCamera.SetDefaultsMBB(pEenvelop);mSceneControl.Refresh;}}SaveImage按鈕控件的Click大事代碼:/************************************************************************//* “保存圖片文件“按鈕按下大事 *//************************************************************************///抓圖,將場(chǎng)景保存成圖片文件privatevoidSaveImage_Click(objectsender,EventArgse){stringsFileName=““;//保存對(duì)話框的標(biāo)題mSaveFileDialog.Title“保存圖片“;//保存對(duì)話框過濾器mSaveFileDialog.Filter=“BMP圖片|*.bmp|JPG圖片|*.jpg“;//圖片的高度和寬度intWidth=mSceneControl.Width;intHeight=mSceneControl.Height;if(mSaveFileDialog.ShowDialog==DialogResult.OK){sFileName=mSaveFileDialog.FileName;if(mSaveFileDialog.FilterIndex1)//保存成BMP格式的文件{mSceneControl.SceneViewer.GetSnapshot(Width,Height,esri3DOutputImageType.BMP,sFileName);}else//保存成JPG格式的文件{mSceneControl.SceneViewer.GetSnapshot(Width,Height,esri3DOutputImageType.JPEG,sFileName);}}}場(chǎng)景掃瞄

MessageBox.Show(“保存圖片成功!“);mSceneControl.Refresh;arcgis的向?qū)?,定制常用的掃瞄方法,如漫游、放大、縮小等等,該方法簡(jiǎn)潔,并且不需要編寫代碼,其次種方法是通過添加代碼的方法更改場(chǎng)景的CurrentTool屬性,從而實(shí)現(xiàn)場(chǎng)景掃瞄的功能,下面對(duì)以上兩種方法一一介紹:第一種方法:ToolbarControl控件,該控件位于“工具箱”中的“ArcGISWindowsForms”選項(xiàng)中,把它的名字設(shè)置Buddy屬性設(shè)置為mSceneControl,設(shè)置方法與mTOCControl控件一樣。其次步:進(jìn)入“mToolbarControl”屬性對(duì)話框中的“items”頁Add…ControlCommandsControl“Commands”列表中就會(huì)消滅與“Scene”關(guān)聯(lián)的命令,雙擊命令就可以將該命令參與到“mToolbarControl”工具條中,如以以下圖:圖5mToolbarControl屬性對(duì)話框其次種方法:

圖6ControlCommands對(duì)話框第一步,參與C#工具條〔ToolStrip控件〕,并將其“Dock”屬性設(shè)置為“Top”,其次步,在工具條中參與按鈕,并為按鈕添加大事,并寫入大事處理程序,其代碼如下:/************************************************************************//* 工具條“ZoomIn”按鈕按下大事 *//************************************************************************///將場(chǎng)景的縮放privatevoidZoomIn_Click(objectsender,EventArgse){//創(chuàng)立命令I(lǐng)CommandpCommand=newControlsSceneZoomInTool;pCommand.OnCreate(mSceneControl.Object);//將當(dāng)前工具設(shè)置為縮放工具mSceneControl.CurrentTool=pCommandasITool;pCommand=null;//刷mSceneControl.Refresh;}本例僅以縮放為例,其他掃瞄工具與此一樣。SceneControl控件中常用的掃瞄功能如下:類名類名功能ControlsSceneFlyTool(Controls)飛行ControlsSceneFullExtentCommand(Controls)全景視圖ControlsSceneNavigateTool(Controls)導(dǎo)航ControlsSceneOpenDocCommand(Controls)翻開文檔ControlsScenePanTool(Controls)漫游ControlsSceneZoomInTool(Controls)放大ControlsSceneZoomOutTool(Controls)縮小點(diǎn)查詢功能點(diǎn)查詢是通過鼠標(biāo)點(diǎn)擊大事來獵取要素的方法arcgiLocateMultipl點(diǎn)查詢功能,以下對(duì)點(diǎn)查詢功能做具體的介紹:CheckBox控件,并命名為mPointSearch,如圖7所示,該控件把握是否進(jìn)展點(diǎn)查詢操作。圖7CheckBox控件圖8ResultForm窗口布局性改為“查詢結(jié)果”ResultForm窗口中有一個(gè)TreeView控件,該控件圖8ResultForm窗口布局添加私有成員函數(shù)privateResultFormmResultForm,并初始化。為mSceneControl控件添加鼠標(biāo)按下大事OnMouseDown,并參與如下代碼:/************************************************************************//* mSceneControl的OnMouseDown大事 *//************************************************************************///處理點(diǎn)查詢privatevoidOnMouseDown(objectsender,ISceneControlEvents_OnMouseDownEvente){if(mPointSearch.Checked)//check按鈕處于打勾狀態(tài){//查詢mSceneControl.SceneGraph.LocateMultiple(mSceneControl.SceneGraph.ActiveViewer,e.x,e.y,esriScenePickMode.esriScenePickAll,false,outmHit3DSet);mHit3DSet.OnePerLayer;if(mHit3DSet==null)//沒有選中對(duì)象{}else{}

MessageBox.Show(“沒有選中對(duì)象“);//顯示在ResultForm控件中。mHit3DSet為查詢結(jié)果集合mResultForm.Show;mResultForm.refeshView(mHit3DSet);mSceneControl.Refresh;}}第四步,在ResultForm中顯示結(jié)果結(jié)合,其代碼如下://顯示結(jié)果集合publicvoidrefeshView(IHit3DSetpHit3Dset){//用tree控件顯示查詢結(jié)果mTreeView.BeginUpdate;//清空tree控件的內(nèi)容mTreeView.Nodes.Clear;IHit3DpHit3D;inti;//遍歷結(jié)果集for(i=0;i<pHit3Dset.Hits.Count;i++){pHit3D=pHit3Dset.Hits.get_Element(i)asIHit3D;if(pHit3D.OwnerisILayer){ILayerpLayer=pHit3D.OwnerasILayer;//將圖層的名稱和坐標(biāo)顯示在樹節(jié)點(diǎn)中TreeNodenode=mTreeView.Nodes.Add(pLayer.Name);node.Nodes.Add(“X=“+pHit3D.Point.X.ToString);node.Nodes.Add(“Y=“+pHit3D.Point.Y.ToString);node.Nodes.Add(“Z=“+pHit3D.Point.Z.ToString);if(pHit3D.Object!=null){if(pHit3D.ObjectisIFeature){IFeaturepFeature=pHit3D.ObjectasIFeature;intj;//顯示Feature中的內(nèi)容for(j=0;j<pFeature.Fields.FieldCount;j++){node.Nodes.Add(pFeature.Fields.get_Field(j).Name+“:“+pFeature.get_Value(j).ToString);}}}}}mTreeView.EndUpdate;}矢量文件生成TINTIN,并顯示到mSceneControl控件中.其控件布局如以以下圖所示:控件類型Text屬性控件名稱備注ComboBox無mLayerCombox控件類型Text屬性控件名稱備注ComboBox無mLayerCombox選擇圖層ComboBox無mFeildCombox選擇與圖層對(duì)應(yīng)的字段ComboBox無mTINType選擇生成Tin文件的類型Button刷圖層RefreshLayer將當(dāng)前工程的圖層顯示到mLayerCombox中去Button構(gòu)建TINConstructTin創(chuàng)立TINTin所以mTINType復(fù)選框下拉菜單的內(nèi)容也是固定的,可以通過修改ComboBox控件的Items10。本文主TIN的類型,其他的類型請(qǐng)參閱arcgis幫助文檔。 圖10mTINType復(fù)選框下拉菜單的內(nèi)容為RefreshLayer按鈕添加Click大事,其代碼如下:/************************************************************************//* RefreshLayer按鈕Click大事 *//************************************************************************///刷圖層privatevoidRefreshLayer_Click(objectsender,EventArgse){mLayerCombox.Items.Clear;//得到當(dāng)前場(chǎng)景中全部圖層intnCount=mSceneControl.Scene.LayerCount;if(nCount<=0)//沒有圖層的狀況{MessageBox.Show(“場(chǎng)景中沒有圖層,請(qǐng)參與圖層“);return;}inti;ILayerpLayer=null;for(i=0;i<nCount;i++){pLayer=mSceneControl.Scene.get_Layer(i);mLayerCombox.Items.Add(pLayer.Name);}//將復(fù)選框設(shè)置為選中第一項(xiàng)mLayerCombox.SelectedIndex0;addFieldNameToCombox(mLayerCombox.Items[mLayerCombox.SelectedIndex].ToString);}大事,其代碼如下:/************************************************************************//* mLayerCombox的SelectedIndexChanged大事 *//************************************************************************/privatevoidOnSelectIndexChange(objectsender,EventArgse){addFieldNameToCombox(mLayerCombox.Items[mLayerCombox.SelectedIndex].ToString);}//更加圖層的名字將該圖層的字段參與到combox中privatevoidaddFieldNameToCombox(stringlayerName){mFeildCombox.Items.Clear;inti;IFeatureLayerpFeatureLayer=null;IFieldspField=null;intnCount=mSceneControl.Scene.LayerCount;ILayerpLayer=null;//查找名稱為layerName的FeatureLayer;for(i=0;i<nCount;i++){pLayer=mSceneControl.Scene.get_Layer(i)asIFeatureLayer;if(pLayer.NamelayerName)//找到了layerName的Featurelayer{pFeatureLayer=pLayerasIFeatureLayer;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大事,其代碼如下:/************************************************************************//* ConstructTin按鈕的Click大事 *//************************************************************************///創(chuàng)立TinprivatevoidConstructTin_Click(objectsender,EventArgse){if(mLayerCombox.Text==““||mFeildCombox.Text==““)//推斷輸入合法性{MessageBox.Show(“沒有相應(yīng)的圖層“);return;}ITinEditpTin=newTinClass;//查找FeaturelayerIFeatureLayerpFeatureLayermSceneControl.Scene.get_Layer(mLayerCombox.SelectedIndex)asIFeatureLayer;if(pFeatureLayer!=null){IEnvelopepEnvelope=newEnvelopeClass;IFeatureClasspFeatureClass=pFeatureLayer.FeatureClass;IQueryFilterpQueryFilter=newQueryFilterClass;IFieldpField=null;pFieldpFeatureClass.Fields.get_Field(pFeature

溫馨提示

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

評(píng)論

0/150

提交評(píng)論