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个数分类图层。

  • 相关阅读:
    jquery实现选项卡(两句即可实现)
    常用特效积累
    jquery学习笔记
    idong常用js总结
    织梦添加幻灯片的方法
    LeetCode "Copy List with Random Pointer"
    LeetCode "Remove Nth Node From End of List"
    LeetCode "Sqrt(x)"
    LeetCode "Construct Binary Tree from Inorder and Postorder Traversal"
    LeetCode "Construct Binary Tree from Preorder and Inorder Traversal"
  • 原文地址:https://www.cnblogs.com/2008nmj/p/13857800.html
Copyright © 2011-2022 走看看