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