服务器对象扩展的替代方法
在本主题中
有时候,ArcObjects 的广度和对 Web 服务进行编码的挑战使初学者对服务器对象扩展 (SOE) 望而生畏。本主题将讨论开发人员过去编写 ArcObjects 代码的一些常见 Web GIS 任务,并提供了无需编写 SOE 或了解 ArcObjects 的替代方法。
创建打印布局
许多开发人员都使用 ArcObjects 访问地图服务的“布局”对象,专门用于在其 Web 应用程序中增添高质量打印功能。他们使用 ArcObjects 处理高质量的地图(如在 ArcMap 及其整饰要素中),从而以大幅面生成可打印的文档等。
ArcGIS 10.0 推出了可以用来编写布局构建和地图打印脚本的 arcpy.mapping Python 模块。然后,可以通过地理处理服务显示脚本。使用 arcpy.mapping,能够以非常精细的程度操作地图文档:可以将图层动态添加到地图和更新其符号系统等。此外,还可以访问地图布局和操作要素,如文本和图像。
在 ArcGIS 10.1 中,arcpy.mapping 功能已大大增强。具体而言,可以更轻松地使用 arcpy.mapping 将 Web 制图应用程序的内容(包括地图服务和图形)动态加载到地图文档。
更改符号和渲染器
开发人员过去使用 ArcObjects 的另一个原因是可以在地图服务中更改特定图层的符号系统。该工作流程往往需要使用非池化服务,这限制了应用程序的可扩展性。有些开发人员想方设法使用池化服务实现此目的,尽管来回切换服务的状态可以满足多个用户的请求,但这往往会导致性能不佳,并且使开发人员为保持地图实例本身的健康状态承担了很大的责任。
ArcGIS Web API 提供了一种能使用客户端要素图层或图形图层符号化要素的简单方法,从而可以在任何时候更改其渲染属性。理想的情况是将可见要素的所有几何体和属性都下载到客户端,这样客户端便可以很容易地使用应用程序开发人员所定义的任意颜色、宽度或分类间隔绘制要素。
要素图层技术对于专题制图、互动和突出要素等特别有效,但在处理数千个要素或非常复杂的面要素时存在不足。在这些情况下,最好的办法是在服务级别请求更改符号系统,并使用地图服务渲染地图图像。此操作以前需要使用 ArcObjects。
ArcGIS 10.1 增强了地图服务,可以让您在运行时更改地图的内容和符号系统(如可以使用 ArcIMS)。您再也无需使用非池化服务和精细的 ArcObjects 更改地图服务图层的符号系统。相反,您可以根据每个请求决定要创建的地图中所使用的内容或符号系统。
此增强功能可以使应用程序更具可扩展性,同时还简化了开发和维护。可通过在要求绘制地图的 Web 服务请求中包括渲染器信息,以及图层的可见性典型信息和范围等完成在运行时定义地图服务中图层的符号系统。ArcGIS Web API 的 3.0 版本包括实用程序类,这样就可以很容易地定义内容、渲染器、分类间隔和符号系统等。
要了解有关在地图服务中动态更改内容和符号系统的详细信息,请参阅关于动态图层。
Web 编辑
在 ArcGIS Server 的早期版本中,在 Web 上编辑数据只能通过 ArcObjects 自定义代码利用本地 (DCOM) 连接完成。在 9.2 版本中,Web ADF 引入了“编辑器任务”,可进行基本的编辑操作,如创建、移动和删除要素。任何自定义此任务或从头开始创建编辑工具都仍然需要进行大量的 ArcObjects 编程。
基于 REST 的 API 最初并没有显示 Web 编辑;但是,随着在 ArcGIS 10 中引入要素服务后,可以通过这些 API 执行编辑操作。不仅可以通过 REST 执行编辑操作,还可以很方便地进行自定义,因为通过几何服务的 REST 实现可以显示许多常见的编辑方法,例如剪切、修剪、延伸、自动完成面和修整。最后,使用 REST 进行编辑时可以使用池化服务。这对于提高性能来说是一个极大的优势。
在 ArcGIS 10.1 中,有一个工作流程不再受到支持:长事务。在 Web ADF 中,可以利用非池化服务按照长事务模型来执行编辑。从本质上讲,可以开始更新要素,并在任何时候进行回滚。使用要素服务,所有操作均为无状态,这意味着不能在数据库级别进行回滚(尽管可以在应用程序中执行业务逻辑)。Web 编辑的长事务模型是极少见的工作流程之一,ArcGIS 10.1 中的新服务器架构不提供替代方法。
这里要着重强调,缺乏对长事务的支持并不妨碍实现撤消/恢复操作。事实上,在 ArcGIS Web 制图 API 中,可以在应用程序级别通过 API 直接实现撤消/恢复操作。
非池化服务提供的另一个独特功能是可在进行编辑的同时更改版本。例如,Web 用户可凭此以不同的版本存储其更改,这些版本稍后可在 ArcGIS for Desktop 中进行协调。ArcGIS 10.1 增强了要素服务,这样就可在运行时从任何 Web 应用程序有效地针对版本进行编辑。
执行地理处理业务逻辑
一些 GIS 应用程序可运行一系列特定工具来执行高级的 GIS 业务逻辑。这些工具可预测森林的木材产量,确定餐馆的合适地点或评估毒云可能扩散的范围。许多开发人员都使用 ArcObjects 满足此功能。
在许多情况下,可以在 ArcGIS 模型构建器中表示这些过程,其中可采用图形化的方式将工具“链”在一起。这些地理处理模型可以显示为 Web 服务,并通过 Web 应用程序使用。这样做的好处非常明显:使用地理处理服务可以节省大量的编码工作。此外,还可以利用地理处理服务的异步执行,而这在通过编写自己的 ArcObjects 代码来实现时非常具有挑战性。
除了可以在模型构建器中合并数百个现存工具的灵活性以外,地理处理服务还能让您开发自定义工具。最简单的方法是创建既可自己运行也可结合模型内的其他工具运行的 Python 脚本。本主题介绍了早期通过 Web 使用 arcpy.mapping 创建高质量地图的示例。
为进一步控制,可以越过 Python 使用 C#、Visual Basic .NET、C++ 或 Java 创建自定义地理处理工具。这样可以在模型内嵌入自己的精细 ArcObjects 逻辑。
无论是使用 Python 还是其他语言,创建自定义工具的优点都是可以在不同的工作流程中重复使用它们,因为其操作类似于任何其他现有的工具。此外,可以在地理处理服务的异步执行模型内执行 ArcObjects 或 Python 代码,这对于长期运行的流程非常方便。
执行几何计算
地理处理服务非常有用,但就像在使用地理处理服务可以很容易实现某些功能时不该沉溺于 ArcObjects 开发一样,如果现有服务可以执行此作业,最明智的做法是避免使用地理处理服务。检查基于 SOAP 或 REST 的几何服务是否提供了您所需的方法。几何服务可以执行基本的 GIS 操作,例如缓冲、确定空间关系以及测量长度和面积。与使用地理处理服务相比,可以更简单和更快地在几何服务中调用一系列方法,并结合地图服务的查询功能和客户端逻辑。