1.3.2 GIS开发组件——ArcGIS Engine
在ArcGIS Engine产品出现之前,使用ArcGIS开发自定义GIS功能有3种方法:在ArcGIS Desktop软件的VBA环境中编写代码;使用支持COM技术的编程语言,通过实现ArcObjects开放的特定接口编写能够嵌入ArcGIS Desktop的DLL文件;使用ArcObjects包含的可视化控件MapControl和PageLayoutControl控件开发具有独立界面的GIS应用程序。这3种开发方式都要求客户端必须安装一定级别的ArcGIS Desktop产品,因此产品的部署成本非常高昂。
ArcGIS Engine是ESRI在ArcGIS9版本才开始推出的新产品,它是一套完备的嵌入式GIS 组件库和工具库,使用ArcGIS Engine开发的GIS应用程序可以脱离ArcGIS Desktop而运行。ArcGIS Engine面向的用户并不是最终使用者,而是GIS项目程序开发员。对开发人员而言,ArcGIS Engine不再是一个终端应用,不再包括ArcGIS桌面的用户界面,它只是一个用于开发新应用程序的二次开发功能组件包。
由于GIS行业的特殊性,最终用户一般都希望使用与自己业务逻辑相适合的自定义界面GIS系统而不是商业软件成品,因此GIS行业从一开始对于定制业务的需求就非常迫切。ArcGIS Engine之前普遍使用的二次开发组件包括ESRI的MapObjects和MapInfo公司的MapX等产品,它们也可以让程序员们使用不同的程序语言和开发环境,建构具有独立界面的GIS程序。
由于MapObjects本身只是一个ActiveX控件,与ESRI ArcGIS的核心库ArcObjects不存在任何联系,因此,ArcGIS中的许多高级GIS功能无法在MapObjects中实现。
为了改变这种情况,ESRI将ArcObjects中的一部分组件重新包装后命名为ArcGIS Engine发布,这个产品取代MapObjects进入嵌入式GIS开发领域,同时,MapObjects在3.2版后已经退出了市场,ESRI不会再为这个产品开发下一个版本。
ArcGIS Engine组件库中的组件在逻辑上可以分为5个部分,这个划分如所图1-2所示。
图1-2 ArcGIS Engine组件库划分
n Base Services包含了ArcGIS Engine中最核心的ArcObjects组件,几乎所有的GIS组件都需要调用它们,如Geometry和Display等。
n Data Access包含了访问包含矢量或栅格数据的GeoDatabase所有的接口和类组件。
n Map Presentation包含了GIS应用程序用于数据显示、数据符号化、要素标注和专题图制作等需要的组件。
n Developer Components包含了进行快速开发所需要的全部可视化控件,如SymbologyControl、GlobeControl、MapControl、PageLayoutControl、SceneControl、TOCControl、ToolbarControl和LicenseControl控件等。除了这些,该库还包括大量可以由ToolbarControl调用的内置commands、tools和menus,它们可以极大地简化二次开发工作。
n Extensions包含了许多高级功能,如GeoDatabase Update、空间分析、三维分析、网络分析和数据互操作等。ArcGIS Engine标准版License并不包含这些ArcObjects组件的许可,它们只是作为一个扩展而存在,需要特定的License才能运行。
1.3.3 ArcGIS Engine产品类型
ArcGIS Engine 9.2包含一个软件开发工具包(Software Developer Kit)和一个用于所有ArcGIS程序的可分发运行时(Runtime)两套产品。
ArcGIS Engine开发工具包是一个基于ArcObjects组件的软件开发产品,用于构建自定义GIS 和制图应用软件,它并不是一个可以直接运行的终端产品,而是安装在开发人员电脑上用于开发的软件组件库。ArcGIS Engine提供了基于COM、.NET、Java和C++的APIs,它支持4种开发环境(C++、COM、.NET和Java),能够实现跨平台部署(Windows、UNIX和Linux)。GIS程序员可以根据最终用户的业务需求,使用ArcGIS Engine Software Developer Kit开发出不同的应用软件产品,如图1-3所示。
为了让使用ArcGIS Engine开发的应用软件能够正常分发,最终用户还需要将ArcGIS Engine Runtime安装在每一台终端上。ArcGIS Engine Runtime分为标准版本和扩展模块版本两种类型。如果使用ArcGIS Engine开发的程序包含了任何类型扩展功能,如三维分析、空间分析等,还必须安装相应的ArcGIS Engine Runtime extensions才能正常运行。
如果没有安装ArcGIS Engine Runtime,用户也可以选择在运行终端上安装ArcGIS Desktop产品,因此ArcView、ArcEditor和ArcInfo的用户也可以运行使用ArcGIS Engine开发的应用程序,但这样的程序会占用Desktop版本的License许可数量,其部署成本过于高昂。
在ArcGIS Engine 9.2中,如果要安装开发工具包,必须首先安装ArcGIS Engine Runtime或ArcGIS Desktop产品,这是ArcGIS Engine9.2产品安装策略的一个重要变化。
图1-3 发布者不同平台上的ArcGIS Engine开发的产品
1.3.4 ArcGIS Engine 9.2新特性展现
ArcGIS Engine 9.2相比以前的版本发生了许多重要的变化,这些改进和更新使开发人员的工作更加便利和简单,如果只是开发一个简单的GIS应用程序,开发者甚至可以无需编写一行代码,仅通过拖曳可视化控件的形式便可以完成。
新的扩展模块
ArcGIS Engine Runtime中新增了多个扩展模块,如Data Interoperability、Maplex、Schematics和Tracking等。
n Data Interoperability模块提供了在各种不同的数据格式之间进行无损访问的能力,它使ArcGIS Engine应用程序能够动态加载多种类型数据,这个功能实际上是通过Geoprocessing工具实现的。
n Maplex模块能够在地图制图时产生高质量、基于遮盖策略的文本标注效果。
n Schematics模块提供了以多种地理示意图的方式管理和查看网络数据的能力。
n Tracking模块允许ArcGIS Engine应用程序访问、查看和分析要素相对于时间或位置的改变。这个扩展支持对来自GPS(Global Positioning System)或其他跟踪设备的数据进行分析、显示和回放。
使用.NET开发ArcGIS Engine程序使用的组件被称为程序集,但这并非意味着ESRI已经将ArcObjects的核心功能用.NET平台上的语言进行了重新编写,事实上,ArcObjects的核心仍然是用C++编写的COM组件。
运行在.NET CLR上的程序被称为托管代码,而其他如COM组件则被称为非托管代码,两者由于运行原理不同,它们是无法直接调用的。那么,ESRI是如何将使用COM开发的ArcObjects提供给.NET开发人员使用的呢?
为了在.NET平台上能够使用COM组件,CLR需要获得COM组件中所有类型的元数据,即存储在类型库中的COM类型定义需要被转换成.NET元数据。这一点并不难办到,Microsoft提供了一个名为Type Library Importer utility(tlbimp.exe)的工具,它能够产生一个包含了COM定义元数据的交互程序集(Primary interop assemblies,PIA),它将作为两者通信的代理。
由COM库发布的PIA是一种强命名的组件,这样可以保证它们的唯一性。ESRI提供了所有ArcObjects类型库的PIA文件,ArcGIS的.NET开发人员应该只使用安装在全局程序集缓存(GAC)的PIA。尽管COM组件与程序集之间添加了一个PIA作为交互代理对象,但这个交互效率损耗非常小,可以忽略不计。ArcObjects的PIA对象可以如图1-4所示。
图1-4 ArcObject COM对象的PIA
ArcGIS Engine9.2中的程序集有3种形式的变化:ArcGIS Engine Runtime中添加了新程序集;许多过去只在ArcGIS Desktop开发中才能使用的程序集现在被添加到ArcGIS Engine中;ArcGIS Engine已经存在的程序集发生了重要的改变。
n 新加入的程序集
Application Developer Framework (ADF):该程序集包含了.NET基础类、组件类型唯一标识符CATIDs和一些工具类(ESRI.ArcGIS.Utility的功能也被放入此程序集中)。除此以外,ADF中还添加了几个新的抽象基础类,如BaseCommandBar、BaseMenu、BaseToolbar、CustomLayerBase和GlobeCustomLayerBase等,它们能简化自定义功能的开发过程。
ADF.Connection:包含连接ArcGIS Server 和ArcIMS服务的类。
Animation:包含了一系列产生动画数据的类。
ArcWeb:提供了基于SOAP访问一个ArcWeb Services的类。
Controls:所有的可视化控件都被放入该程序集中,除此以外,大量已经封装好的commands、menus和palettes也被添加到该程序集。
DataSourcesNetCDF:提供了访问netCDF数据的对象。
GeodatabaseExtension:该程序集包含了协助产生、管理和使用地形数据的对象。
Geoprocessor和Geoprocessing:在ArcGIS Desktop程序中,我们能够使用ArcToolBox完成许多数据处理操作。ArcGIS Engine Runtime 9.2也包含了geoprocessing框架,这些geoprocessing工具现在已经能够在ArcGIS Engine应用程序中使用,只要客户计算机上拥有足够权限的license即可。Geoprocessor程序集中包含了一个名为geoprocessor的托管类,在大部分情况下,我们都是通过该程序集而不是与Geoprocessing程序集直接交互的。
n 被移除的程序集
Utility程序集和ReaderControl控件在ArcGIS Engine 9.2中被移除,ESRI.ArcGIS.Utility的功能被转移到ADF程序集中。
n 功能改进的程序集
Carto库支持ArcGIS9.2中全新的地图制图、显示和基于OpenGL技术的动态显示功能,此外还有多个图层工厂(LayerFactory)对象被添加到Carto库中,如CadastralFabric LayerFactory、EngineCadAnnotationLayerFactory和EngineCadLayerFactory等。
DataSourceRaster库新增了一套执行栅格数据转换的对象,除此以外,DataSourceRaster库的组件还可以为所有可用的栅格数据源添加属性表并拥有将栅格数据存储为PNG、BMP、JPG、PCRaster、BIL、BSQ和File GeoDatabase的能力。
Display库提供了用于实现要素类Representation功能的组件,Representation是ArcGIS 9.2在制图上的一个重要改进,它可以为单独的要素进行符号化。ArcGIS 9.2还提供了一种被称为Basic symbols的符号,Display库对象能够将标准的ArcGIS符号转换为Basic symbols。
Geodatabase库添加了新的用于产生和管理要素类Representations的组件,Representations是存储在Geodatabase每个要素中的符号对象,每一个新要素类产生Representations会自动在要素类中添加RuleID和Override两个字段。为了访问工作空间中的这些Representations,可以使用RepresentationWorkspaceExtension、RepresentationClass、RepresentationClassName、RepresentationClassNames和Representation等组件。
GeoAnalyst库添加了两个新接口——IInterpolationOp3和IRasterNeighborhood2。
SpatialAnalyst库也增加了两个新接口——IHydrologyOp2和ILogicalOperatorOp2;所有的GPValue、GPDataType、GPValueTableType、GPDomain和一些其他的组件从SpatialAnalystUI程序集中被移到SpatialAnalyst程序集。
GeodatabaseDistributed库中提供了访问ArcGIS Server的组件类。
Geometry库中的ArcGIS 9.2得到了很大的改进,要素类能够使用更高的数据精度来存储地理数据。
新的样式控件——SymbologyControl
SymbologyControl提供了一种显示服务器样式文件、样式文件和自定义样式的新方法。这个可视化控件能够展示一个样式文件中包含的内容,并能选择、删除和预览单个样式符号。
使用样式控件,我们能够可视化更新ArcGIS Engine应用程序中图层的渲染情况或改变地图的比例尺和指北针等MapSurround Element。
增强已有控件的功能
n ToolbarControl:支持改变背景颜色、阴影、透明等界面属性;支持Windows XP样式;如果控件没有足够空间显示所有的项目,将自动隐藏某些菜单项;在ToolbarMenus中支持多项对象;提供以快捷方式显示的工具;支持动态改变buddy控件;支持定制ToolbarMenus和ToolbarPalettes等。
n TOCControl:可以访问和设置被选择图层的属性;支持从ArcMap拖曳图层;支持地图图层的拖放操作;支持图层复制功能。
n MapControl,PageLayoutControl:支持通过鼠标滚轮和键盘按键进行地图显示导航。
n LicenseControl:License控件支持新的ArcGIS Engine Runtime扩展。
新的commands、tools、menus和palettes
在ArcGIS Engine产品推出之前,每一个GIS应用的实现都依赖程序员的编码,但在ArcGIS Engine 9.2中,许多通用GIS功能都被添加到了组件库中,用户只需要直接调用这些对象即可省略大量代码的编写工作。同样地,这些功能可以被ToolbarControl控件管理和使用。
下面是几种常用的功能组件集。
n Add Data command:一个已经封装好的数据对话框,能够打开包括coverage、VPF、CAD、Personal Geodatabase、File Geodatabase和数据服务、栅格数据,并将其存放到地图控件中。
n Full Screen command:全屏按钮。
n Map and Globe Inquiry commands:提供和ArcGIS Desktop相同的Identify对话框功能的对象。
n Ink commands:全套的墨迹标注功能。
n ArcWeb Services commands:提供了登录和管理ArcWeb服务的功能。
n Editing commands:完整封装的数据编辑命令。
n Network commands:用于管理网络位置、显示和分析的命令工具。
n Schematics commands:提供了以多种地理示意图的方式管理和查看网络数据的工具。
新的License许可机制
ArcGIS Engine 9.2中,所有应用程序都必须在启动时执行Lincense初始化,这个过程可以使用LicenseControl或AoInitialize对象来实现。如果省略该操作,程序将无法启动运行。
License检测的初始化最简单的方式是使用LicenseControl,如果在UI层上没有拖放这个控件,所有其他的地图控件都会显示相应的警告信息。
将LicenseControl拖放到程序界面上,并打开其属性对话框,如图1-5所示。
图1-5 LicenseControl的设置
开发人员可以在左侧列表中选择相应级别产品的Licnese,如果要使用扩展组件,还需要在Extensions框中勾选相应的扩展组件License。
与Visual Studio.NET 2005紧密结合
ArcGIS Engine 9.2提供了多个IDE插件与Visual Studio.NET 2005紧密结合,它使开发人员基于Visual Studio.NET 2005编写ArcGIS Engine程序变得更加容易。这些插件有以下几个:
n 代码转换器:协助开发者将9.2以前版本的ArcGIS Engine应用程序转为使用ArcGIS Engine 9.2组件的程序。
n 工程模板:帮助开发人员快速建立和运行ArcGIS Engine应用程序。
n 新项目模板(New Item Templates):提供了一个开发自定义commands和tools的简单快捷方法。
n 代码片断(Code Snippets):该功能由Visual Studio.NET 2005支持而实现,在Visual Studio.NET 2005中,用户能够将小段代码存储起来并在需要时直接粘贴。
n Add ArcGIS Class:一个为产生ArcObjects组件的.NET类而提供的向导。
n Add Reference:一个为ArcGIS Engine应用程序快速引入组件的对话框。
n Component Category Registrar:将ArcObjects开发的组件类注册到ESRI component categories的工具,供ArcGIS Desktop和ArcGIS Engine程序使用。
n License Initializer:用于初始化ArcGIS Engine应用程序的License初始化工具。
n ArcGIS Toolbox:出现在Visual Studio.NET 2005中的工具箱,包含了所有的ArcGIS Engine发布的可视化控件。