ArcGIS Engine二次开发:从入门到精通

ArcGIS Engine是ArcGIS的一套软件开发引擎,可以让程序员创建自定义的GIS桌面程序。

它是ESRI在ArcGIS9版本才开始推出的新产品,它是一套完备的嵌入式GIS 组件库和工具库,使用ArcGIS Engine开发的GIS应用程序可以脱离ArcGIS Desktop而运行。

https://baike.baidu.com/item/ArcGIS%20Engine/10318973?fr=aladdin

>>ArcGIS Engine与国土资源:

ESRI在线支持:https://support.esri.com/zh-cn/products/developers/arcgis-engine/arcgis-engine/10-2-2              http://resources.arcgis.com/en/help/

最好的帮助文档其实是arcobject sdk帮助文档和samples.....

但是,有一本参考书还是必要的。

本书共16章。第一部分为基础篇:第1~9章,主要是控件。第二部分为应用提高篇:空间分析。第10章。第三部分:第11~12章,实例应用。第四部分为空间数据库的操作。

第1章 开发基础

ArcGIS的类库总体可以分为界面控件类和操作组件类。控件和组件是不一样的,控件是有界面的,组件是没有界面的。所以它们的引用方式是不一样的。需要注意它们的区别。具体可以看:COM组件

System类库:System类库是Engine中最底层的类库。

SystemUI类库:主要定义了ArcGIS系统中所使用的用户界面组件类型。

Geometry类库:包含了核心几何对象,如点、线、多边形及其几何类型和定义。

Display类库:包含了支持向输出装置绘制符号体系的组件。

Server类库:包含了用于获取到ArcGIS Server的连接的对象。

Output类库:包含了生成输出所必须的对象,通常是从地图或页面布局输出到打印机、绘图仪,或导出到文件中。

Geodatabase类库:Geodatabase类库:包含了所有与数据访问相关的定义的类型,为地理数据提供了编程API,是建立在标准工业关系型和对象关系数据库技术之上的地理数据库。

GISClient类库:

DataSourcesFile类库:

DataSourcesGDB类库:

DataSourcesOleDB类库:

DataSourcesRaster类库:

GeoDatabaseDistributed类库:

Carto类库:Carto类库:该类库支持地图的创建和显示,PageLayout 对象是地图及其底图元素的容器。地图元素包括指北针、图例、比例尺等。Map对象包括地图.上所有图层都有的属性,如空间坐标系、地图比例尺以及地图图层的操作。此对象可以加载各种类型的图层,不同类型的图层由相应的对象处理,如FeatureLayer对象处理矢量数据,RasterLayer 对象处理栅格数据,TinLayer 对象处理TIN数据等。通常图层都有一个相关的Renderer对象,来控制数据在地图中的显示方式。Renderer通常用Display类库中的符号来进行绘制,Renderer 只是将特定符号与待绘制实体属性相匹配。

Location类库:

NetworkAnalysis类库:

Controls类库:

GeoAnalyst类库:

3Danalyst类库:

GlobeCore类库:

SpatialAnalyst类库:

>>第一个例子:基于.NET的ArcGIS Engine的开发

 这里需要注意,创建C#类库(组件)和创建C#应用是不同的。。它们最大的显著不同是生成的文件为dll和exe

创建C#应用之后,还需要添加ArcGIS类库引用(ESRI.ArcGIS.Carto、ESRI.ArcGIS.Display、ESRI.ArcGIS.Geometry、ESRI.ArcGIS.System、ESRI.ArcGIS.SystemUI、ESRI.ArcGIS.Utility)

如果控件不显示(控件和组件的区别),新建选项夹->右键,选择项->添加AxMapControl

        private void Form1_Load(object sender, EventArgs e)
        {
            string path = @"D:BaiduNetdiskDownloadArcGIS Engine从入门到精通第2章samplelesson1dataWorld";
            string fileName = @"World.mxd";
            //加载地图文件
            axMapControl1.LoadMxFile(path + fileName);
            //将地图全屏最大化
            axMapControl1.Extent = axMapControl1.FullExtent;
        }

Toolbar右键->属性,

 

第2章 ArcGIS Engine中的控件

制图控件,如MapControl、PageLayoutControl,其中MapControl控件主要用于地理数据的显示和分析,PageLayoutControl 用于生成一幅成品地图。MapControl 封装了Map对象,而PageI ayoutControl则封装了PageLayout对象。这两个控件都实现了IMxContents接口,因此不仅可以读取ArcMap创建的地图文档,而且可以将自身的地图内容写到一个新的地图文档中。

2.1 制图控件介绍

2.1.1 地图控件MapControl控件封装了Map对象,并提供了其他的属性、方法和事件,用于管理控件的外观、显示属性和地图属性,管理、添加数据图层,装载地图文档,显示、绘制跟踪图层。

2.1.2 页面布局控件PageLayoutControl控件主要用于页面布局与制图。该控件封装了PageLayout类,提供了布局视图中控制元素的属性和方法,以及其他的事件、属性和方法。

>>第二个例子:控件使用实例

该实例是一个较全的GIS常用功能集合,本实例只是简单介绍了一些常用功能的开发,让大家对GIS的这些功能涉及的接口、类,有个大概的了解,后续的章节中对这些类和接口会有更详细的介绍。

//加载Mxd地图文档,显示到控件

        private void 加载地图文档ToolStripMenuItem_Click(object sender, EventArgs e)
        {
            //加载地图文档
            System.Windows.Forms.OpenFileDialog openFileDialog;
            openFileDialog = new OpenFileDialog();
            openFileDialog.Title = "打开地图文档文件";
            openFileDialog.Filter = "map documents(*.mxd)|*.mxd";
            if(openFileDialog.ShowDialog() == DialogResult.OK){
                string filePath = openFileDialog.FileName;
                if (axMapControl1.CheckMxFile(filePath))
                {
                    axMapControl1.MousePointer = esriControlsMousePointer.esriPointerHourglass;
                    axMapControl1.LoadMxFile(filePath, 0, Type.Missing);
                    axMapControl1.MousePointer = esriControlsMousePointer.esriPointerDefault;
                    //loadEagleEyeDocument(filePath);
                    axMapControl1.Extent = axMapControl1.FullExtent;
                }
                else {
                    MessageBox.Show(filePath + "不是有效的地图文档");
                }
            }
        }

这里面的Map.mxd文档中的每个layer都是shp文件,如果是.lyr图层的话就无法显示

图层的操作是GIS中常用的功能,涉及图层的添加、删除、移动等,下面的示例演示了,图层的添加、删除、移动功能。

添加图层可以是*.lyr格式的图层文件,也可以是*.shp文件,使用MapControl自带的AddLayerFromFile方法,提供lyr图层文件的路径,即可加载到地图控件中。

        private void 添加图层ToolStripMenuItem_Click(object sender, EventArgs e)
        {
            System.Windows.Forms.OpenFileDialog openFileDialog;
            openFileDialog = new OpenFileDialog();
            openFileDialog.Title = "打开图层文件";
            openFileDialog.Filter = "map documents(*.lyr)|*.lyr";
            if(openFileDialog.ShowDialog() == DialogResult.OK)
            {
                string filePath = openFileDialog.FileName;
                try {
                    axMapControl1.AddLayerFromFile(filePath);
                }catch(Exception ex)
                {
                    MessageBox.Show("添加图层失败"+ex.ToString());
                }
            }
        }

 效果很棒,但是这里的layer文件是怎么保存的

图形绘制是GIS系统中的一个很重要、很常用的功能,MapControl提供了常用的线、圆、矩形、多边形等形式的绘制,例如,绘制圆形,则在axMapControl1_OnMouseDown事件中设置绘制方法,具体如下所示:

        //绘制线、圆、矩形
        private void drawMapShape(IGeometry geometry)
        {
            IRgbColor rgbColor;
            rgbColor = new RgbColorClass();
            rgbColor.Red = 255;
            rgbColor.Green = 255;
            rgbColor.Blue = 0;
            object symbol = null;
            if (geometry.GeometryType == esriGeometryType.esriGeometryPolyline || geometry.GeometryType == esriGeometryType.esriGeometryLine)
            {
                ISimpleLineSymbol simpleLineSymbol;
                simpleLineSymbol = new SimpleLineSymbolClass();
                simpleLineSymbol.Color = rgbColor;
                simpleLineSymbol.Width = 5;
                symbol = simpleLineSymbol;
            }
            else {
                ISimpleFillSymbol simpleFillSymbol;
                simpleFillSymbol = new SimpleFillSymbolClass();
                simpleFillSymbol.Color = rgbColor;
                symbol = simpleFillSymbol;
            }
            axMapControl1.DrawShape(geometry, ref symbol);
        }

布局控件与地图控件关联

在GIS系统中经常使用到地图的制图,在地图上标记指北针、图例、比例尺等,进行地图输出,Engine提供了PageLayoutControl控件,该控件可以添加图元要素等进行地图修饰,下面代码演示了布局控件与地图控件关联,要实现该功能的核心接口是IObjectCopy,该接口提供了Copy方法用于地图的复制,

        private void copyToPageLayout()
        {
            IObjectCopy objectCopy = new ObjectCopyClass();
            object copyFromMap = axMapControl1.Map;
            object copyMap = objectCopy.Copy(copyFromMap);
            object copyToMap = axPageLayoutControl1.ActiveView.FocusMap;
            objectCopy.Overwrite(copyMap, ref copyToMap);
        }

        private void axMapControl1_OnMapReplaced(object sender, IMapControlEvents2_OnMapReplacedEvent e)
        {
            copyToPageLayout();
        }

        private void axMapControl1_OnAfterScreenDraw(object sender, IMapControlEvents2_OnAfterScreenDrawEvent e)
        {
            IActiveView activeView = (IActiveView)axPageLayoutControl1.ActiveView.FocusMap;
            IDisplayTransformation displayTransformation = activeView.ScreenDisplay.DisplayTransformation;
            displayTransformation.VisibleBounds = axMapControl1.Extent;
            axPageLayoutControl1.ActiveView.Refresh();
            copyToPageLayout();
        }

 布局控件中属性设置与绘制元素

第3章 几何对象和空间坐标系

第4章 地图组成及图层控制

第5章 地图制图

第6章 空间数据管理

第7章 数据编辑

第8章 栅格数据

第9章 三维可视化

第10章 空间分析

第11章 符号库管理系统的开发

第12章 空间数据管理系统

第13章 空间数据库连接与释放

第14章 空间数据库加载

第15章 程序出错和异常

第16章 其他经验技巧

>>根据属性domain个数分类图层。

原文地址:https://www.cnblogs.com/2008nmj/p/13857800.html