http://www.cnblogs.com/xcm11/archive/2009/12/25/1623113.html

一、ArcEngine简介
ArcEngine被定位为一个嵌入式的产品,它并非面向最终用户,而是一个面向开发者的产品。对于繁冗的GIS开发工作而言,理想的解决方案是一个基于组件的实用的开发框架,且该框架允许解决方案提供商或机构内部开发人员快速构建行业专用GIS应用软件。一个GIS开发框架应提供应用软件所需的必要的空间分析功能,并允许软件开发人员集中精力构建软件的特定逻辑。ArcEngine就是这样一个GIS框架,它是为响应ESRI用户的请求而创建的,可以把丰富的ArcGIS技术按产品进行分类,并将其空间分析功能嵌入新的或已有应用软件中。ArcEngine既可以将GIS功能嵌入到已有的应用软件中,如自定义行业专用产品;或嵌入到商业生产应用软件中,如Mirosoftf Word和Excel;还可以创建集中式独立应用软件,并将其发送给机构内的多个用户。
不仅对于开发者,对于用户,Engine同样是一个轻量级的产品。使用Desktop开发的产品如果交付给用户使用,用户需要购买一套桌面软件,价钱昂贵。 而对于Engine开发的产品,用户只需要一个Runtime即可。

二、ArcEngine结构
ArcEngine也是建立在ArcObject之上的,ArcObjects是整个ArcGIS软件的核心功能库,它是由平台独立的COM对象组成。ArcEngine在核心ArcObjects组件上又做了一次封装,开发人员可以用来构建自定义GIS和制图应用程序。这些对象是平台独立的,可以从不同的平台来访问。开发人员可以扩展对象库,并且完全控制应用软件用户界面的外形和感觉。
ArcEngine由两个产品组成:构建软件所用的开发工具包以及使已完成的应用程序能够运行的可再发布的Runtime(运行时环境)。ArcEngine开发工具包是一个基于组件的软件开发产品,可用于构建自定义GIS和制图应用软件。它并不是一个终端用户产品,而是软件开发人员的工具包,适于为Windows、UNIX或Linux用户构建基础制图和综合动态GIS应用软件。ArcEngine Runtime是一个使终端用户软件能够运行的核心ArcObjects组件产品,并且将被安装在每一台运行ArcEngine应用程序的计算机上。

三、ArcEngine的核心库
System库
是ArcGIS结构中最底层的对象库。该库中的组件暴露服务给组成ArcGIS的其他对象库。用于初始化Engien许可的AoInitializer就包含在System库中,开发者不能扩展这个库,但可以扩展它的接口来扩展ArcGIS。
SystemUI库
包含了ArcGIS系统中所使用的用户界面组件的接口定义,例如ITool、ICommand这些接口,开发者亦不能扩展这个库。
Geometry库
处理存储在要素类中的要素几何图形或其他图形要素。包含了核心几何对象,如点、多边形、线及其几何类型和定义等。开发者可以通过添加新的控价参考和投影来扩展空间参考系统。
Display库
包含了用于显示GIS数据的对象。除了包含向输出装置输出图像的显示对象,还包含符号的表示和颜色的使用的对象和交互时提供给用户可视化反馈的对象。
Server库
包含了用于获取到ArcGIS Server的连接的对象。该连接通过本库中的对象进行管理。
Output库
包含了生成输出所必需的对象,通常是从地图或页面布局输出到打印机、绘图仪,或者导出到文件中。
Geodatabase库
为ArcGIS支出的所有数据源提供了一个统一编程模型。定义了许多由AO架构中更高级的数据源提供者所实现的接口。
GISClient库
包含了GIS Web服务的对象。ArcIMS或ArcGIS Server都可以提供这些服务。
DataSourcesFile库
包含了基于文件数据源的GDB API的实现,这些数据源包括shapefile,coverge,TIN,CAD等。
DataSourcesGDB库
包含了数据库数据源的GDB API的实现。
DataSourcesOleDB库
提供了操作“基于对象连接和嵌入数据库”(OLE_DB-based)的数据源的工作空间。
DataSourcesRaster库
包含了数据库数据源的GDB API的实现。
GeoDatabse Distributed库
提供了地理数据库导入/导出工具,支持企业级地理数据库的分布式访问。
Carto库
包含了用于显示地图数据的对象。
Location库
包含了与位置数据操作相关的对象。位置数据可以是路径事件,或者地理编码的位置。
NetworkAnalysis库
支持应用网络的创建和分析。
Controls库
开发者用Controls类库来构建或扩展具有ArcGIS功能的应用程序。这个类库进一步封装了AO并提供粗粒度的API,从而简化了开发过程。开发者通过创建自己的用于操作空间的命令和工具来扩展Controls类库。
GeoAnalyst库
包含了核心空间分析的操作,这些操作可以通过空间分析和3D分析扩展模块来使用。
3Danalyst库
包含了用于进行数据3D分析以及支持3D数据显示的对象。操作该库中的对象需要一个3D分析扩展授权。
GlobeCore库
包含用于进行球体数据分析以及支持球体数据显示的对象。操作该库中的对象需要一个3D分析扩展授权。
SpatialAnalyst库
包含了用于进行栅格与矢量数据空间分析的对象。操作该库中的对象需要一个空间分析授权。
四、        C#开发ArcEngine场景
ArcEngine支持四种API,分别是:
COM--任何COM生成语言(VB,VC++,Delphi)等都可以使用这些API。
.NET--这些API支持Visual Basic.Net和Visual C#.NET。
Java--支持Sun公司的标准Java 2平台。
C++--支持Visual C++6.0,Visual C++.NET等。
这里使用C#作为开发语言,它不仅具有较高的执行效率,而且具有可视化开发环境的优势。
4.1        环境配置和界面设计
         
     
     要使用ArcEngine提供的类库,首先要在工程--“引用”中添加对该库的引用。如上图所示,本例中需要添加的库主要有:ESRI.ArcGIS.AxMapControl, ESRI. ArcGIS.AxLicenseControl,  ESRI. ArcGIS. AxToolbarControl,  ESRI. ArcGIS. AxTOCControl, 
ESRI. ArcGIS.Carto,  ESRI. ArcGIS.ControlCommand,  ESRI. ArcGIS.Geometry,  ESRI. ArcGIS.System,  ESRI. ArcGIS.SystemUI,  ESRI. ArcGIS.Utility等,这些库可以使用开发包中.NET的AddIn工具方便的添加。
另外,我们在工程中最好还要对所使用的命名空间作一下引用,这主要是为了方便我们以后代码的输入,比如我们要使用ESRI.ArcGIS.esriSystem.esriUnits. esriDecimalDegrees,如果我们在工程前添加了using ESRI.ArcGIS.esriSystem,我们就只需要输入esriUnits. esriDecimalDegrees就可以了。

注意:using使用的是命名空间,而在工程--“引用”中添加的是程序集,这两者并不是一一对应的关系,一个程序集的库可以分布在多个命名空间中,反之亦然。
    
     另外,我们要在窗体上使用ArcEngine的控件,还需要把它们添加到工具箱中。在窗体的设计模式下,打开工具箱,在Windows窗体的空白处单击右键,“添加/移除项”,弹出下面的窗口,把需要的控件勾上,下来就可以方便的把它们拖拽到窗体上了。
4.2        装载地图
private void button1_Click(object sender, System.EventArgs e)
                {   。。。。。。
              string  sFilePath = "";  //定义地图文档的路径
                     sFilePath = openFileDialog1.FileName;
                        if (sFilePath == "")
                        {
                                return;
                        }                        
                        if (axMapControl1.CheckMxFile(sFilePath) == true)
                        {
                                axMapControl1.LoadMxFile(sFilePath,null,null);
                                this.Text=axMapControl1.DocumentFilename;
                                textBox1.Text=axMapControl1.MapScale.ToString();                               
                        }
                        else
                        {   。。。。。。
                        }
        }
使控件协同工作,在Form_Load事件里添加:
axToolbarControl1.SetBuddyControl(axMapControl1);
             axTOCControl1.SetBuddyControl(axMapControl1);
4.3        为工具栏添加元素
         完成了上步,加载地图文档后,可以在TOC空间里看到图层了,但是工具栏还没有按钮,还需要我们手工添加所需要的按钮。
           axToolbarControl1.AddItem("esriControlCommands.ControlsSelectFeaturesTool",-1,0,false,0,esriCommandStyles.esriCommandStyleIconOnly);                      
          axToolbarControl1.AddToolbarDef("esriControlCommands.ControlsMapNavigationToolbar",0,false,0,esriCommandStyles.esriCommandStyleIconOnly);
    运行程序,加载一个地图文档后,就会产生下面的效果:
4.4        自定义工具栏
         在ArcGIS桌面软件中,右键单击工具栏,在弹出的右键菜单中可以调出Customaize对话框,通过它可以添加/删除工具栏中的按钮,下面我们就来实现这个功能,我们打算在鼠标右键单击工具栏的时候弹出这个对话框。
private void axToolbarControl1_OnMouseDown(object sender, ESRI.ArcGIS.ToolbarControl.IToolbarControlEvents_OnMouseDownEvent e)
                { 
                        if(e.button==2)
                        {
                                m_CustomizeDialog.StartDialog(axToolbarControl1.hWnd);
                        }
                        else
                                return;
                }                
                private void CreateCustomizeDialog()
                {
                        //绑定事件
                        startDialogE = new ICustomizeDialogEvents_OnStartDialogEventHandler(OnStartDialog);
                        ((ICustomizeDialogEvents_Event)m_CustomizeDialog).OnStartDialog += startDialogE;
                        closeDialogE = new ICustomizeDialogEvents_OnCloseDialogEventHandler(OnCloseDialog);
                        ((ICustomizeDialogEvents_Event)m_CustomizeDialog).OnCloseDialog += closeDialogE;
                         。。。。。。
                }
                private void OnStartDialog()
                {
                        axToolbarControl1.Customize = true; //把Customize属性设为true方可自定义
                }
                private void OnCloseDialog()
                {
                        axToolbarControl1.Customize = false;                        
                }
4.5        显示地图坐标和比例尺
在上面的运行效果图中我们看到底部的状态栏显示了地图坐标和比例尺,要完成这一步:
axMapControl1的OnMouseMove事件里,有两个参数
(object sender, ESRI.ArcGIS.MapControl.IMapControlEvents2_OnMouseMoveEvent e)
其中e.MapX,e.MapY获得的就是当前地图的坐标;
获得地图单位:esriUnits units=new esriUnits();
                         units=axMapControl1.MapUnits;
获得地图比例尺:double scale=axMapControl1.MapScale;
然后,就可以自己在程序里的状态栏上显示坐标和比例尺了。

问题:地图坐标的显示并不会因为地图单位的不同而自动调整显示格式,比如120E,80N,它只是显示-120,80。
4.6        许可初始化
         在为客户部署ArcEngine程序时,必须对许可进行检验,如果没有适当的权限,就会导致程序崩溃,对许可的检验工作见下节。

源代码也可在后续上传!

4.6 许可初始化
为了将ArcEngine的程序部署在另一台机器上,必须首先检查这台机器上有没有可用的许可。如果许可初始化失败,将不能运行该程序。
首先在类中添加变量 private IAoInitialize m_AoInitialize = new AoInitializeClass();
然后在Form_Load事件中添加下面的代码:
//初始化许可
if(m_AoInitialize==null)
{
        MessageBox.Show("Unable to initialize.This programme cannot run.");
        this.Close();
}
//检验是否具有Engine许可
esriLicenseStatus licensestatus=(esriLicenseStatus)m_AoInitialize.
IsProductCodeAvailable(esriLicenseProductCode.esriLicenseProductCodeEngine);
if (licensestatus==esriLicenseStatus.esriLicenseAvailable)
        {                        licensestatus=(esriLicenseStatus)m_AoInitialize.Initialize(esriLicenseProductCode.esriLicenseProductCodeEngine);
        MessageBox.Show("The license is available!");
        if (licensestatus!=esriLicenseStatus.esriLicenseCheckedOut)
                {
                 MessageBox.Show("Initialize failed.This programme cannot run.");
                }
        }
else
        {
        MessageBox.Show("The ArcGIS Engine is unavailable.This programme cannot run.");
                this.Close();
        }
在程序里要保证有ESRI.ArcGIS.esriSystem的引用,这段代码才能正确运行;
4.7 添加右键菜单
下面我们想要在图层控制窗口中添加右键菜单,首先需要添加变量:
private IToolbarMenu m_menuMap;
然后添加axTOCControl的MouseDown事件:
private void axTOCControl1_OnMouseDown(object sender, ESRI.ArcGIS.TOCControl.ITOCControlEvents_OnMouseDownEvent e)
        {
                if (e.button!=2)   //响应右键点击事件
                        return;
                m_tocControl=(ITOCControl)axTOCControl1.Object;
                esriTOCControlItem item = esriTOCControlItem.esriTOCControlItemNone;
                IBasicMap map = null; ILayer layer = null;
                object other = null; object index = null;
m_tocControl.HitTest(e.x, e.y, ref item, ref map, ref layer, ref other, ref index);
if (item == esriTOCControlItem.esriTOCControlItemMap)
m_menuMap.PopupMenu(e.x,e.y,m_tocControl.hWnd);
}
注:HitTest是个很重要的函数,它包含鼠标点击下的位置,控件中的元素类别。

在Form_Load事件里添加:
m_menuMap=new ToolbarMenuClass();
m_menuMap.AddItem(new EngineDemo1.LayerVisibility(),1,0,false,esriCommandStyles.esriCommandStyleTextOnly);
m_menuMap.AddItem(new EngineDemo1.LayerVisibility(),2,1,true,esriCommandStyles.esriCommandStyleTextOnly);
//菜单需要改变的是地图控件中的内容,所以地图空间相当于菜单的钩子
m_menuMap.SetHook(axMapControl1);

注:1)这里的EngineDemo1是命名空间的名字,且添加这段代码之前需要在工程中添加一个名为LayerVisibility的类。
2)SetHook把一个hook对象传递给稍后提到的ICommand::OnCreat
4.8 实现LayerVisibility
     COM对象封装了属性和方法,只暴露出接口。在我们调用一个COM对象时,就要实现它的接口中的所有方法。我们这里需要完成的菜单,和工具、命令按钮一样,都从Command继承而来。当有多个命令时,还要实现ICommandSubType接口。
              public sealed class LayerVisibility : BaseCommand, ICommandSubType
                public override void OnClick()
                 。。。。。。
                public override void OnCreate(object hook)
                 。。。。。。

这里需要提的是IHookHelper,HookHelperClass使命令按钮可以和各种控件协同工作,通过IHookHelper返回这些从ICommand::OnCreat传递来的hook对象的一些属性。
     private IHookHelper m_hookHelper = new HookHelperClass();
     public override void OnCreate(object hook)
                {
                        m_hookHelper.Hook = hook;
                }

转载于:https://www.cnblogs.com/hl3292/archive/2010/12/13/1904325.html

ArcEngine 相关-转载相关推荐

  1. ASP.NET的Page_Load事件及相关转载

    Page_Load,即页面载入要执行的事件; Page_Load的执行分为两种情况;  1.Page_Load事件的执行是在第一次加载页面时发生(即为了响应客户的请求);  2.Page_Load事件 ...

  2. android lcd驱动框架,LCD驱动及Framebuffer相关(转载)

    LCD驱动及Framebuffer相关 (2012-11-20 17:04) 标签:&nBSP; lcd驱动  framebuffer  io内存  分类: Android驱动模块相关 内容提 ...

  3. 编程方法论/架构设计/模式相关转载链接汇总

    1.表驱动法,供参考,后需结合代码大全进行理解 http://www.cnblogs.com/jerry19880126/archive/2012/12/16/2820644.html 2.实用ios ...

  4. VC++中字符串编码处理的一些相关问题

    前言 什么是tchar? 百度百科对其的定义如下": 因为C++支持两种字符串,即常规的ANSI编码(使用""包裹)和Unicode编码(使用L""包 ...

  5. Android Task 相关

    在日常开发过程中,只要涉及到activity,那么对task相关的东西总会或多或少的接触到,不过对task相关的一些配置的作用一直理解的还不是很透彻,官方文档在细节上说的也不够清楚,要透彻理解还是得自 ...

  6. 转载文章要授权,真那么难吗?我现在教你…(新技能Get√)

    正在进行的第二届世界互联网大会上,马化腾说:对于互联网行业持续发展可能面临的挑战,知识产权保护值得关注. 后台也常常有好学的同学提问:我尊重知识产权,想要转载文章,可是究竟怎么样才能要到授权呢? 一. ...

  7. 2017全国大学生电子设计大赛B题 | 板球控制系统(二)图像算法相关

    2017全国大学生电子设计大赛B题 | 板球控制系统(二)图像算法相关 转载请注明出处. 我翻看了很多现有教程以及相关的开源贴,发现大家对于技术的解释都很隐晦,真正的问题没解释清楚,真正的技术也没体现 ...

  8. python3-基础6

    函数嵌套调用: 再调用一个函数的过程中,又调用了其他的函数 函数的嵌套定义:在一个函数的内部,又定义另外一个函数,函数内部定义的变量,在外部不能被调用 名称空间:一种隔离的概念,专门用来存放名字的地方 ...

  9. 2018 - 待深入学习博客

    odoo视图(tree\form)中隐藏按钮( 创建.编辑.删除 ),tree视图中启用编辑 ORACLE ERP 的前世今生摘记及原文 Odoo10学习笔记一:入门与基础视图格式 Odoo开发之扩展 ...

  10. [转]C# WinForm 关于窗体最大化时的是否全屏效果与是否遮盖任务栏

    0.新建窗体 及添加按钮 1.ITPUB个人空间s6d:vU0UL   执行如下按钮事件ITPUB个人空间zA\I;^+M,g"pr Q0J   private void btnFormMa ...

最新文章

  1. 【Postman】6 Postman 发送post请求-Json格式
  2. mysql timestamp 转型_MySQL的timestamp类型自动更新问题【转】
  3. 移动端省际联动插件mobiscroll
  4. 解决deepin微信无法登录
  5. 1143 Lowest Common Ancestor 甲级
  6. 风靡全球的儿童编程语言:Scratch
  7. 内网和外网的区别_在家办公不再难,花生壳盒子助你内网穿透一臂之力
  8. 指定范围内的水仙数(C语言)
  9. 设计模式(二):难忘一次分享盛宴
  10. springside4例子
  11. android SD卡文件夹
  12. 【洛谷试炼场】洛谷新手村——洛谷的第一个任务
  13. cruzer php sandisk 闪迪u盘量产工具_闪迪u3量产工具下载|
  14. html 让360浏览器兼容模式,360浏览器兼容模式怎么设置?360浏览器兼容模式设置方法介绍...
  15. 证券投资基金名词解释
  16. 20190826——python对象实例搬家具
  17. YOLOv5目标检测➕声音告警
  18. Allegro如何使用快捷键快速切换层面操作指导
  19. 智能验证码 阿里云人机验证的使用(PHP)
  20. 【BDWP不限速小妙招】真测有效

热门文章

  1. Mac/Windows Android Studio / Visual Studio Code/Eclipse /Xcode 操作 快捷键 :代码多行选中等 (开发利器)多
  2. centos npm install 超时报错
  3. Python【每日一问】35
  4. Spark 的 python 编程环境
  5. jzoj2941. 贿赂
  6. PHP表单常用正则表达式(URL、HTTP、手机、邮箱等)
  7. iOS-UI分析利器--Reveal安装破解以及简单使用
  8. .Net中的并行编程-6.常用优化策略
  9. URAL 1001 Reverse root
  10. SharePoint And Ajax Technology(2):Ajax Control Toolkit学习