输入和输出数据类型
如地理处理服务的重要概念中所述,只有某些特定的数据类型才可用作地理处理服务的输入和输出参数。
由于发布的模型或脚本中的进程是在所有数据类型均可用的服务器上运行的,所以可对模型或脚本进程使用任何数据类型。只限制输入和输出参数的数据类型。
有四个级别的数据类型支持:
- 在所有客户端上完全支持。
- 仅在 ArcGIS Desktop 客户端上受支持。
- 在任何客户端上都不允许。某些数据类型(如 TIN)不能用作输入参数,并且即使予以使用,模型也无法发布这些参数。发布时将收到一条错误消息,如下图所示。
- 将数据类型转换为“字符串”数据类型。例如,“面积单位”数据类型将在发布的任务中变为“字符串”数据类型。
可能必须先将 ArcGIS Desktop 上运行的模型和脚本修改为只使用支持的输入和输出数据类型,之后才能将它们发布到 ArcGIS Server。
输入数据类型
下表汇总了三种客户端的主要输入参数的数据类型。
输入参数数据类型 |
在 ArcGIS Desktop 客户端上是否受支持? |
在 ArcGIS Explorer 客户端上是否受支持? |
在 Web 应用程序客户端上是否受支持? |
---|---|---|---|
要素集 |
是 |
是 |
是 |
记录集 |
是 |
是 |
是 |
要素类 |
否(但可通过要素集数据类型间接支持要素类输入。) |
否 |
否 |
表 |
否(但可通过记录集数据类型间接支持表输入。) |
否 |
否 |
栅格 |
是 |
否 |
否 |
标准类型(如长整型、双精度型、布尔型、日期型和字符串型)和线性单位(如“1000 米”) |
是 |
是 |
是 |
文件(如 .zip 或 .xml 文件) |
是 |
是 |
是 |
图层(任何类型的图层;如,要素图层、栅格图层和网络分析图层) |
仅支持在结果地图服务或源地图文档中找到的图层 |
仅支持在结果地图服务或源地图文档中找到的图层 |
仅支持在结果地图服务或源地图文档中找到的图层 |
对于以上列表中未包括的任何输入数据类型,在发布模型或脚本时将发生以下两种情况之一:
- 工具将被发布,但数据类型将转换为包含数据字符串表示的字符串数据类型。
- 工具不会发布,您将收到错误消息。可导致发布错误的数据类型有:
- 任何地理数据集(如要素类)或表,但栅格除外
- 数据元素
- 值表/多值
- 列表类型的模型变量
要素类和表
不支持要素类和表数据类型作为输入参数,因为它们依赖于轻量级客户端(如 ArcGIS Explorer 和 Web 应用程序)无法安装的大型软件库。因此,地理处理包含两种可用于替换要素类和表数据类型的轻量级数据类型,即要素集和记录集。
要素集允许所有 Web 客户端对地图上的要素进行交互数字化。在 ArcGIS Desktop 中,要素集数据类型还允许输入现有要素类(如下图所示)。ArcGIS Desktop 允许使用要素类,这是因为它可提供所需的软件库。同样,记录集允许所有客户端交互创建表记录,而且在 ArcGIS Desktop 中还可指定现有表。
栅格数据集
具有栅格数据集输入的地理处理服务仅在 ArcGIS Desktop 客户端上运行。在 ArcGIS Explorer 客户端上,无法以任务的形式添加服务。在 Web 应用程序中,服务将返回错误。
输出数据类型
下表汇总了三种客户端的主要输出参数的数据类型。该表后面的内容是有关每种数据类型的注释。
输出参数的数据类型 |
在 ArcGIS Desktop 客户端上是否受支持? |
在 ArcGIS Explorer 客户端上是否受支持? |
在 Web 应用程序客户端上是否受支持? |
---|---|---|---|
要素类 |
是 |
是 |
是 |
要素图层 |
是 |
是 |
是 |
栅格 |
是 |
否;只能使用结果地图服务显示 |
否;只能使用结果地图服务显示 |
栅格图层 |
是 |
否 |
否 |
地理数据集(除要素类或栅格外) |
否;只能使用结果地图服务显示 |
否;只能使用结果地图服务显示 |
否;只能使用结果地图服务显示 |
表 |
是 |
否(含有表数据类型作为输出参数的服务不会显示在可用任务列表中。) |
是 |
标准类型(如长整型、双精度型、布尔型、日期型和字符串型)和线性单位(如“1000 米”) |
是(在结果 窗口的服务结果中查看) |
是(在“任务结果”窗口中查看) |
是 |
文件 |
是 |
是 |
是 |
对于以上列表中未包括的任何数据类型,在发布模型或脚本时将发生以下两种情况之一:
- 工具将被发布,但数据类型将转换为包含数据字符串表示的字符串数据类型。
- 工具不会发布,您将收到错误消息。
如果正在使用结果地图服务绘制输出数据,则任务可输出任何地理数据集,因为结果地图服务将绘制地理数据集并将地图(而不是数据集本身)发送回客户端。
要素类
支持要素类数据类型作为输出数据类型。在发布模型或脚本时,会对工具进行扫描,如果发现有输出要素类,则将其转换为输出要素集,然后将该要素集传送回客户端。该转换操作在后台进行;模型或脚本不会发生变化。这种情况只发生在输出要素类上,因为转换是在服务器上进行的,而服务器拥有执行该转换所需的全部必要软件库。因此,从技术角度讲,不支持要素类作为输出;之所以允许使用它们,是因为 ArcGIS Server 知道如何将其转换为受支持的要素集数据类型。
要素图层
要素图层引用磁盘上的要素类,并且支持因属性查询或空间查询而生成的一组所选要素。您会使用创建要素图层工具创建要素图层,而使用按属性选择图层和按位置选择图层工具执行查询。地理处理任务输出包含选择内容的要素图层并不少见。
如果 ArcGIS Server 遇到输出要素图层,则所选要素将被转换为要素类,而只将所选要素传送回客户端。
输出要素图层在结果地图服务中不起作用。
使用结果地图服务时,需要特别注意的一点是存在两种服务:地理处理服务和结果地图服务。这两种服务在执行时彼此相互独立。任务执行过程中,ArcGIS Server 会首先执行地理处理任务,然后再执行结果地图服务从而绘制地理处理服务的输出。要素图层是存储在内存中的临时对象,只在任务执行期间存在。任务结束后,内存中的这些要素图层会随即消失。如果结果地图服务引用图层中的相同要素类,则地图服务在进行绘制时,选定要素的所有相关信息(即,任务结果)都将丢失,而结果地图服务将绘制所有要素。如果需要地图服务绘制图层中的所选要素,必须先使用将要素图层作为输入的复制要素工具将所选要素保存到要素类。这样,“复制要素”将只复制图层中的所选要素。然后,便可使用结果地图服务绘制所复制的要素。
栅格数据集
仅在 ArcGIS Desktop 客户端上支持栅格数据集作为输出。
栅格图层
与要素图层一样,只有在 ArcGIS Desktop 客户端上才可输出栅格图层。如果 ArcGIS Server 遇到输出栅格图层,则将栅格传送回客户端。与要素图层在结果地图服务中不起作用的原因(如上所述)相同,输出栅格图层在结果地图服务中同样不起作用。
其他图层
仅支持要素图层和栅格图层作为输出(如前文所述,只有 ArcGIS Desktop 客户端支持栅格图层)。NetCDF 图层、网络分析图层和地统计分析图层等所有其他类型的图层均不受支持。
其他地理数据集
除要素类或栅格外,无法将其他输出地理数据集数据类型(如 TIN 或 Terrain)的数据传送回客户端。但地理处理服务可使用结果地图服务来显示此类数据,而地理处理服务的结果将成为可在任何客户端上绘制的地图服务图层。
表
与要素类数据类型相同,表数据类型同样受支持;它将被转换为记录集而传送回客户端。
针对不支持的数据类型的策略
如果要发布的模型或脚本含有不支持的输入或输出数据类型,或者数据类型已转换为字符串,则必须修改模型或脚本以使其只使用支持的输入或输出数据类型。可采用以下两种常规策略:
- 使用字符串表示。
- 将数据转换为文件。
使用字符串表示
每种数据类型都对应一种字符串表示。有关数据字符串表示的详细信息,请参阅地理处理工具参数的数据类型。
如果在将模型发布到 ArcGIS Server 时,模型的输入数据类型已转换为字符串,则可将模型修改为接受字符串输入,然后将字符串转换为所需数据类型。以下演示向您介绍了如何执行这种转换。此示例首先演示的是将数据类型的值转换为字符串,虽然这与需要对模型执行的操作相反,但却说明了一个重要概念:每种数据类型都对应一种字符串表示。示例的第二部分演示了如何将字符串转换为数据类型值,这是您将在服务中使用的方法。
用于演示的数据类型是面积单位。
此演示的第一部分是确定面积单位的字符串格式。
- 创建新模型。
- 创建数据类型为面积单位的变量,然后将其重命名为 Input AU。
- 添加计算值工具。
- 双击 Calculate Value 打开其对话框。对于表达式参数,请输入 %Input AU%。这会指示计算值读取变量 Input AU 的内容。为“数据类型”参数选择“字符串”,如下图所示。
- 此外,也可以使 Input AU 变量成为计算值的前提条件。前提条件表示变量中必须包含值,才能执行工具。如下图所示,前提条件连接符显示为虚线。
- 双击 Input AU 变量,然后将其值设置为 1000 平方米。
- 单击确定。
- 在“模型构建器”中运行该模型。双击 output_value 并检查它的值。该值是面积单位的字符串表示,如下所示。请注意,字符串表示在 Square 和 Meters 之间不包含空格。
如上所述,每种数据类型值都有一种字符串表示。可使用计算值查看任何数据类型的字符串表示。例如,可将“空间参考”变量输入计算值以查看它的字符串表示。
下列步骤介绍了如何将字符串变量转换为其他数据类型。这些步骤与上述步骤相同,只是输入变量变成了“字符串”而输出为“面积单位”。
- 创建新模型。
- 创建数据类型为字符串的变量,然后将其重命名为 Input AU String,如下图所示。
- 添加计算值工具。
- 双击 Calculate Value 打开其对话框。为表达式参数输入 %Input AU String%。这会指示计算值读取变量 Input AU String 的内容。
为“数据类型”参数选择“面积单位”,如下图所示。
- 此外,也可以使 Input AU 字符串变量成为计算值的前提条件。前提条件表示变量中必须包含值,才能执行工具。如下图所示,前提条件连接符显示为虚线。
- 双击 Input AU String 变量,然后将其值设置为 1000 squaremeters。
- 单击确定。
- 在“模型构建器”中运行该模型。双击 output_value 并检查它的值。如下所示,该值现在是面积单位。output_value 的数据类型实际上是“任意”值,而不是面积单位。“任意”值数据类型是可连接到任何工具参数的通用数据类型。
这种转换方法也在 GP 服务示例:选择数据的 Select Layer By Area 模型中进行了演示。
下图中显示的模型使用简化建筑物工具(以面积单位作为输入)。由于面积单位不是地理处理服务支持的输入参数数据类型,所以该模型的输入参数最小面积是使用上述方法转换为面积单位的字符串。变量 output_value 使用“模型构建器”的“添加连接”工具()连接到简化建筑物的最小面积参数。
使用这种方法时,用户必须为工具输入正确的字符串。例如,如果将 1000 square meters(而不是 1000 squaremeters)作为计算值的输入,则生成的面积单位将为空。不区分大小写,也就是说 SquareMETERS 与 squareMeters 等同。
如果要在将字符串转换为某种数据类型的过程中进行更详细的错误检查,则可编写一个脚本工具来执行数据类型转换并将错误检查功能添加到该脚本。以下 Python 代码体现了这种基本想法。
import arcpy # Get the string and call SetParameterAsText on the output # in_string = arcpy.GetParameterAsText(0) # Do error checking/conversion here, converting "meters squared" # to "squaremeters" for example # Set the output parameter # arcpy.SetParameterAsText(1, in_string)
如下所示,工具的输入数据类型将为字符串,输出数据类型将为目标数据类型(如面积单位)。输出参数“类型”为“派生”。
将数据转换为文件
可对基于文件夹的工作空间(文件地理数据库、coverage 和 shapefile)使用的一种方法是,指示用户使用 ZIP 压缩工具将工作空间创建为 .zip 文件,然后使用该 .zip 文件作为工具的输入。在地理处理服务中,可使用解压缩脚本(请参阅下文)将文件解压缩为工作空间,然后再继续操作。这同样适用于输出 - 您可以为工作空间创建 .zip 文件,然后将该文件用作输出。
以下链接指向两个 Python 脚本:zip.py 和 unzip.py。
- zip.py 脚本获取一个输入工作空间(文件地理数据库、包含 coverage 的文件夹或包含 shapefile 的文件夹 - 只要不是个人地理数据库或企业级地理数据库即可)和一个输出文件名,并创建 ZIP 压缩文件。您应为输出文件名添加 .zip 后缀,该脚本不会自动添加此后缀。
参数属性如下:
Zip.py 参数标注
数据类型
类型
方向
输入工作空间
工作空间
必选
输入
输出文件
文件
必选
输出
- unzip.py 脚本获取 .zip 文件、输出位置(现有文件夹)和输出名称(将成为新文件夹),并将内容写入新文件夹。如果 .zip 文件包含文件地理数据库,则将 .gdb 追加到输出名称。
标注 |
数据类型 |
类型 |
方向 |
---|---|---|---|
输入 ZIP 文件 |
文件 |
必选 |
输入 |
输出位置 |
工作空间 |
必选 |
输入 |
输出名称 |
字符串 |
必选 |
输入 |
输出路径 |
工作空间 |
已派生 |
输出 |
有关使用这些 ZIP 工具的示例,请参阅 GP 服务示例:裁剪与发送和 GP 服务示例:所需数据。