日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程语言 > C# >内容正文

C#

ArcEngine C# GIS开发入门作业 (二)Ex03——基本应用程序生成,右击菜单实现:显示、移除和打开属性表功能

發(fā)布時(shí)間:2024/5/14 C# 66 豆豆
生活随笔 收集整理的這篇文章主要介紹了 ArcEngine C# GIS开发入门作业 (二)Ex03——基本应用程序生成,右击菜单实现:显示、移除和打开属性表功能 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

ArcEngine C# GIS開發(fā)入門作業(yè) (二)Ex03——基本應(yīng)用程序生成,右擊菜單實(shí)現(xiàn):顯示、移除和打開屬性表功能

這篇文章轉(zhuǎn)自我舍友的文章,沒有他的幫忙以我的基礎(chǔ)和水平這個(gè)學(xué)期肯定學(xué)不懂AE開發(fā),他的文章鏈接在這里 https://blog.csdn.net/m0_37768631/article/details/84196202
大家可以看看他的其他文章對(duì)我們這些入門水平的同學(xué)是很幫助的

前言:這里是我的筆記本

目錄:

  • 準(zhǔn)備工作 - 工具方法等
  • 代碼

?

首先說明一下第一個(gè)作業(yè),這是第二個(gè)的鏈接:https://pan.baidu.com/s/1NziPHoMEJx0vc8DCNrX-dA提取碼:qpee看的時(shí)候希望能夠靜下心來看,不要著急,不然略過了信息可能后面代碼看不懂,我的初衷是希望能夠通過以下準(zhǔn)備工作和理論講解加深對(duì)我窗體工作的理解,急不得,有問題可留言啊,我盡量回復(fù),畢竟代碼內(nèi)容有很多問題,還有錯(cuò)別字啥的HH,別介意。

  • 代碼為同學(xué)我的所有代碼,但是完成度并非100%,一些小的改動(dòng)和功能添加可以自行增補(bǔ),而且?guī)в袀€(gè)人習(xí)慣,所以重在屬性功能;另外,同學(xué)我用的是10.2 + VS2012的環(huán)境,不同的版本應(yīng)該有差異,雖然我這里測(cè)試無誤,但是我不能保證其他人賦值粘貼過去后也能正常運(yùn)行;
  • 還有一點(diǎn)想強(qiáng)調(diào)一下,在開始寫代碼之前,準(zhǔn)備工作不能落下,包括使用,嵌入操作,控件的命名,屬性的設(shè)置,添加mapcontrol,lincensecontrol等等,可以省去一些不必要的麻煩。

第一個(gè)文章寫的很爛,對(duì)于沒有C#和窗體基礎(chǔ)的同學(xué)可能較為吃力,但這個(gè)沒辦法啦,這畢竟是我的個(gè)人總結(jié)。大早爬起來終于把第二個(gè)寫好了,現(xiàn)在寫點(diǎn)總結(jié)。第一個(gè)作業(yè)的基礎(chǔ)之后大致熟悉了窗體的基本操作,基本空間的使用,基本設(shè)置等等,如果沒有,可以找一些視頻或者自己看看書熟悉一下。

第二個(gè)作業(yè)實(shí)現(xiàn)的功能

EX03 * 關(guān)系關(guān)系編寫程序,地圖顯示坐標(biāo),工具條命令提示信息,并移除圖層。

  • 在狀態(tài)欄顯示地圖中鼠標(biāo)當(dāng)前位置的坐標(biāo)信息(地圖控件的的的的的OnMouseMove)。
  • 在狀態(tài)欄顯示工具條命令的提示信息(ToolbarControl的的的的的OnMouseMove,的的的的HitTest)。
  • 在TOCControl的圖層上按鼠標(biāo)右鍵,移除該圖層(TOCControl的onmousedown事件事件事件,的的的HitTest)

    生成初始界面(帶工具條);

  • 鼠標(biāo)移動(dòng)顯示坐標(biāo)和工具狀態(tài)信息;
  • 右擊菜單實(shí)現(xiàn);
  • 右擊菜單中刪除圖層功能和AttributeTable打開功能。 標(biāo)題 <p>&nbsp;</p> </li>

  • 本次作業(yè)使用到的工具和方法,需了解,不若不易理解后續(xù)代碼:

  • ArcEngine的控件:地圖控件,ToolbarControl,TOCControl(目錄樹),LicenseControl,中間兩個(gè)不能夠單獨(dú)使用,必須與伙伴控件一起使用,所以在使用時(shí)我們需要將它們綁定到地圖控件或頁面...... .ToolbarControl綁定之后,我們就可以通過工具條對(duì)“伙伴控件”進(jìn)行訪問操作;同理,TOCControl可以用來顯示“伙伴”的地圖,圖層,符號(hào)系統(tǒng)等內(nèi)容的交互式視圖→當(dāng)在TOC中刪除,隱藏圖層時(shí),地圖控件中也會(huì)相應(yīng)移除,不可見。
  • 基本控件的常用屬性,由于初始不熟悉,這里補(bǔ)充一下很多都是可以望文生義的屬性,同時(shí)點(diǎn)擊之后會(huì)有相應(yīng)的功能描述,如下圖所示:常用的碼頭,設(shè)置控件在窗體中的位置,文字文本顯示等。
  • 本次我用了stateStrip控件和的的ContextMenuStrip,toolStripContainer,的textBox中(可以直接在左側(cè)工具欄搜索),也可以使用其他控件實(shí)現(xiàn)相同的功能,看個(gè)人習(xí)慣。至于這些功能基本的使用,可自行百度。這幾個(gè)控件都比較搞,顯示為了好還需要這幾個(gè)設(shè)置位于頂層或者底層才行,忘記了,總之不要把地圖控件下部分蓋住。
    • 引用的類庫:

    使用ESRI.ArcGIS.esriSystem;必須
    使用ESRI.ArcGIS.Carto;必須
    使用ESRI.ArcGIS.Controls;
    使用ESRI.ArcGIS.SystemUI;
    使用ESRI.ArcGIS.Geodatabase; //必須

    非全部必須,具體使用可隨時(shí)添加,這里地理數(shù)據(jù)庫初始可能找不到,按下圖所示方法查找即可:

    • 函數(shù)說明https://blog.csdn.net/haizhongliangji/article/details/43955627
    • public void HitTest(int X,int Y,ref esriTOCControlItem ItemType,ref IBasicMap BasicMap,ref ILayer?

      Layer,ref object unk,ref object Data);
      各參數(shù)的含義如下:
      X,Y:鼠標(biāo)點(diǎn)擊的坐標(biāo);
      項(xiàng)目類型:esriTOCControlItem枚舉常量
      BasicMap:綁定地圖控件的IBasicMap接口
      層:被點(diǎn)擊的圖層
      UNK:TOCControl的LegendGroup對(duì)象
      數(shù)據(jù):LegendClass在LegendGroup中的索引
      .esriTOCControlItem枚舉常量用于描述TocControl上的項(xiàng)目的類型,其定義如下:
      esriTOCControlItemNone 0沒有對(duì)象
      esriTOCControlItemMap 1地圖對(duì)象
      esriTOCControlItemLayer 2圖層對(duì)象
      esriTOCControlItemHeading 3對(duì)象的標(biāo)題
      esriTOCControlItemLegendClass 4 LegendClass對(duì)象

    這里我個(gè)人理解的為綁定TOC和地圖控件后通過該函數(shù)來判斷鼠標(biāo)所處的位置,還有其他的功能但本次未用到。

    C#幾個(gè)經(jīng)常用到的字符串截取,因?yàn)轱@示的字段類型還有一些單位,比如Meters會(huì)是esriMeters,Polyline則為esriGeometryPolyline,所以我用到了字符創(chuàng)截取功能:https://www.cnblogs。 com /lykbk/archive/2012/06/28/lyk1232132.html

    如圖1所示,取字符串的前我個(gè)字符

    (1)string str1 = str.Substring(0,i);

    (2)string str1 = str.Remove(i,str.Length -i);

    2,去掉字符串的前我個(gè)字符

    string str1 = str.Remove(0,i);

    string str1 = str.SubString(i);

    3,從右邊開始取我個(gè)字符:

    string str1 = str.SubString(str.Length -i);

    string str1 = str.Remove(0,str.Length -i);

    如圖4所示,從右邊開始去掉我個(gè)字符:

    string str1 = str.Substring(0,str.Length -i);

    string str1 = str.Remove(str.Length-i,i);

    5,如果字符串中有“abc”則替換成“ABC”
    ?? str = str.Replace(“abc”,“ABC”);

    6,C#截取字符串最后一個(gè)字符的問題!!!!!!!!!!!!!!!!!!!!

    str1.Substring(str1.LastIndexOf(“”)+ 1);

    7,C#截取字符串最后一個(gè)字符

    k = k.Substring(k.Length-1,1);


    就是還有基本窗體怎么生成的問題,就是自帶工具條的那個(gè),這里就不多此一舉了,看這里http://zhihu.esrichina.com.cn/?/article/535與兩種方法,我參考的的是它的第二種方式;這位前輩知乎上的教程不錯(cuò),有6章,都可以看看但是有些代碼拿過來還是有錯(cuò)HH,需要自己調(diào)試

    生成之后添加工具如果不能使用(灰色的)需要注意,TolllBarControl綁定地圖控件添加工具應(yīng)該選擇mapnevigation里的工具才會(huì)生效,有的是針對(duì)layerout ......這個(gè)同學(xué)我也還沒去了解

    http://zhihu.esrichina.com.cn/article/537這的英文右擊菜單生成的方法,也是上面前輩的

    還有選擇控件時(shí)如果覆蓋點(diǎn)不到,可以右擊選擇,就像圖層一樣也可以直接點(diǎn)下方的控件名稱。


    準(zhǔn)備工作時(shí)很重要的,下面基本開始羅列代碼了,再次聲明,僅供參考!!!代碼是使用CSDN編輯器C#選項(xiàng),應(yīng)該可復(fù)制。

    代碼

    這是筆者的界面,下面是各個(gè)部分的代碼,因?yàn)椴糠?strong>改了控件的名稱屬性,可能不一致,比如MapX的是lablestrip改名的,所以你在寫代碼的時(shí)候要改我的代碼來適應(yīng)你的窗體而不是通過我的代碼來改動(dòng)你的窗體和控件。

    1,鼠標(biāo)移動(dòng)在地圖上時(shí),顯示相關(guān)信息

    private void axMapControl1_OnMouseMove(object sender, ESRI.ArcGIS.Controls.IMapControlEvents2_OnMouseMoveEvent e){string path = axMapControl1.DocumentFilename;mapx.Text = "X:" + e.mapX.ToString("0.00");mapy.Text = "Y:" + e.mapY.ToString("0.00");//或者toolStripStatusLabel1.Text = Math.Round(e.mapX, 2).ToString();mapunits.Text = this.axMapControl1.MapUnits.ToString().Remove(0,4);//string str1 = str.Remove(0, i);//string str1 = str.SubString(i);textBox1.Text = "比例尺 1:" + ((long)this.axMapControl1.MapScale).ToString();}

    2,鼠標(biāo)移動(dòng)至工具條工具時(shí),顯示工具信息(索引初始索引為-1)

    private void axToolbarControl1_OnMouseMove(object sender, ESRI.ArcGIS.Controls.IToolbarControlEvents_OnMouseMoveEvent e){//取得鼠標(biāo)所在工具的索引號(hào)int index = axToolbarControl1.HitTest(e.x, e.y, false);if (index != -1){toolinfo.Text = axToolbarControl1.GetItem(index).Command.Message;}//toolinfo為我自己改的控件名,原來是statelable1,就是那個(gè)statestrip的子菜單else{toolinfo.Text = "就緒";}}

    3,右擊菜單的實(shí)現(xiàn),全局變量的設(shè)置就是因?yàn)榍懊嬷v到的幾控件之間的關(guān)聯(lián)關(guān)系

    //右擊菜單的實(shí)現(xiàn)public ILayer pLayer;private void axTOCControl1_OnMouseDown(object sender, ITOCControlEvents_OnMouseDownEvent e){esriTOCControlItem pItem = new esriTOCControlItem();pLayer = new FeatureLayerClass();IBasicMap pBasicMap = new MapClass();object pUnk = new object();object pData = new object();//實(shí)例化HITtest中的后五個(gè)參數(shù)axTOCControl1.HitTest(e.x, e.y, ref pItem, ref pBasicMap, ref pLayer, ref pUnk, ref pData); //調(diào)用函數(shù)if (e.button == 2 && pItem == esriTOCControlItem.esriTOCControlItemLayer)//e.button=2代表鼠標(biāo)右擊,=1則是單擊左鍵,pItem=...表示圖層{contextMenuStrip1.Show(axTOCControl1, new Point(e.x, e.y));}//如果點(diǎn)擊的是圖層,則彈出右擊菜單}

    4,圖層移除功能實(shí)現(xiàn)

    private void removeLayerToolStripMenuItem_Click(object sender, EventArgs e){if (axMapControl1.LayerCount > 0){if (pLayer != null){axMapControl1.Map.DeleteLayer(pLayer);}}}

    5,屬性表功能實(shí)現(xiàn),需要在這個(gè)項(xiàng)目里新建一個(gè)窗體,感覺比較復(fù)雜,直接擺出供參考

    //屬性表窗體連接并顯示private void openAtriiToolStripMenuItem_Click(object sender, EventArgs e){AttributeTable pAttributeTable = new AttributeTable(pLayer as IFeatureLayer);pAttributeTable.Show();}

    5.1,的的的dataGridView控件需要用于顯示屬性表,同時(shí)還需要設(shè)置屬性時(shí)全局顯示,沒記錯(cuò)應(yīng)該是AutoSizeColumnsMode,行兩個(gè),下面是代碼,詳情略

    public partial class AttributeTable : Form{private IFeatureLayer pFeatureLayer = null;public AttributeTable(IFeatureLayer _FeatureLayer){InitializeComponent();pFeatureLayer = _FeatureLayer;}private void AttributeTable_Load(object sender, EventArgs e){IFields pFields; pFields = pFeatureLayer.FeatureClass.Fields;//連接屬性表的列dataGridView1.ColumnCount = pFields.FieldCount;for (int i = 0; i < pFields.FieldCount; i++){string fldName = pFields.get_Field(i).Name;//字段名dataGridView1.Columns[i].Name = fldName;dataGridView1.Columns[i].ValueType = Type.GetType(ParseFieldType(pFields.get_Field(i).Type));//列名和值類型}IFeatureCursor pFeatureCursor;//定義游標(biāo)/指針pFeatureCursor = pFeatureLayer.FeatureClass.Search(null, false);IFeature pFeature;pFeature = pFeatureCursor.NextFeature();while (pFeature != null){string[] fldValue = new string[pFields.FieldCount];for (int i = 0; i < pFields.FieldCount; i++){string fldName;fldName = pFields.get_Field(i).Name;//下代碼判斷是數(shù)值類型還是幾何類型字段if (fldName == pFeatureLayer.FeatureClass.ShapeFieldName){fldValue[i] = pFeature.Shape.GeometryType.ToString().Remove(0,12);}elsefldValue[i] = pFeature.get_Value(i).ToString();}dataGridView1.Rows.Add(fldValue);//寫入行值pFeature = pFeatureCursor.NextFeature();}}private string ParseFieldType(esriFieldType TableFieldType){switch (TableFieldType){case esriFieldType.esriFieldTypeBlob:return "System.String";case esriFieldType.esriFieldTypeDate:return "System.DateTime";case esriFieldType.esriFieldTypeDouble:return "System.Double";case esriFieldType.esriFieldTypeGeometry:return "System.String";case esriFieldType.esriFieldTypeGlobalID:return "System.String";case esriFieldType.esriFieldTypeGUID:return "System.String";case esriFieldType.esriFieldTypeInteger:return "System.Int32";case esriFieldType.esriFieldTypeOID:return "System.String";case esriFieldType.esriFieldTypeRaster:return "System.String";case esriFieldType.esriFieldTypeSingle:return "System.Single";case esriFieldType.esriFieldTypeSmallInteger:return "System.Int32";case esriFieldType.esriFieldTypeString:return "System.String";default:return "System.String";}}}

    代碼就到這里結(jié)束了,但是可能還是會(huì)遇到很多問題,我也深有體會(huì)HH感謝你看完了,有需要的留言,博客可以修改這點(diǎn)是真的好用,當(dāng)筆記本不錯(cuò),下面是我的效果圖(這個(gè)比例尺是可以直接添加的工具,我一開始沒找到,就懶得改了,添加了比例尺工具就可以把我這里的關(guān)代碼去除了):

    總結(jié)

    以上是生活随笔為你收集整理的ArcEngine C# GIS开发入门作业 (二)Ex03——基本应用程序生成,右击菜单实现:显示、移除和打开属性表功能的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。