




下載本文檔
版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
1、者 PageLayoutControl 中都可以使用新建的插件。ArcMap拓展開發(fā)實(shí)習(xí)指導(dǎo)書1、以 ArcGIS C#插件開發(fā)使用 C#和 ArcObject 10.1 開發(fā) ArcGIS 插件,開發(fā)的電腦上必須安裝ArcGIS 基礎(chǔ)平臺,同時(shí)必須安裝支持.NET 的開發(fā)庫。在這里我們使用Visual Studio 2010 作為開發(fā)環(huán)境。開發(fā)步驟如下:1、啟動 Visual Studio 2010,創(chuàng)建 Visual C# 的類庫項(xiàng)目,名稱為 BufferExSolution,如 圖 2_1所示。2_1 創(chuàng)建項(xiàng)目2、在解決方案資源管理器中,選擇BufferExSolution 項(xiàng)目,右鍵添
2、加新建項(xiàng)目,選在ArcGIS 模板下的 Base Comma nd 模板,將名稱設(shè)置為 BufferEx,如圖 2_2 所示,點(diǎn)擊添加”按鈕,出現(xiàn)如圖 2_3 所示的選擇項(xiàng),選擇第二項(xiàng),其意義為在ArcMap、MapControl 或2_2Wht kind of conmAinddo yot腫n t to cr片汐AnzGIobe or GlobeControl CorrmandArcScene or ScaneConiol CommandEElank CommandDesktop AicCdtJog CcnimandDedrtop AroSobe ComiardOesMc ArcMao CQ
3、mmnent categories.3、添加名為BufferDIg ”的 Windows 窗體,如圖 2_4 所示。這樣在資源管理器中就出貞MapCstrol & PzgeLa#ciijtCi3rilT打Cicinnn帖rdl現(xiàn)了ArcGIS New Item Wizard Optio圖 2_44、為 BufferDIg 窗體添加控件,控件布局如圖2_5 所示??丶傩匀绫?2_1 所示。圖 2_5表 2_1控件類型Name 屬性Text 屬性其它屬性LabelIbIChoseLayer選擇圖層LabelIblRadio緩沖區(qū)半徑LabelIblOutPath輸出路徑ComboxcboLaye
4、rsTextBoxtxtBufferDista neeText=0.1Comboxcbo Un itsItems=UnknownInchesPoi ntsFeetYardsMilesNauticalMilesMillimetersCen timetersMetersKilometersDecimalDegreesDecimetersTextBoxtxtOutputPathEn able=falseButtonbtnO utputLayerButtonbtn Buffer輸出GroupBoxgpbTips提示TextBoxtxtMessagesMultiLi neButtonbtnCancel關(guān)
5、閉5、為修改 BufferCmd 類,首先修改其構(gòu)造函數(shù):public BufferCmd()base .m_caption =緩沖區(qū)創(chuàng)建” base .m_message = This should work inArcMap/MapControl/PageLayoutControlbase .m_toolTip =緩沖區(qū)創(chuàng)建 ;base .m_name = BufferCmd ;base .m_category =緩沖區(qū)創(chuàng)建工具”;trystring bitmapResourceName = GetType().Name + .bmp ; base.m_bitmap =new Bitmap
6、 (GetType(), bitmapResourceName);catch ( Exception ex)System.Diagnostics. Trace .WriteLine(ex.Message, InvalidBitmap );6、為 OnClick 函數(shù)添加如下代碼:public override void OnClick()if ( null = m_hookHelper)return ;if (m_hookHelper.FocusMap.LayerCount 0)BufferDlg bufferDlg =new BufferDlg(m_hookHelper);bufferDlg
7、.Show();其中,IHookHelper m_hookHelper 主要在用在自定義類型于 AO/AE 帶的的 IComman(或 ITool 等。在BufferCmd類中, On Create函數(shù)將object類型的參數(shù)hook傳遞給m_hookHelper, 而 m_hookHelper又可以作為參數(shù)在 On Click 函數(shù)中傳遞給 BufferDIg 類,這樣就實(shí)現(xiàn)了 ArcMap 中數(shù)據(jù)向插件傳遞,從而實(shí)現(xiàn)插件對宿主程序中數(shù)據(jù)的操作、拓展了宿主程序的功能。OnCreate 函數(shù)的代碼如下:public override void OnCreate( object hook)if
8、(hook = null )return ;trym_hookHelper = new HookHelperClass (); m_hookHelper.Hook = hook;if (m_hookHelper.ActiveView = null ) m_hookHelper = null ;catchm_hookHelper = null ;if (m_hookHelper = null ) base.m_enabled = false ;elsebase.m_enabled = true ;On Click 函數(shù)的作用就是:當(dāng) ArcMap 中加載了該插件,只要點(diǎn)擊該插件的按鈕,則就執(zhí)行
9、On Click 函數(shù),也就是將 BufferDIg 窗體調(diào)出來。下面,我們將為BufferDIg 窗體添加控件響應(yīng)事件。7、修改 BufferDlg 類的構(gòu)造函數(shù),使構(gòu)造函數(shù)有一個類型為 IHookHelper 的參數(shù),實(shí)現(xiàn) 從BufferCmd 類中接收宿主程序的數(shù)據(jù)。public BufferDlg( IHookHelper hookHelper)InitializeComponent();m_hookHelper = hookHelper;通過 IHookHelper 類型的實(shí)例將宿主程序的對象傳到插件中的機(jī)制如下:IHookHelper m_hookHelper = new Hook
10、HelperClass();m_hookHelper.Hook = this.axMapControl1.Object ; 這樣就可以把 AxMapControl 傳遞給其 它要用到的地方 , 再通過 IHookHelper.ActiveView 和 IHookHelper.FocusMap 屬性來獲取 lActiveView 和 IMap對象,通過這兩個接口進(jìn)行更一步的操作。8、完善 BufferDlg 類,為其添加相應(yīng)的字段,同時(shí) 依次為表 2_1 中列出的控件添加相 應(yīng)的事件響應(yīng), BufferDlg 類實(shí)現(xiàn) 代碼如下:public partialclass BufferDlg : Fo
11、rm/委托機(jī)制,目的是在.Net環(huán)境中使用Win32函數(shù) DllImport (user32.dll )privatestatic extern int PostMessage( IntPtr wnd, uint Msg,IntPtr wParam,IntPtr lParam);privateIHookHelper m_hookHelper = null ;privateconst uint WM_VSCROLL = 0 x0115;privateconst uint SB_BOTTOM = 7;public BufferDlg( IHookHelper hookHelper)Initiali
12、zeComponent();m_hookHelper = hookHelper;private void bufferDlg_Load( object sender, EventArgs e)if ( null = m_hookHelper | null = m_hookHelper.Hook | 0 =m_hookHelper.FocusMap.LayerCount)return ;/將 ArcMap 中的圖層名稱顯示到 combox 中IEnumLayer layers = GetLayers();layers.Reset();ILayer layer = null ;while (lay
13、er = layers.Next() !=null )saveDlg.OverwritePrompt =true ; cboLayers.Items.Add(layer.Name);/ 設(shè)置默認(rèn)圖層if (cboLayers.Items.Count 0) cboLayers.SelectedIndex = 0;string tempDir = System.IO. Path.GetTempPath(); txtOutputPath.Text = System.IO.Path.Combine(tempDir,( string )cboLayers.SelectedItem + _buffer.s
14、hp );/ 設(shè)置默認(rèn)的緩沖半徑單位int units = Convert .ToInt32(m_hookHelper.FocusMap.MapUnits);cboUnits.SelectedIndex = units;private void btnOutputLayer_Click( object sender, EventArgs e)/設(shè)置輸出 shp 文件路徑SaveFileDialog saveDlg = new SaveFileDialog (); saveDlg.CheckPathExists =true ;saveDlg.Filter =Shapefile (*.shp)|*
15、.shp;saveDlg.Title = 輸出圖層 ;saveDlg.RestoreDirectory =saveDlg.FileName = ( string )cboLayers.SelectedItem + _buffer.shpDialogResult dr = saveDlg.ShowDialog();if (dr = DialogResult .OK)txtOutputPath.Text = saveDlg.FileName;private void btnBuffer_Click( object sender, EventArgs e)double bufferDistance;
16、/ 獲取緩沖區(qū)半徑double .TryParse(txtBufferDistance.Text, out bufferDistance);if (0.0 = bufferDistance)MessageBox.Show( 緩沖區(qū)半徑不合法 ! );return ;/ 檢查輸出路徑合法性if(!System.IO. Directory .Exists(System.IO.Path .GetDirectoryName(txtOutputPath.Text) |.shp != System.IO. Path .GetExtension(txtOutputPath.Text)MessageBox.S
17、how( 輸出文件名不正確 ! );return ;/檢測宿主程序(ArcMap)中是否存在圖層if (m_hookHelper.FocusMap.LayerCount = 0)true ;return/從 ArcMap 中獲得圖層IFeatureLayer layer =GetFeatureLayer( string )cboLayers.SelectedItem);if ( null = layer)txtMessages.Text+= Layer + ( string )cboLayers.SelectedItem +不能被找到 !rn;return ;/ 設(shè)置消息框有滾動條Scroll
18、ToBottom();txtMessages.Text +=rn 分析開始,這可能需要幾分鐘時(shí)間 , 請稍候.rn;txtMessages.Update();/ 獲得 geoprocessor 實(shí)例gp.OverwriteOutput =true/ 創(chuàng)建緩沖區(qū)生成工具/ 執(zhí)行緩沖區(qū)生成工具IGeoProcessorResult results = tryGeoprocessor gp =new Geoprocessor ();ESRI.ArcGIS.AnalysisTools.Buffer buffer = newESRI.ArcGIS.AnalysisTools. Buffer(layer,
19、 txtOutputPath.Text,Convert .ToString(bufferDistance) +II II+ ( string )cboUnits.SelectedItem);buffer.dissolve_option =ALL; /這個要設(shè)成 ALL,否則相交部分不會融合/buffer.line_side = FULL;/默認(rèn)是 FULL, 最好不要改否則出錯/buffer.li ne_en d_type = ROUND;/默認(rèn)是ROUND最好不要改否則出錯null ;results = (IGeoProcessorResult )gp.Execute(buffer,null
20、 );catch ( Exception ex)txtMessages.Text +=Failed to buffer layer: + layer.Name +rn ;if (results != null &results.Status !=esriJobStatus .esriJobSucceeded)txtMessages.Text +=ScrollToBottom();private string ReturnMessages( Geoprocessor gp)StringBuilder sb = new StringBuilder ();if (gp.MessageCount 0)
21、for ( int Count = 0; Count = gp.MessageCount - 1; Count+)Trace .WriteLine(gp.GetMessage(Count);rntxtMessages.Text +=Failed to buffer layer: + layer.Name +ScrollToBottom();txtMessages.Text +=rn 分析完成 .rnrnSystem.Diagnostics.sb.AppendFormat(0n , gp.GetMessage(Count);return sb.ToString();/ / 根據(jù)名稱獲取圖層對象/ / / private IFeatureLayer GetFeatureLayer( string/ 從 ArcMap 中獲得 layersIEnumLayer layers = GetLayers();layers.Reset();ILayer layer = null ;while (layer = layers.Next() !=null )if (layer.Name = layerName)return layer as IFeatureLayer ;return null ;private IEnumLayer GetLayers()UID uid = new UIDCla
溫馨提示
- 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)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025年防城港貨運(yùn)上崗證考試
- 經(jīng)濟(jì)學(xué)微觀知識點(diǎn)題庫
- 教育培訓(xùn)機(jī)體育教育培訓(xùn)體系搭建方案
- 2025年常德駕??荚囏涍\(yùn)從業(yè)資格證考試題庫
- 高鐵車身輕質(zhì)材料應(yīng)用規(guī)范
- 常用公司股權(quán)轉(zhuǎn)讓合同
- 光伏機(jī)電安裝工程施工合同
- 英語語法句型轉(zhuǎn)換巧辨析-七年級英語語法教學(xué)
- 河南煤化集團(tuán)六大系統(tǒng)培訓(xùn)-煤礦應(yīng)急救援通信模式的研究與示范
- 《瞻園園林分析》課件
- 2025年黑龍江農(nóng)業(yè)職業(yè)技術(shù)學(xué)院單招職業(yè)技能測試題庫及答案1套
- 華潤電力六合馬鞍120兆瓦漁(農(nóng))光互補(bǔ)光伏發(fā)電項(xiàng)目110千伏送出工程報(bào)告表
- 2025年電工特種作業(yè)人員上崗操作證考試全真模擬試題庫及答案(共七套)
- 有創(chuàng)動脈血壓監(jiān)測
- 全國導(dǎo)游基礎(chǔ)知識-全國導(dǎo)游基礎(chǔ)知識章節(jié)練習(xí)
- 【安排表】2024-2025學(xué)年下學(xué)期學(xué)校升旗儀式安排表 主題班會安排表
- 2025年度老舊小區(qū)改造施工委托合同范本
- 2024黑龍江公務(wù)員考試【A類、B類、省直、筆試】四套真題及答案
- 2025年安徽中醫(yī)藥高等專科學(xué)校高職單招職業(yè)適應(yīng)性測試近5年常考版參考題庫含答案解析
- 第七章 力 達(dá)標(biāo)測試卷(含答案)2024-2025學(xué)年度人教版物理八年級下冊
- 2024年濟(jì)南護(hù)理職業(yè)學(xué)院高職單招語文歷年參考題庫含答案解析
評論
0/150
提交評論