在上文的基础上,(最简单的ArcGIS Engine应用程序(上))
下面将使用简单的代码实现要素类属性的查看。
新增一个窗体,并从工具箱拖动DataGridView控件到该窗体中。设置该对象的Dock属性为Fill。
为该窗体的Load时间处理方法添加代码。当窗体加载时,就从图层数据中读取要素类的属性信息,并且显示到DataGridView控件中。
FeatrAttributeTable.cs
using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Windows.Forms; using ESRI.ArcGIS.DataSourcesFile; using ESRI.ArcGIS.Geodatabase; using ESRI.ArcGIS.Carto; using System.IO; using ESRI.ArcGIS.Controls; namespace SimpleArcEngineDemo { public partial class FeatrAttributeTable : Form { //声明地图控件的变量。 private AxMapControl axMapControl; public FeatrAttributeTable() { InitializeComponent(); } //重载构造函数。 public FeatrAttributeTable(AxMapControl pMapControl) { InitializeComponent(); axMapControl = pMapControl; } private void FeatrAttributeTable_Load(object sender, EventArgs e) { //得到地图控件的第0层图层。 ILayer pLayer = axMapControl.get_Layer(0); //将pLayer类型强制转换为IFeatureLayer。 IFeatureLayer pFLayer = pLayer as IFeatureLayer; //得到要素类对象pFC IFeatureClass pFC = pFLayer.FeatureClass; //获得游标。 IFeatureCursor pFCursor = pFC.Search(null, false); //获得第0图层的第一个要素, 要素中包含多个属性值。 IFeature pFeature = pFCursor.NextFeature(); //将游标移动到结果集下一个要素并返回当前要素,这里将返回结果赋值给了pFeature //新建内存表格, 并构建表结构,包括属性字段和数据字段。 DataTable pTable = new DataTable();//新建内存表格 DataColumn colName = new DataColumn("洲名"); //属性字段(属性名) colName.DataType = System.Type.GetType("System.String"); //数据字段(数据类型) pTable.Columns.Add(colName); //加到pTable中 DataColumn colArea = new DataColumn("面积"); //属性字段(属性名) colArea.DataType = System.Type.GetType("System.String"); //数据字段(数据类型) pTable.Columns.Add(colArea); //加到pTable中 //获得字段名为"CONTINENT"在内存表中的字段索引。下同 int indexOfName = pFC.FindField("CONTINENT"); int indexOfName2 = pFC.FindField("SQMI"); //当要素不为空时 while (pFeature != null) { //得到indexOfName的索引号 string name = pFeature.get_Value(indexOfName).ToString();//得到属性字段对应的属性值 string area = pFeature.get_Value(indexOfName2).ToString(); DataRow pRow = pTable.NewRow(); //创建空行 pRow[0] = name;//通过索引赋值 pRow[1] = area; pTable.Rows.Add(pRow);//加入到pTable中 pFeature = pFCursor.NextFeature(); //将游标移动到结果集下一个要素并返回当前要素,这里将返回结果赋值给了pFeature } dataGridView1.DataSource = pTable; //将属性表连接到dataGridView1控件 } } }
Form1.cs
using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Windows.Forms; using ESRI.ArcGIS.DataSourcesFile; using ESRI.ArcGIS.Geodatabase; using ESRI.ArcGIS.Carto; using System.IO; namespace SimpleArcEngineDemo { public partial class Form1 : Form { public Form1() { InitializeComponent(); } /// <summary> /// 2.2添加shp数据————添加ShapeFile文件到地图控件中。 /// </summary> /// <param name="sender"></param> /// <param name="e"></param> private void menuAddShp_Click(object sender, EventArgs e) { //步骤1: 创建工作空间工厂。 IWorkspaceFactory pWorkspaceFactory = new ShapefileWorkspaceFactory(); //文件过滤器, 选择后缀名为.shp openFileDialog1.Filter = "ShapeFile文件(*.shp)|*.shp"; //设定文件对话框的初始路径 openFileDialog1.InitialDirectory = @"D:\data"; //示例数据文件夹 openFileDialog1.Multiselect = false; //不允许多选 DialogResult dialogResult = openFileDialog1.ShowDialog();//打开对话框 if (dialogResult != DialogResult.OK) { return; //用户没有选择时返回 } //得到文件名对应的路径、文件夹名等 string pPath = openFileDialog1.FileName; //得到完整的路径(路径+文件名) string pFolder = Path.GetDirectoryName(pPath); //得到文件的路径(不包括文件名) string pFileName = Path.GetFileName(pPath); //得到文件的文件名 //步骤2: 打开ShapeFile文件名对应的工作空间。 IWorkspace pWorkspace1 = pWorkspaceFactory.OpenFromFile(pFolder, 0); //数据目录 IFeatureWorkspace pFeatureWorkspce = pWorkspace1 as IFeatureWorkspace; //将工作空间强转成要素工作空间 //步骤3: 打开要素类。 IFeatureClass pFC = pFeatureWorkspce.OpenFeatureClass(pFileName); //步骤4: 创建要素类图层。 IFeatureLayer pFLayer = new FeatureLayerClass(); pFLayer.FeatureClass = pFC; pFLayer.Name = pFC.AliasName; //步骤5: 关联图层和要素类。 ILayer pLayer = pFLayer as ILayer; IMap pMap = axMapControl1.Map; //步骤6: 添加到地图控件中。 pMap.AddLayer(pLayer); axMapControl1.ActiveView.Refresh(); } /// <summary> /// 通过lyr文件添加图层。 /// </summary> /// <param name="sender"></param> /// <param name="e"></param> private void menuAddLyr_Click(object sender, EventArgs e) { //步骤1: 打开文件对话框浏览到一个具体lyr文件。 //文件过滤器, 选择后缀名为.lyr openFileDialog1.Filter = "lyr文件(*.lyr)|*.lyr"; //设定文件对话框的初始化路径 openFileDialog1.InitialDirectory = @"D:\data"; openFileDialog1.Multiselect = false; //不允许多选 DialogResult pDialogResult = openFileDialog1.ShowDialog(); //打开对话框 if (pDialogResult != DialogResult.OK) { return; //用户没有选择时返回 } string pFileName = openFileDialog1.FileName; //得到完整的路径(路径+文件名) //步骤2: 通过地图控件的方法(AddLayerFromFile)直接加载。 axMapControl1.AddLayerFromFile(pFileName); axMapControl1.ActiveView.Refresh(); } private void 图层属性ToolStripMenuItem_Click(object sender, EventArgs e) { FeatrAttributeTable frm = new FeatrAttributeTable(axMapControl1); frm.ShowDialog(); } } }
效果图:
特别一提:
IFeature pFeature = pFCursor.NextFeature();
pFeatureCursor是对要素类进行查询返回的一个游标(即指向搜素结果集的一个指针),pFeatureCursor.NextFeature()即将游标移动到结果集下一个要素并返回当前要素,这里将返回结果赋值给了pFeature。
谢谢观看!本人初学GIS二次开发,如果有不对的地方,请多多包涵!