




已阅读5页,还剩59页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
ArcEngine 二次开发实习初级讲义ArcGIS Engine二次开发实习初级讲义目录1 ArcGIS、ArcObjects和ArcGIS Engine简介- 3 -1.1 ArcGIS简介- 3 -1.2 ArcObjects简介- 4 -1.3 ArcGIS Engine简介- 5 -2 ArcGIS控件介绍- 7 -2.1 ArcGIS控件简介- 7 -2.2重要控件简介- 9 -3 ArcGIS Engine二次开发入门- 16 -3.1 ArcGIS Engine开发起步第一个简单的地图显示程序- 16 -3.2 属性查询- 23 -3.3 空间查询- 27 -3.4 BaseCommand开发实例- 36 -3.5 BaseTool开发实例- 38 -3.6通过代码添加图层- 42 -3.7基于比例尺显示地图- 44 -3.8 构建一个简单的GIS应用- 46 -4.问题解决方法及帮助文档的使用- 58 -4.1使用ArcObjects开发帮助系统- 58 -4.2阅读对象模型图(Object Model Diagram)- 62 -1 ArcGIS、ArcObjects和ArcGIS Engine简介1.1 ArcGIS简介ArcGIS提供了一个可伸缩的框架,可以为独立用户或者多用户,既可以在桌面端也可以在服务器端提供GIS。ArcGIS 9是用来构建一个完整GIS应用的GIS软件产品集成。它是基于共享的GIS软件组件ArcObjects。ArcGIS 9由以下四部分组成:l ArcGIS Desktop高级GIS应用的集成l ArcGIS Engine根据应用程序接口来构建基本应用的嵌入式GIS组件库l ArcGIS Server在企业级或者网络框架下构建服务器端GIS应用的平台,用来构建Web服务和Web应用l ArcIMS通过公开的因特网协议来发布地图、数据和元数据的GIS Web服务器图1 ArcGIS产品结构图每一个GIS框架同样包含ArcSDE网关,这是在关系数据库(RDBMS)上组织地理数据的接口。ArcGIS是构建地理信息系统的平台。ArcGIS 9在地理数据处理、3D可视化表达和开发工具方面做了新的扩展。两个新的产品ArcGIS Engine和ArcGIS Server在这个版本中发布,是ArcGIS成为一个应用程序及服务端开发的完整产品。l 使用ArcGIS能够开发出一系列的产品,开发者可以:l 配置/定制ArcGIS的应用,例如ArcMap和ArcCatalogl 扩展ArcGIS的结构和数据模型l 利用ArcGIS Engine在其他应用程序中嵌入地图和GIS功能l 使用ArcGIS Engine构建并部署桌面版应用程序l 使用ArcGIS Server构建Web服务和应用ArcGIS系列产品是通过称之为ArcObjects的软件组件加以构建和扩展的。ArcObjects包括一系列不同的程序组件,从高度封装的组件(例如独立的geometry objects)到低级组件(例如能够同已有的ArcMap文档集成的地图组件)。这些组件为开发者集成了大量的GIS功能。ArcGIS 9的全线产品都具备开发功能(Engine,Server和Desktop)。作为一个开发者,您能够使用标准程序框架结合ArcObjects来扩张ArcGIS Desktop;能够用ArcGIS Engine定制应用;能够使用ArcGIS Server构建企业级的GIS应用。图2 ArcGIS开发结构图ArcGIS Desktop包含了一些列的Windows桌面应用程序(例如,地图、目录、工具箱、地球方面的应用)。ArcGIS Desktop包含了三种功能级别(ArcView,ArcEditor和ArcInfo),使用ArcGIS Desktop开发包能够进行客户化和扩展。ArcGIS Desktop的软件开发包(software developer kit,SDK)包含在ArcView,ArcEditor和ArcInfo内,支持COM(Component Objects Model,组件对象模型)和.NET程序框架。许多开发者利用Desktop SDK扩展功能,创建新的GIS工具,定制用户界面,完善ArcGIS Desktop应用中专业GIS产品的扩展功能。ArcGIS Server不仅定义和实现了一系列标准的GIS Web服务(例如,地图、数据访问、地理编码等),同时还支持利用ArcObjects进行企业级的服务端应用开发。ArcGIS Server开发包让开发者能构建GIS服务器用来向多用户提供可供访问的GIS功能,能通过客户端对大型GIS中央服务器进行处理,能构建和分发GIS Web应用,能进行分布式GIS运算。1.2 ArcObjects简介ArcObjects是ArcGIS Desktop的开发平台。ArcGIS Desktop是一系列GIS软件系统:ArcInfo,ArcEditor和ArcView。这些系统服务于GIS,例如地理数据组织、控件编辑、分级可视化等功能。ArcGIS Desktop系统包含一系列的应用,例如ArcCatalog、ArcMap、ArcToolBox和ArcScene,并且能够集成大量不同的扩展产品,例如ArcGIS Spatial Analyst(空间分析模块),ArcGIS Geostatistical Analyst(地理统计分析模块),ArcGIS 3D Analyst(三维分析模块)等。ArcObjects是使用微软的组件对象模型(Component Objects Model,COM)书写。因此,凡是支持COM标准的开发语言都能使用ArcObjects。您能向ESRI(Environment System Research Institute,环境系统研究所)的开发者一样,使用同样的方式来扩展ArcObjects中的任何一部分。1.3 ArcGIS Engine简介ArcGIS Engine是开发者用来构建应用程序的一整套嵌入式GIS组件。使用ArcGIS Engine,您可以将一些GIS功能嵌入到已有的应用程序中,这包括Microsoft Office产品,例如Word和Excel,建造有针对性的客户应用程序用来将高级GIS系统与他人分享。ArcGIS Engine由一个软件开发包(software development kit,SDK)和一个给所有ArcGIS应用提供平台的运行许可(runtime)构成。构成ArcGIS Engine的五部分分别如下:1)基本服务几乎任何GIS应用都需要的核心GIS ArcObjects,例如几何(geometry),显示(display)等。2)数据访问ArcGIS Engine提供许多栅格和矢量数据的访问方式,包括与geodatabase相当的能力和灵活性。3)地图表达ArcObjects使用符号、注记和专题地图来生成和表达地图。4)开发组件用来快速定制应用开发程序的高度封装用户接口以及开发过程中全面的帮助系统。5)运行许可ArcGIS Engine运行许可可以部署标准功能或者加入一些附加的高级功能。这中间除了运行许可之外的任何一部分,都打包集成到ArcGIS Engine开发包(SDK)中。ArcGIS Engine运行许可及其选项,尽管是开发完整的GIS应用程序中的一部分,但包含了应用部署,所以被单独打包。1.3.1 ArcGIS Engine Software Developer KitArcGIS Engine SDK是用来开发和部署GIS及地图方面应用程序的组件化软件开发产品。ArcGIS Engine SDK不是终端产品而是共应用开发者使用的软件包。它能构建基本的地图浏览或者全面的、动态的GIS编辑工具。使用ArcGIS Engine SDK,作为开发者,您在定制地图功能接口方面有空前的自由。您可以使用许多API中的一些来构建独一无二的应用程序或者将ArcGIS Engine组建与其他软件组建整合,来实现地图和用户需要的其他信息之间的完美结合。使用ArcGIS Engine,地图既能够作为应用程序的核心,也可以作为一个可选项。例如,如果您的应用主要是数据库中的商务信息,当您查询数据库的时候,ArcGIS Engine能够将您感兴趣的商业信息在地图上高亮显示定位出来。ArcGIS Engine SDK提供了大量的GIS组件,或者称为ArcObjects,按照之前的介绍,包括基本服务、数据访问和地图表达。之前提到的ArcGIS Engine的第四部分,也就是开发组件,也包含在SDK中间。这些都是用来构建一个高质量地图接口的开发控件。下面列出的ArcGIS 控件,或者说可视化控件,用来辅助应用程序开发(下文将针对控件进行更加详细的介绍)。l MapControll PageLayoutControll SceneControll GlobeControll ToolbarControll TOCControll ReaderControll ToolbarControl中所用到的commands(命令)、tools(工具)和menus(菜单)1.3.2 ArcGIS Engine RuntimeArcGIS Engine的最后一部分是运行许可。所有用ArcGIS Engine SDK构建出的应用程序都需要不同级别的ArcGIS Engine运行许可才能够正常运行。ArcGIS Engine Runtime是ArcGIS Desktop(ArcGIS 桌面版)构建的平台,如果得到ArcGIS Engine应用开发许可,ArcGIS Desktop的用户就能够执行基本的基于Engine的应用。ArcGIS Engine Runtime从标准功能到企业级功能之间有许多不同的选择。1.3.3 ArcGIS Engine的功能ArcGIS Engine的功能十分强大。作为ArcGIS Engine开发者,您可以实现以下列出的和其他更多的功能,这包括:l 用多个图层来显示地图,例如道路、水系、边界等l 地图的漫游和缩放l 地图上要素的确认l 地图上要素的查询和定位l 根据属性值显示注记l 根据航片或者卫片显示图像l 绘制几何图形,例如点、线、弧、多边形l 添加描述性的文字l 沿着线选择或者选择矩形、某一范围内、多边形等内部的要素l 选择距离在某一范围内的要素l 利用SQL语言来寻找和选择要素l 利用专题地图来渲染要素,如唯一值法、分级法和点状密度法l 动态显示实时地图或者时序数据l 根据地理编码来寻找位置l 转换您地图的坐标系l 根据几何操作来生成缓冲区、计算差值,或者进行求交、求并等运算l 编辑要素形状或者旋转地图l 创建并更新要素的几何形状及其属性编辑要素(Editing Features)ArcGIS Engine开发包让您构建出能创建、修改和删除geodatabase中矢量要素或者shapefile文件的应用程序。标准的ArcGIS Engine Runtime能够让编辑shapefile文件或者personal geodatabase中简单要素的程序运行。然而,要构建企业级geodatabase的全部功能,就需要ArcGIS Engine Runtime中的Geodatabase Update选项。空间建模和分析通过增加ArcGIS Engine Runtime中的Spatial选项,您能够扩展ArcGIS Engine的功能。这个选项(Spatial选项)能提供一系列强劲的空间建模和分析功能。您能够创建、查询、表达和分析基于象元的栅格数据,能够集成栅格和矢量数据进行分析,能够从已有数据挖掘出新的信息,能够从多层数据中查询信息,能够在ArcGIS Engine应用程序中完美集成基于象元的栅格数据和矢量数据。例如,您能够:l 将要素(如点、线或者面)转化成栅格图l 基于距离或者要素、栅格间的关系来创建栅格缓冲区l 根据点状要素生成密度图l 生成等高线、坡度、可视化区域、方向和山体阴影l 栅格图的分类及显示l 兼容TIFF,BIL,IMG,USGS DEM,SDTS,DTED等标准格式及多种其他格式数据l 三维可视化等ArcGIS Engine Runtime中的3D选项让您通过使用Scene和Globe控件来有效的表达和分析区域及全球数据。您能够从多个不同的视点查看表面;您能够查询表面,决定从某个选中的位置看,哪些要素是可见的;您能够将栅格和矢量数据贴在表面以构建真实的透视影像。例如,您能够:l 显示Scene和Globe文档l 展示交互性的透视图,包括漫游、缩放、旋转、倾斜、模拟飞行以便于表达和分析l 显示真实世界的表面要素,例如楼房l 展示视域和可见范围分析、场景高度内插、剖面分析和最短距离分析2 ArcGIS控件介绍在ArcGIS Engine的二次开发中,ArcGIS控件给我们提供了具体的开发环境和方法。在ArcGIS Engine中共有7个控件,另外在部署过程中还有一个LicenceControl。下面将首先介绍ArcGIS控件,再详细介绍实习中可能用到的MapControl,TOCControl以及ToolbarControl。2.1 ArcGIS控件简介ArcGIS的控件是高度集成化的,首先能够让开发者构建和扩展ArcGIS的功能,其次能够提供图形用户界面(graphical user interface,GUI)。下列展示出的每一个ArcGIS控件都可以被作为ActiveX控件,.NET控件或者可视化的JavaBean:l MapControl类似于“数据”l PageLayoutControll ToolbarControll TOCControl(Tablet of Contents Control)l SceneControll GlobeControll ReaderControl使用ArcGIS控件,可以用两种方式来构建应用程序,首先,ArcGIS控件可以被嵌入到已有的应用程序中,将地图相关的功能作为辅助添加进去,或者其次,ArcGIS控件可以用来创建一个独立的应用程序。不管使用哪种方式,一个独立的ArcGIS控件能够被嵌入到已有程序中或者TOCControl和ToolbarControl能够和其他ArcGIS控件联合使用,提供应用程序的部分框架。对于所有的ArcGIS控件来说,有一些共同的主题、概念和应用方法等,在有效的使用这些控件来构建应用程序之前,有必要先有一定的理解。2.1.1 嵌入式控件(Embeddable Components)每个ArcGIS控件都是一个可嵌入的控件,能被放置到提供可视化编程环境的窗体或者对话框内。被放置之后,这些ArcGIS控件能够连同别的嵌入式控件(例如命令按钮,下拉列表框等)一样重新定义尺寸和位置以构建应用程序中的用户界面。2.1.2 属性页(Property Pages)当每一个ArcGIS控件被放置到窗体或者对话框中之后,鼠标右键点击控件,从弹出菜单中选择“Properties”(属性),都会分别弹出一系列的属性页。这些属性页提供了控件的部分属性和方法,并且允许开发者不使用或使用极少的代码来完成应用开发。2.1.3 ArcObjects每一个ArcGIS控件都封装了一些粗粒度(coarse grained)的ArcObjects以简化用户的开发工作,但同时也提供了访问高粒度(finer grained)ArcObjects的方法。例如,PageLayoutControl控件封装了PageLayout对象(PageLayout Object)。PageLayout对象包含了至少一个MapFrame元素,其中有一个包含有多层矢量图、要素或者通常所说的Layer对象的Map对象。每一个ArcGIS控件提供了封装在ArcObjects中最频繁使用的属性和方法的访问方法。例如,MapControl中的SpatialReference(空间参考)属性项,提供了设置地图对象中空间参考属性的方法。每一个ArcGIS控件同时也有一些实现简单任务的方法。例如,MapControl有AddShapeFile(用来添加ShapeFile文件)方法。ArcGIS控件是典型应用开发的起点,不仅因为它们提供用户界面,同时也提供对象模型的直接方法。2.1.4 事件(Events)每一个ArcGIS控件都能相应终端用户的键盘和鼠标操作。其他的事件用于相应控件内部的操作。例如,当一个地图文件被载入到MapControl中时,会触发OnMapReplaced事件,或者说当一个对象被拖拽到MapControl上时,会触发OnOleDrop事件。2.1.5 伙伴控件(Buddy Controls)ToolbarControl和TOCControl需要和其他“伙伴控件”协同工作。通常说来,“伙伴控件”指的是MapControl,PageLayoutControl,ReaderControl,SceneControl或者GlobeControl。“伙伴控件”可以在设计时通过控件的属性页来设置(在支持属性页的编译环境中设置)或者在程序中用SetBuddyControl方法来设置。2.1.6 控件命令(Control Commands)ArcGIS Engine提供了与ArcGIS控件一起工作的一系列命令(commands),工具(tools)和菜单(menus)。例如,MapControl和PageLayoutControl可以使用地图浏览,要素选择和图形元素命令等。类似的,也有许多可供SceneControl,GlobeControl和ReaderControl使用。对于使用独立控件的程序来说,在程序中新建一个命令的实例,并将这个实例通过OnCreate事件传递给控件就可以直接使用。对于连同“伙伴控件”一起使用ToolbarControl的应用程序来说,这些命令可以被直接添加到ToolbarControl中,既可以在设计时通过属性页加入,也可以在程序运行过程中书写代码加入,如果在运行过程中,ToolbarControl处于客户定制状态,还可以由终端用户添加。开发者可以使用ArcGIS Engine创建自己的命令、工具和菜单来扩展ArcGIS控件。HookHelper,GlobeHookHelper和SceneHookHelper对象能够用来简化开发。具体的开发方法将在第五章详细列出。2.1.7 地图组织(Map Authoring)ArcGIS Desktop应用程序能够创建预定义好的地图文件,之后载入到ArcGIS控件中以快速获得高质量的地图。例如,ArcMap能创建可被载入到MapControl和PageLayoutControl中的地图文件。预定义地图文件能够在组织地图数据和地图符号方面节省大量的时间。当地图文件被载入到ArcGIS控件中之后,在需要改变地图外观的时候,对象模型仍然提供了通过程序来访问图层、元素和符号的方法。下表小结了能够被载入到ArcGIS控件中的文件格式:表1 ArcGIS控件对应的文件格式*ArcReaderControl只有选择ArcGIS Publisher扩展之后才能获得。然而,这里将其列出来是因为与ReaderControl相似。*ArcGIS控件还不提供直接载入图层文件(*.lyr)的方法。然而,它们可以通过MapDocument对象间接载入。2.2重要控件简介本次实习可能用到MapControl,PageLayoutControl,TOCControl和ToolbarControl,下面分别介绍这四种控件。2.2.1 MapControl和PageLayoutControlMapControl和PageLayoutControl分别对应ArcMap Desktop应用中的“数据”和“发布”视图。MapControl中封装了Map对象,PageLayoutControl中封装了PageLayout对象。ArcMap应用程序中组织的地图文件能够直接载入到MapControl和PageLayoutControl中,以省去程序配置地图的时间。地图文件能够在设计时通过MapControl和PageLayoutControl的属性页(在支持属性页的开发环境中)设置,控件可以被设置为“链接”(link)或者“包含”(contain)地图文件。当选择“链接”时,控件将在生成的时候将地图载入并显示出地图文件的最新更新;而选择“包含”时,控件将会将地图文件中的内容复制到控件中,并且不再显示至此之后发生的文件更新。同时,您也可以选择使用LoadMxFile方法在程序运行过程中载入地图文件(这种方法在之后的章节中会有详细介绍)。下面详细介绍MapControl和PageLayoutControl的属性页。1. MapControl在MapControl控件上点击鼠标右键,选择属性,打开MapControl的属性页。属性页中包含General、Map、Color、picture四个选项卡。General选择卡:Border Style:用于设置MapControl控件边界的样式Appearance:用于设置MapControl控件的表现方式。Mouse Pointer:用于设置鼠标在MapControl上的样式。Enabled:设置控件是否可用,这与属性表中的Enabled属性在功能上是相同的。Enable OLE Drop Event:设置控件是否响应拖拽事件,例如:直接将地图拖入MapControlPreview in Design Mode: 设置是否在控件设计模式下显示地图。Arrow Key Intercept:设置是否容许控件响应键盘Tooltip Style:设置地图Tooltip的样式(ToolTip是地图上的一种动态标注。)Map Document:用于载入ArcMap产生的MXD文件,如果您的文件时MXD类型的,可以选择这种方式载入地图,或代码在程序中载入。关于后一种方法会在通过代码载入图层小节中加以介绍。选择地图载入的方式,有两种方式载入地图,第一种是将地图数据载入到MapControl中,这种方式下,地图数据在生成程序时被载入到内存中,之后所有对地图的操作,在没有保存的前提下对原始的地图文件没有影响。第二种方式,通过连接方式载入地图,表示对于地图的操作会影响到原始数据。在MapControl中只是保持着与地图数据的链接。Map选项卡Scale:显示地图比例尺Reference Scale:地图参考比例尺Rotation:设置地图的旋转角度Units:设置单位Spatial Reference:设置或更改地图的空间参考。Initial Map:初始化地图从左到右按钮的功能依此是:加载图层(图层可以是单图层文件,可以使GoeDatabase,也可以是Shapefile)向上移动图层、向下移动图层、删除图层、查看图层属性信息。Color选项卡主要对地图颜色进行相关的设置,但通常关于地图的配色我们是通过代码来完成的,这个选项卡很少涉及。Picture 选项卡主要是对控件中的相关图片资源进行管理,例如鼠标样式等。2. PageLayoutControl对于PageLayoutControl控件的属性页而言,唯一与MapControl不同的是他存在page选项卡,该选项卡提供了页面大小,页面宽度和高度等修改的窗口。MapControl和PageLayoutControl不仅可以读地图文件,同时也能写地图文件(*.mxd)。两个控件都实现了IMxdContents接口,使得MapDocument对象能将MapControl和PageLayoutControl能够将其中的内容写入地图文件。辅助方法(Helper Methods),例如MapControl中的TrackRectangle(鼠标绘制矩形),TrackPolygon(鼠标绘制多边形),TrackLine(鼠标绘制多段线)和TrackCircle(绘制弧形)方法能够在视口中绘制出可擦出的图形。VisibleRegion属性能够改变MapControl中显示区域的形状。辅助方法,例如PageLayoutControl中的FindElementByName和LocateFrontElement方法能帮助开发者组织元素,同时Printer和PrinterPageCount属性能够协同PrintPageLayout方法完成打印输出任务。2.2.2 TOCControlTOCControl需要与一个“伙伴控件”一同工作。“伙伴控件”可以是一个MapControl,PageLayoutControl,ReaderControl,SceneControl或者GlobeControl。“伙伴控件”能够在设计的时候通过TOCControl的属性页设置(在支持属性页的编译环境中),或者在程序运行中通过SetBuddyControl方法来设置。对每个TOCControl,“伙伴控件”都实现了ITOCBuddy接口。TOCControl利用“伙伴控件”来显示交互性的树结构目录,包括“伙伴控件”的地图、图层、符号等内容,并且保持树结构的内容与“伙伴控件”的内容一致。例如,如果TOCControl以MapControl作为其“伙伴”,则当一个图层从MapControl中移除的时候,这个图层也会同时从TOCControl中移除。同样的,如果终端用户通过交互式的TOCControl设置,取消了某个图层的可见性,则MapControl中的相应图层也会不可见。与MapControl不同的是,TOCControl的属性表中包含Buddy Control,如果你已经添加了MapControl,那么在下拉列表中你就会看到它,选择他就可以讲TOCControl与MapControl 绑定。2.2.3 ToolbarControlToolbarControl需要与一个“伙伴控件”一同工作。“伙伴控件”可以是一个MapControl,PageLayoutControl,ReaderControl,SceneControl或者GlobeControl。“伙伴控件”能够在设计的时候通过ToolbarControl的属性页设置(在支持属性页的编译环境中),或者在程序运行中通过SetBuddyControl方法来设置。ToolbarControl包含了与“伙伴控件”的显示相关的一系列的命令(commands),工具(tools),工具控件(tool controls)和菜单(menus)。对每个ToolbarControl,“伙伴控件”都实现了IToolbarBuddy接口。这个接口是用来设置“伙伴控件”的CurrentTool属性。例如,一个ToolbarControl中包含有一个“PageZoomIn”(页面放大)工具,并且将PageLayoutControl设置为“伙伴”,则当终端用户单击ToolbarControl上的“PageZoomIn”时,“PageZoomIn”将会成为PageLayoutControl的当前工具。“PageZoomIn”工具将查询ToolbarControl以访问其“伙伴控件”(PageLayoutControl)并且作用于PageLayout(页面视图),然后它将提供给终端用户显示和使用鼠标拉框的方法以改变PageLayout的显示范围。ToolbarControl实现了ArcGIS 中的所有功能,用户可以在不编写一行代码的情况下,轻松构架出一个功能庞大的GIS软件,只要是ArcGIS中含有的功能,你都会在ToolbarControl中找到。但是这些功能都是事先封装好的,如果你想对这些功能进行进一步的扩展,难度很大。所以不要以为有了ToolbarControl 就可以摆脱学GIS二次开发的过程。让我们来看看我们是如何使用ToolbarControl 的。在ToolbarControl的属性页中有一个Items的选项卡,通过选项卡中的Add按钮可以添加相应的功能按钮。点击Add,会出现以下对话框。该对话框包含了很多已经封装好的工具,包括复杂的空间分析功能。双击其中的功能或拖拽,就可以讲该功能添加到ToolBarControl中。需要删除时,在Items中的按钮列表中将功能拖出即可,按钮列表如下图所示:3 ArcGIS Engine二次开发入门3.1 ArcGIS Engine开发起步第一个简单的地图显示程序这个例子将引导您创建第一个简单的地图显示程序,并添加基本的缩放和漫游功能。如果您之前没有接触过ArcGIS Engine的开发,那么这个例子是您迈入ArcGIS Engine二次开发大门的极好例子,如果您之前没有接触过Visual Basic.NET,也无需担心,这个例子将从零开始引导您一步一步完成任务。3.1.1 创建一个新的工程首先打开Microsoft Visual Studio 2005,点击菜单栏中的“文件”“新建”“项目”,在弹出的对话框中选择新建一个Visual Basic的Windows应用程序,之后更改项目名称为“MapView”,更改文件的路径为个人实习文件夹,点击“确定”即可。图23 新建项目对话框3.1.2 添加控件及引用点击编译器最左侧的“工具箱”,在弹出的选择项中找到“ArcGIS Windows Forms”项,单击其中的MapControl,之后在Form1的空白处单击鼠标左键不放并拖拽鼠标,直到调整MapControl到合适的大小再松开鼠标(您也可以直接在工具箱中双击MapControl,该控件则会自动加入到Form1中)。用同样的方法,再将LicenseControl添加到Form1中。 图24 工具箱如果您在工具箱中找不到MapControl,则请依次尝试以下两种解决方案。首先单击工具栏,待工具箱弹出之后,在工具箱的任意位置上单击鼠标右键,从弹出菜单中选择“重置工具箱”。如果这一步操作之后仍然无法看到MapControl,则请滑动工具栏右侧的滚动条至最底部,找到“常规”选项卡,然后在“常规”选项卡上单击鼠标右键,在弹出菜单中单击“选择项(I)”,在弹出的对话框中找到“AxLicenseControl”和“AxMapControl”,将这两项前的复选框打上勾,最后点击确定即可(如果在“.NET Framework组件”这个面板中找不到这两项,则选择“COM 组件”面板,在“ESRI LicenseControl”和“ESRI MapControl”前面打勾)。图25 重置工具箱图26 选择项图27 选择工具箱项图28 选择工具箱项添加好MapControl和LicenseControl之后,调整Form1和MapControl的位置与大小,如下图所示:图29 窗体布局3.1.3 添加地图在MapControl上单击鼠标右键,选择“属性”,则会弹出MapControl的属性设置面板,在之前也介绍过,通过这个面板可以完成许多简单的工作。如图所示,点击“Map”面板,之后点击按钮,在弹出的对话框中选择下图所示的路径(注:笔者的ArcGIS安装在D盘,若您的ArcGIS装在别的盘符,请做相应修改),再在此路径下选择“States”,点击“Open”。之后在MapControl的属性页上点击“确定”即可。图30 文件添加路径至此,我们已经完成了一个最简单的地图显示程序,下面一起来看一下成果吧。点击“启动调试”按钮(或者在“调试”菜单下选择相应命令,或者按键盘的F5键),可以得到如下的运行结果。图31 “启动调试”按钮图32 初次运行结果3.1.4 添加基本的代码我们没有书写任何代码,就得到了一个最简单的地图显示程序。但这个程序还不能与用户交互,下一步我们需要添加一些代码,让程序能响应用户的鼠标,完成放大和全图显示的功能。图33 MapControl控件支持的所有方法双击MapControl控件,可以进入代码编辑界面。从窗口上方的下拉列表框中,我们能够看到MapControl能够响应的所有事件(关于每个事件的详细使用方法等请参见帮助系统,第六章对帮助系统有更加详细的介绍)。双击MapControl进入代码编辑界面的时候,默认的是“OnMouseDown”事件,下一步就需要在这个事件中添加响应鼠标的相关代码。请您在Private Sub AxMapControl1_OnMouseDown函数中添加如下代码:If e.button = 1 Then AxMapControl1.Extent = AxMapControl1.TrackRectangle ElseIf e.button = 2 Then AxMapControl1.Extent = AxMapControl1.FullExtentEnd If再次运行程序,鼠标左键在地图上拉框可以实现地图的放大功能,而右键单击地图则会还原地图的全图显示。图34 任意比例尺放大功能如果将代码替换如下,则能实现左键放大,右键漫游的功能。If e.button = 1 Then AxMapControl1.Extent = AxMapControl1.TrackRectangle ElseIf e.button = 2 Then AxMapControl1.Pan()End If3.1.5 代码解释下面我们依次来看看这些代码都代表什么意思。首先看来第一段:If e.button = 1 Then AxMapControl1.Extent = AxMapControl1.TrackRectangle ElseIf e.button = 2 Then AxMapControl1.Extent = AxMapControl1.FullExtentEnd If这个代码是一个If Else条件语句,关于“e”的详细定义及其中包含的各参数,请参考帮助中与“IMapControlEvents2, OnMouseDownEventHandler delegate”关键字相关的内容。可以根据e中包含的“button”值来判断鼠标的单击操作是来自何处,若button值为1,则为鼠标左键,2代表鼠标右键,4代表鼠标中键。当判断得到是鼠标左键单击时,执行“AxMapControl1.Extent = AxMapControl1.TrackRectangle”这条语句,其中,等号右侧是调用了“TrackRectangle”方法,这个方法是在地图上拖拽出一个矩形,之后将这个矩形赋值给当前地图的显示区域(Extent),这样就实现了地图的放大功能。类似的,若鼠标右键单击,则将全图范围赋值给当前的显示范围,实现了地图的全图显示功能。第二段代码与第一段结构一样,只是在右键的相应事件上略有不同,这是调用了“Pan”方法,实现了地图的漫游功能。3.1.6 小结通过这个例子,我们制作出了一个最简单的地图浏览程序MapView,并能响应一些基本的鼠标操作。在MapControl的属性页中,其实还有许多内容您可以尝试,例如在“General”面板中可以直接加入地图文件(*.mxd或者*.mxt),您也可以利用刚才的方式一次性多加入一些图层而不仅仅加入“States”一个,同时可以更改各图层的叠放次序,也可以在“Data”面板中设置地图的旋转角度(Rotation)等,您还可以设置MapControl的显示方式,是否支持地图的预览功能,边框样式等等。您可以做一些尝试,看看能得到哪些有趣的结果,这些尝试对您今后熟悉ArcGIS Engine的开发是有一定帮助的。如果需要重置MapControl,只需要点击“Data”面板中的“Reset”按钮。当您完成了这个例子,并做了一些积极的尝试之后,您就可以接着学习下一个小节的内容了。3.2 属性查询查询是GIS中非常重要的一个功能,下面将分别介绍属性查询和空间查询的制作方法。3.2.1 添加控件如果上一小节的工程已经关闭,则将其打开,如果您之后又在MapControl中添加了一些别的数据,请将其删除,只保留一个“states”图层,请务必注意这一步,这直接关系到您下面的工作能否顺利进行。用之前讲过的方式,在窗体中添加一个Label和一个TextBox。将Label的“Text”属性修改为“StateName”,结果如下:图35 Label控件和TextBox控件3.2.2 添加引用和代码首先添加引用。点击菜单栏上的“项目”“添加引用”,在弹出的对话框中同时选择“ESRI.ArcGIS.Carto”和“ESRI.ArcGIS.Geodatabase”(选择的时候按下Ctrl键以同时选择多个),点击确定。之后双击TextBox1控件,进入代码编辑界面。在代码编辑区域的最上方输入以下内容:Imports ESRI.ArcGIS.CartoImports ESRI.ArcGIS.Geodatabase如下图所示:图36 引用添加位置图37 添加引用对话框之后在TextBox1的事件中选择KeyPress,在KeyPress事件中添加以下代码:图38 KeyPress方法 If e.KeyChar = Microsoft.VisualBasic.ChrW(Keys.Return) Then Dim pFeatureLayer As IFeatureLayer Dim pCursor As IFeatureCursor Dim pFilter As IQueryFilter Dim pFeature As IFeature pFeatureLayer = Me.AxMapControl1.Map.Layer(0) If Not pFeatureLayer.Name = states Then Exit Sub Me.AxMapControl1.Map.ClearSelection() pFilter = New QueryFilter pFilter.WhereClause = STATE_NAME = & TextBox1.Text & pCursor = pFeatureLayer.Search(pFilter, True) pFeature = pCursor.NextFeature If pFeature Is Nothing Then Me.AxMapControl1.Refresh() MessageBox.Show(没有找到名为 & TextBox1.Text & 的州, Infomation, MessageBoxButtons.OK) Exit Sub Else Me.AxMapControl1.Map.SelectFeature(pFeatureLayer, pFeature) Me.AxMapControl1.Extent = pFeature.Shape.Envelope End If End If运行程序,分别向编辑框中输入“Texas”和“RS”,键入回车,如下图所示:图39 Texas州查询结果图40 RS查询结果3.2.3 代码解释If e.KeyChar = Microsoft.VisualBasic.ChrW(Keys.Return) Then上述代码是一个判断语句,即当用户输入回车的时候,开始进行查询。下面两行代码是定义查询的范围,默认为上一小节中添加的图层“states”,如果找不到这个图层则自动退出。pFeatureLayer = Me.AxMapControl1.Map.Layer(0)If Not pFeatureLayer.Name = states Then Exit SubMe.AxMapControl1.Map.ClearSelection()是为了将上一次的查询结果清除。pFilter = New QueryFilterpFilter.WhereClause = STATE_NAME = & TextBox1.Text & pCursor = pFeatureLayer.Search(pFilter, True)pFeature = pCursor.NextFeature这一部分是生成一个新的查询器,选择条件(WhereClause)就是检索是否有与用户输入相符的州,并将结果从查询得到的pCursor中读取出来。If pFeature Is Nothing ThenMe.AxMapControl1.Refresh()M
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 医生个人先进事迹
- 宿州市中石油2025秋招面试半结构化模拟题及答案机械与动力工程岗
- 厨房承包合同集锦15篇
- 2025年潍坊诸城市市属国有企业公开招聘工作人员(9名)模拟试卷完整参考答案详解
- 2025年甘肃省天水天光半导体有限责任公司招聘18人模拟试卷完整参考答案详解
- 2025年山东省药品不良反应监测中心公开招聘人员考前自测高频考点模拟试题及答案详解(历年真题)
- 2025年甘肃省大数据中心招聘工作人员模拟试卷及答案详解(网校专用)
- 2025年临沂市罗庄区教育系统部分事业单位公开招聘教师(43名)模拟试卷附答案详解(模拟题)
- 2025年上半年四川乐山职业技术学院赴四川大学考核招聘10人模拟试卷完整答案详解
- 2025年武汉工程大学人才引进33人模拟试卷及答案详解(各地真题)
- 2024年贵州黔南州招聘国有企业工作人员真题
- 2025建筑二次结构木工劳务合同范本
- GB/T 46105-2025陆地生态系统碳汇核算指南
- 李光平-哈工大-机械工程材料单元1课件
- 综合实践活动 绘制公园平面地图教学设计-2025-2026学年初中数学浙教版2024八年级上册-浙教版2024
- 工程项目质量管理研究-以XX小区为例
- 第一讲-决胜十四五奋发向前行-2025秋形势与政策版本-第二讲-携手周边国家共创美好未来-2025秋形势与政策版本
- 红楼梦第九回课件
- 智慧指挥中心建设总体方案设计
- 学堂在线 现代生活美学-花香茶之道 章节测试答案
- 2025民航西藏空管中心社会招聘14人(第1期)笔试参考题库附带答案详解(10套)
评论
0/150
提交评论