ArcEngine C# GIS开发入门作业 (二)Ex03——基本应用程序生成,右击菜单实现:显示、移除和打开属性表功能
ArcEngine C# GIS開發入門作業 (二)Ex03——基本應用程序生成,右擊菜單實現:顯示、移除和打開屬性表功能
這篇文章轉自我舍友的文章,沒有他的幫忙以我的基礎和水平這個學期肯定學不懂AE開發,他的文章鏈接在這里 https://blog.csdn.net/m0_37768631/article/details/84196202
大家可以看看他的其他文章對我們這些入門水平的同學是很幫助的
前言:這里是我的筆記本
目錄:
- 準備工作 - 工具方法等
- 代碼
?
首先說明一下第一個作業,這是第二個的鏈接:https://pan.baidu.com/s/1NziPHoMEJx0vc8DCNrX-dA提取碼:qpee看的時候希望能夠靜下心來看,不要著急,不然略過了信息可能后面代碼看不懂,我的初衷是希望能夠通過以下準備工作和理論講解加深對我窗體工作的理解,急不得,有問題可留言啊,我盡量回復,畢竟代碼內容有很多問題,還有錯別字啥的HH,別介意。
- 代碼為同學我的所有代碼,但是完成度并非100%,一些小的改動和功能添加可以自行增補,而且帶有個人習慣,所以重在屬性功能;另外,同學我用的是10.2 + VS2012的環境,不同的版本應該有差異,雖然我這里測試無誤,但是我不能保證其他人賦值粘貼過去后也能正常運行;
- 還有一點想強調一下,在開始寫代碼之前,準備工作不能落下,包括使用,嵌入操作,控件的命名,屬性的設置,添加mapcontrol,lincensecontrol等等,可以省去一些不必要的麻煩。
第一個文章寫的很爛,對于沒有C#和窗體基礎的同學可能較為吃力,但這個沒辦法啦,這畢竟是我的個人總結。大早爬起來終于把第二個寫好了,現在寫點總結。第一個作業的基礎之后大致熟悉了窗體的基本操作,基本空間的使用,基本設置等等,如果沒有,可以找一些視頻或者自己看看書熟悉一下。
第二個作業實現的功能:
EX03 * :關系關系編寫程序,地圖顯示坐標,工具條命令提示信息,并移除圖層。
在TOCControl的圖層上按鼠標右鍵,移除該圖層(TOCControl的onmousedown事件事件事件,的的的HitTest)
生成初始界面(帶工具條);
本次作業使用到的工具和方法,需了解,不若不易理解后續代碼:
- 引用的類庫:
使用ESRI.ArcGIS.esriSystem;必須
使用ESRI.ArcGIS.Carto;必須
使用ESRI.ArcGIS.Controls;
使用ESRI.ArcGIS.SystemUI;
使用ESRI.ArcGIS.Geodatabase; //必須
非全部必須,具體使用可隨時添加,這里地理數據庫初始可能找不到,按下圖所示方法查找即可:
- 函數說明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);
各參數的含義如下:
X,Y:鼠標點擊的坐標;
項目類型:esriTOCControlItem枚舉常量
BasicMap:綁定地圖控件的IBasicMap接口
層:被點擊的圖層
UNK:TOCControl的LegendGroup對象
數據:LegendClass在LegendGroup中的索引
.esriTOCControlItem枚舉常量用于描述TocControl上的項目的類型,其定義如下:
esriTOCControlItemNone 0沒有對象
esriTOCControlItemMap 1地圖對象
esriTOCControlItemLayer 2圖層對象
esriTOCControlItemHeading 3對象的標題
esriTOCControlItemLegendClass 4 LegendClass對象
這里我個人理解的為綁定TOC和地圖控件后通過該函數來判斷鼠標所處的位置,還有其他的功能但本次未用到。
C#幾個經常用到的字符串截取,因為顯示的字段類型還有一些單位,比如Meters會是esriMeters,Polyline則為esriGeometryPolyline,所以我用到了字符創截取功能:https://www.cnblogs。 com /lykbk/archive/2012/06/28/lyk1232132.html
如圖1所示,取字符串的前我個字符
(1)string str1 = str.Substring(0,i);
(2)string str1 = str.Remove(i,str.Length -i);
2,去掉字符串的前我個字符
string str1 = str.Remove(0,i);
string str1 = str.SubString(i);
3,從右邊開始取我個字符:
string str1 = str.SubString(str.Length -i);
string str1 = str.Remove(0,str.Length -i);
如圖4所示,從右邊開始去掉我個字符:
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#截取字符串最后一個字符的問題!!!!!!!!!!!!!!!!!!!!
str1.Substring(str1.LastIndexOf(“”)+ 1);
7,C#截取字符串最后一個字符
k = k.Substring(k.Length-1,1);
就是還有基本窗體怎么生成的問題,就是自帶工具條的那個,這里就不多此一舉了,看這里http://zhihu.esrichina.com.cn/?/article/535與兩種方法,我參考的的是它的第二種方式;這位前輩知乎上的教程不錯,有6章,都可以看看但是有些代碼拿過來還是有錯HH,需要自己調試
生成之后添加工具如果不能使用(灰色的)需要注意,TolllBarControl綁定地圖控件添加工具應該選擇mapnevigation里的工具才會生效,有的是針對layerout ......這個同學我也還沒去了解
http://zhihu.esrichina.com.cn/article/537這的英文右擊菜單生成的方法,也是上面前輩的
還有選擇控件時如果覆蓋點不到,可以右擊選擇,就像圖層一樣也可以直接點下方的控件名稱。
準備工作時很重要的,下面基本開始羅列代碼了,再次聲明,僅供參考!!!代碼是使用CSDN編輯器C#選項,應該可復制。
代碼
這是筆者的界面,下面是各個部分的代碼,因為部分改了控件的名稱屬性,可能不一致,比如MapX的是lablestrip改名的,所以你在寫代碼的時候要改我的代碼來適應你的窗體而不是通過我的代碼來改動你的窗體和控件。
1,鼠標移動在地圖上時,顯示相關信息
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,鼠標移動至工具條工具時,顯示工具信息(索引初始索引為-1)
private void axToolbarControl1_OnMouseMove(object sender, ESRI.ArcGIS.Controls.IToolbarControlEvents_OnMouseMoveEvent e){//取得鼠標所在工具的索引號int index = axToolbarControl1.HitTest(e.x, e.y, false);if (index != -1){toolinfo.Text = axToolbarControl1.GetItem(index).Command.Message;}//toolinfo為我自己改的控件名,原來是statelable1,就是那個statestrip的子菜單else{toolinfo.Text = "就緒";}}3,右擊菜單的實現,全局變量的設置就是因為前面講到的幾控件之間的關聯關系
//右擊菜單的實現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();//實例化HITtest中的后五個參數axTOCControl1.HitTest(e.x, e.y, ref pItem, ref pBasicMap, ref pLayer, ref pUnk, ref pData); //調用函數if (e.button == 2 && pItem == esriTOCControlItem.esriTOCControlItemLayer)//e.button=2代表鼠標右擊,=1則是單擊左鍵,pItem=...表示圖層{contextMenuStrip1.Show(axTOCControl1, new Point(e.x, e.y));}//如果點擊的是圖層,則彈出右擊菜單}4,圖層移除功能實現
private void removeLayerToolStripMenuItem_Click(object sender, EventArgs e){if (axMapControl1.LayerCount > 0){if (pLayer != null){axMapControl1.Map.DeleteLayer(pLayer);}}}5,屬性表功能實現,需要在這個項目里新建一個窗體,感覺比較復雜,直接擺出供參考
//屬性表窗體連接并顯示private void openAtriiToolStripMenuItem_Click(object sender, EventArgs e){AttributeTable pAttributeTable = new AttributeTable(pLayer as IFeatureLayer);pAttributeTable.Show();}5.1,的的的dataGridView控件需要用于顯示屬性表,同時還需要設置屬性時全局顯示,沒記錯應該是AutoSizeColumnsMode,行兩個,下面是代碼,詳情略
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;//定義游標/指針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;//下代碼判斷是數值類型還是幾何類型字段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";}}}代碼就到這里結束了,但是可能還是會遇到很多問題,我也深有體會HH感謝你看完了,有需要的留言,博客可以修改這點是真的好用,當筆記本不錯,下面是我的效果圖(這個比例尺是可以直接添加的工具,我一開始沒找到,就懶得改了,添加了比例尺工具就可以把我這里的關代碼去除了):
總結
以上是生活随笔為你收集整理的ArcEngine C# GIS开发入门作业 (二)Ex03——基本应用程序生成,右击菜单实现:显示、移除和打开属性表功能的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 虹科为您介绍如何实现多相机同步技术
- 下一篇: c# char unsigned_dll