《资源环境信息系统培训资料》由会员分享,可在线阅读,更多相关《资源环境信息系统培训资料(60页珍藏版)》请在金锄头文库上搜索。
1、基于Visual C#和ArcEngine的二次开发,系统功能需求,简单图层控制功能的实现 数据的转换和可视化表达,一、简单图层控制功能的实现,图层属性表的添加和显示 图层的添加和移除 图层间关系的调整,1 图层属性表的添加和显示,步骤1:设计图层控制的菜单。响应ContextMenuStrip菜单控件,为图层控件添加菜单项(显示属性表菜单和删除图层菜单)。该菜单是在鼠标右键点击图层时弹出的快捷菜单。,添加的菜单项,修改菜单name属性,步骤2:实现图层与图层控制菜单间的关联。响应TOCControl控件的OnMouseDown事件,添加相关代码。 using ESRI.ArcGIS.Cart
2、o; /因为程序中用到ILayer和 /IBasicMap 接口,所以需要添加命名空间 ILayer layer = new FeatureLayerClass(); private void axTOCControl1_OnMouseDown(object sender, ESRI.ArcGIS.Controls.ITOCControlEvents_OnMouseDownEvent e) this.axTOCControl1.ContextMenuStrip = null; IBasicMap map = new MapClass(); System.Object other = null;
3、 System.Object index = null; ESRI.ArcGIS.Controls.esriTOCControlItem item = ESRI.ArcGIS.Controls.esriTOCControlItem.esriTOCControlItemNone; this.axTOCControl1.HitTest(e.x, e.y, ref item, ref map, ref layer, ref other, ref index);,if (item = ESRI.ArcGIS.Controls.esriTOCControlItem.esriTOCControlItemL
4、ayer ,运行程序显示结果如下:,步骤3:设计一个属性表窗体。 1添加一个属性表窗体。,2 为属性表窗体添加DataGridView控件,并修改控件Anchor属性为(Top, Bottom, Left, Right)。,3 为属性表窗体编写相关代码,实现图层属性信息往属性表中的添加。 public partial class 属性表 : Form private ILayer layer; public 属性表(ILayer lyr) /对属性表窗口进行初始化 InitializeComponent(); layer = lyr; this.Text = “ + layer.Name +
5、“ 属性表“; ,private void 属性表_Load(object sender, EventArgs e) try ITable lyrtable = (ITable)layer; DataTable table = new DataTable(); IField field; for (int i = 0; i lyrtable.Fields.FieldCount; i+) field = lyrtable.Fields.get_Field(i); table.Columns.Add(field.Name); object values = new objectlyrtable.F
6、ields.FieldCount; IQueryFilter queryFilter = new QueryFilterClass(); ICursor cursor = lyrtable.Search(queryFilter, true); IRow row;,while (row = cursor.NextRow() != null) for (int j = 0; j lyrtable.Fields.FieldCount; j+) object ob = row.get_Value(j); valuesj = ob; table.Rows.Add(values); this.dataGr
7、idView1.DataSource = table; catch (Exception e1) MessageBox.Show(“无法显示属性表!“); this.Close(); ,由于该段代码中用到了ILayer接口,所以要在属性表.cs开头添加命名空间ESRI.ArcGIS.Carto。同时也用到ITable, IQueryFilter, ICursor, IRow接口,所以要添加命名空间ESRI.ArcGIS.Geodatabase。即添加如下代码: using ESRI.ArcGIS.Carto; using ESRI.ArcGIS.Geodatabase; 但此时运行程序会报错:
8、命名空间ESRI.ArcGIS中不存在类型名或命名空间名称Geodatabase(是缺少程序集引用吗?)。这时需要在资源管理器中将该程序集添加进来。,右键点击引用,从弹出的菜单中点击“添加引用”菜单项,再在弹出的对话框中将ESRI.ArcGIS.Geodatabase命名空间添加进来,步骤4:建立图层控制菜单与属性表的连接,实现属性表界面的显示。双击图层控制菜单上的“显示属性表”菜单项,在响应的Click事件中添加如下代码: private void 显示属性表ToolStripMenuItem_Click(object sender, EventArgs e) 属性表 form = new
9、属性表(layer); form.Show(); ,步骤5:运行程序,查看图层属性。,右键点击该图层,从弹出快捷菜单中选择“显示属性表”菜单项。弹出该图层的属性表界面,步骤6:这里实现一个通过属性表中属性查找图形要素的小功能。响应datagridView1控件的SelectionChanged事件。,先在主窗口中编写一个公有函数,以获取主窗口的MapControl控件,因为该控件是Private类型。在其它窗体中不能直接调用。 public ESRI.ArcGIS.Controls.AxMapControl getMapControl() return axMapControl1; ,再在Se
10、lectionChanged事件中添加如下代码: private void dataGridView1_SelectionChanged(object sender, EventArgs e) DataGridViewSelectedRowCollection SelRows = this.dataGridView1.SelectedRows; DataGridViewRow row; 主窗口 form = (主窗口)Application.OpenForms0; IMap m = form.getMapControl().Map; m.ClearSelection(); for (int i
11、 = 0; i SelRows.Count; i+) row = SelRowsi; int ID = Convert.ToInt32(row.Cells“FID“.Value.ToString(); IFeatureLayer flyr = (IFeatureLayer)layer; IFeatureClass featurecls = flyr.FeatureClass; IFeature feature = featurecls.GetFeature(ID); m.SelectFeature(layer, feature); /获取属性表中选中行对应的图形要素 form.getMapCo
12、ntrol().Refresh(); ,运行程序,显示结果如下:,属性表中选择一个点要素时,将其高亮显示,属性表中拖动选择多个点要素时,将其高亮显示,2 图层的添加和移除,步骤1:在ToolBarControl控件中直接添加“图层添加”按钮,即可以实现图层添加功能(搭建的框架中已有该按钮)。,步骤2:前面建立的图层控制菜单中已经包含了删除图层的菜单,此时只需要响应该菜单,编辑相关程序代码,即可以实现图层删除功能。,双击该菜单项,响应Click事件,在响应的Click事件中添加相关代码: private void 删除此图层ToolStripMenuItem_Click(object sende
13、r, EventArgs e) for (int i = 0; i this.axMapControl1.Map.LayerCount; i+) if (this.axMapControl1.Map.get_Layer(i) = layer) this.axMapControl1.DeleteLayer(i); ,运行程序,显示如下:,删除biaozhidian图层前,删除biaozhidian图层后,3 图层间关系的调整,在ArcMap中,要调整图层的现实顺序,只需要简单的鼠标拖拽就可以完成,既简单又直观。但是TOCControl控件并未实现此功能。本实例即实现此功能。 在本实例中主要利用T
14、OCControl控件的OnMouseDown、OnMouseUp两个时间和HitTest()、Update()方法。 OnMouseDown事件方法的主要功能是获取源图层pMovelayer。 OnMouseUp事件方法的主要功能是: 1) 获取目标图层及其索引号; 2) 利用IMap提供的Movelayer(pMoveLayer, Toindex)将源图层pMoveLayer移到目标图层(Toindex)的下方;3)使用ITOCControl提供的Update()方法更新TOCControl控件中显示的内容。,步骤1:在主窗口.cs中申明两个全局变量,并响应TOCControl控件的OnM
15、ouseDown事件(前面已响应此事件),添加相关代码。 /申明全局变量 ILayer pMoveLayer; int Toindex; private void axTOCControl1_OnMouseDown(object sender, ESRI.ArcGIS.Controls.ITOCControlEvents_OnMouseDownEvent e) /前面已添加代码,这里不需要再添加 this.axTOCControl1.ContextMenuStrip = null; IBasicMap map = new MapClass(); System.Object other = nu
16、ll; System.Object index = null; ESRI.ArcGIS.Controls.esriTOCControlItem item = ESRI.ArcGIS.Controls.esriTOCControlItem.esriTOCControlItemNone; this.axTOCControl1.HitTest(e.x, e.y, ref item, ref map, ref layer, ref other, ref index);,if (item = ESRI.ArcGIS.Controls.esriTOCControlItem.esriTOCControlItemLayer /layer是前面申明的一个全局变量 ,步骤2:响应TOCControl控件的OnMouseUp事件,并添加相关代码。,双击OnMouseUp事件,