最简单的ArcGIS Engine应用程序

小白在参阅网上各类参考资料和书籍之后,一路艰辛,终于成功实现第一个应用程序,记录遇到的问题,供参考。

关于类和接口

简单理解:类是一个对象(比如人),接口实现类的内部属性和方法的分类。一个类可以实现多个接口,一个接口也可以被多个类实现。类内显式实现的接口,不能通过类的全名进行方法的调用,只能用接口实例来访问。
例如:

注:显式接口不能用public 来修饰。
错误做法:

正确做法:

如果不是显式接口,

person A =new person();
A.start();

是可以的。

IZou pZou=new person();
pZou.start();

也是可以的。

接口本身并不提供所定义的成员的实现,而只是指定实现该接口的类或接口必须提供的成员。在可以使用类的地方,都可以使用接口来替代,除了使用类产生一个对象外。

参考:https://blog.csdn.net/lianliancf/article/details/7661323

创建工程

添加控件

  1. 找不到ToolbarControl,TOCControl,MapControl,PageLayoutControl等相关控件的解决办法:右键工具箱->选择项,在选择工具箱页面中勾选相关选项。


  1. 控件布设完毕,最后将LicenseControl控件拖入到窗体的任意地方。按F5编译运行如果不能运行,很可能是ArcEngine没有许可,解决方法:打开program.cs,把

ESRI.ArcGIS.RuntimeManager.Bind(ESRI.ArcGIS.ProductCode.EngineOrDesktop);

这句放到Application.SetCompatibleTextRenderingDefault(false);和Application.Run(new Form1());
之间。


控件绑定

右击ToolbarControl、TOCControl等控件,将Buddy设置为axMapControl1,实现绑定。

添加菜单

菜单是MenuStrip控件


添加工具

右键工具条,属性,打开界面


我添加控件后并绑定后(ToolbarControl、TOCControl分别和MapControl绑定)的界面如下

写代码实现相关功能

控件的属性中,双击事件进入相应代码段。

1. 地图浏览

不写代码,单击工具栏上第一个图标Open,打开mxd文件,即可加载浏览。

2. 添加shp、添加lyr、图层属性

为”添加shp”、“添加lyr”、“图层属性“ 编写Click事件代码,分别对应下面的menuAddShp_Click、menuAddLyr_Click、menuAttibutes_Click函数。

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;

namespace MapViewer
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        private void menuAddShp_Click(object sender, EventArgs e)
        {
            ////1.创建工作工厂空间
            //IWorkspaceFactory pWorkspaceFactory = new ShapefileWorkspaceFactory();

            ////2.打开文件名对应的工作空间
            //IWorkspace pWorkspace1 = pWorkspaceFactory.OpenFromFile(@"E:\engineTest\data", 0);

            ////3.打开要素类
            //IFeatureWorkspace pFeatureWorkspace = pWorkspace1 as IFeatureWorkspace;
            //IFeatureClass pFC = pFeatureWorkspace.OpenFeatureClass("water.shp");

            ////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();
            //上面阴影部分是加载代码指定文件的方法
            //以下改进后用户自定义加载文件

            IWorkspaceFactory pWorkspaceFactory = new ShapefileWorkspaceFactory();
            //文件过滤器
            openFileDialog1.Filter = "ShapeFile文件(*.shp)|*.shp";
            //设定文件对话框的初始路径
            openFileDialog1.InitialDirectory = @"E:\engineTest\data";

            //不能多选
            openFileDialog1.Multiselect = false;
            DialogResult pDialogResult = openFileDialog1.ShowDialog() ;
            if (pDialogResult != DialogResult.OK)
                return;

            //得到对应文件对应的路径和文件名
            string pPath = openFileDialog1.FileName;
            string pFolder = System.IO.Path.GetDirectoryName(pPath);
            string pFileName = System.IO.Path.GetFileName(pPath);

            IWorkspace pWorkspace1 = pWorkspaceFactory.OpenFromFile(pFolder, 0);
            IFeatureWorkspace pFeatureWorkspace = pWorkspace1 as IFeatureWorkspace;
            IFeatureClass pFC = pFeatureWorkspace.OpenFeatureClass(pFileName);
            IFeatureLayer pFLayer = new FeatureLayerClass();
            pFLayer.FeatureClass = pFC;
            pFLayer.Name = pFC.AliasName;
            ILayer pLayer = pFLayer as ILayer;
            IMap pMap = axMapControl1.Map;
            pMap.AddLayer(pLayer);
            axMapControl1.ActiveView.Refresh();

        }

        private void menuAddLyr_Click(object sender, EventArgs e)
        {
            openFileDialog1.Filter = "lyr文件(*.lyr)|*.lyr";
            openFileDialog1.InitialDirectory = @"E:\engineTest\data";

            //不能多选
            openFileDialog1.Multiselect = false;
            DialogResult pDialogResult = openFileDialog1.ShowDialog();
            if (pDialogResult != DialogResult.OK)
                return;
            //得到对应文件对应的路径和文件名
            string pFileName = openFileDialog1.FileName;

            axMapControl1.AddLayerFromFile(pFileName);
            axMapControl1.ActiveView.Refresh();            
        }

        private void menuAttibutes_Click(object sender, EventArgs e)
        {
            FeatAttributeTable frm = new FeatAttributeTable(axMapControl1);
            frm.ShowDialog();
        }
    }
}

为了能够在点击图层属性时加载属性表,在现有项目之上新建一个窗体应用程序。拖入DataGridView控件,编写Load事件代码。

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.Geodatabase;
using ESRI.ArcGIS.Carto;
using ESRI.ArcGIS.Controls;

namespace MapViewer
{
    public partial class FeatAttributeTable : Form
    {
        //声明地图控件
        private AxMapControl axMapControl;
         
        public FeatAttributeTable()
        {
            InitializeComponent(); //初始化窗体及窗体上的各种控件
        }

        //构造函数2,1个参数
        public FeatAttributeTable(AxMapControl pMapControl)
        {
            InitializeComponent(); //初始化窗体及窗体上的各种控件
            axMapControl = pMapControl;
        }

        private void FeatAttributeTable_Load(object sender, EventArgs e)
        {
            //得到地图控件的第0层图层
            ILayer pLayer = axMapControl.get_Layer(0);
            //将pLayer类型强制转换成IFeatureLayer
            IFeatureLayer pFLayer = pLayer as IFeatureLayer;
            IFeatureClass pFC = pFLayer.FeatureClass;//class主要是属性的接口


            //获得图标
            IFeatureCursor pFCursor = pFC.Search(null, false);
            //获得第0图层的第一个要素,要素中包含多个属性值
            IFeature pFuture = pFCursor.NextFeature();
            DataTable pTable = new DataTable();
            DataColumn ColName = new DataColumn("KIND");
            ColName.DataType = System.Type.GetType("System.String");
            pTable.Columns.Add(ColName);
            
            //获得字段名在内存表中的字段所引
            int indexOfName = pFC.FindField("KIND");
            //当要素不为空时
            while (pFuture != null)
            {

                //得到索引号
                string name=pFuture.get_Value(indexOfName);
                DataRow pRow = pTable.NewRow();
                pRow[0] = name;
                pTable.Rows.Add(pRow);
                pFuture = pFCursor.NextFeature();
            }
            //将属性表和控件连接
            dataGridView1.DataSource = pTable;
        
        }
    }
}

最后效果

参考:https://blog.csdn.net/lianliancf/article/details/7667523
《ArcGIS Engine + C#入门经典》赵银军 卢远 | 2016年编著

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 218,607评论 6 507
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 93,239评论 3 395
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 164,960评论 0 355
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,750评论 1 294
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,764评论 6 392
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,604评论 1 305
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,347评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,253评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,702评论 1 315
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,893评论 3 336
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 40,015评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,734评论 5 346
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,352评论 3 330
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,934评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,052评论 1 270
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,216评论 3 371
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,969评论 2 355

推荐阅读更多精彩内容