RModel Builder是ArcGIS中另外一个最为精髓的地方之一。Model Builder可以其中一个工具的输出作为另一个工具的输入,以实现将一系列连续的工具串联起来,并将最终的模型结果作为一个工具使用!

当我们创建了一个模型以后,其实就相当于我们创建了一个工具,在arcpy中调用模型,其实就相当于调用一个工具,只是这个工具是自定义工具箱或第三方工具项中的工具。因此本节实际上是讲如何调用自定义工具箱或第三方工具项中的工具

创建Model Builder

这里我创建了一个简单的模型(如图 1所示),里面仅有一个缓冲区分析。模型有三个参数,分别是输入要素、缓冲距离已经输出要素。该模型保存在MyTools.tbx工具箱下,名称即为Buffer。直接双击Buffer模型,界面如图 2所示。
model.png
图 1 Buffer模型
buffer-window.png
图 2 Buffer模型窗体界面

ArcPy调用模型

名称处理

在上一节调用系统工具箱时,我们有讲到,ArcPy中对于工具的函数命名是有一定的规则的:工具箱的别名紧随工具名称之后,中间用下划线隔开,即工具名称_工具箱别名;或者是使用点进行分隔,工具箱的别名在前,工具名称在后,即:工具箱别名.工具名称。因此,我们先对工具名称与工具箱的别名进行处理。

选中模型Buffer,点击右键查看其属性(如图 3所示),我们可以看到其有一个名称为Buffer。名称默认是和我们创建模型保存时的名是一样的,这里我们可以更为其为MyBuffer(这与系统工具是不同的,系统工具名称无法更改)。

buffer-attrs.png
图 3 Buffer模型属性

选中工具箱MyTools.tbx,点击右键查看其属性(如图 4所示)。前面讲到,要使用工具箱中的工具,需要使用工具箱的别名。实际上,如果这里“没有”别名我们也可以使用,这需要我们在代码中给其定义别名。现在我们先给其起个别名:MyToolsAlias
tools-attrs.png
图 4 工具箱属性

使用模型

为了使用模型,我们需要使用arcpy.ImportToolbox方法将工具箱导入代码中,其定义如下:

  1. ImportToolbox(input_file, {module_name})
参数 说明 数据类型
input_file 要导入的自定义工具箱或第三方工具箱的路径 String
module_name 工具箱的别名。如果未定义工具箱别名,则可设置一个临时别名作为第二个参数;如果已经定义工具箱别名,则会覆盖原来的工具箱别名。 String

引用自:https://desktop.arcgis.com/zh-cn/arcmap/10.3/analyze/arcpy-functions/importtoolbox.htm

我们已经工具箱中定义了别名:MyToolsAlias,那么我们可以像向下方一样使用它:

  1. tool_box_path = "./data/MyTools.tbx"
  2. arcpy.ImportToolbox(tool_box_path)
  3. shp = "./data/Point.shp"
  4. distance = "0.3 Degrees"
  5. arcpy.MyBuffer_MyToolAlias("./data/buffer1.shp", distance, shp)
  6. arcpy.MyToolAlias.MyBuffer("./data/buffer2.shp", distance, shp)

这里我们如何确定初入参数的顺序的呢?有以下3种方法:

  1. 运行Buffer模型工具,参数从上往下依次为代码中参数的顺序;
  2. 对Buffer模型工具右键查看其参数,参数从上往下依次为代码中参数的顺序,我们也可以在这个页面中调整其顺序;
  3. 运行Buffer模型工具,查看工具帮助。(似乎有点多余)

如果我们在导入工具的时候指定别名,那么应该向下面这样使用:

  1. tool_box_path = "./data/MyTools.tbx"
  2. tool_alias = "MyToolAlias2"
  3. arcpy.ImportToolbox(tool_box_path, tool_alias)
  4. shp = "./data/Point.shp"
  5. distance = "0.3 Degrees"
  6. arcpy.MyBuffer_MyToolAlias2("./data/buffer3.shp", distance, shp)
  7. arcpy.MyToolAlias2.MyBuffer("./data/buffer4.shp", distance, shp)

OK,现在开心的使用Model Builder吧!