




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)
文檔簡介
1、ArcGISEngine二次開發(fā)提高篇ArcGISEngine高級功能開發(fā)ArcGISEngine二次開發(fā)提高篇ArcGISEngine高級功能開發(fā)1縮略圖(鷹眼)鷹眼功能是GIS的主要功能之一,當(dāng)?shù)貓D范圍很大時,它可以很好的為用戶指明當(dāng)前地圖的范圍。在本小節(jié)中我們將學(xué)習(xí)如何制作這種鷹眼。1.1 添加控件新建一個C#.Net項目,項目名稱為OverView,將Forml的名字設(shè)置為MainForm,并添力口ToolbarControl、兩個MapControl和LicenceControl等四個控件。布局如下圖所示。左邊的axMapControl1用于地圖數(shù)據(jù)顯示和操作,右邊axMapCont
2、rol2用于鷹眼顯示。圖1界面布局在ToolbarControl加載添加數(shù)據(jù)按鈕和地圖瀏覽的功能按鈕,如下圖所示,并將ToolbarControl的伙伴控件設(shè)為axMapControl1。圖2添加按鈕1.2 代碼添加及解釋鷹眼用來顯示主窗體當(dāng)前視圖范圍在全景視圖中的位置,在ArcMap中使用一個線框在鷹眼視圖中標(biāo)識。當(dāng)主視圖中的視圖范圍改變時,鷹眼中的線框隨之改變,當(dāng)拖動鷹眼視圖中的紅線框時,主視圖中的視圖范圍也隨之改變。下面開始實現(xiàn)鷹眼功能,添加usingESRI.ArcGIS.Carto、usingESRI.ArcGIS.Geometry、usingESRI.ArcGIS.Display三
3、個引用。首先在axMapControll中視圖范圍改變時鷹眼窗體要做出對應(yīng)的響應(yīng),即繪制線框并顯示,在OnExtentUpdated事件中添加代碼如下:privatevoidaxMapControl1_OnExtentUpdated(objectsender,ESRI.ArcGIS.Controls.IMapControlEvents2_OnExtentUpdatedEvente)/創(chuàng)建鷹眼中線框IEnvelopepEnv=(IEnvelope)e.newEnvelope;IRectangleElementpRectangleEle=newRectangleElementClass();IEl
4、ementpEle=pRectangleEleasIElement;pEle.Geometry=pEnv;/設(shè)置線框的邊線對象,包括顏色和線寬IRgbColorpColor=newRgbColorClass();pColor.Red=255;pColor.Green=0;pColor.Blue=0;pColor.Transparency=255;/產(chǎn)生一個線符號對象ILineSymbolpOutline=newSimpleLineSymbolClass();pOutline.Width=2;pOutline.Color=pColor;/設(shè)置顏色屬性pColor.Red=255;pColor.G
5、reen=0;pColor.Blue=0;pColor.Transparency=0;/設(shè)置線框填充符號的屬性IFillSymbolpFillSymbol=newSimpleFillSymbolClass();pFillSymbol.Color=pColor;pFillSymbol.Outline=pOutline;IFillShapeElementpFillShapeEle=pEleasIFillShapeElement;pFillShapeEle.Symbol=pFillSymbol;/得到鷹眼視圖中的圖形元素容器IGraphicsContainerpGra=axMapControl2.M
6、apasIGraphicsContainer;IActiveViewpAv=pGraasIActiveView;/在繪制前,清除axMapControl2中的任何圖形元素pGra.DeleteAllElements();/鷹眼視圖中添加線框pGra.AddElement(IElement)pFillShapeEle,0);/刷新鷹眼pAv.PartialRefresh(esriViewDrawPhase.esriViewGraphics,null,null);當(dāng)鼠標(biāo)點擊鷹眼窗體時,主窗體Extent隨之改變。在axMapControl2的OnMouseDow#件中添加代碼如下:privatev
7、oidaxMapControl2_OnMouseDown(objectsender,ESRI.ArcGIS.Controls.IMapControlEvents2_OnMouseDownEvente)if(this.axMapControl2.Map.LayerCount!=0)/按下鼠標(biāo)左鍵移動矩形框if(e.button=1)IPointpPoint=newPointClass();pPoint.PutCoords(e.mapX,e.mapY);IEnvelopepEnvelope=this.axMapControl1.Extent;pEnvelope.CenterAt(pPoint);t
8、his.axMapControl1.Extent=pEnvelope;this.axMapControl1.ActiveView.PartialRefresh(esriViewDrawPhase.esriViewGeography,null,null);/按下鼠標(biāo)右鍵繪制矩形框elseif(e.button=2)IEnvelopepEnvelop=this.axMapControl2.TrackRectangle();this.axMapControl1.Extent=pEnvelop;this.axMapControl1.ActiveView.PartialRefresh(esriViewD
9、rawPhase.esriViewGeography,null,null);當(dāng)鼠標(biāo)在鷹眼窗體移動時,主窗體Extent隨之改變。在axMapControl2的OnMouseMov事件中添加代碼如下:privatevoidaxMapControl2_OnMouseMove(objectsender,ESRI.ArcGIS.Controls.IMapControlEvents2_OnMouseMoveEvente)/如果不是左鍵按下就直接返回if(e.button!=1)return;IPointpPoint=newPointClass();pPoint.PutCoords(e.mapX,e.ma
10、pY);this.axMapControl1.CenterAt(pPoint);this.axMapControl1.ActiveView.PartialRefresh(esriViewDrawPhase.esriViewGeography,null,null);下面代碼用于實現(xiàn)axMapControl2與axMapControl1的數(shù)據(jù)的同步更新,獲取主視圖中視圖范圍最大的圖層作為鷹眼中的視圖。這個更新由兩部分組成,一個是對axMapControll添加地圖文檔(mxd文件)的響應(yīng),通過axMapControll的OnMapReplac郵件實現(xiàn),一個是對axMapControll添加單個圖層
11、的響應(yīng),通過axMapControl1的OnFullExtentUpdated事件實現(xiàn)。我們獲取主視圖中的視圖范圍最大的圖層寫成一個獨(dú)立的函數(shù),方便調(diào)用。privateILayerGetOverviewLayer(IMapmap)/獲取主視圖的第一個圖層ILayerpLayer=map.get_Layer(0);遍歷其他圖層,并比較視圖范圍的寬度,返回寬度最大的圖層/ILayerpTempLayer=null;for(inti=1;i<map.LayerCount;i+)pTempLayer=map.get_Layer(i);if(pLayer.AreaOfInterest.Width&
12、lt;pTempLayer.AreaOfInterest.Width)pLayer=pTempLayer;returnpLayer;然后在axMapControll的OnMapReplace那件中調(diào)用。privatevoidaxMapControl1_OnMapReplaced(objectsender,IMapControlEvents2_OnMapReplacedEvente)/獲取鷹眼圖層this.axMapControl2.AddLayer(this.GetOverviewLayer(this.axMapControl1.Map);/設(shè)置MapControl顯示范圍至數(shù)據(jù)的全局范圍th
13、is.axMapControl2.Extent=this.axMapControl1.FullExtent;/刷新鷹眼控件地圖this.axMapControl2.Refresh();在axMapControl1的OnFullExtentUpdated添加代碼,用于實現(xiàn)在主視圖添加圖層時,實現(xiàn)對鷹眼視圖的更新。代碼如下:privatevoidaxMapControl1_OnFullExtentUpdated(objectsender,ESRI.ArcGIS.Controls.IMapControlEvents2_OnFullExtentUpdatedEvente)獲取鷹眼圖層/this.axM
14、apControl2.AddLayer(this.GetOverviewLayer(this.axMapControl1.Map);/設(shè)置MapControl顯示范圍至數(shù)據(jù)的全局范圍this.axMapControl2.Extent=this.axMapControl1.FullExtent;/刷新鷹眼控件地圖this.axMapControl2.Refresh();本例的示例數(shù)據(jù)無特別要求,使用前面章節(jié)實例數(shù)據(jù)即可。運(yùn)行程序,添加地圖數(shù)據(jù),可以在主視圖進(jìn)行相關(guān)操作,鷹眼視圖同步響應(yīng),在鷹眼視圖可以移動紅線框可以同步更新主視圖的視圖范圍,在鷹眼視圖單擊右鍵拉框可以重新繪制紅線框,效果如下:圖3
15、鷹眼效果1.3 MyGIS中添加鷹眼在上一講中的最后一節(jié),我們創(chuàng)建了一個簡單的GIS系統(tǒng)MyGIS這里,我們講鷹眼功能嵌入到我們的系統(tǒng)中。在這里我們對實現(xiàn)的思路做一個介紹,請您自己動手完善MyGIS首先需要修改一下MyGIS窗體的控件布局,我們講鷹眼視圖放到圖層管理器的下方,需要在控件容器SpliterContainerl的Panell中添加一個水平分隔的SpliterContainer,然后將圖層管理器空間TOCControl和鷹眼視圖MapControl分別置于上下的容器中,并將其屬性Dock分別設(shè)為Fill。另外,在此種窗體布局情況下,直接在TOCControl控件屬性中設(shè)置伙伴控件無效
16、,如圖所示。我們需要在MainForm的Load事件中為TOCControl設(shè)置伙伴控件為axMapControl1。添加代碼如下:privatevoidForm1_Load(objectsender,EventArgse)/設(shè)置axTOCControll的伙伴控件this.axTOCControll.SetBuddyControl(axMapControll.Object);圖4TOCControl控件屬性中設(shè)置伙伴控件然后依次添加本例中的代碼,即可完成,運(yùn)行效果如下圖所示圖5MyGIS中鷹眼的運(yùn)行效果1.4 小結(jié)在本小節(jié)中,我們實現(xiàn)了鷹眼功能并講鷹眼加入了MyGIS這部分的重點是鷹眼視圖和
17、主視圖之間的事件交互。推薦您仔細(xì)結(jié)合例子程序查看代碼,如果需要獲得進(jìn)一步的信息,請查看幫助系統(tǒng)。如果您對這一小節(jié)的內(nèi)容比較熟悉了,就可以開始學(xué)習(xí)本章最后一小節(jié)的內(nèi)容了。在下一小節(jié)中,我們將嘗試添加緩沖區(qū)分析功能。ArcGISEngine高級功能開發(fā)2緩沖區(qū)分析緩沖區(qū)分析指為了識別某一地理實體或空間物體對其周圍地物影響度而在其周圍建立的具有一定寬度的區(qū)域,以確定哪些實體落在了被影響的區(qū)域范圍之內(nèi)。緩沖區(qū)分析與緩沖區(qū)查詢不同,緩沖區(qū)查詢是不破壞原有空間目標(biāo)的關(guān)系,只是檢索到該緩沖區(qū)范圍內(nèi)涉及到的目標(biāo)。而緩沖區(qū)分析是根據(jù)設(shè)定的距離條件對一類地物建立緩沖區(qū)多邊形,存儲到一個新的圖層中。然后再將新的圖層
18、與需要進(jìn)行緩沖區(qū)分析的圖層進(jìn)行疊置分析,得到所需要的結(jié)果。因此,緩沖區(qū)分析實際上進(jìn)行了兩步的操作,第一步是建立緩沖區(qū)圖層,第二步是進(jìn)行疊置剪裁分析。緩沖區(qū)分析適用于點、線、面對象,如點狀的居民點、線狀的河流和面狀的作物分布區(qū)等,只要地理實體能對周圍一定區(qū)域形成影響即可使用這種分析方法。I.II圖6點、線、面的緩沖區(qū)分析ArcGIS的ArcToolBox中的分析工具提供了緩沖區(qū)分析的功能,本節(jié)實習(xí)我們首先使用Geoprocessor方法實現(xiàn)一個簡單的緩沖區(qū)分析功能,然后將緩沖區(qū)分析功能添加到我們的MyGIS項目中。程序運(yùn)行前首先需要在D盤下新建一個名為Temp的文件夾存放疊置分析生成的文件。2.
19、1 Geoprocessor實現(xiàn)緩沖區(qū)分析為了降低開發(fā)難度和提高開發(fā)效率,ArcGISEngine中添加了GeoProcessor類,使用Geoprocessor能幫助用戶直接實現(xiàn)一些簡單的工具性的功能,所有在ArcToolBox中的功能,基本都可以用Geoprocessor編程實現(xiàn)。本節(jié)我們使用Geoprocessor實現(xiàn)緩沖區(qū)分析的功能。2.1.1添加控件新建一個C#.Net項目,項目名稱為Buffer,將Form1的名字設(shè)置為MainForm,并添力口ToolbarControl、MapControl、TOCControkLicenceControl和Button等五個控件。并將Tool
20、barControl、TOCControl的伙伴控件設(shè)為MapControl,Button控件的Nameil性設(shè)定為btnBuffer,Text屬性設(shè)定為“緩沖區(qū)分析”??丶季中Ч缦聢D所示。ArcGISEngine高級功能開發(fā)圖7控件布局效果在ToolbarControl加載添加數(shù)據(jù)按鈕和地圖瀏覽的功能按鈕,如下圖所示圖8添加按鈕2.1.2 代碼添加及解釋首先添加如下四個命名空間的引用。usingESRI.ArcGIS.Carto;usingESRI.ArcGIS.Geoprocessor;usingESRI.ArcGIS.Geoprocessing;usingESRI.ArcGIS.es
21、riSystem;在使用Geoprocessor工具實現(xiàn)緩沖區(qū)分析時,需要首先定義一個Geoprocessor對象,因為命名空間“ESRI.ArcGIS.Geoprocessing”也包含Geoprocessor類,為了避免混淆,我們使用命ArcGISEngine高級功能開發(fā)名空間來定義Geoprocessor,然后設(shè)置Geoprocessor中的環(huán)境參數(shù),這里我們使用默認(rèn)參數(shù)。然后定義一個操作類Buffer,并設(shè)置參數(shù),生成緩沖區(qū)的參數(shù)包含原始圖層,緩沖半徑和輸出路徑,最后使用已定義的Geoprocessor對象執(zhí)行即可。雙擊”生成緩存區(qū)”按鈕,添加代碼如下:privatevoidbtnBu
22、ffer_Click(objectsender,EventArgse)/判斷MapControl中是否包含圖層if(this.axMapControl1.LayerCount=0)return;/獲取MapControl中第一個圖層ILayerpLayer=this.axMapControl1.Map.get_Layer(0);/輸出路徑,可以自行指定stringstrOutputPath="D:Buffer.shp"/緩沖半徑doubledblDistace=1.0;/獲取一個geoprocessor的實例,避免與命名空間Geoprocessing中的Geoprocess
23、or發(fā)生引用錯誤ESRI.ArcGIS.Geoprocessor.Geoprocessorgp=newESRI.ArcGIS.Geoprocessor.Geoprocessor();/OverwriteOutput為真時,輸出圖層會覆蓋當(dāng)前文件夾下的同名圖層gp.OverwriteOutput=true;/創(chuàng)建一個Buffer工具的實例ESRI.ArcGIS.AnalysisTools.Bufferbuffer=newESRI.ArcGIS.AnalysisTools.Buffer(pLayer,strOutputPath,dblDistace);/執(zhí)行緩沖區(qū)分析IGeoProcessorRe
24、sultresults=null;results=gp.Execute(buffer,null)asIGeoProcessorResult;/判斷緩沖區(qū)是否成功生成if(results.Status!=esriJobStatus.esriJobSucceeded)MessageBox.Show("圖層"+pLayer.Name+"緩沖區(qū)生成失敗");elseMessageBox.Show(緩沖區(qū)生成成功”);/將生成圖層加入MapControlintindex=strOutputPath.LastIndexOf("");this.ax
25、MapControl1.AddShapeFile(strOutputPath.Substring(0,index),strOutputPath.Substring(index);運(yùn)行程序,添加一個圖層(多個圖層時本例中默認(rèn)選擇的圖層為第一個圖層),點擊“生ArcGISEngine高級功能開發(fā)成緩沖區(qū)”,運(yùn)行結(jié)果如圖圖9緩沖區(qū)生成效果2.1.3 小結(jié)本例中,我們使用Geoprocessor工具實現(xiàn)了緩沖區(qū)分析。從中我們可以得到Geoprocessor工具使用的一般方法,在使用Geoprocessor時,一般需先定義一個Geoprocessor對象,然后設(shè)置該對象的參數(shù),如本例中的Overwrit
26、eOutput,再定義一個具體的操作類,如本例中的Buffer類,在設(shè)置完操作類的參數(shù)后,則通過Geoprocessor的Excute函數(shù)來執(zhí)行。至此,我們已經(jīng)實現(xiàn)了一個簡單的緩沖區(qū)分析的功能,從中我們學(xué)習(xí)了Geoprocessor的使用方法。下一節(jié)我們講對緩沖區(qū)份分析功能做進(jìn)一步的改進(jìn),使其具有更強(qiáng)的適用性,并將這個功能添加到MyGIS中。2.2 MyGIS中添加緩沖區(qū)分析我們在使用緩沖區(qū)分析時,需要設(shè)定原始的圖層,緩沖半徑以及生成緩沖區(qū)的保存路徑。本節(jié)我們將在上一節(jié)的基礎(chǔ)上進(jìn)一步實現(xiàn)緩沖區(qū)分析,實現(xiàn)緩沖圖層,緩沖半徑和保存路徑的可選設(shè)置。2.2.2 添加控件打開項目MyGIS在MyGIS的
27、主菜單添加一個新的菜單項“空間分析”,并添加子菜單“緩沖區(qū)分析",NameH性修改為"menuBuffer”。項目中添加一個新的窗體,名稱為“BufferForm",NameS性設(shè)為“緩沖區(qū)分析”,添加四個Label、一個ComboBox兩個TextBox、三個Button控件,控件屬性設(shè)置如下:表1控件屬性設(shè)置控件類型Name屬性Text屬性控件說明ArcGISEngine高級功能開發(fā)Label選擇圖層:Label緩沖半徑:LabellblUnit地圖單位標(biāo)示當(dāng)前地圖的地圖單位Label輸出圖層:ComboBoxcboLayers所有圖層的名稱生成緩沖區(qū)的緩沖半
28、徑TextBoxtxtBufferDistance1.0TextBoxtxtOutputPath緩沖區(qū)文件的輸出路徑,其ReadOnly屬性設(shè)為TrueButtonbtnOutputLayer選擇緩沖區(qū)文件的輸出路徑ButtonbtnBuffer分析進(jìn)行緩沖區(qū)分析ButtonbtnCancel取消取消2.2.3 代碼添加及解釋該項目需添加如下引用:usingESRI.ArcGIS.Controls;usingESRI.ArcGIS.Geoprocessor;usingESRI.ArcGIS.Carto;usingESRI.ArcGIS.Geoprocessing;usingESRI.ArcGI
29、S.esriSystem;首先聲明兩個成員變量,用于保存地圖數(shù)據(jù)和輸出文件的路徑。/接收MapControl中的數(shù)據(jù)privateIHookHelpermHookHelper=newHookHelperClass();/緩沖區(qū)文件輸出路徑publicstringstrOutputPath;重寫B(tài)ufferForm的構(gòu)造函數(shù),添加一個參數(shù),用于接收MapControl中的數(shù)據(jù)。/重寫構(gòu)造函數(shù),添加參數(shù)hook,用于傳入MapControl中的數(shù)據(jù)publicBufferForm(objecthook)InitializeComponent();this.mHookHelper.Hook=hook
30、;添加一個自定義函數(shù),用于根據(jù)圖層名稱獲取要素圖層并返回。privateIFeatureLayerGetFeatureLayer(stringlayerName)IFeatureLayerpFeatureLayer=null;/遍歷圖層,獲取與名稱匹配的圖層ArcGISEngine高級功能開發(fā)for(inti=0;i<this.mHookHelper.FocusMap.LayerCount;i+)ILayerpLayer=this.mHookHelper.FocusMap.get_Layer(i);if(pLayer.Name=layerName)pFeatureLayer=pLayer
31、asIFeatureLayer;if(pFeatureLayer!=null)returnpFeatureLayer;elsereturnnull;BufferForm在載入時需要加載當(dāng)前MapControl中的圖層名稱到cboLayers,讀取當(dāng)前地圖的地圖單位,設(shè)置緩沖區(qū)文件的默認(rèn)輸出路徑,這里我們將默認(rèn)輸出路徑設(shè)為“D:privatevoidBufferForm_Load(objectsender,EventArgse)/傳入數(shù)據(jù)為空時返回if(null=mHookHelper|null=mHookHelper.Hook|0=mHookHelper.FocusMap.LayerCount
32、)return;/獲取圖層名稱并加入cboLayersfor(inti=0;i<this.mHookHelper.FocusMap.LayerCount;i+)ILayerpLayer=this.mHookHelper.FocusMap.get_Layer(i);cboLayers.Items.Add(pLayer.Name);/cboLayers控件中默認(rèn)顯示第一個選項if(cboLayers.Items.Count>0)cboLayers.SelectedIndex=0;/設(shè)置生成文件的默認(rèn)輸出路徑和名稱stringtempDir="D:Temp"txtOu
33、tputPath.Text=System.IO.Path.Combine(tempDir,(string)cboLayers.SelectedItem+"_buffer.shp");/設(shè)置默認(rèn)地圖單位lblUnits.Text=Convert.ToString(mHookHelper.FocusMap.MapUnits);ArcGISEngine高級功能開發(fā)雙擊路徑設(shè)置按鈕,進(jìn)入代碼編輯界面,添加如下代碼:privatevoidbtnOutputLayer_Click(objectsender,EventArgse)/定義輸出文件路徑SaveFileDialogsaveDl
34、g=newSaveFileDialog();/檢查路徑是否存在saveDlg.CheckPathExists=true;saveDlg.Filter="Shapefile(*.shp)|*.shp"/保存時覆蓋同名文件saveDlg.OverwritePrompt=true;saveDlg.Title="輸出路徑"/對話框關(guān)閉前還原當(dāng)前目錄saveDlg.RestoreDirectory=true;saveDlg.FileName=(string)cboLayers.SelectedItem+"_buffer.shp"/讀取文件輸出路
35、徑到txtOutputPathDialogResultdr=saveDlg.ShowDialog();if(dr=DialogResult.OK)txtOutputPath.Text=saveDlg.FileName;雙擊“分析”按鈕,添加代碼如下:privatevoidbtnBuffer_Click(objectsender,EventArgse)/緩沖距離doublebufferDistance;/輸入的緩沖距離轉(zhuǎn)換為doubledouble.TryParse(txtBufferDistance.Text.ToString(),outbufferDistance);/判斷輸出路徑是否合法i
36、f(!System.IO.Directory.Exists(System.IO.Path.GetDirectoryName(txtOutputPath.Text)|".shp"!=System.IO.Path.GetExtension(txtOutputPath.Text)MessageBox.Show('輸出路彳錯誤!");return;/判斷圖層個數(shù)if(mHookHelper.FocusMap.LayerCount=0)return;/獲取圖層ArcGISEngine高級功能開發(fā)IFeatureLayerpFeatureLayer=GetFeatur
37、eLayer(string)cboLayers.SelectedItem);if(null=pFeatureLayer)MessageBox.Show("圖層"+(string)cboLayers.Selectedltem+"不存在!rn");return;/獲取一個geoprocessor的實例Geoprocessorgp=newGeoprocessor();/OverwriteOutput為真時,輸出圖層會覆蓋當(dāng)前文件夾下的同名圖層gp.OverwriteOutput=true;/緩沖區(qū)保存路徑strOutputPath=txtOutputPath.
38、Text;/創(chuàng)建一個Buffer工具的實例ESRI.ArcGIS.AnalysisTools.Bufferbuffer=newESRI.ArcGIS.AnalysisTools.Buffer(pFeatureLayer,strOutputPath,bufferDistance.ToString();/執(zhí)行緩沖區(qū)分析IGeoProcessorResultresults=null;results=(IGeoProcessorResult)gp.Execute(buffer,null);/判斷緩沖區(qū)是否成功生成if(results.Status!=esriJobStatus.esriJobSucce
39、eded)MessageBox.Show("圖層"+pFeatureLayer.Name+"緩沖區(qū)生成失敗");elsethis.DialogResult=DialogResult.OK;MessageBox.Show。緩沖區(qū)生成成功");雙擊“取消”按鈕,添加代碼如下:privatevoidbtnCancel_Click(objectsender,EventArgse)this.Dispose();進(jìn)入MyGIS的主窗體,雙擊菜單中的“緩沖區(qū)分析”,添加代碼如下:BufferFormbufferForm=newBufferForm(this.
40、axMapControl1.Object);if(bufferForm.ShowDialog()=DialogResult.OK)/獲取輸出文件路徑stringstrBufferPath=bufferForm.strOutputPath;ArcGISEngine高級功能開發(fā)/緩沖區(qū)圖層載入到MapControlintindex=strBufferPath.LastIndexOf("");this.axMapControl1.AddShapeFile(strBufferPath.Substring(0,index),strBufferPath.Substring(index)
41、;至此,代碼編輯完成,運(yùn)行程序,添加數(shù)據(jù)usa.mxd,選擇圖層wind,設(shè)置緩沖區(qū)半徑為0.8,點擊“分析”,效果如下圖所示。圖10緩沖區(qū)分析效果如果運(yùn)行過程中出現(xiàn)錯誤”正試圖在OS加載程序鎖內(nèi)執(zhí)行托管代碼。不要嘗試在DllMain或映像初始化函數(shù)內(nèi)運(yùn)行托管代碼這樣做會導(dǎo)致應(yīng)用程序掛起?!闭埐捎萌缦路椒ń鉀Q:把vs2005菜單的調(diào)試->異常->ManagedDebugginAssistants->LoaderLock的選中狀態(tài)去掉即可:如果異常,exception,這一項沒有的話在工具-自定義-命令選項卡選擇左邊“調(diào)試”找到右邊“異?!蓖系讲藛紊?。2.2.4 小結(jié)緩沖區(qū)分析
42、是GIS空間分析的基本功能,這一節(jié)我們完成了緩沖區(qū)分析的功能,實現(xiàn)了緩沖區(qū)分析文件、緩沖半徑和輸出路徑的可選設(shè)置,希望您仔細(xì)體會并掌握Geoprocessor工具開發(fā)空間分析功能的基本方法。ArcGISEngine高級功能開發(fā)3疊置分析疊置分析是GIS中一種常見的分析功能,它是將有關(guān)主題層組成的各個數(shù)據(jù)層面進(jìn)行疊置產(chǎn)生一個新的數(shù)據(jù)層面,其結(jié)果綜合了原來兩個或多個層面要素所具有的屬性,同時疊置分析不僅生成了新的空間關(guān)系,而且還將輸入的多個數(shù)據(jù)層的屬性聯(lián)系起來產(chǎn)生了新的屬性關(guān)系。ArcGIS中的疊置分析包含Union(疊置求并)、Intersect(疊置求交)、Identify(疊置標(biāo)識)、Era
43、se(疊置擦除)、SymmetricalDifference(疊置相交取反)、Update(疊置更新)等。這一小節(jié),我們以疊置求交為例,介紹疊置分析的開發(fā)。疊置求交是保留兩個圖層公共部分的空間圖形,并綜合兩個疊加圖層的屬性。如下圖,反映了疊置求交的原理。INFIJI圖11疊置求交示意圖本節(jié)實習(xí)將介紹這種方法實現(xiàn)緩沖區(qū)分析,我們首先使用Geoprocessor方法實現(xiàn)一個簡單的緩沖區(qū)分析功能,然后將緩沖區(qū)分析功能添加到我們的MyGIS項目中。同樣,ArcGIS的ArcToolBox中的分析工具提供了緩沖區(qū)分析的功能,本節(jié)實習(xí)我們首先使用Geoprocessor方法實現(xiàn)一個簡單的緩沖區(qū)分析功能,然
44、后將緩沖區(qū)分析功能添加到我們的MyGIS項目中。程序運(yùn)行前首先需要在D盤下新建一個名為Temp的文件夾存放疊置分析生成的文件。3.1 Geoprocessor實現(xiàn)疊置分析疊置分析我們同樣使用Geoprocessor工具來實現(xiàn)。3.1.1 添加控件新建一個C#.Net項目,項目名稱為OverLay,將Form1的名字設(shè)置為MainForm,并添力口ToolbarControl、MapControl、TOCControkLicenceControl和Button等五個控件。并將ToolbarControl、TOCControl的伙伴控件設(shè)為Text屬性設(shè)定為MapControl,Button控件的
45、NamefS性設(shè)定為btnIntersect“疊置求交”。控件布局效果如下圖所示ArcGIS Engine高級功能開發(fā)圖12控件布局效果在ToolbarControl加載添加數(shù)據(jù)按鈕和地圖瀏覽的功能按鈕,如下圖所示圖13添加按鈕3.1.2 代碼添加及解釋首先添加如下引用:usingESRI.ArcGIS.Carto;usingESRI.ArcGIS.AnalysisTools;usingESRI.ArcGIS.Geoprocessor;usingESRI.ArcGIS.Geoprocessing;ArcGISEngine高級功能開發(fā)與緩沖區(qū)分析的實現(xiàn)類似,在使用Geoprocessor工具實現(xiàn)
46、疊置分析時,需要首先定義一個Geoprocessor對象,因為命名空間“ESRI.ArcGIS.Geoprocessing也包含Geoprocessor類,為了避免混淆,我們使用命名空間來定義Geoprocessor,然后設(shè)置Geoprocessor中的環(huán)境參數(shù),這里我們使用默認(rèn)參數(shù)。然后定義一個操作類,這里為Intersect,然后設(shè)置其操作參數(shù),這里我們僅設(shè)置輸入的要素,最后使用已定義的Geoprocessor對象執(zhí)行即可。雙擊“生成緩存區(qū)”按鈕,添加代碼如下:privatevoidbtnIntersect_Click(objectsender,EventArgse)/添加兩個以上圖層時才
47、允許疊置if(this.axMapControl1.LayerCount<2)return;ESRI.ArcGIS.Geoprocessor.Geoprocessorgp=newESRI.ArcGIS.Geoprocessor.Geoprocessor();/OverwriteOutput為真時,輸出圖層會覆蓋當(dāng)前文件夾下的同名圖層gp.OverwriteOutput=true;/創(chuàng)建疊置分析實例IntersectintersectTool=newIntersect();/獲取MapControl中的前兩個圖層ILayerpInputLayer1=this.axMapControl1.g
48、et_Layer(0);ILayerpInputLayer2=this.axMapControl1.get_Layer(1);轉(zhuǎn)換為object類型/objectinputfeature1=pInputLayer1;objectinputfeature2=pInputLayer2;/設(shè)置參與疊置分析的多個對象IGpValueTableObjectpObject=newGpValueTableObjectClass();pObject.SetColumns(2);pObject.AddRow(refinputfeature1);pObject.AddRow(refinputfeature2);i
49、ntersectTool.in_features=pObject;/設(shè)置輸出路徑stringstrTempPath="D:Temp"stringstrOutputPath=strTempPath+pInputLayer1.Name+"_"+pInputLayer2.Name+"_Intersect.shp"intersectTool.out_feature_class=strOutputPath;/執(zhí)行疊置分析IGeoProcessorResultresult=null;result=gp.Execute(intersectTool,
50、null)asIGeoProcessorResult;/判斷疊置分析是否成功if(result.Status!=ESRI.ArcGIS.esriSystem.esriJobStatus.esriJobSucceeded)MessageBox.Show("疊置求交失?。 ?;ArcGISEngine高級功能開發(fā)elseMessageBox.Show("疊置求交成功”);intindex=strOutputPath.LastIndexOf("");this.axMapControl1.AddShapeFile(strOutputPath.Substring(
51、0,index),strOutputPath.Substring(index);運(yùn)行程序,添加疊置分析的數(shù)據(jù),至少為兩個圖層,點擊“疊置求交”,運(yùn)行結(jié)果如圖。圖14疊置求交效果3.1.3 小結(jié)學(xué)習(xí)完這一小節(jié),細(xì)心的同學(xué)會發(fā)現(xiàn)使用Geoprocessor實現(xiàn)疊置分析與實現(xiàn)緩沖區(qū)分析的基本思路是一致的,只是不同的操作方法設(shè)置了不同的參數(shù)。另外,注意在進(jìn)行疊置分析時要通過IGpValueTableObject接口加載多個要素。請您仔細(xì)體會緩沖區(qū)分析和疊置求交分析的實現(xiàn)過程的相似點與不同點。下一小節(jié)我們將對疊置分析進(jìn)行進(jìn)一步學(xué)習(xí),并將多種疊置分析功能添加到MyGIS中。3.2 MyGIS中添加疊置分析
52、這一小節(jié)我們將在上一節(jié)開發(fā)的疊置求交的基礎(chǔ)上,實現(xiàn)疊置分析中三種最常用的疊置方式,Union(疊置求并)、Intersect(疊置求交)和Identify(疊置標(biāo)識)。Intersect(疊置求交)在上節(jié)已經(jīng)介紹,下面簡要介紹一下Union(疊置求并)和Identify(疊置標(biāo)識)。疊置求并(Union)保留了兩個疊置圖層的空間圖形和屬性信息,進(jìn)行疊置求和的兩個圖層須是多邊形圖層。輸入圖層的一個多邊形被疊加圖層中的多邊形弧段分割成多個多邊形,輸出圖層綜合了兩個圖層的屬性。所有要素都將被寫入到輸出要素類,輸出結(jié)果具有來自與其疊置的輸入要素的屬性。ArcGISEngine高級功能開發(fā)I INPUT
53、圖15疊置求并(Union)Identify(疊置標(biāo)識)是以輸入圖層為界,保留邊界以內(nèi)兩個多變形的所有多邊形,出入圖層切割后的多邊形也被賦予疊加圖層的屬性。如下圖所示。IMPUTOUTPUT圖16疊置標(biāo)識(Identify)在通過ArcEngine中的Geoprocessor實現(xiàn)這三種疊置分析時,我們將實現(xiàn)輸入圖層和疊置圖層的可選設(shè)置,疊置方式的可選設(shè)置,輸出路徑的可選設(shè)置3.2.1 添加控件打開項目MyGIS在MyGIS的主菜單“空間分析”中添加子菜單”疊置分析",NameH性修改為"menuOverlay”。項目中添加一個新的窗體,名稱為“OverlayForm&quo
54、t;,NameH性設(shè)為“疊置分析”,添加四個Label、一個ComboBox四個TextBox、五個Button控件和一個GroupBox,控件屬性設(shè)置如下:表2控件屬性設(shè)置控件類型Name屬性Text屬性Readonly屬性控件說明Label輸入要素:Label疊置要素:Label疊置方式:Label輸出圖層:TextBoxtxtInputFeatTrue保存輸入要素路徑TextBoxtxtOverlayFeatTrue保存疊置要素路徑TextBoxtxtOutputPathTrue疊置結(jié)果的輸出路徑TextBox疊置分析處理過程消息,txtMessageTrueMultiline屬性設(shè)為T
55、rue,ArcGISEngine高級功能開發(fā)ScrollBars屬性設(shè)為VerticalDock屬性設(shè)為FillComboBoxcboOverLay疊置分析的方式ButtonbtnInputFeat選擇輸入要素ButtonbtnOverlayFeat選擇疊置要素Button選擇疊置分析2果的輸出路btnOutputLayer徑ButtonbtnBuffer分析進(jìn)行疊置分析ButtonbtnCancel取消取消GroupBox處理過程作為txtMessage的容器消息3.2.2 代碼添加及解釋該工程需要添加如下引用:usingESRI.ArcGIS.Controls;usingESRI.ArcG
56、IS.AnalysisTools;usingESRI.ArcGIS.Geoprocessing;首先聲明一個成員變量,用于保存疊置分析輸出文件的路徑。publicstringstrOutputPath;OverlayForm在載入時需要加載三種疊置方式到cboOverlay中,并且需要設(shè)置緩沖區(qū)文件的默認(rèn)輸出路徑,這里我們將默認(rèn)輸出路徑設(shè)為“D:”。privatevoidOverlayForm_Load(objectsender,EventArgse)/加載疊置方式求交 (Intersect)");this.cboOverLay.Items.Add(this.cboOverLay.Items.Add("求并(Union)");標(biāo)識 (Identity)");this.cboOverLay.Items.Add("this.cbo
溫馨提示
- 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)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 投資項目可行性研究與項目評估
- 農(nóng)業(yè)觀光生態(tài)園
- 三農(nóng)產(chǎn)品物流配送手冊
- 綠色農(nóng)產(chǎn)品生產(chǎn)技術(shù)推廣與應(yīng)用實踐方案
- 車聯(lián)網(wǎng)及大數(shù)據(jù)應(yīng)用
- 電商行業(yè)直播帶貨模式創(chuàng)新與發(fā)展方案
- 校園廣播系統(tǒng)投標(biāo)方案
- 針對公司運(yùn)營挑戰(zhàn)的對策報告
- 電力設(shè)施節(jié)能減排操作規(guī)程
- 三農(nóng)村公共服務(wù)設(shè)施信息化管理方案
- 作業(yè)層隊伍建設(shè)重點業(yè)務(wù)課件
- DB31T 685-2019 養(yǎng)老機(jī)構(gòu)設(shè)施與服務(wù)要求
- 二年級下冊美術(shù)教案-第5課 美麗的花園|嶺南版
- 人類進(jìn)化史精品課件
- 魯濱遜漂流記讀后感PPT
- 總包單位向門窗單位移交門窗安裝工程工作面交接單
- 設(shè)備供貨安裝方案(通用版)
- 公開招聘社區(qū)居委專職工作人員考試筆試、面試題集及相關(guān)知識(11套試題含答案)
- 《植物生理學(xué)》課件第三章+植物的光合作用
- 中國藥膳理論與實踐-藥膳基本理論和技能
- 華東師大版七年級初一數(shù)學(xué)下冊全套試卷(單元、期中、期末)
評論
0/150
提交評論