将子模型添加到模型

地理处理模型以模型工具的形式保存在工具箱中。模型工具可像任何其他地理处理工具一样在地理处理窗格中运行,并可在其他模型与 Python 脚本中使用。

在其他模型中添加和运行某个模型这种理念有时也称为子模型、嵌套模型或模型中的模型。通过在一个模型中使用另一个模型,可以将大模型分割为可重用的更小、更易于管理的模型。

要向模型添加子模型,请完成以下步骤。

  1. 创建模型,执行您要从其他模型调用的处理 - 子模型。您将在另一个模型中运行此子模型,因此应遵循模型工具的最佳做法创作子模型,包括设置模型工具的属性参数

    如果您已拥有要转换为子模型的模型的一部分,则可以复制模型变量和流程并将其粘贴到新模型,或对其分组并使用将组另存为新模型命令。

  2. 确保在完成上述步骤后保存模型,并准备好将模型添加到另一模型。
  3. 编辑或创建一个新的主模型。
  4. 使用将工具添加到模型的技术中的一种将子模型添加到主模型。您需要在目录窗格中找到子模型并将其拖动到主模型中,除非子模型位于工程工具箱中。

    子模型的输入和输出数据参数将自动转换为主模型中的变量。您可以通过右键单击子模型并单击创建变量 > 从参数 > <选择参数>,将子模型的其他参数显示为模型中的变量。

以下是在一个模型中使用另一个模型的两个主要原因:

  • 为了将复杂的大型模型简化为更小、更易于管理的模型。
  • 为了支持在较大模型的一个区域内使用模型迭代器

简化大型的复杂模型

通过在其他模型中嵌入模型工具,可以将大型的复杂过程划分为更易于在其他模型或脚本中进行管理和重复利用的小模型单位。此外,还可修改这些子模型,然后在无需编辑潜在难以处理的大型模型或重新运行整个过程的情况下重新运行这些子模型 - 如果某个子模型中出现错误,只需对该模型进行校正,然后重新运行单个模型,而不必再次运行整个过程。

大型模型
可以分为 4 个子模型的大型模型以及一个运行 4 个子模型的主模型的示例

上面的大模型可分解为四个子模型和一个主模型。较小的子模型可添加到主模型,并连接到最终进程。将子模型添加到其他模型时,子模型的输出参数将以输出变量的形式进行添加。

向主模型添加子模型

模型迭代器的高级应用

在其他模型中嵌入模型工具还可以实现模型迭代器的高级应用。如果工作流需要模型迭代,则需要运行多次的特定工具或过程必须与只需要运行一次的工具或过程分隔开。

注:

一个常见的误解是:仅模型迭代器下游的工具才会运行多次。如果模型包含迭代器,则模型中的所有过程都将运行多次。

应该将需要运行多次的所有工具放置在一个具有模型迭代器的模型中并将该模型用作子模型。只需运行一次的工具应该放置在主模型中,该主模型会调用迭代子模型。

以下示例是一个工作流,其中合并了一组来自地理数据库的输入。合并工具接受多个要素类以输入形式进行合并,但无法自动添加特定工作空间中的所有要素类。在这种情况下,迭代要素类模型迭代器可与收集值工具结合使用,从而读取工作空间中的所有要素类并将其存储在多值变量中。由于这两个过程都需要执行多次(迭代),因此会将其添加到子模型中,而合并工具应该只执行一次,因而将它添加到主模型中,并将其连接到包含迭代器的子模型的输出。

主模型和子模型

下面将逐步介绍如何创建上述的完整工作流。有关以下使用的术语和方法的详细信息,请参阅 ModelBuilder 词汇

  1. 创建两个模型:主模型和子模型,其中子模型将添加到主模型。向主模型添加合并工具,向子模型添加迭代要素类迭代器和收集值 工具。
  2. 在子模型中,设置包含要以迭代要素类迭代器的输入形式进行合并的要素类的工作空间。要仅迭代点要素类,请将迭代要素类要素类型参数设置为 POINT
  3. 迭代要素类的输出变量输出要素类连接到收集值工具,以便迭代和收集工作空间中各点要素类的路径。
  4. 将输入工作空间变量和收集值工具的输出变为模型参数。将输入工作空间变量重命名为输入数据集,以确保该变量名称是相关名称且易于理解。
    设置子模型
  5. 保存并关闭子模型,然后将其作为过程添加到主模型。将子模型添加到主模型时,子模型的参数会自动作为主模型中的变量进行添加。
    添加子模型
  6. 将子模型的输出变量连接为合并工具的输入数据集参数。确保“合并”工具的输出路径为有效路径。