在服务编辑器中发布结果时,需要为各任务参数指定输入模式。选择的模式决定客户端给任务参数提供值的方式。本主题旨在帮助您了解为何有些输入模式选项不可用于某参数,并推荐了一些用于创建使用可用输入模式选项的任务的方法。
回顾一下,共有三种输入模式选项,如下所述:
- 用户定义值:客户端将提供参数的值。
- 选择列表:给出字符串列表(选择列表),客户端必须从选择列表中选择一个或多个字符串。根据输入的数据类型,选择列表中的字符串可以是图层名称或简单关键字选项。
- 常量值:任务将使用您在创建结果时为参数提供的值。由于该值为常量,所以客户端无法对其进行更改,因此在发布服务时该值不会成为任务参数。
特定参数具有的输入模式选项取决于工具的参数数据类型。有三种类型的数据类型:
- 数据集:磁盘上存储的数据,如要素类、表、文件夹、地图文档、数据库等。
- 标量:数据集以外的任何数据类型,如数字和字符串。
- 值表:多列值表形式的特殊数据类型。
数据集
GIS 服务必须使用所有客户端中的最简单客户端:在计算机上运行的没有任何 GIS 功能的 Web 浏览器。这种简单的客户端仅知道如何向服务器传输(发送和接收)简单数据包,例如文本、数字、文件、地理要素及其属性(字段)。在地理处理任务上下文中,GIS 数据集可分为两种不同类别:可传输和不可传输。
- 可传输数据集包括要素、栅格、表和文件。包含可传输数据集的参数支持用户定义值输入模式。
- 不可传输数据集包括要素、栅格、表和文件以外的所有数据集。不可传输数据集分为两类。
- 复杂数据集包括几何网络、网络数据集、拓扑、TIN 等。这些数据类型称为复杂数据集,因为它们用于对简单要素之间的复杂关系进行建模。
- 容器数据集包括文件夹、文件和个人地理数据库以及地图文档 (.mxd) 等项目。这些数据类型混合了其他数据集 - 因此,将它们称作“容器”。
确定工具参数的数据类型
要确定任务参数是否支持用户定义值输入模式,可在服务编辑器中对其进行检查,查看输入模式是否作为选项显示。您也可在进入服务编辑器之前,通过以下任意一种方法确定工具参数的数据类型,从而判断是否支持用户定义值:
- 在工具的参考页面中,语法区域包含一个用于描述每个参数的表。该表的最后一列包含参数的数据类型。
- 在 ModelBuilder 中,右键单击变量,然后依次单击属性和数据类型选项卡。将在对话框的顶部列出数据类型。
- 对于脚本工具,在目录窗口中,右键单击脚本工具,然后选择属性。在属性对话框中,单击参数选项卡。各参数的数据类型将列出在参数表中。
选择列表和不可传输数据集
如果输入参数值是引用不可传输数据集的图层,则可选择选择列表作为输入模式选项。例如,交通模式网络参数可用于根据用户的交通模式(汽车、自行车或步行)找出最佳路径的任务。
此参数的数据类型是“网络数据集图层”。网络数据集是复杂数据集,无法通过 Web 进行传输,所以用户定义值不适用于该参数。但是,可以使用选择列表指定要使用的图层名称的选择列表。客户端将从选择列表中选择一个图层名称,而任务将使用客户端选择的图层并访问图层引用的、存储在服务器上的网络数据集。
多数复杂数据集具有相应的图层制图表达。上面的示例显示了网络数据集图层。其他复杂数据集包括 TIN 图层、地统计图层、宗地结构图层和 LAS 数据集图层。具有不可传输数据集时,可以使用其图层制图表达作为输入值。上面的示例任务的创建方法是:执行模型并提供街道网络图层作为输入。如果通过提供磁盘上的网络数据集的路径而不是图层名称执行模型,则输入模式将设置为常量值。必须使用图层作为输入来执行工具,这样才会显示选择列表选项。
总之:
- 客户端可通过 Internet 发送和接收(传输)简单要素、栅格、表和文件。
- 复杂数据集(如网络数据集、TIN 和宗地结构)不可传输。容器数据集(如文件夹、地理数据库和地图文档)也不可传输。也就是说,客户端无法创建这些复杂数据集或容器,或通过 Internet 传输它们。即使是 ArcMap 等全功能客户端也是如此。
- 多数复杂数据集具有图层制图表达;即,可以向 ArcMap 添加数据集,这将在内容列表中创建图层。
- 您可以创建图层名称的选择列表,客户端将从中选择一个或多个图层名称作为任务的输入。然后任务将使用图层引用的数据集。
- 要创建图层名称的选择列表,必须使用图层作为输入来执行工具。在服务编辑器中,选择列表将使用内容列表中的适用图层填充。
- 如果使用磁盘上的数据集的路径执行工具,则选择列表选项将不可用,即使您具有内容列表中类型正确的图层。
常量值和复杂数据集
如果任务的输入是复杂数据集的路径(例如 D:\mydata\chicago.gdb\transportation\streetnetwork 下的网络数据集),则输入模式将固定为常量值。如果在输入模式设置为常量值时进行发布,则数据集将复制到服务器(除非在服务器的数据存储中找到它)并且任务将使用复制的数据集。
如果可以通过向 ArcMap 添加数据集来创建图层,则可使用图层作为输入来重新运行工具。这将创建可以共享的新结果,并且服务编辑器将支持选择列表作为输入模式。
常量值和容器数据集
容器包括文件夹、文件和个人地理数据库以及地图文档 (.mxd) 等项目。这些数据类型混合了其他数据集 - 因此,将它们称作“容器”。容器是不可传输的,一般规则是:容器及其所有内容将复制到服务器(除非容器在服务器的数据存储中),已发布的任务将使用复制的容器。下面介绍了几种常见容器。
文件夹
如果任务的输入是文件夹,则输入模式将固定为常量值。如果在输入模式设置为常量值时进行发布,则文件夹及其内容(请参阅下面的注释)将复制到服务器(除非在服务器的数据存储中找到它)并且任务将使用复制的文件夹。
地图文档 (.mxd)
如果任务的输入是地图文档,则输入模式将固定为常量值。如果在输入模式设置为常量值时进行发布,则地图文档、其所有图层以及图层引用的所有数据集都将复制到服务器,除非在服务器的数据存储中找到地图文档。如果在服务器的数据存储中找不到任何引用的数据集,则也会将它们复制到服务器。实际上,将地图文档打包,将其发送到服务器,然后在服务器上解包。
地理数据库
如果任务的输入是地理数据库,则输入模式将固定为常量值。如果在输入模式设置为常量值时进行发布,则地理数据库及其内容将复制到服务器(除非在服务器的数据存储中找到它)并且任务将使用复制的地理数据库。
服务器平台(64 位操作系统)不支持个人地理数据库 (.mdb),复制到服务器后,会将其转换为文件地理数据库。向服务器进行复制时,企业地理数据库也将转换为文件地理数据库。
不可传输输出
如果工具的输出是复杂数据集或容器数据集,则无法将其传输回客户端。在服务编辑器中,输出参数将显示字符串这一数据类型。在下图中,任务返回的值将是所创建的 TIN 数据集的名称,而非数据集本身。
有多种处理不可传输输出的方法。
- 使用结果地图服务将结果以地图形式发送到客户端。除数据的地图外,任何数据集都不会传输到客户端。
- 将数据集转换为可传输数据集。例如,可以使用 TIN 转栅格工具将 TIN(不可传输)转换为栅格数据集(可传输)。
- 使用图层和表视图工具集中的某工具创建数据集的图层包 (.lpk),然后使用打包图层工具创建图层包。图层包是文件,文件可通过 Internet 传输。客户端将必须对图层包进行解包。
- 使用 ZIP 工具创建结果数据集文件或文件夹,并将 .zip 文件传输到客户端。客户端负责对文件进行解压。裁剪与发送服务示例将图层从研究区域裁剪到文件地理数据库(以及其他格式),然后创建将传输到客户端上的 .zip 文件。如果要使用此方法,请参阅以下链接:
标量
标量数据类型包括数据集以外的任何数据类型。标量数据类型有时称为简单数据类型。地理处理中存在许多标量数据类型,如字段(表中的字段)、SQL 表达式、计算器表达式、字段映射、模糊函数以及许多其他类型。其中有些很少使用。字段和 SQL 表达式等其他类型较为常见。
以下标量数据类型受所有客户端的完全支持并且无需转换即可通过 Internet 进行发送和接收:布尔型、日期型、双精度型、线性单位、长整型和字符串型。其他所有标量数据类型都将转换为字符串,这些数据类型称为不受支持或不可传输数据类型。
将不受支持的标量数据类型转换为字符串基本不是问题,因为每种数据类型都具有良好定义的字符串表示 - 只需知道这是什么,即可为您的客户端对其进行记录。在某些情况下,可能需要修改工具以便其使用客户端提供的其他信息构建字符串表示。下面将对这两种技术进行讨论。特殊数据类型“值表”将在下节中单独讨论。
查找参数的字符串表示
多数字符串表示显而易见。例如,“字段”数据类型的字符串表示是字段的名称。有时,必须深入挖掘才能找出字符串表示。
以下示例显示了用于将点插值成面的 IDW(反距离权重法)工具的搜索半径参数。此参数由三部分构成:搜索半径设置的方法(可变或固定)和两个值如下所示。
- 要查找此参数的字符串表示,首先查看工具参考页面的参数语法部分。此表的第一列包含参数名称,在特殊情况下还包含字符串表示。表的最后一列包含参数的数据类型。下图显示了上述搜索半径参数第一列的内容。
也可在工具参考页面的底部查看 Python 代码示例,因为这些示例通常使用参数的字符串表示。
- 要查看任何参数的字符串表示,请运行工具,在结果窗口中右键单击结果,然后选择复制为 Python 代码片段。将代码片段粘贴到文本编辑器中,并对其进行检查。以下为运行反距离权重法工具所使用的代码片段(为简洁起见,移除了初始参数):arcpy.gp.Idw_sa(...,"2","VARIABLE 12 250","#")。 沿该行浏览,您将看到搜索半径(与上图匹配)的字符串表示为 "VARIABLE 12 250"。可以更改参数值并复制 Python 代码片段再次运行该工具,以检查任何参数的字符串表示。
确定字符串表示后,需要告诉客户端这是什么。此操作在任务文档中完成。
在工具中构建字符串表示
对于复杂的字符串表示,或客户端的负担过重而无法构建字符串,可以修改工具以为客户端构建字符串。SQL 表达式数据类型就是一个很好的示例。在下图所示的模型中,表达式参数的数据类型为 SQL 表达式,为使此模型作为任务运行,客户端必须提供有效的 SQL 表达式字符串。
如果任务的目的是基于所有者名称选择宗地,则可创建客户端输入所有者名称且构建对应的有效 SQL 语句的模型。该操作可通过变量替换轻松实现,如下所示。所有者名称变量是字符串数据类型;客户端输入宗地的所有者名称,并在模型中创建有效 SQL 表达式。有关使用变量替换的其他示例,请参阅行内模型变量替换的示例主题。
创建自己的选择列表
许多地理处理工具都会针对其字符串参数定义选择列表,也称为值列表过滤器。前面所示的按属性选择图层工具的选择类型参数(NEW_SELECTION、ADD_TO_SELECTION、REMOVE_FROM_SELECTION 等)具有字符串选择列表。可以使用值列表过滤器为字符串变量创建自己的选择列表。
值表
“值表”是相交和合并以及许多其他工具中使用的多列表。下图显示了相交工具,其输入要素参数是包含两列的“值表”:要素和等级。
值表不可传输,其输入模式在服务编辑器中将固定为常量值。
如果您需要客户端输入值而不是使用常量值,则需要修改模型或脚本,使其使用“值表”之外的其他数据类型。
“值表”可以具有任意数量的行,修改工具的方式取决于您希望客户端输入固定还是可变的行数。如果“值表”中的任何列包含数据集,则行数必须固定,因为各行需要其自己的参数以包含数据集。
下图显示了可在模型构建器中用来使两个要素类相交的方法,具有等级但没有显示“值表”。在“值表”中输入街道和公园变量时,ModelBuilder 将自动创建这些变量。街道等级和公园等级变量的创建方法如下:
- 创建两个长整型独立变量。对其进行重命名并为其构建模型参数。
- 打开相交工具并单击等级列中的单元格,如下所示。可以从您创建的两个长整型变量中选择一个。
始终可以创建接受单个输入、在脚本中构建“值表”参数、然后调用工具的脚本工具。以下代码执行两个要素类的相交但没有使用“值表”参数。
# Script tool to intersect two feature classes.
#
import arcpy
inFeatures1 = arcpy.GetParameterAsText(0) # data type = Feature layer
inRank1 = arcpy.GetParameterAsText(1) # data type = Long integer
inFeatures2 = arcpy.GetParameterAsText(2) # data type = Feature layer
inRank2 = arcpy.GetParameterAsText(3) # data type = Long integer
outFeatures = arcpy.GetParameterAsText(4) # data type = Feature class
# Default values
#
joinAttributes = "ALL"
xyTolerance = "#"
outputType = "INPUT"
# Construct the value table parameter, a list of lists
#
valueTable = [ [inFeatures1, inRank1], [inFeatures2, inRank2] ]
arcpy.Intersect_analysis(valueTable, outFeatures, joinAttributes,
xyTolerance, outputType)
以下示例使用融合工具演示如何使用参数的字符串表示以及“值表”中的可变行数。融合工具接受线或面的要素类或图层,并基于融合字段参数中一个或多个字段中的值聚合要素。在聚合过程中,可以通过统计字段参数(值表)计算聚合要素的统计数据。
只要客户端指定其输入要素中的融合字段和统计字段,就会执行任务。为此,需要创建接受融合字段和统计字段参数的字符串表示的脚本工具,而不是提供位于输入要素方案中的字段选择列表。实际上,您不必将智能化集成到工具对话框和服务编辑器中,只需使用参数的字符串表示来执行工具。
# Script tool code to do a Dissolve using strings for the Dissolve Fields(s) and
# Statistics Fields(s) parameters
#
import arcpy
inFeatures = arcpy.GetParameterAsText(0) # data type = Feature layer outFeatures = arcpy.GetParameterAsText(1) # data type = Feature class dissolveFields = arcpy.GetParameterAsText(2) # data type = String statFields = arcpy.GetParameterAsText(3) # data type = String multi_part = False # Always produce single-part features unsplit_lines = True # Only dissolve lines if the share common vertex
arcpy.Dissolve_management(inFeatures, outFeatures, dissolveFields, statFields, multi_part, unsplit_lines)
执行该脚本工具时,用户需提供融合字段和统计字段参数的字符串表示。由上例可见,融合字段 = DISTRICT,统计字段 = POP98 SUM;NAME FIRST。(有关如何查找数据类型的字符串表示的详细信息,请参阅上文。) 可在服务编辑器中将这两个参数设置为用户定义值,因为它们是字符串。