在上文的基础上,(最简单的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二次开发,如果有不对的地方,请多多包涵!

01-23 22:02