2024年2月21日发(作者:)
第2章 桌面GIS应用软件的开发方式
对于桌面GIS应用来说,ArcGIS平台不仅提供了用于开发独立运行的GIS应用软件的二次开发工具包ArcGIS Engine,还提供了对ArcGIS Desktop桌面软件进行扩展的开发方法。在开发一个具体的GIS行业应用软件时,程序员应该根据系统规模、用户水平和具体应用环境等设计相应的系统架构,从而决定是采用C/S架构还是B/S架构?如果采用C/S架构,是开发一个独立的系统还是在现有的ArcGIS桌面软件上进行扩展?因此选择合适的开发方式是进行GIS软件设计的第一步。特别需要注意的是,并不是所有的GIS应用系统都一定要基于ArcGIS Engine开发。因此,本章将首先介绍基于ArcGIS平台开发桌面GIS应用系统的其它几种方式,包括使用VBA的方法,使用DLL动态链接库的方法,以及使用Add-In的方法等。最后再介绍使用ArcGIS Engine创建一个简单的能独立运行的GIS应用软件的方法。
2.1 使用VBA进行桌面软件开发
VBA(Visual Basic for Applications)可以理解为简化的Visual Basic语言,它是Visual
Basic语言的子集,主要用于对支持VBA的Windows程序(称为“宿主程序”)进行扩展和定制。Word、Excel等Office办公套件很早就集成了VBA语言,利用它可以进一步扩充这些宿主程序的功能,或者基于这些宿主程序开发较为复杂的应用系统。Visual Basic开发的系统可以脱离Visual Basic而运行,但是基于VBA开发的系统不能脱离宿主软件运行,它的代码存储在宿主程序的文档中,如对Word进行VBA定制和开发的代码存储在*.doc文件中,对ArcMap进行扩展的代码存储于*.mxd地图文档中。
使用VBA进行系统扩展是一种轻量级的软件开发模式。Esri目前不特别推荐使用VBA进行系统开发,而更侧重于推荐使用Python语言进行扩展。但在很多情况下,特别是一些业务模式相对固定的生产和管理部门,并不需要复杂的GIS分析功能,而是更侧重于地理数据的管理,并且这些用户基本掌握了ArcGIS软件的使用,通过VBA开发方式将一系列
业务管理流程自动化为工具按钮置于ArcGIS桌面软件中,既能满足行业管理的需求,又能充分利用ArcGIS本身强大的空间数据管理功能,这时使用VBA开发定制无疑是一种较好的方式。但需要注意的是,出于产品线战略布局的总体考虑,ArcGIS 10.1中已不再支持VBA开发(当然10.0及以下版本的ArcGIS还可以使用VBA),对应的开发模式转为Add-in方式。不过由于生产单位软件更新的滞后性,在今后较长的一段时间内,较低版本的ArcGIS软件依旧存在,因此了解VBA的开发还是有必要的。
2.1.1 VBA开发方式
通过VBA开发环境进行ArcGIS桌面软件的扩展和定制是最简单的GIS软件开发方式。开发者只需专注于ArcGIS软件不能提供的功能,对于ArcGIS软件已经提供的工具,直接“拿过来”使用即可。并且VBA环境本身已经提供了对整个应用程序和文档进行控制的变量,例如在ArcMap中开发人员可以直接通过Application、ThisDocument两个全局变量获取程序本身和程序所使用的文档对象,使开发更为快捷和简单。
在ArcGIS 10.0版本中,进行VBA的开发需要单独安装VBA开发程序模块,安装ArcGIS Desktop时不再附带VBA安装选项。根据操作方式的不同,在ArcGIS Desktop中进行VBA编程的方法有两种:一种是编写VBA宏命令,另一种是创建UIControl工具并在其事件中写入实现代码。
2.1.1.1 宏命令方式
开发人员将那些能够自动执行某种操作的命令统称为宏(Macros)。宏是一种操作命令,它和菜单操作命令的使用方式一致,因此可以认为宏和普通的命令是一样的。使用宏的目的往往是完成某些重复的操作,借以提高工作效率。
下面以在ArcMap中根据选择集创建临时图层为例,说明如何使用宏命令进行VBA的编程。
1) 在ArcMap中,点击主菜单中的【Customize】菜单,选择【VBA Macros】然后
选择【Macros…】或者直接按【Alt+F8】键弹出图2.1所示的宏命令对话框。在其中输入宏名称为“CreateLayerBySelection”。
图2.1 创建宏
在“宏的位置”下拉列表中,“Project”选项表示该宏命令将保存在程序正在使用的*.mxd文档中;“Normal”选项表示这个宏命令将保存在模板中,这样宏命令将出现在任何一个新建的*.mxd文档中,因为每个*.mxd文档都是从模板中派生生成的。
2) 点击【创建】按钮,自动进入图2.2所示的VBA程序代码实现界面。
图2.2 VBA程序界面(宏命令方式)
3) 在VBA程序界面中,完成CreateLayerBySelection()过程(Sub),实现根据选择集创建临时图层的操作,具体代码如下:
Sub CreateLayerBySelection()
'定义文档变量
Dim pMxDoc As IMxDocument
Set pMxDoc = nt
'定义地图文档
Dim pMap As IMap
Set pMap = ap
Dim pLayer As ILayer
Dim pNewLayer As ILayer
Dim pEnumLyr As IEnumLayer
Dim pFeatLyr As IFeatureLayer
Dim pNewFeatLyr As IFeatureLayer
Dim pFeatSel As IFeatureSelection
Dim pFeatLyrDef As IFeatureLayerDefinition
'获取当前地图中的图层枚举类型
Set pEnumLyr =
Set pLayer =
'循环遍历当前地图文档中所有图层
While (Not pLayer Is Nothing)
Set pFeatLyr = pLayer
Set pFeatSel = pFeatLyr
'判断当前图层是否有选中要素,有则根据选中要素生成图层,无则直接跳过
If <> 0 Then
Set pFeatLyrDef = pFeatSel
Set pNewFeatLyr = SelectionLayer("New" + ame, True, "",
"")
'将根据选择集生成的图层加载到当前地图文档中
If Not pNewFeatLyr Is Nothing Then
Set pNewLayer = pNewFeatLyr
er pNewLayer
End If
End If
Set pLayer =
Wend
End Sub
4) 点击【保存】按钮,保存代码。关闭VBA环境回到ArcMap环境中,点击主菜单中的【Customize】菜单,然后选择【Customize Mode…】,弹出如图2.3所示对话框,在Commands选项卡中单击“[Macros]”可以看到刚才创建的宏命令出现在对话框中,选中该宏命令拖动至ArcMap工具条中,则会在工具条中出现对应的工具按钮。
图2.3 宏的调用
5) 拖拽完成宏命令添加后,用户可以通过在该宏命令按钮上单击鼠标右键来改变它
的属性信息。选中该宏命令按钮,单击鼠标右键,弹出图2.4所示下拉菜单,用户可以在这里设置该宏命令按钮的图像、样式等属性信息,如设置成是只显示文字还是同时显示文字和图片等。当然用户也可以对按钮进行编组、删除等操作。
图2.4 宏属性信息设置
6) 单击该宏命令按钮,ArcMap根据当前选择集的情况自动创建临时图层,并将创建的临时图层添加到当前地图中。
2.1.1.2 UIControl方式
使用宏命令可以将重复的过程包装起来,让用户更加方便的调用,但是如果涉及到鼠标交互,如使用鼠标拖拽的方式来实现拉框放大、缩小等,宏命令则无法做到。这时需要使用ArcMap提供给开发人员的UIControl工具进行鼠标交互,即VBA开发的另一种方式:使用UIControl进行交互式开发。
1) 在ArcMap界面中,点击主菜单中的【Customize】,然后选择【Customize Mode…】,弹出图2.3所示【Customize】对话框,在Commands选项卡中找到“[ UI Control ]”,然后点击【New UIControl】,弹出如图2.5所示【New UIControl】对话框。
图2.5 新建UIControl对话框
在这个对话框中,可以创建自定义的控件,它罗列了四种不同的类型,每种类型的作用如表2.1所示:
表2.1 UIControl类型与用途
UIControl类型
UIButtonControl
UIToolControl
UIEditBoxControl
UIComboBoxControl
用途
创建Button(按钮)
创建与Map交互的Tool(工具)
创建EditBox(编辑框)
创建ComboBox(组合框)
2) 下面以新建UIToolControl为例介绍UIControl的用法。选择【UIToolControl】单选框,点击按钮【Create and Edit】进入图2.6所示VBA编码界面。
图2.6 VBA编码界面(UIControl方式)
3)
事件。
以“定位到所选范围”功能为例,在图2.7右侧事件下拉框列表中选择MouseDown
图2.7 选择控件事件
在该事件中,添加“将当前视图窗口定位到鼠标绘制范围”的代码,具体代码如下所示:
'获取当前地图文档
Dim pMxDoc As IMxDocument
Set pMxDoc = nt
Dim pScreenDis As IScreenDisplay
Set pScreenDis = Display
'获取缩放范围
Dim pEnv As IEnvelope
Dim pRubber As IRubberBand
Set pRubber = New RubberEnvelope
Set pEnv = ew(pScreenDis, Nothing)
'缩放到所选范围
= pEnv
h
4) 点击【保存】按钮,保存代码关闭VBA环境回到ArcMap环境中。
5) 点击主菜单中的【Customize】,然后选择【Customize Mode…】,弹出图2.8所示对话框,在Commands选项卡中点击“[ UI Control ]”可以看到刚才创建的功能按钮出现在对话框中,选中该功能按钮并将其拖动至ArcMap工具栏中,点击该按钮即可执行相应代码。
图2.8 添加 UIControl工具
通过上面两个简单的例子,可以看出VBA编程既具有充分利用现有ArcGIS桌面软件所提供功能的便利,又能有效地扩展原有桌面软件的功能。生产管理部门和数据处理需求较多的业务化部门均会对这种开发方式有较强的需求。本书之所以介绍VBA编程,一方面在于提醒读者进行项目设计时勿对简单项目进行过度设计,另一方面也告诉读者对于日常工作中经常进行的重复性工作可以通过VBA简单编程的方法来极大地提高工作效率。
2.1.2 VBA代码的安全性
VBA代码保存在文档或者模板中,即保存在*.mxd或者*.mxt文件里,开发人员编写的代码很容易被别人使用。为了保护开发人员的成果不被非法修改和利用,可以设置VBA代码的密码,以增加安全性。
在【Customize】对话框中选择【Options】选项卡,可以查看、设置VBA代码的安全级别等相关信息。点击图2.9中的【Lock Customization…】按钮,用户会被要求输入文档保护密码。设置密码后,在尝试打开VBA代码编写窗口时,将会出现一个认证对话框,只有输入正确的密码才能进入。
图2.9 设置VBA代码的安全级别
同时为了避免使开发人员的代码成为宏病毒的载体,点击【Change VBA Security…】按钮,可以设置VBA代码的安全级别,最高级别的安全性将只能运行有签名的宏,而潜在的不安全命令将会被删除。实际上,由于VBA代码的安全性较低,给VBA代码设置密码更多的是为了保护代码不被非法修改致使系统无法运行,而不是防止代码被别人非法拷贝。当开发人员逐渐掌握了GIS开发技能并具有一定的编程经验后,将会发现编程思想、系统框架设计等远比代码编写重要的多。
2.2 使用DLL进行桌面软件开发
采用VBA固然是一种简单的开发方式,但也受到很多限制,如不能脱离ArcGIS
Desktop运行、安装部署不易等,同时很多时候一个GIS应用软件还需要处理更多具有行业特色的业务,这时候采用DLL编程进行桌面软件的功能扩展是一种更可取的方式。
动态链接库(Dynamic Link Library,DLL)是Windows平台下的一种类文件编译格式,这种格式的文件可以被任何支持COM规则的语言所支持和引用,ArcObjects组件本身的物理文件就是DLL文件。DLL开发方式的特点是开发环境脱离了ArcGIS Desktop软件,读者可以使用自己熟悉的开发语言,如Java、C#等语言进行开发;开发的功能可以更为强大和灵活;编译的结果是DLL文件,封装性更好;功能分发只需传递DLL文件即可。实际上,开发大型软件一般采用DLL的方式将一类相似的操作进行封装,这样不仅提高了程序的复用性,减少了代码开发的工作量,而且便于软件的更新和分发。
2.2.1 DLL开发方式
下面仍以将当前视图范围定位为鼠标所绘范围为例对DLL开发方式进行介绍,实例位于本书随书光盘“„chp02DLL开发code”中,实例所用数据位于本书随书光盘“„chp02DLL开发data”中,具体操作步骤如下:
1) 启动Visual Studio 2010,创建一个新项目。在图2.10所示的【新建项目】对话框中,在左侧“Visual C#”选择项下,选择“ArcGIS”→“Extending ArcObjects”,在右侧窗口中选择“Class Library(ArcMap)”,并输入名称“SampleDll”、指定存储位置“C:”,点击【确定】按钮,新建一个项目。
图2.10 新建项目
2) 由于在开发过程中,不同的ArcGIS命名空间位于不同的引用项文件中,所以在弹出的如图2.11所示的对话框中选择要添加的ArcGIS引用项,点击【Finish】按钮,完成项目创建。
图2.11 添加引用对话框
3) 在创建完成的工程中,选中SampleDll工程,点击鼠标右键。在弹出的右键菜单中选择【添加】→【新建项…】,如图2.12所示。
图2.12 添加新建项
4) 由于本实例为新建一个工具,因此在弹出的图2.13所示【添加新项】对话框中,选择“Extending ArcObjects”→“Base Tool”,并输入工具名称“ZoomIn”,点击【添加】按钮。
图2.13 添加工具
5) 由于实例是对ArcMap桌面程序的扩展,所以在弹出的如图2.14所示的对话框中选择“ArcMap,MapControl or PageLayoutControl Tool”选择项。开发人员可以根据所扩展ArcGIS Desktop桌面程序的不同,选择不同的选择项。
图2.14 指定工具类型
6) 在添加的工具类中,分别在base.m_category、base.m_caption、base.m_toolTip、base.m_name等属性中输入工具的类别名称(可使用本地化字符)、名称(可使用本地化字符)、鼠标放置在工具上时的提示信息(可使用本地化字符)、名称(程序中的唯一ID,使用非本地化字符)等信息,然后在OnMouseDown事件处理函数中添加如下代码,实现将当前视图窗口定位到鼠标所绘范围的功能。
核心代码如下:
public override void OnMouseDown(int Button, int Shift, int X, int Y)
{
//获取当前地图文档
IApplication pApplication = m_ as IApplication;
IMapDocument pMapDoc = nt as IMapDocument;
IScreenDisplay pScreenDis = new ScreenDisplayClass();
pScreenDis = Display;
//获取所绘范围
IEnvelope pEnv = new EnvelopeClass();
IRubberBand pRubberBand = new RubberEnvelope();
pEnv = ew(pScreenDis, null) as IEnvelope;
//设置当前视图范围
= pEnv;
//刷新
lRefresh(ewGeography, null, null);
}
7) 按【F5】键启动程序调试,将自动启动ArcMap程序,在ArcMap界面中,点击主菜单中的【Customize】菜单,然后选择【Customize Mode…】,弹出图2.15所示对话框,在【Commands】选项卡中找到“ZoomIn”类别中的“ZoomIn”命令,将其拖动到ArcMap工具栏中。
图2.15 ArcMap中添加自定义工具
8) 参照“2.1.1节VBA开发方式—宏命令方式”中的步骤5来改变工具按钮的显示方式、图片等属性。使用时,点击该工具在地图窗口拉出一个矩形范围,执行将当前文档定位到所绘制范围的功能。
2.2.2 DLL功能的应用部署
采用DLL方式所编译的结果是生成扩展名为dll、pdb、tlb的三种文件。DLL是微软公司在Windows操作系统中实现共享函数库概念的一种方式,函数的可执行代码位于一个
DLL 中,该 DLL 包含一个或多个已被编译、链接并与使用它们的进程分开存储的函数。DLL 还有助于共享数据和资源,多个应用程序可同时访问内存中单个DLL 副本的内容。DLL在Windows应用程序中的使用非常广泛。PDB全称为Program Database,这个文件主要存储对应模块(dll或者exe)内部的所有符号,以及符号对应的地址、文件名和行号。PDB文件是在编译工程时和对应的模块(exe或dll)一起生成,可以理解为调试时应用程序和源文件之间的一个桥梁。TLB文件是一个说明文件,用户可以通过TLB文件得知DLL中的COM接口以及常量等信息。其可以单独发行,也可以作为组建DLL中的一个资源随组件一起发行。在基于DLL方式进行ArcGIS功能扩展时,将同时编译生成这三种文件。用户要在ArcGIS Desktop中使用该DLL提供的工具,需要将生成的DLL文件进行注册。
在ArcGIS 10.0版本中,提供了用于注册DLL的注册程序,即(该注册工具随ArcGIS Desktop一同安装,一般位于...Program FilesCommon FilesArcGISbin
目录下,当然不同安装环境该目录不同,读者可自行查找)。
自定义的COM组件在应用时必须注册为Desktop或者Engine组件,具体的注册过程如下:
1) 找到要注册的DLL文件,双击该文件,弹出如图2.16所示的注册版本类型对话框,此处选择Desktop,点击【Register】按钮,以注册DLL文件。
图2.16 DLL文件注册版本选择
2)
当弹出提示注册成功对话框时,表示注册成功。注册成功后,在ArcMap界面中,点击主菜单中的【Customize】菜单,然后选择【Customize Mode…】,在【Commands】选项卡中找到DLL文件所提供的工具,将其拖动到ArcMap工具栏中,就可使用该DLL文件中工具所包含的功能。
在对DLL文件进行注册后,当用户不再需要该DLL文件所包含的功能时,可以使用反注册的方式来清除该DLL文件在ArcGIS中的扩展,反注册的步骤如下:
1) 点击【开始】菜单→【所有程序】→【附件】→【命令提示符】,在命令输入窗口中输入“cd C:Program FilesCommon FilesArcGISbin”(目录位置可能有所不同)命令定位到注册工具目录。
2) 在光标后输入反注册命令,即:“ /p:desktop /u
"C:"(DLL文件所在的绝对路径信息)”,如图2.17所示,回车完成DLL文件的反注册,当弹出反注册成功提示框时表示反注册成功,如图2.18所示。
图2.17 DLL文件反注册
图2.18 反注册成功
2.3 使用Add-In进行桌面软件开发
下面对Add-In方式的开发和安装部署进行简单的介绍,使读者了解如何利用Add-In方式扩展ArcGIS桌面程序。(Add-In分为基于.NET和基于Python两种,本书以基于.Net为例。)
2.3.1 Add-In开发方式
Add-In是ArcGIS 10.0提供的一种能够快速扩展桌面应用程序的全新的扩展方式。作为ArcGIS 10.0全新定制方式,它具有以下特点:
1. 容易创建:ArcGIS 10.0不仅提供了很多创建Add-In的模板,也提供了详细的接口
来实现各种功能。
2. 更易共享:Add-In本质上是一个Zip压缩文件,这个压缩文件由配置文件、程序集和资源三项构成,易于网络、传输、共享。
3. 更加安全:可以对Add-In文件进行数字签名,使应用的安全性得到保障。
4. 更易安装和管理:只要安装有桌面软件,系统就能自动识别Add-In文件,双击即可安装部署,同时ArcGIS Desktop中也提供了用于管理Add-In的工具。
下面以“获取多边形选择集”为例,介绍如何采用Add-In开发方式进行桌面程序的扩展,实例位于本书随书光盘“„chp02Add-In开发code”中,实例所用数据位于本书随书光盘“„chp02Add-In开发data”中,具体操作步骤如下:
1) 启动Visual Studio 2010,选择【文件】→【新建项目】,弹出如图2.19所示的对话框,在左侧“Visual C#”选择项下,选择“ArcGIS”→“Desktop Add-Ins”,在右侧窗口中,选择“ArcMap Add-in”方式,输入新建项目的名称“SampleArcMapAddin”,选择项目的存储位置“C:”,点击【确定】按钮,创建Add-In示例项目。
图2.19 Add-In项目创建
2) 在图2.20所示的【ArcGIS Add-Ins Wizard】创建向导对话框中,输入要创建的
Add-In的功能描述信息,点击【Next】按钮,弹出图2.21对话框。
图2.20 设置Add-In描述信息
3) 由于本示例为创建一个工具,因此在如图2.21所示对话框的Add-In Types中勾选Tool类型(开发人员可以根据需创建Add-In功能的不同,勾选不同类型的Add-In,Add-In的具体类型如表2.2所示),在右侧输入要创建的Add-In工具的属性信息,点击【Finish】按钮完成Add-In工具的配置。
图2.21 Add-In类型选择
表2.2 Add-In类型与用途
Add-in类型
Button
Tool
Combo Box
Multi-Item
Extension
Editor Extension
Dockable Window
用途
Button(按钮)
与Map交互的Tool(工具)
ComboBox(组合框)
菜单和右键菜单
应用程序扩展
编辑扩展
可停靠窗体
4) 在生成的Add-In工程中,包含两部分内容,即dinx和。其中dinx文件包含Add-In的配置信息,文件是实现获取选择集功能的类文件,如图2.22所示。
图2.22 Add-In工程组成
5) 由于本例是通过多边形选择工具来获取选择集,因此使用鼠标的OnMouseDown事件,在类文件中重写该事件,核心代码如下:
protected override void OnMouseDown(ventArgs
arg)
{
//获取当前地图文档Map、ActiveView
IMxDocument con = nt as IMxDocument;
IMap pMap = ap;
IActiveView pActiveView = pMap as IActiveView;
//生成矩形框
IRubberBand pRubberBand = new RubberRectangularPolygonClass();
IGeometry pQueryGeometry = ew(Display, null);
//根据矩形框获取选择集
ByShape(pQueryGeometry, null, false);
lRefresh(ewGeoSelection, null, null);
}
6) 按【F5】键启动程序调试,将自动启动ArcMap程序,在ArcMap界面中,点击主菜单中的【Customize】菜单,然后选择【Customize Mode…】,在弹出如图2.23【Customize】的选择框中,选择【Command】选项卡,在“Categories”中,选择“Add-In Controls”可
以看到“Sel Tool”工具按钮,将该工具按钮拖动到ArcMap桌面工具条中,可参照“2.1.1.1节宏命令方式”中的步骤5来改变工具按钮的显示方式、图片等属性,如图2.24所示。
图2.23 添加Add-In工具
图2.24 设置Add-In工具属性
7)
所示。
点击该工具,在地图窗口中绘制多边形,多边形范围内的要素将被选中,如图2.25
图2.25 Add-In工具选择效果
2.3.2 Add-In的安装部署
采用Add-In方式开发完成之后,需要将程序部署到用户机器中,方能正常使用该功能。ArcGIS 10.0不仅提供了Add-In的部署工具,也提供了Add-In的管理工具。
Add-In程序的部署可以采用两种方式进行。一种是直接双击要部署的dIn文件,在弹出的如图2.26对话框中,单击【Install Add-In】按钮,当弹出安装成功对话框之后表明Add-In程序部署成功。
图2.26 Add-In部署工具
Add-In程序的另一种部署方式是在打开ArcMap之后,在界面主菜单中选择【Customize】→【Custominze Mode…】,在弹出的如图2.27对话框中,在Commands选项卡中单击【Add from file…】按钮,在弹出的如图2.28对话框中选择要添加的Add-In文件。
图2.27 使用添加文件方式部署Add-In
图2.28 添加Add-In文件选择框
在弹出如图2.26的部署对话框中选择【Install Add-In】,接下来在弹出的如图2.29添加组件对话框中,浏览要添加的工具,点击【OK】按钮,当在Command选项卡的“Categories”中出现要添加的工具按钮时表示添加成功,如图2.30所示,用户可以将其选中添加到ArcMap工具条中进行使用。
图2.29 Add-In所包含内容
图2.30 Add-In添加成功
当Add-In程序被成功部署后,用户可以通过选择ArcMap主菜单中的【Customize】→【Add-In Manager…】,在弹出的如图2.31对话框中,浏览所添加的所有Add-In程序的信息并对所添加的Add-In程序进行查看、删除等操作。
图2.31 Add-In管理工具
2.4 使用ArcGIS Engine构建独立应用程序
前面讲述的三种开发方式都是在ArcGIS Desktop上进行扩展,也就是在原有软件平台的基础上增加相应的功能。对于大型、专业的GIS应用系统来讲,由于功能的复杂性和软件版权保护等原因,往往需要所包含的GIS功能能够脱离ArcGIS平台软件独立运行,这就需要使用ArcGIS Engine进行开发。由于基于ArcGIS Engine构建独立应用程序是整本书要讲述的内容,因此本节只通过一个简单的实例,来讲解如何应用ArcGIS Engine所提供的控件来构建一个GIS系统的基本流程与步骤。本节介绍的控件绑定和通过界面添加功能的方法适应于对GIS要求不高,或者仅仅是展示地图数据的应用,这些对于初学者快速掌握使用ArcGIS Engine的方法是很好的范例,而对于大多数行业GIS软件的开发,一般都是通过编程实现而不仅仅是拖放相关的工具按钮。
本节实例位于本书随书光盘“„chp02ArcGIS Engine开发code”中,实例所用数据位于本书随书光盘“„chp02ArcGIS Engine开发data”中,具体步骤如下:
1) 启动Visual Studio 2010,选择【文件】→【新建项目】,弹出如图2.32所示对话框,在“Visual C#”→“ArcGIS”→“Extending ArcObjects”选择项下,选择“Windows
Application(Engine)”,输入项目名称“Sample”、选择保存位置“C:”,点击【确定】按钮,创建Sample工程。
图2.32 创建Sample工程
2) 在弹出的如图2.33【ArcGIS Project Wizard】向导窗体中选择需要添加的ArcGIS引用项,点击【Next】,在【License Checking】选项页中选择需要的软件许可授权和扩展模块许可授权,如图2.34所示,点击【Finish】完成项目的设置。(需要注意:在选择License级别时,虽然左侧的Products列表中是多选的图标,但实际上只能单选一个License级别,有时会造成混淆,如果多选了的话会以最上面的那个为准。)
图2.33 添加ArcGIS Engine引用项
图2.34 选择软件许可和扩展模块许可
3) 在如图2.35所示的编程界面中,在【工具箱】面板中找到【ArcGIS Windows Forms】选项卡,此选项卡中包含有ArcGIS Engine中所有的可视化控件,选择需要的控件添加到【Sample】窗体中。通常首先拖动不可视的LicenseControl控件到界面中以进行软件授权,然后拖动MapControl控件进行地图显示,拖动TOCControl控件进行图层树控制,拖动
ToolbarControl控件添加地图工具,最终界面如图2.35所示。
图2.35
系统界面
4) 选中ToolbarControl控件,单击鼠标右键,选择【属性】,弹出如图2.36所示对话框,在【General】选项卡中的“Buddy”下拉列表中选择与其绑定的MapControl地图控件,这样就指定了工具条按钮操作所对应的地图控件。在如
图2.37所示的【Items】选项卡中,点击【Add…】按钮,弹出如图2.38所示对话框,可见ToolbarControl控件可以使用大多数的地图操作和数据处理工具,只需要拖动或双击这些工具按钮、菜单等,就可以将其添加到ToolbarControl工具条中,从而使用其对应的功能。
图2.36 ToolbarControl控件通用属性选项
图2.37 ToolbarControl控件添加工具属性页
图2.38 ToolbarControl可添加的工具按钮
5) 选中TOCControl控件,单击鼠标右键,选择【属性】,弹出如
图2.39所示的对话框,在【General】选项卡的“Buddy”下拉列表中选择与其绑定的MapControl地图控件,这样当程序运行时TOCControl控件才可以与地图控件进行联动。
图2.39 TocControl控件通用属性选项
6) 要对TOCControl控件和ToolbarControl控件进行地图控件的绑定,除了使用上述方法通过属性选项进行设置外,还可以通过程序代码实现,具体代码如下所示:
dyControl(axMapControl1);
dyControl(axMapControl1);
7) 选中MapControl控件,单击鼠标右键,选择【属性】,弹出如图2.40所示对话框,在对话框中选择程序运行时加载的*.mxd地图文档,点击【确定】按钮完成对*.mxd文档的关联。
图2.40 MapControl控件通用属性选项
按【F5】键启动程序调试,弹出图2.41所示界面,表示应用程序构建成功。地图文档被自动加载到程序中,工具条中的工具可以实现放大、缩小、平移、查询等操作,至此一个简单、初步的ArcGIS Engine应用程序构建完成。
图2.41 ArcGIS Engine程序运行界面
2.5 不同开发方式的比较
提及GIS应用软件的开发,通常有三种模式:C/S架构、网络GIS和移动GIS。ArcGIS平台提供了对三种开发方式的全面支持(网络GIS和移动GIS的开发不属于本书的范畴)。对于采用C/S架构的大多数开发者来讲,首先想到的就是采用ArcGIS Engine进行开发。实际上,并不是所有的系统都必需采用这种方式,上述的三种开发方式(VBA、DLL和Add-in方式)在很多时候也可以考虑。
VBA方式采用Visual Basic语言规范,作为Visual Basic的子集,简单易学,开发者只需关注自己需要而ArcGIS没有直接提供的功能。对于广大ArcGIS使用人员来说,几句简单的编程就可以使自己的工作更加自动化,减少重复劳动、提高效率,特别是在空间数据处理方面这种方式非常有效,所以这种开发方式对于经常使用ArcGIS平台而开发基础较
为薄弱的使用者来讲是比较可取的。同时VBA方式可以让开发人员添加模块、类模块、用户窗体等,也适合于中小型规模的GIS软件开发。
DLL方式扩展了鼠标交互等界面操作功能,可以构建规模稍大的应用系统。这种开发方式在分发软件的时候只需要提供DLL文件,经过注册即可在ArcGIS Desktop中使用,比VBA的部署方式灵活很多。适合于用户较少,业务性较强的专业部门使用。有一定编程基础的ArcGIS用户可以通过这种方式定制自己的管理业务,扩展ArcGIS应用。
Add-In方式是Esri最近大力推广的一种轻量级开发方式,它提供了更多的扩展类型,更容易创建和分发,ArcGIS又提供了许多可以利用的模板,使得这一开发方式越来越受青睐,这也是替代VBA方式和DLL方式的一项更好的选择。
以上三种开发方式的共同点是开发的程序必须在ArcGIS桌面软件上运行。在实际应用中,受上述方式软件独立性、部署成本等因素的限制,目前最常用的开发方式还是基于ArcGIS Engine的开发方式。它的优点是可以构建独立运行和部署的GIS/非GIS应用程序,既可以充分利用GIS开发控件和组件所提供的空间数据管理和分析等专业GIS功能,又可以充分利用可视化开发语言在非GIS应用开发中的高效、方便等优点,集二者之所长,不仅大大提高了应用系统的开发效率,而且使开发出来的应用程序具有更好的外观效果,更强大的数据库管理功能等非GIS功能,可靠性好、易于移植、便于维护。这种方式能够很好地体现不同行业用户的不同GIS需求,具有很强的灵活性和扩展性,但是开发难度较大,适合于大中型项目的二次开发。


发布评论