发布和使用ArcGIS Server 服务之–地理处理服务(Geoprocessing service)

地理处理服务是借助于万维网来展示 ArcGIS 强大分析功能的方式。实质上是您将ArcGIS强大的分析功能公开给万维网的方法。

大家常见的有:
地图服务:发布和使用ArcGIS Server 服务之–地图服务(Mapserver)
要素服务:发布和使用 ArcGIS Server 服务之–要素服务(feature server)
影像服务:发布和使用 ArcGIS Server 服务之–影像服务(image server)
OGC 服务:发布和使用 ArcGIS Server 服务之–OGC服务(WMS/WMTS/WFS/WCS/WPS)
缓存服务:发布和使用 ArcGIS Server 服务之–缓存服务(TileServer)(一)
缓存服务:管理和迁移ArcGIS Server服务和缓存服务(TileServer)(二)
发布和使用ArcGIS Server 服务之–地理处理服务(Geoprocessing service)、矢量切片服务、场景服务
、地理数据服务、以及几何服务、KML 服务、地理编码服务、定位器Maritime Server、路径服务、Schematics 服务、流服务、公共设施网络服务、Workflow Manager 服务等;

本篇文章我们主要来聊聊什么是地理处理服务:

1、什么是地理处理服务(GP服务)

地理处理服务包含地理处理任务,该任务将获取在Web应用程序中捕获的简单数据,进行处理,然后以要素,地图,报告和文件的形式返回有意义且有用的输出。一项任务可以计算出危险化学品泄漏的可能撤离面积,飓风的预计轨迹和强度,用户定义的分水岭内的土地覆盖和土壤的报告,具有所有权的历史详细信息的地块图或许可化粪池系统的申请。这些服务的可能性是无限的。

地理处理服务包含一个或多个地理处理任务。地理处理任务是一个运行在服务器上的地理处理工具,它的执行和输出是通过服务器管理的。将地理处理结果共享为地理处理服务后,会通过创建该结果的工具创建一个对应的地理处理任务。

一种解释服务的有效方式是将服务视为四个独立的活动,即:设计、制作、发布(或共享)和使用(或消费)。

1.1 地理处理服务和地理处理工具的区别是什么?

服务和任务、工具箱以及工具
如果曾在 ArcGIS Desktop 中使用过地理处理服务,则可以将地理处理服务设想为一个工具箱,将任务设想为工具箱中的工具。主要区别在于,执行地理处理服务中的任务时,任务将使用服务器计算机的资源在服务器计算机上执行。

地理处理服务就像一个工具箱,是一个容器,不能执行任何处理。但是,服务具有会被服务中的所有任务继承的属性(例如,结果是否通过相应的地图服务、执行模式、进程数量、写入数据的位置等进行绘制)。

在讨论地理处理服务和任务时,很容易混淆服务及其任务,尤其是在服务仅包含一个任务时。在闲谈时,将服务和任务相提并论很常见,而且(通常)不会引起混淆。

言外之意是,单个工具可以完成单个任务,多个工具可以处理多个工作流任务,一个地理处理服务:可以由多个工具和任务组成;

1.2 如何创作地理处理任务

创作地理处理服务需要在服务中创作任务。
创作任务就是选择或创建工具,定义任务的输入和输出参数以及任务使用的所有数据的位置,说的简单通俗点就是,我使用GP工具创造一个我需要做流程化的操作工具。选择一个或多个要作为服务中的任务的地理处理工具,下面详细介绍了创造地理处理服务的几种方式:

任意地理处理工具

  • 可以使用 ArcGIS 所提供的若干系统工具中的一个,也就是我们可以发布任意的地理处理工具;
    在这里插入图片描述
    arcmap和arcgis Pro提供了上千种的工具供我们使用;

我们需要使用某一个工具时,可以直接将其运行成功后,然后共享为GP服务,即可在前端使用JS进行调用;

或者使用 ModelBuilder

ModelBuilder 是一个用来创建、编辑和管理模型的应用程序。

模型是将一系列地理处理工具串联在一起的工作流,它将其中一个工具的输出作为另一个工具的输入。也可以将 ModelBuilder 看成是用于构建工作流的可视化编程语言。

下图以使用 ModelBuilder 创建的将包括到任务中的工具为例。该模型(和发布的任务)是一个非常简单的供需分配模型;给定一组用于表示提供服务的点位置(例如应急响应或零售设施点),以及另一组用于表示需求的点位置(例如需要服务提供的家庭和商店),目的是将需求点分配给最近设施点,为各设施点创建贸易区,并汇总设施点贸易区中的全部需求。输出是一组面,每个输入设施点对应一个面,每个面具有包含面内的总体需求的属性。
在这里插入图片描述
我們可以在arcmap中,根据自己的项目需求:完成任意自己需要的完整流程项目处理需求;

您可以使用模型和 ModelBuilder 创作地理处理任务。
在这里插入图片描述
进入上述modelBulider的入门介绍,参考官网:使用 ModelBuilder 创作地理处理任务

或 Python 脚本创建自己的工具

在这里插入图片描述

参考下面官网链接:
ArcGIS Python如何将py脚本制作成python工具(自定义地理处理工具)

下面这个链接,是我梳理的一个简答的实例操作:

使用 Python 脚本创作地理处理任务

1.3 如何发布地理处理服务

  • 创建自己的地理处理任务,看1.2介绍。

  • 收集执行工具所需的输入数据。通常,这些数据集是 ArcMap 内容列表中的图层。

  • 执行工具在结果窗口中创建结果。

  • 如有必要,定义输入和输出数据集的符号系统。

  • 将结果共享为地理处理服务。共享结果时,使用服务编辑器定义数据集的输入模式(如下所述)以及服务和其任务的其他属性。

2、GP服务参数设置

2.1 服务编辑器简介

定义要创建或覆盖的服务后,将打开地理处理服务编辑器,如下图所示。左侧是可修改设置的分类列表。其中的一些设置应用于服务,而其余的设置则应用于服务中的任务。右上方则是用于执行操作的按钮。
在这里插入图片描述
服务设置
服务设置定义了客户端访问服务和任务的方法。这些设置将应用于服务中的所有任务。例如,其中的一个参数设置将决定任务的输出是否将作为地图影像返回到客户端。

任务设置
在左侧面板中单击参数将在服务编辑器的右侧面板中显示其设置。这些设置基于参数类型,如要素、表、栅格、字符串、文件、布尔值等。

导入设置
可以导入现有服务定义文件或已发布服务的属性。使用此方法,可避免使用 服务编辑器来配置服务属性。相反,您可以导入一个相似的服务定义文件或已发布服务的属性。

添加任务
一项地理处理服务可包含多项地理处理任务。单击添加结果 按钮以添加一个新的任务。

移除任务
要移除地理处理任务,请右键单击任务并选择移除。移除任务时,任务将从服务中移除 - 相应的地理处理结果及其工具不会删除。

预览任务
单击预览按钮 以显示在 ArcGIS Desktop 中使用时任务对话框的出现方式。预览任务有助于验证对任务参数所作的修改。如果存在多项任务,在单击预览按钮之前请选择任务(或其参数之一)。在发布时,任务可预览任意次数。

发布服务
单击发布按钮 发布服务。将对服务进行分析,如有错误出现,则准备 窗口将打开且服务不会发布。若不存在错误,则进度对话框打开,服务发布完成时将会出现提示。

2.2 任务设置–输入模式

在服务编辑器中发布结果时,需要为各任务参数指定输入模式。选择的模式决定客户端给任务参数提供值的方式。本主题旨在帮助您了解为何有些输入模式选项不可用于某参数,并推荐了一些用于创建使用可用输入模式选项的任务的方法。
在这里插入图片描述

输入模式在服务编辑器 中进行设置,因为这仅涉及地理处理任务,而不涉及基础工具。输入要素有三种输入模式:

用户定义值:客户端将创建一个要素集,该要素集将通过 Internet 传输以供任务读取。指定用户定义值作为输入模式时,输入图层的要素类型、属性、空间参考和符号系统都存储在要素集中。客户端可检索此方案并使用它将要素数字化到要素集中或将要素从磁盘上的文件中加载到要素集中。对于输入表而言,包含一个对应的记录集用于存储表的属性方案。
选择列表:客户端可输入您在图层列表中选中的一个或多个图层的名称。客户端是否可输入多个图层将取决于工具本身。上面所示的生成近邻表工具允许输入多个图层。其他工具(例如缓冲区)则仅允许输入选择列表中的一个图层。
常量值:任务将使用您运行工具时所指定的值。常量值与移除参数相同 - 图层(数据集)由任务内部地使用,而不提供给客户端。

输入模式和参数数据类型:
https://desktop.arcgis.com/zh-cn/arcmap/10.7/analyze/sharing-workflows/parameter-data-type-transformations.htm

2.1.1 不可传输的数据

GIS 服务必须使用所有客户端中的最简单客户端:在计算机上运行的没有任何 GIS 功能的 Web 浏览器。这种简单的客户端仅知道如何向服务器传输(发送和接收)简单数据包,例如文本、数字、文件、地理要素及其属性(字段)。在地理处理任务上下文中,GIS 数据集可分为两种不同类别:可传输和不可传输。

可传输数据集包括要素、栅格、表和文件。包含可传输数据集的参数支持用户定义值输入模式。
不可传输数据集包括要素、栅格、表和文件以外的所有数据集。不可传输数据集分为两类。
复杂数据集包括几何网络、网络数据集、拓扑、TIN 等。这些数据类型称为复杂数据集,因为它们用于对简单要素之间的复杂关系进行建模。
容器数据集包括文件夹、文件和个人地理数据库以及地图文档 (.mxd) 等项目。这些数据类型混合了其他数据集 - 因此,将它们称作“容器”。
复杂数据集和容器数据集不可传输,而且不支持用户定义值输入模式。

2.1.2 数据集

GIS 服务必须使用所有客户端中的最简单客户端:在计算机上运行的没有任何 GIS 功能的 Web 浏览器。这种简单的客户端仅知道如何向服务器传输(发送和接收)简单数据包,例如文本、数字、文件、地理要素及其属性(字段)。在地理处理任务上下文中,GIS 数据集可分为两种不同类别:可传输和不可传输。

可传输数据集包括要素、栅格、表和文件。包含可传输数据集的参数支持用户定义值输入模式。
不可传输数据集包括要素、栅格、表和文件以外的所有数据集。不可传输数据集分为两类。
复杂数据集包括几何网络、网络数据集、拓扑、TIN 等。这些数据类型称为复杂数据集,因为它们用于对简单要素之间的复杂关系进行建模。
容器数据集包括文件夹、文件和个人地理数据库以及地图文档 (.mxd) 等项目。这些数据类型混合了其他数据集 - 因此,将它们称作“容器”。
复杂数据集和容器数据集不可传输,而且不支持用户定义值输入模式。

2.1.3 选择列表和不可传输数据集

如果输入参数值是引用不可传输数据集的图层,则可选择选择列表作为输入模式选项。例如,交通模式网络参数可用于根据用户的交通模式(汽车、自行车或步行)找出最佳路径的任务。

此参数的数据类型是“网络数据集图层”。网络数据集是复杂数据集,无法通过 Web 进行传输,所以用户定义值不适用于该参数。但是,可以使用选择列表指定要使用的图层名称的选择列表。客户端将从选择列表中选择一个图层名称,而任务将使用客户端选择的图层并访问图层引用的、存储在服务器上的网络数据集。

多数复杂数据集具有相应的图层制图表达。上面的示例显示了网络数据集图层。其他复杂数据集包括 TIN 图层、地统计图层、宗地结构图层和 LAS 数据集图层。具有不可传输数据集时,可以使用其图层制图表达作为输入值。上面的示例任务的创建方法是:执行模型并提供街道网络图层作为输入。如果通过提供磁盘上的网络数据集的路径而不是图层名称执行模型,则输入模式将设置为常量值。必须使用图层作为输入来执行工具,这样才会显示选择列表选项。

2.3 同步和异步的区别是什么

gp服务分为异步执行模式和同步执行模式,两者的区别是:

异步和同步定义客户端提交执行参数并从任务获取结果的方式。服务设置为同步时,客户端将等待任务完成。通常,同步任务的执行速度很快,大概需要 5 秒或更短。
同步:适合于快速的处理,数据量较小,本质区别在于同步模式,服务器处理之后,处理结果并不在服务器端保存,而是将结果发送至客户端,由客户端去显示。如果客户端也没有保存结果,那么处理结果就丢失了。

异步任务的执行所花费的时间通常较长,客户端必须定期询问服务器任务是否已完成,如果已完成,则获取结果。使用异步任务的 Web 应用程序必须添加函数逻辑来检查任务状态,并在执行完毕后处理结果。异步:适合长时间的处理,数据量较大,本质区别在于异步模式,服务器处理之后,处理结果保存在服务器端,可以在arcgisjobs文件中找到。

那么GP服务为什么设定这两种不同的执行类型?

地理处理任务的地理处理功能可以很简单,这在服务器上可能只需数秒执行;也可以支持高级功能(处理大型数据集),这可能需要更长的处理时间。因此,REST API 提供了两个在服务器上运行地理处理任务的选项。

同步:同步任务适合快速运行任务。在同步任务中,客户端会发送一个运行任务的请求,同时任务的结果会作为响应发送给客户端。

异步:异步任务适合长时间运行的作业。在异步任务中,服务器返回一个作业 ID,客户端使用它对任务状态进行轮询。在状态为完成时,结果会创建为作业的子资源,而客户端可使用其作业 ID 访问该作业。

3、地理处理服务制作、发布

3.1 制作

要制作地理处理任务,通常要使用 模型构建器 或 Python 创建地理处理工具。您不必创建自己的工具,可以使用 ArcGIS 安装自带的多个系统工具中的任何一个。

我们使用最多的也就是单个工具,或者modelbuider进行构建自己的任务流;

3.2 发布

要发布已制作的工具,您可以在 ArcGIS Desktop 应用程序(如 ArcMap 或 ArcGlobe)中执行该工具。

执行工具会在结果 窗口中创建结果。要发布服务,必须具有对 ArcGIS Server 安装程序的管理员权限。

要发布服务,请右键单击结果并单击共享为 > 地理处理服务,如下图所示。
在这里插入图片描述

此操作将打开一系列对话框(共享为服务分步向导和服务编辑器对话框),以创建服务定义和包含在服务中的初始任务。初始任务与用于创建该结果的工具完全相同。可以向服务中添加结果,所有结果将成为服务中的任务。

单击共享为 > 地理处理服务后,将打开共享为服务向导,如下图所示

在这里插入图片描述
在第一个面板中,可用的选项如下:

  • 发布服务 - 连接到服务器并发布或另存为服务定义文件以在以后发布。
  • 另存为服务定义文件 - 无需连接到服务器。您将创建可随后发布的服务定义文件。
  • 覆盖现有服务 - 这与在发布前停止并删除现有服务所实现的操作完全相同。

如果选择发布服务,则下一对话框将提供服务连接和服务名称。单击下一步后,可创建一个文件夹用于存储服务。

默认情况下,服务会发布到 ArcGIS Server 的根文件夹 (root)。
也可将服务组织到根文件夹下的子文件夹中。选择要将服务发布到其中的文件夹,或创建一个包含服务的新文件夹。

如果选择另存为服务定义文件,则在下一面板上将提供两个选项:为特定服务器创建服务定义或创建通用服务器定义文件。

最后一个面板可指定用于保存已完成服务定义的位置。

注:
从 10.4 版本开始,仅管理员可以发布地理处理服务。要允许发布者发布地理处理服务,可在 ArcGIS Server 管理员目录的站点属性中添加allowGPAndExtensionPublishingToPublishers 属性,并将其设置为 true。

4、 使用

每个 ArcGIS Server 都有一个服务目录,可通过 URL 访问;服务器上的每个服务都有自己的服务页面,也可通过 URL 访问。可在 web 浏览器内的服务页面上检查上述地理处理 REST 服务属性。此服务页面主要被 web 开发人员用来理解服务的功能。即便您不是 web 开发人员,您也会发现,服务页面可帮助您理解在发布服务时所做的决定可以影响到开发人员如何在内部使用您的服务和任务。
您在 ArcGIS Desktop 内成功发布地理处理服务后,会在目录 窗口中向 ArcGIS Server 连接添加一个新的地理处理服务。若要查看您的服务的服务页面,右键单击服务并选择服务属性。这将打开服务编辑器。在服务编辑器 中,单击功能下的地理处理选项卡。如下图所示的 REST URL 值是服务页面的 URL。
在这里插入图片描述

ArcGIS REST Web 服务基于两个清晰的原则:

  • 1、在 ArcGIS Server 上发布的每个 GIS 服务都被视为一个可通过 URL 访问的资源,例如 http://<主机名>/arcgis/rest/<服务名>。此 URL 也称为 REST 端点。
  • 2、每个资源都包括:描述该资源的属性、可对资源执行的操作(可选)、子资源(可选)

操作是对资源执行的可触发资源的状态转移和/或创建新资源的一种行为。子资源是存在于其父资源环境内并继承其父资源属性的资源。子资源也可有自己的属性,并支持可对其执行的操作。一个资源为其子资源创建端点等级和通过 URL 访问的操作。

可通过 Web 客户端使用地理处理服务及其包含的任务。可以访问 GIS 服务的客户端示例包括 Web 浏览器、移动应用程序以及 ArcGIS Engine 应用程序。

最重要的是,GIS 服务与其他任何 Web 资源一样可供用户进行搜索。可以通过上面列出的客户端或搜索引擎来查找 GIS 资源并立即使用这些资源。

4.1 ArcGIS Desktop 中使用地理处理服务

ArcGIS Desktop 就是这样一个 Web 客户端。ArcGIS Desktop 允许您访问和使用任何地理处理服务,无需编程。

在 ArcGIS Desktop 中,您可通过连接到 ArcGIS GIS Server 站点来添加地理处理服务并执行各种任务。而且,您必须指定一个 SOAP 端点 (URL),才能在 ArcGIS Desktop 中创建一个 ArcGIS Server 连接。可从 ArcGIS Online 中的服务描述所提供的 REST URL 派生 SOAP URL。例如,如果 REST URL 为:
http://sampleserver.esri.com/arcgis/rest/services//gpserver
则用于创建服务器连接的相应 SOAP URL 如下:
http://sampleserver.esri.com/arcgis/services
使用此 SOAP URL 创建一个服务器的用户连接。创建完连接后,对服务器目录彻底搜索,找到地理处理服务和任务。

https://enterprise.arcgis.com/zh-cn/server/latest/publish-services/windows/a-quick-tour-of-using-a-service-in-desktop.htm

4.2 通过 ArcGIS Online 使用地理处理服务

ArcGIS Online 是一个网站,可在其中使用地图和其他类型的地理信息。ArcGIS Online 包含来自 Esri、其合作伙伴和整个 GIS 社区的地图、数据、应用程序和工具(包括地理处理服务)。通过 ArcGIS Online,每个人都可访问、提供和共享地图、工具、任务和应用程序。

ArcGIS Online 中的地理处理服务
可在发布时共享地理处理任务,或通过提供服务的 REST 端点将服务及其任务添加到 ArcGIS Online 内容中。同样,您也可搜索 ArcGIS Online 寻找由社区共享的地理处理服务。在 ArcGIS Online 中,所有内容都称为项目,且所有项目都具有一个类型(例如 Web 地图或要素)以及有关该项目的详细信息。ArcGIS Online 中的地理处理服务项目提供了有关此服务的简要说明和 REST URL。

4.3 地理处理 REST 服务概述

地理处理服务是一个资源,它经由 URL 访问。地理处理服务的 URL 格式是 http://<服务器名>/<实例名>/rest/services/<服务名>/GPServer,例如 http://myServer/ArcGIS/rest/services/BufferPoints/GPServer。

一个地理处理服务拥有服务描述、任务、执行类型和结果地图服务器等属性。发布在一个地理处理服务内的地理处理任务是其子资源。

地理处理服务本身并无任何操作,但任务可支持 submitJob 或 execute 操作。地理处理服务内的任务继承了执行类型和结果地图服务器属性,并具备任务描述、任务参数等其他属性。服务和任务的属性由服务的发布者所决定,不能由客户端修改。

下图显示了地理处理 REST 资源的等级。请注意以橙色显示的地理处理服务属性,例如执行类型、最大记录数(就是图中的最大记录数)和结果地图服务器等,由每个地理处理任务所继承。

在这里插入图片描述

4.4 在 Web 应用程序中使用地理处理任务

通过 ArcGIS API for JavaScript,Web 浏览器可以与 ArcGIS Server 服务进行通信、绘制地理数据并执行分析。由于可通过 Web URL 访问库,因此无需下载此库。

4.4.1 Web 应用程序中的地理处理任务

使用地理处理服务,可将地理处理功能和数据分析添加至 Web 应用程序。每个地理处理服务包含一个或多个地理处理任务。
如果浏览 ArcGIS Server 的服务目录,可以找到地理处理服务、该服务中的任务以及每个任务的参数和属性。地理处理 REST 服务主题提供有关 REST 资源等级的信息,而地理处理任务介绍主题提供有关地理处理任务、参数和访问方式的详细信息。

ArcGIS API for JavaScript 提供了合适的对象和方法,以便访问地理处理任务和执行功能。
要在 Web 应用程序中添加某个任务提供的地理处理功能,请遵循以下四个步骤:

  • 初始化地理处理任务。
  • 设置任务参数。
  • 运行任务。
  • 渲染结果。

通过这四个步骤,应用程序可以与服务器进行通信、成功执行任务并在应用程序中显示所需结果。

4.4.2 使用 ArcGIS API for JavaScript 中的地理处理任务

通过这四个步骤,您可以使用 ArcGIS API for JavaScript 成功添加地理处理功能。

步骤 1:初始化地理处理任务

要初始化地理处理任务,需要了解任务 URL。地理处理任务 URL 的模板为 https:GPServer/。将以下代码添加到 JavaScript 应用程序中,用于初始化地理处理任务。

执行初始化时,确保将地理处理任务实例的 OutSpatialReference 属性设置为 Web 地图空间参考。地理处理任务数据集可能位于不同的空间参考中,因此其输出所位于的空间参考也有所不同。

然而,Web 应用程序假设任务输出与地图的空间参考相同。这可能导致绘制输出时发生异常行为。因此,必须设置地理处理任务的输出空间参考属性。服务器将在由 OutSpatialReference 属性指定的空间参考中返回输出。

初始化地理处理任务

// esri.tasks.gp is required for using Geoprocessor.
//  Add it along with other dojo.require statements.
dojo.require(esri.tasks.gp); 
/* Step 1: Initialize Geoprocessing Task as a global variable. 
    That is, declare the variable outside a function definition 
    since we will be using gpTask variable in other methods */
var gpTaskUrl="https://myserver/ArcGIS/rest/services/" +
                   "BufferPoints/GPServer/BufferPoints";
var gpTask = new esri.tasks.Geoprocessor(gpTaskUrl);	
// Set output spatial reference property to map's spatial reference.
//   myMap is assumed to be an instance of map container esri.map.
gpTask.outSpatialReference=myMap.spatialReference;
步骤 2:设置任务参数

执行地理处理任务时,Web 应用程序必须提供地理处理任务的参数值。要了解任务的参数要求,请复制任务 URL,并将其粘贴到 Web 浏览器地址栏,打开服务目录的“任务”页面。“任务”页面列出了所有任务参数及其数据类型。此外,任务页面还包含帮助 URL,在此可以查找有关地理处理功能、访问和使用的详细信息。

为了成功执行任务,必须为该任务所需的所有输入参数 (EsriGPParameterTypeRequired) 指定值,如“任务”页面所示。通常,任务值来自于以下一个或多个来源:

  • 用户使用 Web 应用程序输入的值
  • 当前其中一个 Web 地图要素图层或图形图层的值
  • 其他任务的结果,如查询、路径任务等
  • 其他地理处理任务的结果

以下 JavaScript 代码显示了从添加到 Web 地图的 FeatureLayer 创建输入要素 GPFeatureRecordsetLayer 参数,以及使用 id=“distance” 派生于 Dojo 文本输入的 GPLinearUnit 参数 BuffDistance 的示例。此示例假设用户将交互输入距离值。创建任务参数后,构建具有参数名称-值对的 JSON 结构,然后发送至服务器。

设置参数

//Step 2: Setup Parameters of the task
function setupParameters(){
   /* The code below assumes that the web map 
     has a featurelayer with id fLayer. */
   // Get Input Parameter 1 : GPFeatureRecordSetLayer from fLayer.
   var inputFeatures = new esri.tasks.FeatureSet();			    
   inputFeatures.features = map.getLayer("fLayer").graphics;
   inputFeatures.fields=map.getLayer("fLayer").fields;
   // Get Input Parameter 2 : GPLinearunit from a dojo UI element
   var buffDistance = new esri.tasks.LinearUnit();
   buffDistance.distance=dojo.byId(“distance”).value;
   buffDistance.units=”esriMiles”;
   // Create Parameter list with name-value pairs.
   // Names must match the parameter name in Task page.
   // Parameters must be in the same-order as in Task page.
   var params= {"Input_Features":inputFeatures, 
              "Distance":buffDistance};
   // Return name-value pairs of parameters
   return params;
}

注:
GPFeatureRecordSetLayer 和 GPRecordSetLayer 参数具有由任务定义的默认方案。您可以在“任务”页面查找参数方案。GPFeatureRecordSetLayer 方案包含几何、空间参考、字段和要素。最好确保 GPFeatureRecordSetLayer 参数具有在方案中定义的所有属性,以获得成功结果。

步骤 3:运行任务

要运行任务,应使用基于地理处理任务支持操作的地理处理器实例 (gpTask) 的 execute 或 submitJob 方法。您可以在“任务”页面查找任务所支持的操作。任务操作:execute 和任务操作:submitJob 主题介绍了各种操作之间的区别以及操作时服务器与客户端之间的通信。

任务操作:execute
如果任务所支持的操作为执行任务,则必须使用地理处理器实例的 execute 方法并传递参数。必须定义事件处理程序,用以根据成功和失败的请求操纵应用程序。当任务成功执行时,触发 onExecuteComplete 事件,并返回结果和地理处理消息。任务执行失败时,触发 onError 事件。任务失败时,服务器将返回错误实例,包含 HTML 错误代码和地理处理消息(如果有)。

任务操作:execute

function myGPExecuteTask(){
 // Get params from setupParameters method described above. var params=setupParameters();
 // Setup onTaskSuccess and onTaskFailure event handlers. dojo.connect(gpTask, "onExecuteComplete",onTaskSuccess);
 dojo.connect(gpTask, "onError",onTaskFailure);
 // Execute gpTask with params gpTask.execute(params);
}
// Callback when the Task operation succeeded function onTaskSuccess(results, messages) {
  // Do something with the results...  // More info on rendering the results in section below    
}
// Handler that is invoked when the Task operation has failed function onTaskFailure(error) {
  // Report error   alert("Error:"+ error); 
}

任务操作:submitJob

如果任务所支持的操作是 submitJob 操作,则必须使用 Geoprocessor.submitJob 方法,并传递参数。如果是 submitJob,则触发三个事件,这三个事件必须在 Web 应用程序中进行相应处理。
在这里插入图片描述

  • onStatusUpdate:与 execute 不同,如果是 submitJob,服务器将创建作业,并分配作业 Id。submitJob 操作不会在作业完成时通知客户端,因此,客户端将自行检查服务以确定作业状态。默认情况下,Web 应用程序每秒向服务器发送一次状态请求,以确定任务状态。每次收到状态响应时,都会触发 onStatusUpdate 事件。如果需要,可以通过 Geoprocessor.setUpdateDelay 方法增加或减少状态检查的时间间隔。每次检查作业状态时,都会触发 onStatusUpdate 事件。事件处理程序接收到由服务器返回的 JobInfo 实例,其中包含作业 ID、作业状态和任何 GPMessages。您可以使用此信息保持跟踪任务进程。
  • onJobComplete: 当 JobInfo.jobStatus = STATUS_SUCCEEDED 时,将触发 onJobComplete 事件。操作完成时,结果不会自动返回至客户端,而是存储在服务器上,客户端必须必须发送请求才能检索结果。在 onJobComplete 事件处理程序中,可以调用 Geoprocessor.getResultData 方法以获取结果。每个输出参数都是独立的资源,因此必须为任务的每个输出参数调用地理处理器实例的 GetResultData 方法。必须提供由事件处理程序返回的作业 Id 以及 GetResultData 方法中的输出参数名称。此外,还必须为 onGetResultDataComplete 事件创建事件处理程序。当 Web 应用程序接收输出参数的结果值时,将触发 onGetResultDataComplete 事件。
  • onError:如果 submitJob 请求或状态请求超时或地理处理任务失败,则触发 onError 事件。该事件将返回包含 HTML 错误代码的错误实例。

您可在任务操作:submitJob 中的 submitJob 操作中了解到有关作业、作业 ID、jobstatus 以及服务器与客户端间通信的更多信息。以下代码显示了如何将作业提交至服务器以及如何处理事件。

任务操作:submitJob

function myGPSubmitJob(){
 // Get params from setupParameters method described above.
 var params=setupParameters();
 // Setup event handlers.
 dojo.connect(gpTask, "onJobComplete",onTaskComplete);
 dojo.connect(gpTask, "onError",onTaskFailure);
 dojo.connect(gpTask, "onStatusUpdate",onTaskStatus);
 gpTask.submitJob(params);
}
// Event handler for onJobComplete event
function onTaskComplete(jobInfo) {
    /* Get the value of an output parameter Buffer_polygons
      using getResultData. The name of the output
      may vary in your gpTask*/      
    dojo.connect(gpTask, "onGetResultDataComplete",
                      onTaskResultComplete);
    gpTask.getResultData(jobInfo.jobId, 
                          "Buffer_polygons");
}
// Event handler for onStatusUpdate event
function onTaskStatus(jobInfo) {
     //write status to console to help debugging
    console.log(jobInfo.jobStatus);
}
// Event handler for onError event
function onTaskFailure(error) {
  // Report error 
  alert("Error:"+ error); 
}
步骤 4:渲染结果

根据输出参数的数据类型渲染地理处理任务的结果。
在这里插入图片描述

从 onExecuteComplete 事件处理程序中获得的结果

如果是 execute 操作,onExecuteComplete 事件将返回地理处理任务的结果和消息。结果实例是任务的所有输出参数的数组,数组中的条目始终按照“任务”页面列出的顺序排列。因此,可以通过数组中参数值的位置来识别各个参数值。数组中的每个输出参数都具有参数名称、数据类型和值。下列代码显示了如何访问结果中的第一个输出参数。在以下代码中,输出参数称为 GPFeatureRecordSetLayer 输出,因此该代码可说明如何将参数渲染为图形图层并将其添加到 Web 应用程序中。

渲染 onExecuteComplete 事件处理程序中的结果

function onTaskSuccess(results, messages) {
    /* Retrieve the output parameter value based 
      on its position from the result instance.
      In the case shown below, the output is the first output 
      parameter of the task and it
      is a GPFeatureRecordSetLayer.*/
    var featureset = results[0].value;
   
    // Create a graphics layer with features
    var taskResultLayer= new esri.layers.GraphicsLayer
              ({id:"MyGPExecuteResultLayer"});
    
    // Create a symbol based on the geometry. 
    // The geometry is assumed to be polygons in the code below
    var simplePolySymbol = new esri.symbol.SimpleFillSymbol();
    simplePolySymbol.setOutline(new esri.symbol.SimpleLineSymbol(
                  esri.symbol.SimpleLineSymbol.STYLE_SOLID,
                  new dojo.Color([0,0,0,0.5]), 1));
    simplePolySymbol.setColor(new dojo.Color([255,0,0,0.7]));
    
    // Create graphics from features and add it graphicslayer 
    dojo.forEach(featureset.features,function(feature){
             feature.setSymbol(simplePolySymbol);
             //Add feature to the graphics layer
             taskResultLayer.add(feature);});
    }
    // Add graphicslayer to webmap 
    //  myMap is assumed to be an instance of map container esri.map
    myMap.addLayer(taskResultLayer)
}

从 onGetResultDataComplete 事件处理程序中获得的结果

onGetResultDataComplete 事件提供了结果实例。与 onExecuteComplete 事件中的结果不同,该结果实例仅具有请求参数值。参数结果将包含请求参数的名称、数据类型和值。从结果中检索参数值,并根据需要使用。以下代码显示了如何渲染参数结果实例中 GPFeatureRecordSetLayer 参数的结果。

从 OnGetResultDataComplete 事件处理程序中获得的结果

function onTaskResultComplete(paramResult) {
   // Retrieve the value of the parameter from the paramresult   var featureSet = paramResult.value;
   // Create a graphics layer with features   var taskResultLayer= new esri.layers.GraphicsLayer              ({id:"MyGPSubmitJobResultLayer"});
       // Create a symbol based on the geometry. 
   // The geometry is assumed to be polygons in the code below   var simplePolySymbol = new esri.symbol.SimpleFillSymbol();
   simplePolySymbol.setOutline(new esri.symbol.SimpleLineSymbol(                  esri.symbol.SimpleLineSymbol.STYLE_SOLID,                  new dojo.Color([0,0,0,0.5]), 1));
   simplePolySymbol.setColor(new dojo.Color([255,0,0,0.7]));
       // Create graphics from features and add it graphicslayer 
   dojo.forEach(featureset.features,function(feature){
             feature.setSymbol(simplePolySymbol);
             //Add feature to the graphics layer             taskResultLayer.add(feature);});
   }
   // Add graphicslayer to webmap    //   myMap is assumed to be an instance of map container esri.map.
   myMap.addLayer(taskResultLayer) }
  • 1
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
使用 Python 发布 ArcGIS Server 服务,您可以使用 ArcPy 模块中的 PublishServiceDefinition 工具。以下是一个简单的代码示例: ```python import arcpy # 定义服务定义文件路径 sddraft = r"C:\path\to\service.sddraft" sd = r"C:\path\to\service.sd" # 定义服务名称、类型和端口号 serviceName = "MyService" serviceType = "MapServer" port = "6080" # 创建服务定义草稿 arcpy.mapping.CreateMapSDDraft("C:/data/World.mxd", sddraft, serviceName, serviceType, "ARCGIS_SERVER", "http://localhost:"+port, True, None, "MyFolder") # 读取服务定义草稿 doc = DOM.parse(sddraft) # 修改服务属性 tagsType = doc.getElementsByTagName('Type') for tagType in tagsType: if tagType.parentNode.tagName == 'SVCManifest': if tagType.hasChildNodes(): tagType.firstChild.data = serviceType tagsConfigProps = doc.getElementsByTagName('ConfigurationProperties')[0] tagsProps = tagsConfigProps.getElementsByTagName('PropertyArray')[0] tagsItems = tagsProps.getElementsByTagName('PropertySetProperty') for tagItem in tagsItems: if tagItem.firstChild.data == 'filePath': tagItem.lastChild.firstChild.data = r"C:\data\World.mxd" # 保存修改后的服务定义草稿 f = open(sddraft, 'w') doc.writexml(f) f.close() # 将服务定义文件发布服务 arcpy.StageService_server(sddraft, sd) arcpy.UploadServiceDefinition_server(sd, "My Hosted Services") ``` 此代码将以“ARCGIS_SERVER”类型为例,发布名为“MyService”的MapServer服务,端口号为6080,并将地图文档“World.mxd”作为服务的数据源。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

GIS哼哈哈

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值