• 最简单的ArcGIS Engine应用程序(终)


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

  • 相关阅读:
    Ubuntu中用户名密码和root密码修改
    在Python中,输出格式:%d , %6d , %-6d, %06d , %.6f的一些区分
    定制的print()输出格式
    python编程系列---Pycharm快捷键(更新中....)
    webbrowser控件——Windows下的开发利器
    Windows读写文件的猫腻
    根据GUID获取设备信息
    转:APDU命令格式
    VC中添加消息响应函数
    VC 取消warning
  • 原文地址:https://www.cnblogs.com/edcoder/p/11713623.html
Copyright © 2020-2023  润新知