资源描述:
《利用arcobject组件定制arcgis行业工具条》由会员上传分享,免费在线阅读,更多相关内容在学术论文-天天文库。
1、利用ArcObject组件定制ArcGIS行业工具条陈永刚,汤孟平,施拥军,徐文兵(浙江林学院环境科技学院浙江省临安311300)摘要:以ComGIS理论为指导,利用C#语言,以ArcObject组件对ArcGIS进行定制行业工具条开发。详细介绍COM组件的开发过程和算法的实现方式。实现栅格数据和矢量数据的动态提取,结合林业应用的专业模型,完成各种空间分析和属性数据的分析,以无缝的方式插入到ARCGIS中。高效快速的完成各种分析任务和运算任务,以满足具体工程项目的需求。关键词:工具条、COM、组件、ArcObject1引言ComGIS的发展是现代软件技术发展的一个历程碑。传统GIS虽然在功能
2、上已经比较成熟,但是由于这些系统多是基于10多年前的软件技术开发的,属于独立封闭的系统。组件式软件是新一代GIS的重要基础,ComGIS是面向对象技术和组件式软件在GIS软件开发中的应用。ComGIS不依赖于某一种开发语言,可以嵌入通用的开发环境(如:VB和Delphi)中实现GIS功能,专业模型则可以使用这些通用开发环境来实现,也可以插入其它的专业性模型分析控件。因此,使用ComGIS可以实现高效、无缝的系统集成.无须专门GIS开发语言,如ArcInfo的AML、MGE的MDL、MapInfo的MapBasic等,二次开发语言对用户和应用开发者而言也存在学习上的负担。而且使用系统所提供的二
3、次开发语言,开发往往受到限制,难以处理复杂问题。ComGIS则不需要额外的GIS二次开发语言.COM不是一种面向对象的语言,而是一种二进制标准。COM所建立的是一个软件模块与另一个软件模块之间的链接,当这种链接建立之后,模块之间就可以通过称之为“接口”的机制来进行通信。2ArcObject开发模型简介ArcObjects是一个COM组件的集合,它是ArcGIS的两个ArcMap和ArcCatalog的基石。这一系列的组件包含了超过1200个对象,它们可以用来定制、扩展和构建GIS应用程序。扩充ArcGIS应用程序可以用VBA也可以用其他任何支持COM的语言来订制对象。通过“Tool”菜单“C
4、ustomize”项来加入订制的COM对象。面向接口编程是整个COM开发的核心所在,接口的作用是重在功能的分类而不是功能的实现。软件通过预留接口,而把具体实现留待用户实现为系统的扩充提供了可能。Application处于是整个程序的最顶端,通过Application可以到达程序任意一层。MxDoucmment处于Application之下由PageLayou和Map聚合而成。IActiveView是版面视图(PageLayout)和地图视图(Map)的父类。如图1所示。ICommand接口是AO中一个重要的接口,在ICommand接口中可以设置Command的名字、图标、可用否等.其中有两个
5、最为重要的方法,一个是OnCreate,这个方法是一个Command要创建时内部要调用的,所以在这个方法里应该实现Command和IApplication及其下面组件的连接,这里就是建立ArcGIS和COM通讯的关键部分。在ICommand中还有一个重要的方法,那就是OnClick方法,表示Command事件被激活时要响应的动作。ITool接口包括OnMouseDown,图1ArcMap构架图OnMouseMove,OnMouseUp以及OnDblClick等事件、Cursor属性和Refresh方法。ITool既具有ICommand的功能,又具有与ArcMap界面交互的功能,IComman
6、d的功能代码必须写在ICommand的OnClick事件中,而所有实现交互功能的代码必须写在ITool接口的各个事件中。ITool接口的各个事件,用户可以在其中写入相关代码,表示用户与ArcMAP界面交互时一旦触发某事件要实现的功能。3程序实现由地图的等高线生成Tin三角网,由Tin三角网分别生成高程、坡度、坡向的GRID栅格图层。根据林火蔓延应用的专有模型,形成林火蔓延的范围。建立一个FeatureLayer层显示林火蔓延的范围。取得ArcMap的对象句柄,建立COM和ArcMap的连接。publicvoidOnCreate(objecthook){if(hook!=null){if(ho
7、okisIMxApplication)//建立COM和ArcMap的连接{//将ArcMap的对象句柄赋值给mApp变量mApp=(IApplication)hook;this.enable=true;}}}鼠标点击,取得着火点的高程、坡度、坡向值。publicvoidOnMouseDown(intButton,intShift,intX,intY){try{//将鼠标的屏幕坐标转换为地图坐标this.mou