在后台运行自定义(模型或脚本)工具

如果在后台执行工具,您便可以继续与应用程序(例如 ArcMap)进行交互从而在工具运行期间执行其他任务。

默认情况下,模型或脚本工具在前台运行。如果希望工具在后台运行,则需要解决下方列出的问题。确保模型和脚本纠正了这些问题后,便可按以下步骤在后台运行工具:

  1. 目录 窗口或 ArcToolbox 窗口中,右键单击工具,然后单击属性。在常规选项卡中,取消选中始终在前台中运行,然后单击确定。
  2. 在 ArcMap 菜单中,单击地理处理 > 地理处理选项。在后台处理窗格中,选中启用

必须解决的问题包括

  1. 使用地图文档图层(模型和脚本工具均存在此问题)。
  2. 在脚本工具中使用当前地图 文档(仅脚本工具存在此问题)。

问题 1 - 使用地图文档图层

模型示例

如果要在后台执行某模型工具,仅作为模型参数参与的图层才允许进入后台进程。例如,下方模型允许用户输入感兴趣区域、起始等值线和等值线间距,以便生成一个等值线要素类。此模型包含四个参数(3 个输入参数和 1 个输出参数)。请注意,Elevation Raster 变量虽然是 ArcMap 内容列表中的图层,但却不会被设置为模型参数。使用模型的工具对话框运行模型时,用户需要为感兴趣区域参数输入 Potential Landfill Site 图层,但无需提供 Elevation Raster 图层,因此它不属于参数。

在模型中使用图层

上述模型将按预期在前台运行。但如果将此模型设置为在后台运行,运行将失败,并会显示警告:“无任何进程准备好运行”,如下图所示。失败的原因是后台运行的进程无法使用不属于工具参数的图层。这种情况下,由于 Elevation Raster 模型变量不属于参数,后台进程无法找到它,因此运行会失败并会显示警告。

在后台中使用图层的模型的警告消息

解决方案

可采用多种方法更改模型,以使其能够在后台运行。

  • 使图层变量成为模型参数。执行此操作可将图层传递给后台进程,然后此工具便可在后台中执行。这是最简单的解决方案。
  • 不使用图层而使用磁盘上的数据集。在上例中,您可双击 Extract by Mask 工具,然后将输入栅格参数(由 Elevation Raster 变量表示)更改为使用栅格数据集而非内容列表中的图层。此解决方案存在唯一的问题是,对图层可执行选择操作,而对磁盘上的数据集则不能执行选择操作。如果是因为需要使用图层中的选择内容而要使用某图层变量,则不能使用磁盘上的数据集。这种情况下,您有两种选择(除了使变量成为模型参数以外):
    • 在模型中,添加创建要素图层工具以便根据数据集变量创建图层变量,然后将该图层变量用作下一个模型流程的输入。(“创建要素图层”工具允许输入选择表达式。)
    • 创建图层文件 (.lyr),然后在模型中使用该 .lyr 文件。也就是说,在上述模型中,Elevation Raster 变量将指向 .lyr 文件。您可使用保存至图层文件工具创建 .lyr 文件。
注注:

除了将输入图层设置为模型参数外,由模型创建或更新的所有其他图层也都必须设置为模型参数。

脚本工具示例

将图层用作输入时,脚本工具存在与模型工具相同的问题。必须以参数形式传递每个图层,并且每个图层必须是正确的地理处理数据类型。脚本工具比较灵活,用户的选择余地更大;例如,使用与内容列表中图层名称匹配的字符串数据类型,脚本工具便可对图层执行操作。此方法尽管在前台中有效,但在后台中却不起作用,因为地图图层参考与后台进程之间不存在连接。下图演示的是某参数图层以字符串形式进行传递,并且脚本的属性也进行了修改,以便将图层用作输入。修改某脚本工具参数的数据类型

解决方案

请确保脚本工具参数使用的是正确的数据类型,如“要素图层”、“栅格图层”和“表视图”。

如果脚本工具使用的图层不属于参数,则需要

  • 使图层成为参数。
  • 不使用图层,改为使用磁盘上的数据集或 .lyr 文件。

问题 2 - 在脚本工具中使用当前地图 文档。

当前地图文档中运行的脚本工具必须在前台运行。MapDocument 类是在各种脚本工具中使用当前地图文档的有效方法。例如,在您的脚本中,可能自动缩放到了刚刚选择的要素。运行以下脚本将发生错误“Object: CreateObject 无法打开地图文档”。

选择要素并使用 ArcPy 映射缩放至这些要素的脚本示例

import arcpy

idvalue = arcpy.GetParameterAsText(0)

mxd = arcpy.mapping.MapDocument("CURRENT")

arcpy.SelectLayerByAttribute_management(
    "Parcels", "NEW_SELECTION", '"ID" = ' + idvalue)
df = arcpy.mapping.ListDataFrames(mxd)[0]
df.zoomToSelectedFeatures()
了解有关使用 MapDocument 类中 CURRENT 的详细信息。

解决方案

使用当前地图文档的脚本工具必须始终在前台中运行。在目录 窗口中,右键单击脚本工具,然后单击属性。在常规选项卡中,选中始终在前台中运行

在工具中运行工具

假设您的脚本工具使用上述当前地图文档,并且此工具必须始终在前台运行。如果在某模型工具中使用此脚本工具并且该模型工具需要在后台中运行,会出现什么情况?答案就是,模型会注意到其本身包含必须在前台执行的工具。如果包含任何必须在前台运行的工具,则模型工具将自动在前台中运行。

注注:

如果想要在后台运行某个模型,但是因选中且禁用了始终在前台中运行选项而被阻止,请检查模型的属性或模型所使用的脚本工具,并确保没有为这些工具选中始终在前台运行选项。

5/10/2014