zoukankan      html  css  js  c++  java
  • 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个数分类图层。

  • 相关阅读:
    《编写高质量代码》读书笔记一
    [转] Markdown
    皓首穷经还是及时行乐!
    有用的iOS网站地址
    [股票] 入市
    https原理 就是两次http
    数据预处理
    重新建立程序员的应对方式
    ROC曲线手画
    机器学习的总结
  • 原文地址:https://www.cnblogs.com/2008nmj/p/13857800.html
Copyright © 2011-2022 走看看