已閱讀5頁(yè),還剩73頁(yè)未讀, 繼續(xù)免費(fèi)閱讀
版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
ArcGIS Engine二次開(kāi)發(fā)提高篇1 縮略圖(鷹眼)鷹眼功能是GIS的主要功能之一,當(dāng)?shù)貓D范圍很大時(shí),它可以很好的為用戶指明當(dāng)前地圖的范圍。在本小節(jié)中我們將學(xué)習(xí)如何制作這種鷹眼。1.1 添加控件新建一個(gè)C#.Net項(xiàng)目,項(xiàng)目名稱(chēng)為OverView,將Form1的名字設(shè)置為MainForm,并添加ToolbarControl 、兩個(gè)MapControl和LicenceControl等四個(gè)控件。布局如下圖所示。左邊的axMapControl1用于地圖數(shù)據(jù)顯示和操作,右邊axMapControl2用于鷹眼顯示。圖 1 界面布局在ToolbarControl 加載添加數(shù)據(jù)按鈕和地圖瀏覽的功能按鈕,如下圖所示,并將ToolbarControl的伙伴控件設(shè)為axMapControl1。圖 2添加按鈕1.2 代碼添加及解釋鷹眼用來(lái)顯示主窗體當(dāng)前視圖范圍在全景視圖中的位置,在ArcMap中使用一個(gè)線框在鷹眼視圖中標(biāo)識(shí)。當(dāng)主視圖中的視圖范圍改變時(shí),鷹眼中的線框隨之改變,當(dāng)拖動(dòng)鷹眼視圖中的紅線框時(shí),主視圖中的視圖范圍也隨之改變。下面開(kāi)始實(shí)現(xiàn)鷹眼功能,添加using ESRI.ArcGIS.Carto、using ESRI.ArcGIS.Geometry、using ESRI.ArcGIS.Display三個(gè)引用。首先在axMapControl1中視圖范圍改變時(shí)鷹眼窗體要做出對(duì)應(yīng)的響應(yīng),即繪制線框并顯示,在OnExtentUpdated事件中添加代碼如下:private void axMapControl1_OnExtentUpdated(object sender, ESRI.ArcGIS.Controls.IMapControlEvents2_OnExtentUpdatedEvent e) /創(chuàng)建鷹眼中線框 IEnvelope pEnv = (IEnvelope)e.newEnvelope; IRectangleElement pRectangleEle = new RectangleElementClass(); IElement pEle = pRectangleEle as IElement; pEle.Geometry = pEnv; /設(shè)置線框的邊線對(duì)象,包括顏色和線寬 IRgbColor pColor = new RgbColorClass(); pColor.Red = 255; pColor.Green = 0; pColor.Blue = 0; pColor.Transparency = 255; / 產(chǎn)生一個(gè)線符號(hào)對(duì)象 ILineSymbol pOutline = new SimpleLineSymbolClass(); pOutline.Width = 2; pOutline.Color = pColor; / 設(shè)置顏色屬性 pColor.Red = 255; pColor.Green = 0; pColor.Blue = 0; pColor.Transparency = 0; / 設(shè)置線框填充符號(hào)的屬性 IFillSymbol pFillSymbol = new SimpleFillSymbolClass(); pFillSymbol.Color = pColor; pFillSymbol.Outline = pOutline; IFillShapeElement pFillShapeEle = pEle as IFillShapeElement; pFillShapeEle.Symbol = pFillSymbol; / 得到鷹眼視圖中的圖形元素容器 IGraphicsContainer pGra = axMapControl2.Map as IGraphicsContainer; IActiveView pAv = pGra as IActiveView; / 在繪制前,清除 axMapControl2 中的任何圖形元素 pGra.DeleteAllElements(); / 鷹眼視圖中添加線框 pGra.AddElement(IElement)pFillShapeEle, 0); / 刷新鷹眼 pAv.PartialRefresh(esriViewDrawPhase.esriViewGraphics, null, null); 當(dāng)鼠標(biāo)點(diǎn)擊鷹眼窗體時(shí),主窗體Extent隨之改變。在axMapControl2的OnMouseDown事件中添加代碼如下:private void axMapControl2_OnMouseDown(object sender, ESRI.ArcGIS.Controls.IMapControlEvents2_OnMouseDownEvent e) if (this.axMapControl2.Map.LayerCount != 0) / 按下鼠標(biāo)左鍵移動(dòng)矩形框 if (e.button = 1) IPoint pPoint = new PointClass(); pPoint.PutCoords(e.mapX, e.mapY); IEnvelope pEnvelope = this.axMapControl1.Extent; pEnvelope.CenterAt(pPoint); this.axMapControl1.Extent = pEnvelope; this.axMapControl1.ActiveView.PartialRefresh(esriViewDrawPhase.esriViewGeography, null, null); / 按下鼠標(biāo)右鍵繪制矩形框 else if (e.button = 2) IEnvelope pEnvelop = this.axMapControl2.TrackRectangle(); this.axMapControl1.Extent = pEnvelop; this.axMapControl1.ActiveView.PartialRefresh(esriViewDrawPhase.esriViewGeography, null, null); 當(dāng)鼠標(biāo)在鷹眼窗體移動(dòng)時(shí),主窗體Extent隨之改變。在axMapControl2的OnMouseMove事件中添加代碼如下: private void axMapControl2_OnMouseMove(object sender, ESRI.ArcGIS.Controls.IMapControlEvents2_OnMouseMoveEvent e) / 如果不是左鍵按下就直接返回 if (e.button != 1) return; IPoint pPoint = new PointClass(); pPoint.PutCoords(e.mapX, e.mapY); this.axMapControl1.CenterAt(pPoint); this.axMapControl1.ActiveView.PartialRefresh(esriViewDrawPhase.esriViewGeography, null, null); 下面代碼用于實(shí)現(xiàn)axMapControl2與axMapControl1的數(shù)據(jù)的同步更新,獲取主視圖中視圖范圍最大的圖層作為鷹眼中的視圖。這個(gè)更新由兩部分組成,一個(gè)是對(duì)axMapControl1添加地圖文檔(mxd文件)的響應(yīng),通過(guò)axMapControl1的OnMapReplace事件實(shí)現(xiàn),一個(gè)是對(duì)axMapControl1添加單個(gè)圖層的響應(yīng),通過(guò)axMapControl1的OnFullExtentUpdated事件實(shí)現(xiàn)。我們獲取主視圖中的視圖范圍最大的圖層寫(xiě)成一個(gè)獨(dú)立的函數(shù),方便調(diào)用。 private ILayer GetOverviewLayer(IMap map) /獲取主視圖的第一個(gè)圖層 ILayer pLayer = map.get_Layer(0); /遍歷其他圖層,并比較視圖范圍的寬度,返回寬度最大的圖層 ILayer pTempLayer = null; for (int i = 1; i map.LayerCount;i+ ) pTempLayer = map.get_Layer(i); if (pLayer.AreaOfInterest.Width pTempLayer.AreaOfInterest.Width) pLayer = pTempLayer; return pLayer; 然后在axMapControl1的OnMapReplaced事件中調(diào)用。 private void axMapControl1_OnMapReplaced(object sender, IMapControlEvents2_OnMapReplacedEvent e) /獲取鷹眼圖層 this.axMapControl2.AddLayer(this.GetOverviewLayer(this.axMapControl1.Map); / 設(shè)置 MapControl 顯示范圍至數(shù)據(jù)的全局范圍 this.axMapControl2.Extent = this.axMapControl1.FullExtent; / 刷新鷹眼控件地圖 this.axMapControl2.Refresh(); 在axMapControl1的OnFullExtentUpdated添加代碼,用于實(shí)現(xiàn)在主視圖添加圖層時(shí),實(shí)現(xiàn)對(duì)鷹眼視圖的更新。代碼如下: private void axMapControl1_OnFullExtentUpdated(object sender, ESRI.ArcGIS.Controls.IMapControlEvents2_OnFullExtentUpdatedEvent e) /獲取鷹眼圖層 this.axMapControl2.AddLayer(this.GetOverviewLayer(this.axMapControl1.Map); / 設(shè)置 MapControl 顯示范圍至數(shù)據(jù)的全局范圍 this.axMapControl2.Extent = this.axMapControl1.FullExtent; / 刷新鷹眼控件地圖 this.axMapControl2.Refresh(); 本例的示例數(shù)據(jù)無(wú)特別要求,使用前面章節(jié)實(shí)例數(shù)據(jù)即可。運(yùn)行程序,添加地圖數(shù)據(jù),可以在主視圖進(jìn)行相關(guān)操作,鷹眼視圖同步響應(yīng),在鷹眼視圖可以移動(dòng)紅線框可以同步更新主視圖的視圖范圍,在鷹眼視圖單擊右鍵拉框可以重新繪制紅線框,效果如下:圖 3鷹眼效果1.3 MyGIS中添加鷹眼在上一講中的最后一節(jié),我們創(chuàng)建了一個(gè)簡(jiǎn)單的GIS系統(tǒng)MyGIS,這里,我們講鷹眼功能嵌入到我們的系統(tǒng)中。在這里我們對(duì)實(shí)現(xiàn)的思路做一個(gè)介紹,請(qǐng)您自己動(dòng)手完善MyGIS。首先需要修改一下MyGIS窗體的控件布局,我們講鷹眼視圖放到圖層管理器的下方,需要在控件容器SpliterContainer1的Panel1中添加一個(gè)水平分隔的SpliterContainer,然后將圖層管理器空間TOCControl和鷹眼視圖MapControl分別置于上下的容器中,并將其屬性Dock分別設(shè)為Fill。另外,在此種窗體布局情況下,直接在TOCControl控件屬性中設(shè)置伙伴控件無(wú)效,如圖所示。我們需要在MainForm的Load事件中為T(mén)OCControl設(shè)置伙伴控件為axMapControl1。添加代碼如下: private void Form1_Load(object sender, EventArgs e) /設(shè)置axTOCControl1的伙伴控件 this.axTOCControl1.SetBuddyControl(axMapControl1.Object); 圖 4 TOCControl控件屬性中設(shè)置伙伴控件然后依次添加本例中的代碼,即可完成,運(yùn)行效果如下圖所示:圖 5 MyGIS中鷹眼的運(yùn)行效果1.4 小結(jié)在本小節(jié)中,我們實(shí)現(xiàn)了鷹眼功能并講鷹眼加入了MyGIS,這部分的重點(diǎn)是鷹眼視圖和主視圖之間的事件交互。推薦您仔細(xì)結(jié)合例子程序查看代碼,如果需要獲得進(jìn)一步的信息,請(qǐng)查看幫助系統(tǒng)。如果您對(duì)這一小節(jié)的內(nèi)容比較熟悉了,就可以開(kāi)始學(xué)習(xí)本章最后一小節(jié)的內(nèi)容了。在下一小節(jié)中,我們將嘗試添加緩沖區(qū)分析功能。ArcGIS Engine高級(jí)功能開(kāi)發(fā)2 緩沖區(qū)分析緩沖區(qū)分析指為了識(shí)別某一地理實(shí)體或空間物體對(duì)其周?chē)匚镉绊懚榷谄渲車(chē)⒌木哂幸欢▽挾鹊膮^(qū)域,以確定哪些實(shí)體落在了被影響的區(qū)域范圍之內(nèi)。緩沖區(qū)分析與緩沖區(qū)查詢(xún)不同,緩沖區(qū)查詢(xún)是不破壞原有空間目標(biāo)的關(guān)系,只是檢索到該緩沖區(qū)范圍內(nèi)涉及到的目標(biāo)。而緩沖區(qū)分析是根據(jù)設(shè)定的距離條件對(duì)一類(lèi)地物建立緩沖區(qū)多邊形,存儲(chǔ)到一個(gè)新的圖層中。然后再將新的圖層與需要進(jìn)行緩沖區(qū)分析的圖層進(jìn)行疊置分析,得到所需要的結(jié)果。因此,緩沖區(qū)分析實(shí)際上進(jìn)行了兩步的操作,第一步是建立緩沖區(qū)圖層,第二步是進(jìn)行疊置剪裁分析。緩沖區(qū)分析適用于點(diǎn)、線、面對(duì)象,如點(diǎn)狀的居民點(diǎn)、線狀的河流和面狀的作物分布區(qū)等,只要地理實(shí)體能對(duì)周?chē)欢▍^(qū)域形成影響即可使用這種分析方法。圖 6點(diǎn)、線、面的緩沖區(qū)分析ArcGIS的ArcToolBox中的分析工具提供了緩沖區(qū)分析的功能,本節(jié)實(shí)習(xí)我們首先使用Geoprocessor方法實(shí)現(xiàn)一個(gè)簡(jiǎn)單的緩沖區(qū)分析功能,然后將緩沖區(qū)分析功能添加到我們的MyGIS項(xiàng)目中。程序運(yùn)行前首先需要在D盤(pán)下新建一個(gè)名為T(mén)emp的文件夾,存放疊置分析生成的文件。2.1 Geoprocessor實(shí)現(xiàn)緩沖區(qū)分析為了降低開(kāi)發(fā)難度和提高開(kāi)發(fā)效率,ArcGIS Engine中添加了GeoProcessor類(lèi),使用Geoprocessor能幫助用戶直接實(shí)現(xiàn)一些簡(jiǎn)單的工具性的功能,所有在ArcToolBox中的功能,基本都可以用Geoprocessor編程實(shí)現(xiàn)。本節(jié)我們使用Geoprocessor實(shí)現(xiàn)緩沖區(qū)分析的功能。2.1.1 添加控件新建一個(gè)C#.Net項(xiàng)目,項(xiàng)目名稱(chēng)為Buffer,將Form1的名字設(shè)置為MainForm,并添加ToolbarControl 、MapControl、TOCControl、LicenceControl和Button等五個(gè)控件。并將ToolbarControl 、TOCControl的伙伴控件設(shè)為MapControl,Button控件的Name屬性設(shè)定為btnBuffer,Text屬性設(shè)定為“緩沖區(qū)分析”??丶季中Ч缦聢D所示。圖 7控件布局效果在ToolbarControl 加載添加數(shù)據(jù)按鈕和地圖瀏覽的功能按鈕,如下圖所示。圖 8添加按鈕2.1.2 代碼添加及解釋首先添加如下四個(gè)命名空間的引用。using ESRI.ArcGIS.Carto;using ESRI.ArcGIS.Geoprocessor;using ESRI.ArcGIS.Geoprocessing;using ESRI.ArcGIS.esriSystem;在使用Geoprocessor工具實(shí)現(xiàn)緩沖區(qū)分析時(shí),需要首先定義一個(gè)Geoprocessor對(duì)象,因?yàn)槊臻g“ESRI.ArcGIS.Geoprocessing”也包含Geoprocessor類(lèi),為了避免混淆,我們使用命名空間來(lái)定義Geoprocessor,然后設(shè)置Geoprocessor中的環(huán)境參數(shù),這里我們使用默認(rèn)參數(shù)。然后定義一個(gè)操作類(lèi)Buffer,并設(shè)置參數(shù),生成緩沖區(qū)的參數(shù)包含原始圖層,緩沖半徑和輸出路徑,最后使用已定義的Geoprocessor對(duì)象執(zhí)行即可。雙擊“生成緩存區(qū)”按鈕,添加代碼如下: private void btnBuffer_Click(object sender, EventArgs e) /判斷MapControl中是否包含圖層 if (this.axMapControl1.LayerCount = 0) return; /獲取MapControl中第一個(gè)圖層 ILayer pLayer = this.axMapControl1.Map.get_Layer(0); /輸出路徑,可以自行指定 string strOutputPath = D:Buffer.shp; /緩沖半徑 double dblDistace = 1.0; /獲取一個(gè)geoprocessor的實(shí)例,避免與命名空間Geoprocessing中的Geoprocessor發(fā)生引用錯(cuò)誤 ESRI.ArcGIS.Geoprocessor.Geoprocessor gp = new ESRI.ArcGIS.Geoprocessor.Geoprocessor(); /OverwriteOutput為真時(shí),輸出圖層會(huì)覆蓋當(dāng)前文件夾下的同名圖層 gp.OverwriteOutput = true; /創(chuàng)建一個(gè)Buffer工具的實(shí)例 ESRI.ArcGIS.AnalysisTools.Buffer buffer = new ESRI.ArcGIS.AnalysisTools.Buffer(pLayer, strOutputPath, dblDistace); /執(zhí)行緩沖區(qū)分析 IGeoProcessorResult results = null; results = gp.Execute(buffer, null) as IGeoProcessorResult; /判斷緩沖區(qū)是否成功生成 if (results.Status != esriJobStatus.esriJobSucceeded) MessageBox.Show(圖層 + pLayer.Name + 緩沖區(qū)生成失??!); else MessageBox.Show(緩沖區(qū)生成成功!); /將生成圖層加入MapControl int index = strOutputPath.LastIndexOf(); this.axMapControl1.AddShapeFile(strOutputPath.Substring(0, index), strOutputPath.Substring(index); 運(yùn)行程序,添加一個(gè)圖層(多個(gè)圖層時(shí)本例中默認(rèn)選擇的圖層為第一個(gè)圖層),點(diǎn)擊“生成緩沖區(qū)”,運(yùn)行結(jié)果如圖。圖 9緩沖區(qū)生成效果2.1.3 小結(jié)本例中,我們使用Geoprocessor工具實(shí)現(xiàn)了緩沖區(qū)分析。從中我們可以得到Geoprocessor工具使用的一般方法,在使用Geoprocessor時(shí),一般需先定義一個(gè)Geoprocessor對(duì)象,然后設(shè)置該對(duì)象的參數(shù),如本例中的OverwriteOutput,再定義一個(gè)具體的操作類(lèi),如本例中的Buffer類(lèi),在設(shè)置完操作類(lèi)的參數(shù)后,則通過(guò)Geoprocessor的Excute函數(shù)來(lái)執(zhí)行。至此,我們已經(jīng)實(shí)現(xiàn)了一個(gè)簡(jiǎn)單的緩沖區(qū)分析的功能,從中我們學(xué)習(xí)了Geoprocessor的使用方法。下一節(jié)我們講對(duì)緩沖區(qū)份分析功能做進(jìn)一步的改進(jìn),使其具有更強(qiáng)的適用性,并將這個(gè)功能添加到MyGIS中。2.2 MyGIS中添加緩沖區(qū)分析我們?cè)谑褂镁彌_區(qū)分析時(shí),需要設(shè)定原始的圖層,緩沖半徑以及生成緩沖區(qū)的保存路徑。本節(jié)我們將在上一節(jié)的基礎(chǔ)上進(jìn)一步實(shí)現(xiàn)緩沖區(qū)分析,實(shí)現(xiàn)緩沖圖層,緩沖半徑和保存路徑的可選設(shè)置。2.2.1 添加控件打開(kāi)項(xiàng)目MyGIS,在MyGIS的主菜單添加一個(gè)新的菜單項(xiàng)“空間分析”,并添加子菜單“緩沖區(qū)分析”,Name屬性修改為“menuBuffer”。項(xiàng)目中添加一個(gè)新的窗體,名稱(chēng)為“BufferForm”,Name屬性設(shè)為“緩沖區(qū)分析”,添加四個(gè)Label、一個(gè)ComboBox、兩個(gè)TextBox、三個(gè)Button控件,控件屬性設(shè)置如下:表 1控件屬性設(shè)置控件類(lèi)型Name屬性Text屬性控件說(shuō)明Label選擇圖層:Label緩沖半徑:LabellblUnit地圖單位標(biāo)示當(dāng)前地圖的地圖單位Label輸出圖層:ComboBoxcboLayers所有圖層的名稱(chēng)TextBoxtxtBufferDistance1.0生成緩沖區(qū)的緩沖半徑TextBoxtxtOutputPath緩沖區(qū)文件的輸出路徑,其ReadOnly屬性設(shè)為T(mén)rueButtonbtnOutputLayer選擇緩沖區(qū)文件的輸出路徑ButtonbtnBuffer分析進(jìn)行緩沖區(qū)分析ButtonbtnCancel取消取消2.2.2 代碼添加及解釋該項(xiàng)目需添加如下引用:using ESRI.ArcGIS.Controls;using ESRI.ArcGIS.Geoprocessor;using ESRI.ArcGIS.Carto;using ESRI.ArcGIS.Geoprocessing;using ESRI.ArcGIS.esriSystem;首先聲明兩個(gè)成員變量,用于保存地圖數(shù)據(jù)和輸出文件的路徑。 /接收MapControl中的數(shù)據(jù) private IHookHelper mHookHelper = new HookHelperClass(); /緩沖區(qū)文件輸出路徑 public string strOutputPath;重寫(xiě)B(tài)ufferForm的構(gòu)造函數(shù),添加一個(gè)參數(shù),用于接收MapControl中的數(shù)據(jù)。 /重寫(xiě)構(gòu)造函數(shù),添加參數(shù)hook,用于傳入MapControl中的數(shù)據(jù) public BufferForm(object hook) InitializeComponent(); this.mHookHelper.Hook = hook; 添加一個(gè)自定義函數(shù),用于根據(jù)圖層名稱(chēng)獲取要素圖層并返回。 private IFeatureLayer GetFeatureLayer(string layerName) IFeatureLayer pFeatureLayer = null; /遍歷圖層,獲取與名稱(chēng)匹配的圖層 for (int i = 0; i this.mHookHelper.FocusMap.LayerCount; i+) ILayer pLayer = this.mHookHelper.FocusMap.get_Layer(i); if (pLayer.Name = layerName) pFeatureLayer = pLayer as IFeatureLayer; if (pFeatureLayer != null) return pFeatureLayer; else return null; BufferForm在載入時(shí)需要加載當(dāng)前MapControl中的圖層名稱(chēng)到cboLayers,讀取當(dāng)前地圖的地圖單位,設(shè)置緩沖區(qū)文件的默認(rèn)輸出路徑,這里我們將默認(rèn)輸出路徑設(shè)為“D:Temp”。 private void BufferForm_Load(object sender, EventArgs e) /傳入數(shù)據(jù)為空時(shí)返回 if (null = mHookHelper | null = mHookHelper.Hook | 0 = mHookHelper.FocusMap.LayerCount) return; /獲取圖層名稱(chēng)并加入cboLayers for (int i = 0; i 0) cboLayers.SelectedIndex = 0; /設(shè)置生成文件的默認(rèn)輸出路徑和名稱(chēng) string tempDir = D:Temp; txtOutputPath.Text = System.IO.Path.Combine(tempDir, (string)cboLayers.SelectedItem + _buffer.shp); /設(shè)置默認(rèn)地圖單位 lblUnits.Text = Convert.ToString(mHookHelper.FocusMap.MapUnits); 雙擊路徑設(shè)置按鈕,進(jìn)入代碼編輯界面,添加如下代碼: private void btnOutputLayer_Click(object sender, EventArgs e) /定義輸出文件路徑 SaveFileDialog saveDlg = new SaveFileDialog(); /檢查路徑是否存在 saveDlg.CheckPathExists = true; saveDlg.Filter = Shapefile (*.shp)|*.shp; /保存時(shí)覆蓋同名文件 saveDlg.OverwritePrompt = true; saveDlg.Title = 輸出路徑; /對(duì)話框關(guān)閉前還原當(dāng)前目錄 saveDlg.RestoreDirectory = true; saveDlg.FileName = (string)cboLayers.SelectedItem + _buffer.shp; /讀取文件輸出路徑到txtOutputPath DialogResult dr = saveDlg.ShowDialog(); if (dr = DialogResult.OK) txtOutputPath.Text = saveDlg.FileName; 雙擊“分析”按鈕,添加代碼如下: private void btnBuffer_Click(object sender, EventArgs e) /緩沖距離 double bufferDistance; /輸入的緩沖距離轉(zhuǎn)換為double double.TryParse(txtBufferDistance.Text.ToString(),out bufferDistance); /判斷輸出路徑是否合法 if (!System.IO.Directory.Exists(System.IO.Path.GetDirectoryName(txtOutputPath.Text) | .shp != System.IO.Path.GetExtension(txtOutputPath.Text) MessageBox.Show(輸出路徑錯(cuò)誤!); return; /判斷圖層個(gè)數(shù) if (mHookHelper.FocusMap.LayerCount = 0) return; /獲取圖層 IFeatureLayer pFeatureLayer = GetFeatureLayer(string)cboLayers.SelectedItem); if (null = pFeatureLayer) MessageBox.Show(圖層 + (string)cboLayers.SelectedItem + 不存在!rn); return; /獲取一個(gè)geoprocessor的實(shí)例 Geoprocessor gp = new Geoprocessor(); /OverwriteOutput為真時(shí),輸出圖層會(huì)覆蓋當(dāng)前文件夾下的同名圖層 gp.OverwriteOutput = true; /緩沖區(qū)保存路徑 strOutputPath = txtOutputPath.Text; /創(chuàng)建一個(gè)Buffer工具的實(shí)例 ESRI.ArcGIS.AnalysisTools.Buffer buffer = new ESRI.ArcGIS.AnalysisTools.Buffer(pFeatureLayer, strOutputPath, bufferDistance.ToString(); /執(zhí)行緩沖區(qū)分析 IGeoProcessorResult results = null; results = (IGeoProcessorResult)gp.Execute(buffer, null); /判斷緩沖區(qū)是否成功生成 if (results.Status != esriJobStatus.esriJobSucceeded) MessageBox.Show(圖層 + pFeatureLayer.Name + 緩沖區(qū)生成失敗!); else this.DialogResult = DialogResult.OK; MessageBox.Show(緩沖區(qū)生成成功!); 雙擊“取消”按鈕,添加代碼如下: private void btnCancel_Click(object sender, EventArgs e) this.Dispose(); 進(jìn)入MyGIS的主窗體,雙擊菜單中的“緩沖區(qū)分析”,添加代碼如下: BufferForm bufferForm = new BufferForm(this.axMapControl1.Object); if (bufferForm.ShowDialog() = DialogResult.OK) /獲取輸出文件路徑 string strBufferPath = bufferForm.strOutputPath; /緩沖區(qū)圖層載入到MapControl int index = strBufferPath.LastIndexOf(); this.axMapControl1.AddShapeFile(strBufferPath.Substring(0, index), strBufferPath.Substring(index); 至此,代碼編輯完成,運(yùn)行程序,添加數(shù)據(jù)usa.mxd,選擇圖層wind,設(shè)置緩沖區(qū)半徑為0.8,點(diǎn)擊“分析”,效果如下圖所示。圖 10緩沖區(qū)分析效果如果運(yùn)行過(guò)程中出現(xiàn)錯(cuò)誤“正試圖在 OS 加載程序鎖內(nèi)執(zhí)行托管代碼。不要嘗試在 DllMain 或映像初始化函數(shù)內(nèi)運(yùn)行托管代碼,這樣做會(huì)導(dǎo)致應(yīng)用程序掛起?!保?qǐng)采用如下方法解決:把vs2005菜單的 調(diào)試-異常-Managed Debuggin Assistants-LoaderLock 的選中狀態(tài)去掉即可!如果異常(exception)這一項(xiàng)沒(méi)有的話,在工具-自定義-命令選項(xiàng)卡,選擇左邊“調(diào)試”,找到右邊“異?!蓖系讲藛紊?。2.2.3 小結(jié)緩沖區(qū)分析是GIS空間分析的基本功能,這一節(jié)我們完成了緩沖區(qū)分析的功能,實(shí)現(xiàn)了緩沖區(qū)分析文件、緩沖半徑和輸出路徑的可選設(shè)置,希望您仔細(xì)體會(huì)并掌握Geoprocessor工具開(kāi)發(fā)空間分析功能的基本方法。ArcGIS Engine高級(jí)功能開(kāi)發(fā)3 疊置分析疊置分析是GIS中一種常見(jiàn)的分析功能,它是將有關(guān)主題層組成的各個(gè)數(shù)據(jù)層面進(jìn)行疊置產(chǎn)生一個(gè)新的數(shù)據(jù)層面,其結(jié)果綜合了原來(lái)兩個(gè)或多個(gè)層面要素所具有的屬性,同時(shí)疊置分析不僅生成了新的空間關(guān)系,而且還將輸入的多個(gè)數(shù)據(jù)層的屬性聯(lián)系起來(lái)產(chǎn)生了新的屬性關(guān)系。ArcGIS中的疊置分析包含Union(疊置求并)、Intersect(疊置求交)、Identify(疊置標(biāo)識(shí))、Erase(疊置擦除)、Symmetrical Difference (疊置相交取反)、Update(疊置更新)等。這一小節(jié),我們以疊置求交為例,介紹疊置分析的開(kāi)發(fā)。疊置求交是保留兩個(gè)圖層公共部分的空間圖形,并綜合兩個(gè)疊加圖層的屬性。如下圖,反映了疊置求交的原理。圖 11疊置求交示意圖本節(jié)實(shí)習(xí)將介紹這種方法實(shí)現(xiàn)緩沖區(qū)分析,我們首先使用Geoprocessor方法實(shí)現(xiàn)一個(gè)簡(jiǎn)單的緩沖區(qū)分析功能,然后將緩沖區(qū)分析功能添加到我們的MyGIS項(xiàng)目中。同樣,ArcGIS的ArcToolBox中的分析工具提供了緩沖區(qū)分析的功能,本節(jié)實(shí)習(xí)我們首先使用Geoprocessor方法實(shí)現(xiàn)一個(gè)簡(jiǎn)單的緩沖區(qū)分析功能,然后將緩沖區(qū)分析功能添加到我們的MyGIS項(xiàng)目中。程序運(yùn)行前首先需要在D盤(pán)下新建一個(gè)名為T(mén)emp的文件夾,存放疊置分析生成的文件。3.1 Geoprocessor實(shí)現(xiàn)疊置分析疊置分析我們同樣使用Geoprocessor工具來(lái)實(shí)現(xiàn)。3.1.1 添加控件新建一個(gè)C#.Net項(xiàng)目,項(xiàng)目名稱(chēng)為OverLay,將Form1的名字設(shè)置為MainForm,并添加ToolbarControl 、MapControl、TOCControl、LicenceControl和Button等五個(gè)控件。并將ToolbarControl 、TOCControl的伙伴控件設(shè)為MapControl,Button控件的Name屬性設(shè)定為btnIntersect,Text屬性設(shè)定為“疊置求交”??丶季中Ч缦聢D所示。圖 12控件布局效果在ToolbarControl 加載添加數(shù)據(jù)按鈕和地圖瀏覽的功能按鈕,如下圖所示。圖 13添加按鈕3.1.2 代碼添加及解釋首先添加如下引用:using ESRI.ArcGIS.Carto;using ESRI.ArcGIS.AnalysisTools;using ESRI.ArcGIS.Geoprocessor;using ESRI.ArcGIS.Geoprocessing;與緩沖區(qū)分析的實(shí)現(xiàn)類(lèi)似,在使用Geoprocessor工具實(shí)現(xiàn)疊
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 二零二四前期物業(yè)服務(wù)協(xié)議及社區(qū)文化活動(dòng)服務(wù)合同3篇
- 2024年高端紅酒代理銷(xiāo)售合同協(xié)議
- 2025年度市場(chǎng)調(diào)研服務(wù)外包合同4篇
- 二零二四年個(gè)性化嬰兒護(hù)理服務(wù)與月嫂雇傭協(xié)議3篇
- 2025年茶店加盟管理合同范本簡(jiǎn)易4篇
- 專(zhuān)業(yè)蝦苗供應(yīng)協(xié)議模板2024年適用版A版
- 2025年度航空器材產(chǎn)品定制采購(gòu)服務(wù)協(xié)議4篇
- 2025年度城市地下綜合管廊建設(shè)施工合同9篇
- 2025年茶樓茶葉采購(gòu)與營(yíng)銷(xiāo)推廣合同范本4篇
- 2024門(mén)店承包與區(qū)域市場(chǎng)拓展合同范本3篇
- 《庖丁解?!帆@獎(jiǎng)?wù)n件(省級(jí)公開(kāi)課一等獎(jiǎng))-完美版PPT
- 化工園區(qū)危險(xiǎn)品運(yùn)輸車(chē)輛停車(chē)場(chǎng)建設(shè)標(biāo)準(zhǔn)
- 6月大學(xué)英語(yǔ)四級(jí)真題(CET4)及答案解析
- 氣排球競(jìng)賽規(guī)則
- 電梯維修保養(yǎng)報(bào)價(jià)書(shū)模板
- 危險(xiǎn)化學(xué)品目錄2023
- FZ/T 81024-2022機(jī)織披風(fēng)
- GB/T 33141-2016鎂鋰合金鑄錠
- JJF 1069-2012 法定計(jì)量檢定機(jī)構(gòu)考核規(guī)范(培訓(xùn)講稿)
- 綜合管廊工程施工技術(shù)概述課件
- 公積金提取單身聲明
評(píng)論
0/150
提交評(píng)論