版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
1、ArcGISEngine二次開發(fā)提高篇ArcGISEngine高級功能開發(fā)ArcGISEngine二次開發(fā)提高篇ArcGISEngine高級功能開發(fā)1縮略圖(鷹眼)鷹眼功能是GIS的主要功能之一,當地圖范圍很大時,它可以很好的為用戶指明當前地圖的范圍。在本小節(jié)中我們將學習如何制作這種鷹眼。1.1 添加控件新建一個C#.Net項目,項目名稱為OverView,將Forml的名字設置為MainForm,并添力口ToolbarControl、兩個MapControl和LicenceControl等四個控件。布局如下圖所示。左邊的axMapControl1用于地圖數據顯示和操作,右邊axMapCont
2、rol2用于鷹眼顯示。圖1界面布局在ToolbarControl加載添加數據按鈕和地圖瀏覽的功能按鈕,如下圖所示,并將ToolbarControl的伙伴控件設為axMapControl1。圖2添加按鈕1.2 代碼添加及解釋鷹眼用來顯示主窗體當前視圖范圍在全景視圖中的位置,在ArcMap中使用一個線框在鷹眼視圖中標識。當主視圖中的視圖范圍改變時,鷹眼中的線框隨之改變,當拖動鷹眼視圖中的紅線框時,主視圖中的視圖范圍也隨之改變。下面開始實現鷹眼功能,添加usingESRI.ArcGIS.Carto、usingESRI.ArcGIS.Geometry、usingESRI.ArcGIS.Display三
3、個引用。首先在axMapControll中視圖范圍改變時鷹眼窗體要做出對應的響應,即繪制線框并顯示,在OnExtentUpdated事件中添加代碼如下:privatevoidaxMapControl1_OnExtentUpdated(objectsender,ESRI.ArcGIS.Controls.IMapControlEvents2_OnExtentUpdatedEvente)/創(chuàng)建鷹眼中線框IEnvelopepEnv=(IEnvelope)e.newEnvelope;IRectangleElementpRectangleEle=newRectangleElementClass();IEl
4、ementpEle=pRectangleEleasIElement;pEle.Geometry=pEnv;/設置線框的邊線對象,包括顏色和線寬IRgbColorpColor=newRgbColorClass();pColor.Red=255;pColor.Green=0;pColor.Blue=0;pColor.Transparency=255;/產生一個線符號對象ILineSymbolpOutline=newSimpleLineSymbolClass();pOutline.Width=2;pOutline.Color=pColor;/設置顏色屬性pColor.Red=255;pColor.G
5、reen=0;pColor.Blue=0;pColor.Transparency=0;/設置線框填充符號的屬性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);當鼠標點擊鷹眼窗體時,主窗體Extent隨之改變。在axMapControl2的OnMouseDow#件中添加代碼如下:privatev
7、oidaxMapControl2_OnMouseDown(objectsender,ESRI.ArcGIS.Controls.IMapControlEvents2_OnMouseDownEvente)if(this.axMapControl2.Map.LayerCount!=0)/按下鼠標左鍵移動矩形框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);/按下鼠標右鍵繪制矩形框elseif(e.button=2)IEnvelopepEnvelop=this.axMapControl2.TrackRectangle();this.axMapControl1.Extent=pEnvelop;this.axMapControl1.ActiveView.PartialRefresh(esriViewD
9、rawPhase.esriViewGeography,null,null);當鼠標在鷹眼窗體移動時,主窗體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);下面代碼用于實現axMapControl2與axMapControl1的數據的同步更新,獲取主視圖中視圖范圍最大的圖層作為鷹眼中的視圖。這個更新由兩部分組成,一個是對axMapControll添加地圖文檔(mxd文件)的響應,通過axMapControll的OnMapReplac郵件實現,一個是對axMapControll添加單個圖層
11、的響應,通過axMapControl1的OnFullExtentUpdated事件實現。我們獲取主視圖中的視圖范圍最大的圖層寫成一個獨立的函數,方便調用。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那件中調用。privatevoidaxMapControl1_OnMapReplaced(objectsender,IMapControlEvents2_OnMapReplacedEvente)/獲取鷹眼圖層this.axMapControl2.AddLayer(this.GetOverviewLayer(this.axMapControl1.Map);/設置MapControl顯示范圍至數據的全局范圍th
13、is.axMapControl2.Extent=this.axMapControl1.FullExtent;/刷新鷹眼控件地圖this.axMapControl2.Refresh();在axMapControl1的OnFullExtentUpdated添加代碼,用于實現在主視圖添加圖層時,實現對鷹眼視圖的更新。代碼如下:privatevoidaxMapControl1_OnFullExtentUpdated(objectsender,ESRI.ArcGIS.Controls.IMapControlEvents2_OnFullExtentUpdatedEvente)獲取鷹眼圖層/this.axM
14、apControl2.AddLayer(this.GetOverviewLayer(this.axMapControl1.Map);/設置MapControl顯示范圍至數據的全局范圍this.axMapControl2.Extent=this.axMapControl1.FullExtent;/刷新鷹眼控件地圖this.axMapControl2.Refresh();本例的示例數據無特別要求,使用前面章節(jié)實例數據即可。運行程序,添加地圖數據,可以在主視圖進行相關操作,鷹眼視圖同步響應,在鷹眼視圖可以移動紅線框可以同步更新主視圖的視圖范圍,在鷹眼視圖單擊右鍵拉框可以重新繪制紅線框,效果如下:圖3
15、鷹眼效果1.3 MyGIS中添加鷹眼在上一講中的最后一節(jié),我們創(chuàng)建了一個簡單的GIS系統(tǒng)MyGIS這里,我們講鷹眼功能嵌入到我們的系統(tǒng)中。在這里我們對實現的思路做一個介紹,請您自己動手完善MyGIS首先需要修改一下MyGIS窗體的控件布局,我們講鷹眼視圖放到圖層管理器的下方,需要在控件容器SpliterContainerl的Panell中添加一個水平分隔的SpliterContainer,然后將圖層管理器空間TOCControl和鷹眼視圖MapControl分別置于上下的容器中,并將其屬性Dock分別設為Fill。另外,在此種窗體布局情況下,直接在TOCControl控件屬性中設置伙伴控件無效
16、,如圖所示。我們需要在MainForm的Load事件中為TOCControl設置伙伴控件為axMapControl1。添加代碼如下:privatevoidForm1_Load(objectsender,EventArgse)/設置axTOCControll的伙伴控件this.axTOCControll.SetBuddyControl(axMapControll.Object);圖4TOCControl控件屬性中設置伙伴控件然后依次添加本例中的代碼,即可完成,運行效果如下圖所示圖5MyGIS中鷹眼的運行效果1.4 小結在本小節(jié)中,我們實現了鷹眼功能并講鷹眼加入了MyGIS這部分的重點是鷹眼視圖和
17、主視圖之間的事件交互。推薦您仔細結合例子程序查看代碼,如果需要獲得進一步的信息,請查看幫助系統(tǒng)。如果您對這一小節(jié)的內容比較熟悉了,就可以開始學習本章最后一小節(jié)的內容了。在下一小節(jié)中,我們將嘗試添加緩沖區(qū)分析功能。ArcGISEngine高級功能開發(fā)2緩沖區(qū)分析緩沖區(qū)分析指為了識別某一地理實體或空間物體對其周圍地物影響度而在其周圍建立的具有一定寬度的區(qū)域,以確定哪些實體落在了被影響的區(qū)域范圍之內。緩沖區(qū)分析與緩沖區(qū)查詢不同,緩沖區(qū)查詢是不破壞原有空間目標的關系,只是檢索到該緩沖區(qū)范圍內涉及到的目標。而緩沖區(qū)分析是根據設定的距離條件對一類地物建立緩沖區(qū)多邊形,存儲到一個新的圖層中。然后再將新的圖層
18、與需要進行緩沖區(qū)分析的圖層進行疊置分析,得到所需要的結果。因此,緩沖區(qū)分析實際上進行了兩步的操作,第一步是建立緩沖區(qū)圖層,第二步是進行疊置剪裁分析。緩沖區(qū)分析適用于點、線、面對象,如點狀的居民點、線狀的河流和面狀的作物分布區(qū)等,只要地理實體能對周圍一定區(qū)域形成影響即可使用這種分析方法。I.II圖6點、線、面的緩沖區(qū)分析ArcGIS的ArcToolBox中的分析工具提供了緩沖區(qū)分析的功能,本節(jié)實習我們首先使用Geoprocessor方法實現一個簡單的緩沖區(qū)分析功能,然后將緩沖區(qū)分析功能添加到我們的MyGIS項目中。程序運行前首先需要在D盤下新建一個名為Temp的文件夾存放疊置分析生成的文件。2.
19、1 Geoprocessor實現緩沖區(qū)分析為了降低開發(fā)難度和提高開發(fā)效率,ArcGISEngine中添加了GeoProcessor類,使用Geoprocessor能幫助用戶直接實現一些簡單的工具性的功能,所有在ArcToolBox中的功能,基本都可以用Geoprocessor編程實現。本節(jié)我們使用Geoprocessor實現緩沖區(qū)分析的功能。2.1.1添加控件新建一個C#.Net項目,項目名稱為Buffer,將Form1的名字設置為MainForm,并添力口ToolbarControl、MapControl、TOCControkLicenceControl和Button等五個控件。并將Tool
20、barControl、TOCControl的伙伴控件設為MapControl,Button控件的Nameil性設定為btnBuffer,Text屬性設定為“緩沖區(qū)分析”??丶季中Ч缦聢D所示。ArcGISEngine高級功能開發(fā)圖7控件布局效果在ToolbarControl加載添加數據按鈕和地圖瀏覽的功能按鈕,如下圖所示圖8添加按鈕2.1.2 代碼添加及解釋首先添加如下四個命名空間的引用。usingESRI.ArcGIS.Carto;usingESRI.ArcGIS.Geoprocessor;usingESRI.ArcGIS.Geoprocessing;usingESRI.ArcGIS.es
21、riSystem;在使用Geoprocessor工具實現緩沖區(qū)分析時,需要首先定義一個Geoprocessor對象,因為命名空間“ESRI.ArcGIS.Geoprocessing”也包含Geoprocessor類,為了避免混淆,我們使用命ArcGISEngine高級功能開發(fā)名空間來定義Geoprocessor,然后設置Geoprocessor中的環(huán)境參數,這里我們使用默認參數。然后定義一個操作類Buffer,并設置參數,生成緩沖區(qū)的參數包含原始圖層,緩沖半徑和輸出路徑,最后使用已定義的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為真時,輸出圖層會覆蓋當前文件夾下的同名圖層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);運行程序,添加一個圖層(多個圖層時本例中默認選擇的圖層為第一個圖層),點擊“生ArcGISEngine高級功能開發(fā)成緩沖區(qū)”,運行結果如圖圖9緩沖區(qū)生成效果2.1.3 小結本例中,我們使用Geoprocessor工具實現了緩沖區(qū)分析。從中我們可以得到Geoprocessor工具使用的一般方法,在使用Geoprocessor時,一般需先定義一個Geoprocessor對象,然后設置該對象的參數,如本例中的Overwrit
26、eOutput,再定義一個具體的操作類,如本例中的Buffer類,在設置完操作類的參數后,則通過Geoprocessor的Excute函數來執(zhí)行。至此,我們已經實現了一個簡單的緩沖區(qū)分析的功能,從中我們學習了Geoprocessor的使用方法。下一節(jié)我們講對緩沖區(qū)份分析功能做進一步的改進,使其具有更強的適用性,并將這個功能添加到MyGIS中。2.2 MyGIS中添加緩沖區(qū)分析我們在使用緩沖區(qū)分析時,需要設定原始的圖層,緩沖半徑以及生成緩沖區(qū)的保存路徑。本節(jié)我們將在上一節(jié)的基礎上進一步實現緩沖區(qū)分析,實現緩沖圖層,緩沖半徑和保存路徑的可選設置。2.2.2 添加控件打開項目MyGIS在MyGIS的
27、主菜單添加一個新的菜單項“空間分析”,并添加子菜單“緩沖區(qū)分析",NameH性修改為"menuBuffer”。項目中添加一個新的窗體,名稱為“BufferForm",NameS性設為“緩沖區(qū)分析”,添加四個Label、一個ComboBox兩個TextBox、三個Button控件,控件屬性設置如下:表1控件屬性設置控件類型Name屬性Text屬性控件說明ArcGISEngine高級功能開發(fā)Label選擇圖層:Label緩沖半徑:LabellblUnit地圖單位標示當前地圖的地圖單位Label輸出圖層:ComboBoxcboLayers所有圖層的名稱生成緩沖區(qū)的緩沖半
28、徑TextBoxtxtBufferDistance1.0TextBoxtxtOutputPath緩沖區(qū)文件的輸出路徑,其ReadOnly屬性設為TrueButtonbtnOutputLayer選擇緩沖區(qū)文件的輸出路徑ButtonbtnBuffer分析進行緩沖區(qū)分析ButtonbtnCancel取消取消2.2.3 代碼添加及解釋該項目需添加如下引用:usingESRI.ArcGIS.Controls;usingESRI.ArcGIS.Geoprocessor;usingESRI.ArcGIS.Carto;usingESRI.ArcGIS.Geoprocessing;usingESRI.ArcGI
29、S.esriSystem;首先聲明兩個成員變量,用于保存地圖數據和輸出文件的路徑。/接收MapControl中的數據privateIHookHelpermHookHelper=newHookHelperClass();/緩沖區(qū)文件輸出路徑publicstringstrOutputPath;重寫B(tài)ufferForm的構造函數,添加一個參數,用于接收MapControl中的數據。/重寫構造函數,添加參數hook,用于傳入MapControl中的數據publicBufferForm(objecthook)InitializeComponent();this.mHookHelper.Hook=hook
30、;添加一個自定義函數,用于根據圖層名稱獲取要素圖層并返回。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在載入時需要加載當前MapControl中的圖層名稱到cboLayers,讀取當前地圖的地圖單位,設置緩沖區(qū)文件的默認輸出路徑,這里我們將默認輸出路徑設為“D:privatevoidBufferForm_Load(objectsender,EventArgse)/傳入數據為空時返回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控件中默認顯示第一個選項if(cboLayers.Items.Count>0)cboLayers.SelectedIndex=0;/設置生成文件的默認輸出路徑和名稱stringtempDir="D:Temp"txtOu
33、tputPath.Text=System.IO.Path.Combine(tempDir,(string)cboLayers.SelectedItem+"_buffer.shp");/設置默認地圖單位lblUnits.Text=Convert.ToString(mHookHelper.FocusMap.MapUnits);ArcGISEngine高級功能開發(fā)雙擊路徑設置按鈕,進入代碼編輯界面,添加如下代碼:privatevoidbtnOutputLayer_Click(objectsender,EventArgse)/定義輸出文件路徑SaveFileDialogsaveDl
34、g=newSaveFileDialog();/檢查路徑是否存在saveDlg.CheckPathExists=true;saveDlg.Filter="Shapefile(*.shp)|*.shp"/保存時覆蓋同名文件saveDlg.OverwritePrompt=true;saveDlg.Title="輸出路徑"/對話框關閉前還原當前目錄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;/輸入的緩沖距離轉換為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;/判斷圖層個數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為真時,輸出圖層會覆蓋當前文件夾下的同名圖層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();進入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、;至此,代碼編輯完成,運行程序,添加數據usa.mxd,選擇圖層wind,設置緩沖區(qū)半徑為0.8,點擊“分析”,效果如下圖所示。圖10緩沖區(qū)分析效果如果運行過程中出現錯誤”正試圖在OS加載程序鎖內執(zhí)行托管代碼。不要嘗試在DllMain或映像初始化函數內運行托管代碼這樣做會導致應用程序掛起?!闭埐捎萌缦路椒ń鉀Q:把vs2005菜單的調試->異常->ManagedDebugginAssistants->LoaderLock的選中狀態(tài)去掉即可:如果異常,exception,這一項沒有的話在工具-自定義-命令選項卡選擇左邊“調試”找到右邊“異?!蓖系讲藛紊?。2.2.4 小結緩沖區(qū)分析
42、是GIS空間分析的基本功能,這一節(jié)我們完成了緩沖區(qū)分析的功能,實現了緩沖區(qū)分析文件、緩沖半徑和輸出路徑的可選設置,希望您仔細體會并掌握Geoprocessor工具開發(fā)空間分析功能的基本方法。ArcGISEngine高級功能開發(fā)3疊置分析疊置分析是GIS中一種常見的分析功能,它是將有關主題層組成的各個數據層面進行疊置產生一個新的數據層面,其結果綜合了原來兩個或多個層面要素所具有的屬性,同時疊置分析不僅生成了新的空間關系,而且還將輸入的多個數據層的屬性聯系起來產生了新的屬性關系。ArcGIS中的疊置分析包含Union(疊置求并)、Intersect(疊置求交)、Identify(疊置標識)、Era
43、se(疊置擦除)、SymmetricalDifference(疊置相交取反)、Update(疊置更新)等。這一小節(jié),我們以疊置求交為例,介紹疊置分析的開發(fā)。疊置求交是保留兩個圖層公共部分的空間圖形,并綜合兩個疊加圖層的屬性。如下圖,反映了疊置求交的原理。INFIJI圖11疊置求交示意圖本節(jié)實習將介紹這種方法實現緩沖區(qū)分析,我們首先使用Geoprocessor方法實現一個簡單的緩沖區(qū)分析功能,然后將緩沖區(qū)分析功能添加到我們的MyGIS項目中。同樣,ArcGIS的ArcToolBox中的分析工具提供了緩沖區(qū)分析的功能,本節(jié)實習我們首先使用Geoprocessor方法實現一個簡單的緩沖區(qū)分析功能,然
44、后將緩沖區(qū)分析功能添加到我們的MyGIS項目中。程序運行前首先需要在D盤下新建一個名為Temp的文件夾存放疊置分析生成的文件。3.1 Geoprocessor實現疊置分析疊置分析我們同樣使用Geoprocessor工具來實現。3.1.1 添加控件新建一個C#.Net項目,項目名稱為OverLay,將Form1的名字設置為MainForm,并添力口ToolbarControl、MapControl、TOCControkLicenceControl和Button等五個控件。并將ToolbarControl、TOCControl的伙伴控件設為Text屬性設定為MapControl,Button控件的
45、NamefS性設定為btnIntersect“疊置求交”??丶季中Ч缦聢D所示ArcGIS Engine高級功能開發(fā)圖12控件布局效果在ToolbarControl加載添加數據按鈕和地圖瀏覽的功能按鈕,如下圖所示圖13添加按鈕3.1.2 代碼添加及解釋首先添加如下引用:usingESRI.ArcGIS.Carto;usingESRI.ArcGIS.AnalysisTools;usingESRI.ArcGIS.Geoprocessor;usingESRI.ArcGIS.Geoprocessing;ArcGISEngine高級功能開發(fā)與緩沖區(qū)分析的實現類似,在使用Geoprocessor工具實現
46、疊置分析時,需要首先定義一個Geoprocessor對象,因為命名空間“ESRI.ArcGIS.Geoprocessing也包含Geoprocessor類,為了避免混淆,我們使用命名空間來定義Geoprocessor,然后設置Geoprocessor中的環(huán)境參數,這里我們使用默認參數。然后定義一個操作類,這里為Intersect,然后設置其操作參數,這里我們僅設置輸入的要素,最后使用已定義的Geoprocessor對象執(zhí)行即可。雙擊“生成緩存區(qū)”按鈕,添加代碼如下:privatevoidbtnIntersect_Click(objectsender,EventArgse)/添加兩個以上圖層時才
47、允許疊置if(this.axMapControl1.LayerCount<2)return;ESRI.ArcGIS.Geoprocessor.Geoprocessorgp=newESRI.ArcGIS.Geoprocessor.Geoprocessor();/OverwriteOutput為真時,輸出圖層會覆蓋當前文件夾下的同名圖層gp.OverwriteOutput=true;/創(chuàng)建疊置分析實例IntersectintersectTool=newIntersect();/獲取MapControl中的前兩個圖層ILayerpInputLayer1=this.axMapControl1.g
48、et_Layer(0);ILayerpInputLayer2=this.axMapControl1.get_Layer(1);轉換為object類型/objectinputfeature1=pInputLayer1;objectinputfeature2=pInputLayer2;/設置參與疊置分析的多個對象IGpValueTableObjectpObject=newGpValueTableObjectClass();pObject.SetColumns(2);pObject.AddRow(refinputfeature1);pObject.AddRow(refinputfeature2);i
49、ntersectTool.in_features=pObject;/設置輸出路徑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);運行程序,添加疊置分析的數據,至少為兩個圖層,點擊“疊置求交”,運行結果如圖。圖14疊置求交效果3.1.3 小結學習完這一小節(jié),細心的同學會發(fā)現使用Geoprocessor實現疊置分析與實現緩沖區(qū)分析的基本思路是一致的,只是不同的操作方法設置了不同的參數。另外,注意在進行疊置分析時要通過IGpValueTableObject接口加載多個要素。請您仔細體會緩沖區(qū)分析和疊置求交分析的實現過程的相似點與不同點。下一小節(jié)我們將對疊置分析進行進一步學習,并將多種疊置分析功能添加到MyGIS中。3.2 MyGIS中添加疊置分析
52、這一小節(jié)我們將在上一節(jié)開發(fā)的疊置求交的基礎上,實現疊置分析中三種最常用的疊置方式,Union(疊置求并)、Intersect(疊置求交)和Identify(疊置標識)。Intersect(疊置求交)在上節(jié)已經介紹,下面簡要介紹一下Union(疊置求并)和Identify(疊置標識)。疊置求并(Union)保留了兩個疊置圖層的空間圖形和屬性信息,進行疊置求和的兩個圖層須是多邊形圖層。輸入圖層的一個多邊形被疊加圖層中的多邊形弧段分割成多個多邊形,輸出圖層綜合了兩個圖層的屬性。所有要素都將被寫入到輸出要素類,輸出結果具有來自與其疊置的輸入要素的屬性。ArcGISEngine高級功能開發(fā)I INPUT
53、圖15疊置求并(Union)Identify(疊置標識)是以輸入圖層為界,保留邊界以內兩個多變形的所有多邊形,出入圖層切割后的多邊形也被賦予疊加圖層的屬性。如下圖所示。IMPUTOUTPUT圖16疊置標識(Identify)在通過ArcEngine中的Geoprocessor實現這三種疊置分析時,我們將實現輸入圖層和疊置圖層的可選設置,疊置方式的可選設置,輸出路徑的可選設置3.2.1 添加控件打開項目MyGIS在MyGIS的主菜單“空間分析”中添加子菜單”疊置分析",NameH性修改為"menuOverlay”。項目中添加一個新的窗體,名稱為“OverlayForm&quo
54、t;,NameH性設為“疊置分析”,添加四個Label、一個ComboBox四個TextBox、五個Button控件和一個GroupBox,控件屬性設置如下:表2控件屬性設置控件類型Name屬性Text屬性Readonly屬性控件說明Label輸入要素:Label疊置要素:Label疊置方式:Label輸出圖層:TextBoxtxtInputFeatTrue保存輸入要素路徑TextBoxtxtOverlayFeatTrue保存疊置要素路徑TextBoxtxtOutputPathTrue疊置結果的輸出路徑TextBox疊置分析處理過程消息,txtMessageTrueMultiline屬性設為T
55、rue,ArcGISEngine高級功能開發(fā)ScrollBars屬性設為VerticalDock屬性設為FillComboBoxcboOverLay疊置分析的方式ButtonbtnInputFeat選擇輸入要素ButtonbtnOverlayFeat選擇疊置要素Button選擇疊置分析2果的輸出路btnOutputLayer徑ButtonbtnBuffer分析進行疊置分析ButtonbtnCancel取消取消GroupBox處理過程作為txtMessage的容器消息3.2.2 代碼添加及解釋該工程需要添加如下引用:usingESRI.ArcGIS.Controls;usingESRI.ArcG
56、IS.AnalysisTools;usingESRI.ArcGIS.Geoprocessing;首先聲明一個成員變量,用于保存疊置分析輸出文件的路徑。publicstringstrOutputPath;OverlayForm在載入時需要加載三種疊置方式到cboOverlay中,并且需要設置緩沖區(qū)文件的默認輸出路徑,這里我們將默認輸出路徑設為“D:”。privatevoidOverlayForm_Load(objectsender,EventArgse)/加載疊置方式求交 (Intersect)");this.cboOverLay.Items.Add(this.cboOverLay.Items.Add("求并(Union)");標識 (Identity)");this.cboOverLay.Items.Add("this.cbo
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
- 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 不銹鋼表面除蠟施工方案
- 2025北京東城高二(上)期末生物(教師版)
- 突發(fā)事件處置方案
- 地下室不銹鋼水池施工方案
- 紫葉矮櫻嫁接繁育技術關鍵要點全面深入探討與闡述
- 四川省眉山市洪雅縣洪雅縣2024-2025學年九年級上學期期末考試物理試題(原卷版+解析版)
- 室外弱電整修施工方案
- 綠色金融與可持續(xù)投資的策略
- 工業(yè)碳減排與綠色制造的策略及實施路徑
- 思維可視化視域下高中英語課堂讀后續(xù)寫教學策略研究
- 精選湖北省武漢市2023屆高三畢業(yè)生二月調研測試英語試題
- 武理工船舶柴油機習題庫及答案
- 公司返工通知單
- T-SXDZ 057-2020 煤礦沖擊地壓危險性評價報告編制細則
- GB/T 25146-2010工業(yè)設備化學清洗質量驗收規(guī)范
- GB/T 1094.3-2017電力變壓器第3部分:絕緣水平、絕緣試驗和外絕緣空氣間隙
- GB 18265-2019危險化學品經營企業(yè)安全技術基本要求
- 2023年陜西省普通高校職業(yè)教育單招招生考試試題
- 手機攝影PPT學習課件(攝影的七大要素)
- 《采購管理》教學課件
- 金蝶云星空V7.7-產品培訓-供應鏈-銷售管理
評論
0/150
提交評論