查看并测试脚本

Python 脚本可用于自动化 ArcGIS Pro 中的任务。 您可以将自己创建的脚本作为 Python .py 文件与其他人共享。 但是,使用其他人编写的脚本需要掌握一些 Python 知识,即使只是更改要处理的数据集的名称。 为了以更易于使用的形式共享 Python 脚本,您可以创建 Python 脚本工具。

Python 脚本工具通过用户友好型界面,呈现 Python 脚本,与标准地理处理工具类似。 您可以添加代码,以验证用户输入并向用户提供反馈消息,因此,脚本工具的运行方式与标准地理处理工具类似。 您还可以包含内置的支持文档,以说明如何使用该工具并配置其参数。

创建脚本工具后,与其他用户共享 Python 脚本的功能更容易。 Python 脚本可以嵌入到自定义工具箱文件 (.atbx),因此,共享非常简单。

打开工程并查看数据集

首先,您将下载教程数据,打开现有工程,并查看将由该工具处理的数据。

  1. 下载本教程的 PythonTool.zip 文件,并在计算机上定位该文件。

    注:
    大多数 Web 浏览器默认将文件下载到计算机的 Downloads 文件夹中。

  2. 右键单击 PythonTool.zip 文件,并将其提取到 C:\Tutorials\ 文件夹。

    注:
    如果计算机上没有此文件夹,您可以创建一个并提取该 zip 文件。 您也可以将其提取到其他位置,但是,说明和脚本使用 C:\Tutorials 路径。 如果将 PythonTool 文件夹放在其他位置,您需要更新脚本以指向文件夹路径。

  3. 启动 ArcGIS Pro,并登录到 ArcGIS Online

    注:

    如果您没有组织帐户,请参阅软件访问权限选项

  4. ArcGIS Pro 中,单击打开其他工程

    单击打开其他工程。

  5. 打开工程窗口中,浏览到 PythonTool 文件夹,然后依次单击 Python Tool.aprx确定

    打开 PythonTool 工程。

    工程随即打开。

    华盛顿特区区域地图随即打开。

    该地图显示华盛顿特区区域的多个要素类。

  6. 如果目录窗格尚未显示,则在功能区的视图选项卡上,单击目录窗格
  7. 目录窗格中,展开文件夹PythonTool
  8. 展开 DC.gdb 地理数据库。

    展开“文件夹”、PythonTool 文件夹和 DC.gdb 地理数据库。

    地理数据库包含八个要素类。 其中一些是地图上的图层。

    PythonTool 文件夹还包含名为 neighborhood.shp 的 shapefile,也显示在地图上。

    假设您在城市办公室工作,经常收到对城市特定街区的数据提取请求。

    为了完成这项任务,您需要将地理数据库中的所有要素类裁剪到一个街区,并将裁剪后的要素类存储在新地理数据库中。 该新地理数据库应压缩为 ZIP 存档,以便您可以轻松对其进行共享,或将其用于备份目的。

    这是许多 GIS 工作场所中相对常见的任务。

    您可以在 ArcGIS Pro 中执行这些任务,方法为使用创建文件地理数据库工具创建新地理数据库,然后多次运行裁剪工具(针对每个要素类运行一次该工具)。 然后,您可以通过 File Explorer 或压缩实用程序创建 ZIP 存档。 此过程可能会很繁琐和耗时,特别是在要处理的要素类很多时。

    由于这是一个常规任务,因此将其进行自动化很有意义。

    工程包含自动化任务的脚本。 您将查看并测试此独立脚本,然后基于此脚本创建 Python 脚本工具。

查看并测试 Python 脚本

首先,您将打开脚本并查看其内容。

  1. File Explorer 中,浏览到 C:\Tutorials\PythonTool 文件夹。
  2. 右键单击 clip_zip.py Python 脚本文件,然后单击使用 IDLE 编辑 (ArcGIS Pro)

    右键单击脚本,然后单击“使用 IDLE 编辑 (ArcGIS Pro)”。

    注:
    如果您已安装 ArcGIS Desktop 10.x (ArcMap),则快捷菜单中还将包含快捷选项使用 IDLE 编辑。 请勿使用此快捷选项,因为此选项不会打开正确版本的 Python

    注:
    如果您使用的是 Windows 11,而使用 IDLE 编辑 (ArcGIS Pro) 选项未显示,单击显示更多选项,然后单击使用 IDLE 编辑 (ArcGIS Pro)

    脚本将在 Python 默认编辑器 IDLE 中打开。

    脚本在 IDLE 中打开。

    您将查看此脚本以了解其运行原理,并对其进行测试。

    脚本以导入模块开始:

    import arcpy
    import os
    import zipfile

    这些行可导入脚本将使用的模块。

    ArcPy 用于运行地理处理工具和相关任务,os 模块用于路径操作,zipfile 模块用于创建 ZIP 存档。

    脚本的下一部分可设置工作空间,以及输入和输出数据集的路径。 脚本(不包括备注)如下所示:

    arcpy.env.workspace = "C:/Tutorials/PythonTool/DC.gdb"
    clip_fc = "C:/Tutorials/PythonTool/neighborhood.shp"  
    gdb = "C:/Tutorials/PythonTool/Clip.gdb"
    gdb_path, new_gdb = os.path.split(gdb)
    gdb = "C:/Tutorials/PythonTool/Clip.zip"
    arcpy.env.overwriteOutput = True

    工作空间设置为 DC.gdb 地理数据库,其中包含需要裁剪的要素类。 neighborhood.shp 要素类将作为裁剪要素使用。 脚本将创建 Clip.gdb 地理数据库,该地理数据库将包含裁剪工具的输出。 通过 os.path.split(),地理数据库的完整路径分割为文件夹路径 (C:\Tutorials\PythonTool) 和地理数据库名称 (Clip.gdb)。 这些内容稍后将在脚本中作为单独的变量使用。 ZIP 存档 Clip.zip 将包含地理数据库 Clip.gdb 的完整内容。

    所有数据集均位于同一文件夹中,但对于要运行的脚本,这并非必要设置。 例如,新地理数据库可以在不同文件夹中创建。

    脚本接下来的内容可实现创建新地理数据库的功能。 系统会打印一条消息,确认新地理数据库已创建。

    arcpy.CreateFileGDB_management(gdb_path, new_gdb)
    print(f"Output geodatabase {gdb} created")

    接下来的部分可实现运行裁剪工具的功能:

    inputs = arcpy.ListFeatureClasses()
    for fc in inputs:
        fc_name = arcpy.da.Describe(fc)["baseName"]
        new_fc = os.path.join(gdb, fc_name)
        arcpy.analysis.Clip(fc, clip_fc, new_fc)
        print(f"Output feature class {new_fc} created")

    ListFeatureClasses() 函数返回工作空间(即 DC.gdb 地理数据库)中的所有要素类。 在接下来的 for 循环中,您会获取要素类的基本名称。 虽然在此示例中,该设置并不是完全必要的,但会使脚本更加可靠,因为在 shapefile 为输入时,其会移除任何文件扩展名,例如 .shp。 输出要素类的完整路径通过 os.path.join() 创建。 这是必要操作,因为您希望输出结果存储在 Clip.gdb 地理数据库而非工作空间中。 裁剪工具已运行,系统会打印一条消息,确认新要素类已创建。 对于列表中的每个要素类,这些步骤均会重复一次。

    最后的部分可实现创建 ZIP 存档的功能:

    with zipfile.ZipFile(out_zip, "w") as myzip:
        for f in os.listdir(gdb):
            if not f.endswith(".lock"):
                file_name = os.path.join(gdb, f)
                arc_name = os.path.join(new_gdb, f)
                myzip.write(file_name, arc_name)

    新的空 ZIP 存档通过 zipfile.ZipFile() 创建。 在这里,with 语句用于创建和打开文件,同时确保在处理完成后关闭文件。 地理数据库中的内容通过 os.listdir() 确定,该函数可返回地理数据库文件夹中所有文件的列表。 文件扩展名为 .lock 的文件会跳过。 其余的文件将写入 ZIP 存档。 变量 file_name 表示原始地理数据库中每个文件的完整路径。 变量 arc_name 表示要写入 ZIP 存档的每个文件,但只包括地理数据库的名称和文件名。 该函数可实现在 File Explorer 中手动创建 ZIP 存档的操作。

    现在,您已查看脚本,接下来准备对其进行测试。

  3. 在 IDLE 中,查看在脚本开头使用的路径。

    如果已将教程文件夹复制到 C:/Tutorials/PythonTool/ 之外的位置,您将需要使用 File Explorer 获取数据路径。

  4. 编辑此部分的四个路径:

    arcpy.env.workspace = "C:/Tutorials/PythonTool/DC.gdb"
    clip_fc = "C:/Tutorials/PythonTool/neighborhood.shp"  
    gdb = "C:/Tutorials/PythonTool/Clip.gdb"
    gdb_path, new_gdb = os.path.split(gdb)
    gdb = "C:/Tutorials/PythonTool/Clip.zip"
    arcpy.env.overwriteOutput = True

    注:
    请注意,脚本中的路径使用正斜线字符 (/) 作为路径分隔符。 如果您从 File Explorer 复制路径,默认 Windows 路径分隔符字符 \ 将使用。 您需要将脚本中的所有反斜线字符替换为正斜线字符。

    完整的硬编码路径仅存在于脚本的顶部部分,均已分配给变量。 脚本的其余部分会使用这些变量。 完整路径和文件名在此顶部部分之外不会重复出现。 此策略使识别需要更改的内容更容易,当脚本经过改编,稍后在本教程中作为 Python 脚本工具使用时,将会很有帮助。

  5. 在 IDLE 中,单击文件,然后单击保存,以保存对脚本的更改内容。

    保存脚本。

  6. 在 IDLE 中,单击运行,然后单击运行模块以运行脚本。

    在 IDLE 中运行脚本。

    脚本已运行。

    IDLE Shell 窗口随即显示,脚本在处理数据时打印进度消息。

    IDLE Shell 窗口可显示输出消息。

    注:
    如果路径修改不正确,该窗口可能会显示错误消息。 例如,如果工作空间设置不正确,名为 inputs 的列表将为空,脚本将返回以下错误:

    TypeError: ‘NoneType’ object is not iterable

    或者,如果 Clip.gdb 地理数据库的路径不正确,脚本将返回以下错误:

    ERROR 000732: File GDB Location: Dataset … does not exist or is not supported

    这些错误用于说明共享脚本时所面临的挑战。 创建脚本工具是避免这些类型的错误的好方法。

    如果脚本运行正确,系统会显示一条消息,确认地理数据库和裁剪后的要素类已创建。 您可以使用 ArcGIS ProFile Explorer 检查这一点。

  7. ArcGIS Pro目录窗格中,右键单击 PythonTool 文件夹,然后单击刷新

    在“目录”窗格中刷新 PythonTool 文件夹。

  8. 目录窗格的 PythonTool 文件夹中,验证 Clip.gdb 地理数据库是否已创建。

    Clip.gdb 地理数据库已创建。

  9. 展开 Clip.gdb 地理数据库。

    裁剪后的要素类已创建。

  10. Clip.gdb 地理数据库中,右键单击 bike_racks,然后单击添加至当前地图

    将 bike_racks 要素类添加到当前地图。

    裁剪后的新 bike_racks 图层已添加到地图。

    裁剪后的 bike_racks 图层已添加到地图。

  11. File Explorer 中,浏览到 C:\Tutorials\PythonTool 文件夹。

    Clip.zip 文件已添加到文件夹。

    Clip.zip 存档已添加到文件夹。

该独立脚本按预期方式运行。 如果想要将脚本用于不同的数据集,您可以打开脚本并修改路径。 对于不熟悉 Python 脚本编写的其他用户,该操作并不简单。 修改脚本中的路径也很容易出错。 在下一部分中,您将开发具有用户友好型界面的 Python 脚本工具。


创建工具并添加参数

进程的下一阶段是创建脚本工具并配置其参数。 在此阶段,您将设置工具的用户界面。

创建工具箱和脚本工具

您可在 ArcGIS Pro 中创建 Python 脚本工具。 这些工具存储在自定义工具箱中。 现在,您将在工程中创建自定义工具箱,并向其中添加脚本工具。

  1. ArcGIS Pro目录窗格中,右键单击 PythonTool 文件夹,然后依次单击新建工具箱 (.atbx)

    创建工具箱。

    工具箱已创建。

    工具箱已创建。

  2. 对于工具箱名称,输入 Clip_and_ZIP,然后按 Enter 键。

    输入 Clip_and_ZIP。

    工具箱名称为 Clip_and_ZIP

    工具箱已命名。

    注:
    较早版本的 ArcGIS Pro 使用 .tbx 格式。 您仍然可以使用此格式的较早工具箱,但在创建工具箱时,应自 ArcGIS Pro 3.0 起使用 .atbx 格式。

  3. 右键单击 Clip_and_ZIP 工具箱,指向新建,然后单击脚本

    在工具箱中创建脚本工具。

    新建脚本窗口随即显示。

    “新建脚本”窗口随即显示。

    此窗口用于设置工具的常规属性、配置工具参数、输入执行代码和添加验证代码。 您将在本教程的剩余部分完成所有这些步骤。

    现在,您将为脚本工具指定名称、标注和描述。

  4. 名称框中,输入 ClipandZIP

    工具名称是工具使用的内部唯一标识名称。 名称只能包含字母和数字。 空格和特殊字符不允许使用。

  5. 标注框中,输入 Clip and ZIP

    工具标注是工具箱中,以及在工具对话框中打开工具时显示的简明易懂的工具名称。 标注可以包含空格和特殊字符。

    下一个框是工具箱,包含脚本工具。 工具箱的路径和名称根据 .atbx 文件所在的位置显示,无法在窗口中更改。 需要注意的是,脚本工具并非单独的文件,而是 .atbx 文件的一部分。

  6. 描述框中,输入 This script tool allows you to select multiple feature layers or feature classes and clip them using one or more polygon features. The results are stored in a new geodatabase and a ZIP archive of this new geodatabase is created for easy sharing or backup.

    您添加到“新建脚本”窗口的信息

  7. 单击确定

    您已创建具有输入的常规属性的脚本工具。

  8. 目录窗格的 Clip_and_ZIP 工具箱中,双击 Clip and ZIP 工具。

    打开 Clip and ZIP 工具。

    该脚本工具随即在地理处理窗格中打开。 其包含地理处理工具的框架基础,但大部分内容仍为空。

    没有参数的 Clip and ZIP 脚本工具用户界面

  9. 关闭工具。

    下一步是配置工具的参数。

检查工具属性

仔细配置工具参数是创建 Python 脚本工具的关键部分。 工具参数用于定义工具的用户界面,工具的用户可在其中输入数据和其他值,这些内容将由脚本处理。

  1. 右键单击 Clip and ZIP 工具,然后单击属性

    检查脚本工具属性。

    工具属性:Clip and ZIP 窗口随即显示,先前条目已自动填充到常规选项卡上。

  2. 单击参数选项卡。

    单击“参数”选项卡。

    您将在此处配置工具参数。 工具参数以表格形式组织,每一行显示一个参数,而列则显示每个参数的属性。

    “工具参数”选项卡显示空表格。

    您将使用此表格来创建以下参数:

    • 输入要素图层 - 用户可以选择活动地图中的任何要素图层,或浏览到磁盘上的任何要素类。
    • 裁剪面 - 用户可以选择面要素图层,浏览到磁盘上的面要素类,或在活动地图中创建由面组成的要素集。
    • 输出地理数据库 - 用户可以指定新地理数据库的路径和文件名,以存储结果。
    • 输出 ZIP 存档 - 用户可以指定要使用地理数据库内容创建的 ZIP 存档的路径和文件名。

添加输入要素图层参数

首先,您将添加输入要素图层参数。

  1. 标注列中,输入 Input feature layers,然后按 Enter 键。

    输入参数标注。

    参数标注是参数的可读标注,在工具窗格中显示。

    参数名称会根据标注自动填充,其空格将由下划线代替。 参数名称由脚本工具内部使用,在 Python 脚本中设置工具参数时,您也可以使用参数名称。

  2. 数据类型列中,单击更改数据类型按钮。

    单击该按钮,以更改参数的数据类型。

    参数数据类型窗口随即显示。

    “参数数据类型”窗口随即显示。

    默认值为字符串,但您可将其更改为要素图层

  3. 单击数据类型下拉列表,滚动至列表的 F 部分,然后单击要素图层

    选择“要素图层”作为数据类型。

    将数据类型设置为要素图层后,您可以使用工具上的下拉列表,选择活动地图中的要素图层,或浏览到磁盘上的要素类。

    您希望该工具能够接受多个输入要素图层。

  4. 选中多个值

    选中“多个值”。

    选中多个值意味着,用户可以为该工具的此参数选择一个或多个输入。 输入可以是要素图层和要素类的组合。

  5. 单击确定,以关闭参数数据类型窗口。

    要素图层输入参数已配置。

  6. 对于类型,接受必填默认值。

    将参数设置为必填意味着,如果该参数未设置,则工具无法运行。

  7. 对于方向,接受输入默认值。

    将参数的方向设置为输入后,工具将收到指示:该参数是其将处理的输入图层或输入值之一。 该工具还可以在 ModelBuilder 中使用,其中要素图层可以作为输入连接到工具。

    第一个参数的配置已完成。 您可以立即检查一下只有这一个参数的脚本工具的外观。

  8. 工具属性:Clip and ZIP 窗口中,单击确定
  9. 目录窗格的 Clip_and_ZIP 工具箱中,双击 Clip and ZIP 工具。

    该脚本工具随即在地理处理窗格中打开。 现在,第一个参数已显示。 您可以使用下拉列表,从活动地图中选择要素图层,还可以使用浏览按钮,浏览磁盘上的要素类。 参数标注前的红色星号指示这是必填参数。

    已配置第一个参数的 Clip and ZIP 工具窗格。

    在此阶段,您将配置工具参数,并查看工具用户界面,以测试参数是否正确显示。 由于尚未添加 Python 代码,您还不能测试工具是否正常运行。

    注:
    如果选择至少一个输入要素图层,并运行工具,您将收到错误消息。

    如果现在尝试运行工具,您将收到错误消息。

  10. 关闭工具。

添加“裁剪面”参数

接下来,您将配置裁剪面的参数。

  1. 右键单击 Clip and ZIP 工具,然后单击属性
  2. 参数选项卡上表格第二行中,单击标注列,输入 Clip Polygons,然后按 Enter 键。

    “裁剪面”参数的行已部分填写。

    参数的名称更新为 Clip_Polygons

  3. 数据类型列中,单击更改数据类型按钮。
  4. 对于数据类型,单击下拉列表,然后单击要素集

    将数据类型设置为“要素集”。

    要素集是要素类的轻量级表示。 在地理处理工具的上下文中,对于要素集,工具可以接受交互式输入。 用户可以通过在地图上绘制来创建要素,就像通过编辑创建要素窗格来创建要素一样。 用户还可以从活动地图中选择要素图层,或浏览到磁盘上的要素类。

  5. 单击确定,以关闭参数数据类型窗口。
  6. 对于类型,接受必填默认值。
  7. 对于方向,接受输入默认值。

    接下来,您将为该参数设置过滤器,以便工具的裁剪面参数只接受面要素作为输入。

  8. 向右滚动并单击过滤器列。

    单击“过滤器”列。

  9. 单击过滤器下拉列表,并选择要素类型

    选择“要素类型”。

    要素类型过滤器窗口随即显示。

  10. 选中

    选中“面”作为“要素类型过滤器”。

    现在,运行工具时,您只能使用面作为输入裁剪几何。

  11. 要素类型过滤器窗口中,单击确定

    您已配置裁剪面参数。

添加输出地理数据库参数

接下来,您将配置输出地理数据库参数。

  1. 参数选项卡上表格第三行中,单击标注列,输入 Output geodatabase,然后按 Enter 键。
  2. 数据类型列中,单击更改数据类型按钮。
  3. 对于数据类型,单击下拉列表,然后依次单击工作空间确定

    将输出地理数据库参数的数据类型设置为“工作空间”。

  4. 对于类型,接受必填默认值。
  5. 单击方向列,并在下拉列表中选择输出

    将“方向”设置为“输出”。

    方向设置为输出后,工具将收到指示:该参数是其将生成的输出之一。 该工具还可以在 ModelBuilder 中使用,在其中,该工具将生成输出项。

  6. 单击过滤器列。
  7. 单击过滤器下拉列表,并选择工作空间

    将“过滤器”设置为“工作空间”。

  8. 工作空间过滤器窗口中,选中本地数据库

    选中“本地数据库”。

    将过滤器设置为本地数据库意味着,用户只能将文件地理数据库而非企业地理数据库或文件夹指定为输出。

  9. 单击确定

    您已配置输出地理数据库参数。

添加输出 zip 存档参数

接下来,您将配置输出 zip 存档参数。

  1. 参数选项卡上表格第四行中,单击标注列,输入 Output ZIP archive,然后按 Enter 键。
  2. 数据类型列中,单击更改数据类型按钮。
  3. 对于数据类型,单击下拉列表,然后依次单击文件确定

    将“数据类型”设置为“文件”。

    zip 存档为文件,这表明数据类型正确无误。

  4. 单击方向列,并在下拉列表中选择输出
  5. 单击过滤器下拉列表,并选择文件

    将“过滤器”设置为“文件”。

  6. 文件过滤器窗口的扩展名框中,输入 zip

    输入 zip。

    文件扩展名应仅为扩展名的字母部分,不包括文件扩展名分隔符“.”。 请勿输入 .zip

    文件扩展名不区分大小写。

  7. 单击确定

    您已添加该工具的所有参数。

    所有参数均已添加。

  8. 工具属性:Clip and ZIP 窗口中,单击确定

    接下来,您将测试所配置的参数。

测试参数

创建所有工具参数后,您可以测试工具窗格,以确保每个参数按照预期设置运行。

  1. 目录窗格的 Clip_and_ZIP 工具箱中,双击 Clip and ZIP 工具。

    Clip and ZIP 工具随即打开;所有参数均已添加到工具窗格。

    Clip and ZIP 工具随即打开。 现在,您在之前步骤中配置的所有参数均显示在工具窗格中。

  2. Clip and ZIP 工具上,单击输入要素图层下拉列表,然后单击 bike_racks

    bike_racks 下方显示第二个输入要素图层框,因为此工具参数接受多个值。

    该工具已添加 bike_racks 图层

  3. 单击输入要素图层浏览按钮,展开 DC.gdb 地理数据库,然后依次单击 bike_routes确定

    浏览到 DC.gdb 地理数据库中的 bike_routes 要素类。

    bike_routes 要素类不在地图上,但您已将其添加到 Clip_and_ZIP 工具。

    bike_routes 要素类已添加到该工具。

    这表明用户可以选择多个输入,包括来自活动地图的要素图层和磁盘上的要素类。

  4. 单击裁剪面草图工具。

    单击“裁剪面”草图工具。

    要素集草图输入限制为面要素。

    裁剪点要素或线要素会导致错误,该限制措施可防止其他人尝试这样做。

    现在,您将测试输出。

  5. 输出地理数据库框中,输入 C:\Tutorials\PythonTool\Clip,然后单击输出 ZIP 存档文本框。

    文件夹路径会产生错误标记。

    输入文件夹路径后,输出地理数据库参数会显示错误警告图标。

  6. 指向错误警告图标。

    错误消息指示工作空间类型不正确。

    系统会显示错误消息,指示指定位置不存在地理数据库,或者工作空间类型不正确。

    此外,如果您所输入的文件扩展名(例如,.fdb)不正确,系统会自动将其更改为 .gdb

    对于最后一个参数,您将进行类似验证。

  7. 输出 ZIP 存档框中,输入 C:\Tutorials\PythonTool\Clip,然后单击输出地理数据库文本框。

    工具会在 Clip 后添加文件扩展名 .zip

    zip 后缀已添加。

  8. 输出 ZIP 存档框中,输入 C:\Tutorials\PythonTool\Clip.zipped,然后单击输出地理数据库框。

    如果所输入的路径结尾的文件扩展名不正确,输出 ZIP 存档参数会显示错误警告图标。

  9. 指向错误警告图标。

    错误消息显示文件类型的输入不正确。

    如果指向图标,系统会显示错误消息,指示文件类型不正确。

  10. 关闭工具。

    您的测试显示,所配置的过滤器和其他参数均按设置运行。 仔细设计参数使工具更加可靠,因为可以防止用户使用无效值运行工具。

    您已测试参数,但工具尚未做好运行准备,因为代码尚未添加。 您将在接下来执行此操作。

编辑执行代码

Python 脚本工具的执行代码是,当用户在地理处理窗格中,单击运行时运行的 Python 代码。 您将使用之前查看的独立脚本,但需要对其进行一些更改,以便脚本能够接收用户在工具窗格中输入的参数。

  1. 右键单击 Clip and ZIP 工具,然后单击属性
  2. 单击执行选项卡。

    单击“执行”选项卡,以查看工具的 Python 代码模板。

    该选项卡显示脚本工具的 Python 代码模板。

    Python 代码模板。

    代码以脚本文档的多行注释占位符开头。 在 Python 中,多行注释以三个引号开始,并以三个引号结束。 Python 不会运行放置在注释中的文本。

    在注释之后,代码的第一行是 import arcpy。 大多数地理处理工具脚本将使用 ArcPy,因此其包含在模板中。

    接下来,代码定义了名为 script_tool() 的函数。 函数通过 def 关键字,后跟函数名称和函数参数的形式创建。 您将更改模板函数的名称以匹配工具。

    模板函数指定两个参数,但工具需要更多参数;这是您需要更改的另一项内容。

    脚本工具的执行代码将放置在此函数内部。

    函数模板块的末尾为 return 语句。 该语句用于结束函数并返回结果。

    代码的最后部分以 if __name__ == '__main__': 开头。 这是条件语句,只有当条件评估为 True 时,后面的缩进代码块才会运行。 任何脚本的变量 __name__(左右两侧各有两个下划线)均具有 '__main__' 值。

    当您将代码作为脚本运行(例如,运行脚本工具)时,缩进代码块将运行。 但是,对于导入的模块,变量设置为模块名称。 在这种情况下,缩进代码块将不会运行。 此代码结构可用于区分将代码作为脚本运行,还是将代码作为模块导入到另一个脚本中。 在这里,此场景并不适用。 只需了解当运行脚本工具时,缩进代码块将会运行,即可创建脚本工具。 代码块通过 ArcPy 函数 GetParameterAsText() 接收参数,然后将该参数传递给函数 ScriptTool(),该函数接受该参数后被调用。

    模板使用两个参数,分别为 param0 和 param1。 这些参数只是临时占位符;您需要对其进行编辑以匹配脚本。

    注:
    在接下来的步骤中,您将开始修改执行代码。 了解代码的存储位置至关重要。 默认情况下,Python 代码是嵌入式的。 这意味着,该代码是 .atbx 工具箱文件的一部分,而不会单独存储。 但是,为了便于编辑,您可以将代码导出为 .py 文件,操作完成后,将代码嵌入回来。 在对代码进行渐进式更改时,您可以练习此工作流。

    接下来,您需要将函数 script_tool() 的名称修改为更有意义的名称。 首先,您将直接在工具属性对话框中编辑嵌入式代码。

  3. 执行选项卡的代码框中,将 def script_tool(param0, param1): 一行编辑为 def ClipZip(param0, param1):

    在此处对其进行更改:

    更改函数名称。

    其应如下所示:

    已添加新函数名称。

    当您在工具属性对话框中修改代码时,已修改的代码行前面会显示黄色标记。

  4. 在代码框中,将 script_tool(param0, param1) 一行编辑为 ClipZip(param0, param1)

    编辑函数名称,函数将通过该名称调用。

    现在,您已在脚本工具模板中更新了两个位置的函数名称。

    虽然以这种方式编辑代码非常便捷,但与典型 Python 编辑器相比,代码框的功能十分有限。 接下来,您将了解两种在 Python 编辑器中编辑执行代码的方法。

  5. 执行选项卡中,单击代码框下方的确定

    单击“确定”。

    对嵌入式代码的更改内容会自动保存,当您关闭工具属性对话框时,黄色标记将消失。

  6. 右键单击 Clip and ZIP 工具,然后单击属性
  7. 在代码框底部,单击在脚本编辑器中打开按钮。

    单击“在脚本编辑器中打开”。

    临时脚本文件随即在默认 Python 编辑器中打开。 除非您已配置其他编辑器,否则脚本将在 IDLE 中打开。

    IDLE 中的临时脚本文件

    脚本框中的编辑内容均已保存到脚本中。

    注:
    您可以通过工程选项卡配置 Python 编辑器。 单击工程选项卡,单击选项,然后单击左侧窗格中的地理处理脚本编辑器选项默认为空,这意味着 IDLE 已使用。 您可以通过指定路径,将其更改为首选编辑器。 IDLE 足以达成本教程目标。

    路径将类似于:C:\Users\UserName\AppData\Local\Temp\1\ArcGISProTemp19512\

    文件名由字母 tmp(后跟字母数字代码)以及 .py 文件扩展名组成。 当您对代码进行更改并保存 .py 文件时,这些更改内容将添加到嵌入式执行代码块。 您将练习此工作流。

  8. IDLE 中,在 import arcpy 下方添加新代码行,并添加以下代码:

    import os
    import zipfile

    两个导入语句已添加到临时脚本。

    这两个模块在原始的独立脚本中使用。 您可以从脚本中复制并粘贴代码,或者手动输入代码。

  9. IDLE 中,单击文件,然后单击保存

    保存临时 Python 脚本。

  10. 关闭 IDLE

    现在,您在 IDLE 中添加的代码位于代码框中。

    现在,您在 IDLE 中添加的代码位于代码框中。

    接下来,您将在独立脚本文件中编辑脚本参数。

将脚本保存到单独的文件中

到目前为止,您所使用的代码已嵌入在工具箱中。 您还可以将代码导出到 .py 文件中,以便在首选 Python 编辑器中对其进行使用。

  1. 执行选项卡中,单击脚本框上方的将脚本导出至文件按钮的绿色箭头。

    导出脚本。

  2. 导出脚本窗口中,确认位置为 PythonTool 文件夹,并在名称中输入 clip_zip_tool.py

    为输出的 .py 文件命名。

    包含您需要传递和更新的大部分代码的原始脚本,已命名为 clip_zip.py,因此,请确保使用不同的名称,以免覆盖原始文件。

  3. 单击保存

    现在,您已将代码从脚本框中导出到外部 Python 脚本文件中,代码不再存储在工具箱中。

    框顶部显示脚本文件的路径。

    .py 脚本文件的路径显示在代码框顶部。

    拥有单独 .py 脚本文件的好处是,您现在可以更轻松地在首选编辑器中处理代码。 但是,在本教程中,您将继续使用 IDLE

    工具属性窗口中显示的代码不再是嵌入式代码,而是 .py 文件中的代码。 但是,您仍然可以直接在工具属性窗口中编辑代码,当您关闭工具属性窗口时,.py 文件将自动保存。

    在本教程的大部分剩余内容中,您将在 IDLE 中打开 .py 文件,而非在工具属性窗口中编辑该文件。

  4. 在代码框底部,单击在脚本编辑器中打开按钮。

    .py 文件在 IDLE 中打开。

    脚本在 IDLE 中打开。

    文件名和路径不再是临时的。

    注:
    您可以同时在执行选项卡的代码框和 IDLE 中编辑 .py 脚本文件代码。 但这不是最佳做法。 您将收到警告消息,并需要确定保留哪些更改内容。 为了避免这种情况,请一次只在一个应用程序中编辑脚本。

    现在,您已将代码导出到 .py 文件中,将关闭此窗口。

  5. 属性窗口中,单击确定

    关闭“属性”窗口。

    接下来,您将更改代码以匹配脚本工具参数。

  6. IDLE 中,将 if __name__ == "__main__": 行之后,以 param0param1 开头的两个参数行替换为以下代码:

        inputs = arcpy.GetParameter(0)
        clip_fc = arcpy.GetParameterAsText(1)
        gdb = arcpy.GetParameterAsText(2)
        out_zip = arcpy.GetParameterAsText(3)

    默认模板参数

    已更新的代码应如下所示:

    已更新的参数

    注:
    重要的是,新行的缩进级别要匹配四个空格的原始缩进级别。

    您已为脚本工具设置四个参数。 Python 脚本将以此方式接收这四个参数。

    通过 ArcPy 函数 GetParameter()GetParameterAsText(),您可以获取脚本工具的参数。 工具用户界面将参数作为 Python 元组传递给脚本,元组是元素的索引从零开始的序列数据类型。 第一个参数的索引为零,第二个参数的索引为一,依此类推。 这些索引值由每个新行末尾的括号中的数字引用。 如果这些数字的顺序与工具用户界面中参数的顺序不匹配,脚本所获取的数据值不正确。

    注:
    ArcGIS Pro 3.2 起,您还可以通过参数名称引用参数。 例如,您可以使用 arcpy.GetParameter("Input_feature_layers") 而非 arcpy.GetParameter(0)。 您能够以任何顺序输入参数,而无需了解每个参数的索引。

    第一个参数由 Python 列表组成,该列表可能包含多个输入要素类名称。 函数 GetParameter() 会保留这种格式,因此,使用该函数接收第一个参数。 使用 GetParameterAsText() 以文本形式接收其他参数。

    每个参数值均分配给变量。 这些变量将传递给 ClipZip 函数。 所选择的变量名称需要与现有独立脚本中的代码保持一致。

  7. 编辑 ClipZip(param0, param1) 行,将 param0, param1 替换为包含参数值的变量:

    ClipZip(inputs, clip_fc, gdb, out_zip)

    更新调用 ClipZip 函数的代码行中的参数。

    更改内容应如下所示:

    参数已更新。

    这行代码通过这些参数调用 ClipZip() 函数。

  8. 删除 arcpy.SetParameterAsText(2, "Result") 行。

    删除模板 SetParameterAsText 行。

    此脚本工具不使用模板中的这行代码。

    接下来,您将更新 ClipZip() 函数的定义。

  9. 编辑 def ClipZip(param0, param1): 行,将 param0, param1 替换为包含参数值的变量:

    def ClipZip(inputs, clip_fc, gdb, out_zip):

    更新 def ClipZip 行。

    更改内容应如下所示:

    函数定义已更新,函数接受新参数。

    这会定义接受四个参数的 ClipZip() 函数。

    函数定义中变量的名称,不一定必须与“参数”选项卡中的参数相同,只要这些变量的顺序与这些参数相同即可。 函数定义行中变量的名称,必须与定义函数功能的代码块中变量的名称保持一致(该代码块尚未添加)。

  10. IDLE 中,单击文件,然后单击保存

    IDLE 中的更改内容已保存到脚本文件。

    脚本应如下所示:

    到目前为止的脚本进展情况

    接下来,您将向代码块添加原始脚本的代码。

复制原始脚本中的代码

原始脚本包含您将添加到脚本工具的代码块的代码。

  1. IDLE 中,单击文件,然后单击打开

    在 IDLE 中打开文件。

  2. C:\Tutorials\PythonTool 文件夹中,单击 clip_zip.py,然后单击打开

    打开 clip_zip.py 文件。

  3. IDLE 中,对于 clip_zip.py 脚本,单击 # Workspace and datasets 行的开头,然后单击并拖动鼠标,以将内容选择到脚本结尾,import 行除外。

    单击并拖动鼠标以选择大部分脚本。

  4. 右键单击所选代码,然后单击复制

    复制代码。

  5. IDLE 中,切换到 clip_zip_tool.py窗口。
  6. 选择 """Script code goes below""" 注释。

    选择注释。

  7. 右键单击所选代码,然后单击粘贴

    将原始脚本中的代码粘贴到代码块中。

    代码将粘贴到 ClipZip 函数的代码块中。

    代码粘贴到函数定义的代码块中。

    您已完成原始脚本的导入。 现在,您可以关闭该窗口,专注于 clip_zip_tool.py 代码。

  8. IDLE 中,关闭 clip_zip.py 脚本窗口。

    复制到 clip_zip_tool.py 脚本中的整个代码块,需要缩进四个空格,成为函数的一部分。

    您可以手动执行此操作,即在每行前输入四个空格,还可以选择所有要缩进的行,然后同时对所选行进行缩进。

    在这种情况下,最好选择同时对所选行进行缩进,以避免出错,因为缩进空格在 Python 中具有重要意义。 如果您在一个代码行中意外添加了三个空格或五个空格,代码将无法正确运行。 此外,由于代码有多行内容,并且包含循环和条件语句的缩进部分,手动添加缩进空格很可能引入错误。

  9. IDLEclip_zip_tool.py 窗口中,单击并拖动鼠标,以选择粘贴的尚未缩进四个空格,与代码块内容不匹配的代码。

    # Workspace and datasets 行是否缩进,取决于在代码中进行粘贴时,是否选择了 """Script code goes below""" 注释之前的空格。

    确保将内容选择到 return 行之前的代码。

    选择要缩进的行。

  10. 单击格式,然后单击缩进区域

    对所选区域进行缩进。

    每个代码行都将额外缩进四个空格。

    现在,代码块已缩进。

  11. 验证 ClipZip 函数代码块,查看自 def ClipZip 行之后的第一行起,至止 return 行的代码是否均已缩进四个空格(循环或条件语句行缩进更多空格)。
  12. IDLE 中,单击文件,然后单击保存

移除硬编码值

原始脚本中的几行代码将变量设置为特定路径,称为硬编码路径。 因此,脚本能够定位和处理数据。 但是,在脚本工具中,工具的用户使用工具用户界面的控件指定输入和输出。 您已经设置脚本,以使用 arcpy.GetParameterarcpy.GetParameterAsText,从工具用户界面获取这些信息。 下一步是移除硬编码行。

  1. 删除用于指定硬编码路径的每一行。

    这些需要删除的行以 arcpy.env.workspace = clip_fc = gdb =out_zip = 开头。

    删除硬编码路径行。

  2. 删除 arcpy.env.overwriteOutput = True 行。

    您无需保留此行,因为当代码作为脚本工具运行时,overwriteOutput 属性由 ArcGIS Pro 控制。

  3. 保留通过分割 gdb 变量值,为变量 gdb_pathnew_gdb 分配值的代码行。

    保留用于分割 gdb 路径的行

  4. 验证该行已缩进四个空格,缩进级别与注释 # Workspace and datasets 相同。

    现在,您已删除所有包含硬编码值的代码行。 脚本将从脚本工具参数获取这些值。

  5. 保存脚本。

将 print 语句更改为消息

原始脚本使用 print 语句,将状态打印到 IDLE Shell 窗口。 仅当在脚本编辑器中运行脚本时,此操作才有效。 您将编辑 print 语句,以使用 arcpy.AddMessage 将此信息发送到地理处理消息框。

脚本包含三个 print 语句。 您将更改其中两个,并删除剩下的一个。

  1. 编辑 print(f"Output geodatabase {gdb} created") 行,将 print 更改为 arcpy.AddMessage

    行现在应该如下所示:

    arcpy.AddMessage(f"Output geodatabase {gdb} created")

    编辑该行,以使用 arcpy.AddMessage 而非 print。

    代码中的下一个 print 语句打印输入要素类的列表。 现在,脚本工具已设置 inputs 变量要素类列表,因此使用 arcpy.ListFeatureClasses 设置输入的行不再需要。 您将删除此 print 语句和生成列表的行。

  2. # Clip each input feature class 部分,选择 inputs = arcpy.ListFeatureClasses() 行和 print(inputs) 行,然后将其删除。

    选择两行。

    该部分应如下所示:

    在删除这些行后,代码如下所示。

    现在,您将编辑第三个 print 语句。

  3. 编辑 print(f"Output feature class {new_fc} created") 行,将 print 更改为 arcpy.AddMessage

    该行应如下所示:

    arcpy.AddMessage(f"Output feature class {new_fc} created")

    第三个 print 语句已转换为使用 arcpy.AddMessage。

  4. IDLE 中,单击文件,然后单击保存

    创建 ZIP 文件的最后一部分代码无需进行任何更改。

  5. 关闭 IDLE

测试脚本工具

现在,脚本工具已准备就绪,可以进行测试。

  1. ArcGIS Pro目录窗格中,展开 DC.gdb 地理数据库。

    展开 DC 地理数据库。

  2. 右键单击 bike_routes,然后单击添加至当前地图
  3. 展开 Clip_and_ZIP.atbx 工具箱,双击 Clip and ZIP 工具。

    Clip and ZIP 工具随即打开。

    Clip and ZIP 工具已准备就绪,可以进行测试。

  4. 对于输入要素图层参数,单击添加多个箭头按钮。

    “添加多项”按钮

  5. 添加多个对话框中,选中 bike_racksbike_routesbus_lines,然后单击添加

    添加多个输入要素图层。

  6. 对于裁剪面参数,选择 neighborhood 图层。
  7. 对于输出地理数据库参数,输入 C:\Tutorials\PythonTool\Clip.gdb
  8. 对于输出 ZIP 存档参数,输入 C:\Tutorials\PythonTool\Clip.zip

    工具已准备就绪,可以进行测试。

  9. 单击运行

    工具将运行。 运行完成后,工具底部将显示绿色通栏,指示运行已完成。

  10. 在通栏上,单击查看详细信息

    查看详细信息。

    工具的消息部分显示,工具通过从 print 语句修改为 arcpy.AddMessage 的代码生成的消息。

  11. 关闭详细信息窗口。
  12. 单击目录选项卡。

    Clip.gdb 地理数据库已添加到工程文件夹。

    Clip.gdb 已添加。

    目录窗格未显示 zip 存档文件,但您可以使用 Windows File Explorer 验证其是否已创建。

    Windows 文件资源管理器中的 Clip.zip 文件。

您已创建功能完备的 Python 脚本工具。 该工具具有输入和输出参数,包含一些针对这些参数的基本过滤器,以防止出现一些常见问题。

下一部分将介绍,如何向脚本工具添加更多验证代码,以使其更加可靠。


通过验证功能提高工具性能

脚本工具旨在处理用户输入。 验证用于确保用户输入具有意义,并且不会导致错误。 验证的第一步是仔细设计工具参数。 例如,裁剪面参数具有过滤器,以确保只选择面要素类。 在本部分中,您将浏览其他验证方法。

添加检查空要素类的功能

我们考虑一下其中一个输出要素类为空的情况。 当输入要素类的任何要素均不在裁剪面的边界内时,这种情况就会发生。 在这种情况下,发送输出为空的消息将非常有帮助。

  1. 目录窗格中,右键单击 Clip and ZIP 工具,然后单击属性
  2. 单击执行选项卡。
  3. # Clip each input feature class 部分中,选择 arcpy.AddMessage(f"Output feature class {new_fc} created") 行。

    选择此行。

  4. 将该行替换为以下代码:

    count = int(arcpy.management.GetCount(new_fc)[0])
            if count > 0:                                       
                arcpy.AddMessage(f"Output feature class {new_fc} created")
            else:
                arcpy.AddWarning(f"Output feature class {new_fc} created but does not contain any features.")

  5. 验证代码缩进是否匹配此图像:

    检查缩进。

    新代码开始于 count = int(arcpy.management.GetCount(new_fc)[0]) 行,该行用于获取输出要素类中要素的数量。 此行的缩进级别,应与其之前的以 arcpy.analysis.Clip 开头的行相同。

    下一行使用 if 条件语句,判断新要素类中是否存在要素。 如果其中存在要素,则条件块会运行,并显示原始消息。 如果其中不存在要素,则 else 块会运行,并使用 arcpy.AddWarning 显示警告消息,该消息指示要素类已创建,但为空。 ifelse 之后的两行条件语句,应相对于上一行缩进四个空格。

  6. 单击确定,关闭工具属性窗口,并保存更改内容。
  7. 双击 Clip and ZIP 工具。
  8. 输入要素图层窗格中,单击“浏览”按钮,在 DC.gdb 地理数据库中单击 points_outside 要素类,然后单击确定

    选择 points_outside 要素类作为工具输入。

    此要素类包含所有位于邻域 shapefile 面外部的点要素。 您将使用此要素类测试工具。

  9. 对于第二个输入要素图层,从地图中选择 bike_routes 图层。
  10. 对于裁剪面参数,选择 neighborhood 要素图层。
  11. 对于输出地理数据库参数,输入以下路径:C:\Tutorials\PythonTool\Clip_empty.gdb
  12. 对于输出 ZIP 存档参数,输入以下路径:C:\Tutorials\PythonTool\Clip_empty.zip
  13. 单击运行

    该工具随即运行。 运行完成后,工具底部将显示黄色通栏,指示运行已完成,但存在警告。

  14. 在通栏上,单击查看详细信息

    查看警告信息。

    工具的消息部分显示由已更新的代码生成的消息。 警告消息指示,points_outside 要素类已创建,但不包含要素。

    工具消息包含警告信息。

    其他工具消息按预期方式显示。

  15. 关闭 Clip and ZIP 消息和 Clip and ZIP 工具。

    这种类型的验证在工具运行并生成输出后进行, 而在工具运行前,同样可以进行。

使用验证功能检查空输入

我们考虑一下,用户所选择的裁剪面由空要素类组成的情况。 这不会引发错误,因为输入是有效的。 但是,由于所有新创建的要素类均为空,输出将没有意义。 如果能够提前知道输出没有意义,理想情况下,工具应该不会运行。

您将修改脚本工具属性,添加检查空输入的功能。 这种类型的验证功能采用不同的验证方式,而不会向脚本文件添加验证代码。

  1. 目录窗格中,右键单击 Clip and ZIP 工具,然后单击属性
  2. 单击验证选项卡。

    转至“验证”选项卡。

    验证选项卡显示代码框,但这不是脚本文件。 此处的代码仅存在于工具属性中,不会作为单独的 .py 文件存储。 验证选项卡包含模板代码,您可以直接对其进行编辑。

    ToolValidator 模板代码

    模板代码显示名为 ToolValidator 的类。 该类包含多种方法,用于不同类型的验证。 大部分验证在工具运行前进行。

    您可以直接在代码框中修改代码,也可以单击在脚本编辑器中打开,将代码作为临时脚本文件打开。

  3. 单击在脚本编辑器中打开

    在 IDLE 脚本编辑器中打开代码。

  4. def updateMessages 部分中,选择两个注释行。
  5. 选择 def updateMessages 代码块中的三行。

    return 行和两个注释行已选择。

  6. 复制并粘贴以下代码,以替换注释和 return 语句:

    # When the clip polgyon feature set, feature layer or
        # feature class does not contain any features, a warning
        # message appears in the tool dialog since this would result
        # in empty feature classes in the new geodatabase.
        if self.params[1].value:
            count = int(arcpy.management.GetCount(self.params[1].value)[0])
            if count < 1:
                self.params[1].setWarningMessage("No clip features. This results in empty outputs.")
        return

    在代码中进行粘贴。

    代码粘贴到方法定义中。 但是,这存在问题。 注释的第一行已正确缩进,但其后的所有行均需要额外缩进四个空格。

    请注意,粘贴的代码中有一些缩进不正确。

  7. 选择需要缩进的行。

    选择需要缩进的行。

  8. 单击格式,然后单击缩进区域
  9. 验证缩进现在是否正确。

    验证缩进是否正确。

  10. IDLE 中,单击文件,然后单击保存
  11. 关闭 IDLE

    ArcGIS Pro 中,指示已进行更改的警告会出现。

  12. 单击
  13. 单击确定关闭工具属性窗口。
  14. 双击 Clip and ZIP 工具。
  15. 对于输入要素图层,添加 bike_racksbike_routes 图层。
  16. 对于裁剪面参数,单击“浏览”按钮,在 DC.gdb 地理数据库中单击 polygon_empty 要素类,然后单击确定

    选择 polygon_empty 要素类。

    polygon_empty 要素类是没有任何要素的面要素类。

    裁剪面输入框旁边出现警告图标。

  17. 指向警告图标。

    指向警告图标以查看消息。

    您所添加的工具验证代码检测到面要素类为空,并发送警告消息。

    警告消息意味着用户仍然可以运行工具,但已提前了解结果如何。 或者,如果使用 setErrorMessage 而非 setWarningMessage,则错误消息会出现,这将阻止工具运行。 在设计工具时,您需要仔细考虑哪种类型的消息最有意义。

    注:
    此处使用的验证代码包括 Get Count 工具。 当为参数选择值时,此工具会运行。 一般情况下,您不希望在验证代码中使用地理处理工具,因为这可能非常耗时,并且可能导致不可预见的问题。 Get Count 工具属于例外情况,因为这是一个非常简单的工具,即使对于非常大的数据集,也可以快速运行。

添加默认值

另一种工具验证方法是使用默认值填充工具参数。 这项技术应用于许多地理处理工具。 例如,当您运行裁剪工具时,输出要素类名称默认为后跟 _Clip 的输入要素类名称。 对于 Clip and ZIP 工具,输出地理数据库输出 ZIP 存档参数没有默认值。 您可以将这些默认值添加到验证代码。

  1. 关闭 Clip and ZIP 工具。
  2. 打开工具属性,然后单击验证选项卡。
  3. 单击在脚本编辑器中打开
  4. IDLE 中,选择 def updateParameters 代码块中的三行。

    选择 def updateParameters 代码块中的这些行。

  5. 将这些行替换为以下代码:

    # The output geodatabase and ZIP archive are given default
        # names of Clip.gdb and Clip.zip, respectively, inside the 
        # workspace of the project. Users can specify a different
        # file name and folder.
        if self.params[0].value and self.params[1].value:
            folder = os.path.split(arcpy.env.workspace)[0]
            self.params[2].value = os.path.join(folder, "Clip.gdb")
            self.params[3].value = os.path.join(folder, "Clip.zip")
        return

  6. 检查您所粘贴的代码。

    第一行已正确缩进,但其他行均需要额外缩进四个空格。

    注意缩进问题。

  7. 选择需要缩进的行,单击格式,然后单击缩进区域

    对所选区域进行缩进。

    缩进问题已解决。

    缩进问题已解决。

  8. IDLE 中,单击文件,然后单击保存
  9. 关闭 IDLE
  10. ArcGIS Pro 中,单击警告消息对话框中的
  11. 单击确定关闭工具属性窗口。
  12. 双击 Clip and ZIP 工具。
  13. 对于输入要素图层,添加 bike_racksbike_routes 图层。
  14. 对于裁剪面参数,选择 neighborhood 图层。

    只要前两个参数已赋值,第三个和第四个参数就会填充默认值。 由于 Clip.gdbClip.zip 文件已存在,警告消息会显示。

    工具已填充默认输出名称。

    在出现警告的情况下,您可以运行该工具,还可以更改输出名称并运行该工具。

在本教程中,您已了解如何创建可提供 Python 代码用户友好型界面的脚本工具, 如何配置脚本工具的参数,如何编辑代码,以便其能够接受脚本工具的参数。 此外,您也已了解如何移除硬编码路径,并发送代码返回消息。 最后,您已了解如何为工具添加验证代码,使其更加可靠。