Просмотр и тестирование скрипта

Скрипты Python могут использоваться для автоматизации задач в ArcGIS Pro. Вы можете делиться созданными вами скриптами с другими пользователями в виде файлов Python .py. Однако использование скрипта, написанного кем-то другим, требует определенных знаний Python, хотя бы для того, чтобы изменить имена обрабатываемых наборов данных. Чтобы поделиться скриптом Python в более простой для использования форме, вы можете создать инструмент-скрипт Python.

Инструмент-скрипт Python позволяет предоставить скрипту Python удобный интерфейс, который выглядит как стандартные инструменты геообработки. Вы можете заставить свой инструмент-скрипт вести себя как стандартный инструмент геообработки, добавив код для проверки вводимых пользователем данных и отправки сообщений обратно пользователю. Вы также можете включить в инструмент вспомогательную документацию, объясняющую, как использовать инструмент и настраивать его параметры.

Создание инструментов-скриптов упрощает публикацию функциональных возможностей скрипта Python для других пользователей. Сценарии Python могут быть встроены в файл пользовательского набора инструментов (.atbx), что упрощает общий доступ.

Открытие проекта и обзор наборов данных

Сначала вы загрузите обучающие данные, откроете существующий проект и просмотрите данные, которые будут обработаны инструментом.

  1. Загрузите файл PythonTool.zip для этого руководства и найдите его на своем компьютере.

    Примечание:
    Большинство веб-браузеров по умолчанию загружают файлы в папку 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, который тоже есть на карте.

    Предположим, вы работаете в городском офисе и регулярно получаете запросы на извлечение данных по конкретным районам города.

    Чтобы выполнить эту задачу, необходимо вырезать все классы пространственных объектов в базе геоданных по районам и сохранить вырезанные классы в новой базе геоданных. Эта новая база геоданных должна быть сжата в ZIP-архив, чтобы вы могли легко поделиться ею или использовать для резервного копирования.

    Это относительно распространенная задача в ГИС.

    Вы можете выполнить эти задачи в ArcGIS Pro, используя инструмент Создать файловую базу геоданных для создания новой базы геоданных, а затем запустив инструмент Вырезание несколько раз, по одному разу для каждого класса пространственных объектов. Затем вы можете создать ZIP-архив из File Explorer или с помощью утилиты сжатия. Этот процесс может быть громоздким и отнимающим много времени, особенно если требуется обработать много классов пространственных объектов.

    Поскольку это регулярная задача, имеет смысл ее автоматизировать.

    К проекту прилагается скрипт для автоматизации этой задачи. Вы просмотрите и протестируете этот автономный скрипт, а затем создадите инструмент-скрипт Python на его основе.

Просмотр и тестирование скрипта Python

Сначала вы откроете скрипт и ознакомитесь с его содержимым.

  1. В File Explorer перейдите к папке C:\Tutorials\PythonTool.
  2. Щелкните правой кнопкой файл скрипта clip_zip.py Python и щелкните Редактировать в IDLE (ArcGIS Pro).

    Щелкните скрипт правой кнопкой и выберите Редактировать в IDLE (ArcGIS Pro).

    Примечание:
    Если у вас также установлен ArcGIS Desktop 10.х (ArcMap), в контекстном меню будет отображаться ярлык Редактировать в IDLE. Не используйте этот ярлык, он открывает более старую версию Python.

    Примечание:
    Если вы используете Windows 11 и опция Редактировать в IDLE (ArcGIS Pro) не отображается, щелкните Показать дополнительные опции и выберите Редактировать в IDLE (ArcGIS Pro).

    Скрипт откроется в IDLE, редакторе Python по умолчанию.

    Скрипт откроется в 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 будет создана скриптом и будет содержать выходные данные инструмента Вырезание. Полный путь к базе геоданных разбивается на папку, C:\Tutorials\PythonTool, и имя базы геоданных, Clip.gdb, используя os.path.split(). Они позже понадобятся в качестве отдельных переменных в скрипте. В 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 получается базовое имя класса пространственных объектов. Хотя в данном примере это не является строго необходимым, это делает скрипт более надежным, поскольку удаляет любые расширения файлов, например .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-архив, но включает только название базы геоданных и имя файла. Это повторяет то, как вы бы вручную создавали ZIP-архив в File Explorer.

    Теперь, когда вы ознакомились со скриптом, вы будете готовы к его тестированию.

  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 Pro и File 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 с удобным интерфейсом.


Создание инструмента и добавление параметров

Следующим этапом процесса является создание инструмента-скрипта и настройка его параметров. Это позволяет настроить пользовательский интерфейс инструмента.

Создание набора инструментов и инструмента-скрипта

Инструменты-скрипты Python создаются в ArcGIS Pro. Они хранятся в пользовательском наборе инструментов. Теперь вы создадите пользовательский набор инструментов в своем проекте и добавите в него инструмент-скрипт.

  1. В ArcGIS Pro на панели Каталог щелкните правой кнопкой мыши папку PythonTool, щелкните Новый и выберите Панель инструментов (.atbx).

    Создание набора инструментов.

    Набор инструментов создан.

    Набор инструментов создан.

  2. В поле имени набора инструментов введите Clip_and_ZIP и нажмите Enter.

    Введите Clip_and_ZIP.

    Набор инструментов называется Clip_and_ZIP.

    Набору инструментов присвоено имя.

    Примечание:
    В предыдущих версиях ArcGIS Pro использовался формат .tbx. Вы все еще можете использовать старые наборы инструментов в этом формате, но при создании наборов инструментов следует использовать формат .atbx, появившейся в версии ArcGIS Pro 3.0.

  3. Щелкните набор инструментов Clip_and_ZIP правой кнопкой мыши, выберите Новый и щелкните Скрипт.

    Создайте инструмент-скрипт в наборе инструментов.

    Откроется окно Новый скрипт.

    Откроется окно Новый скрипт.

    Это окно используется для задания общих свойств инструмента, настройки его параметров, ввода кода и добавления кода проверки. Вы выполните все эти шаги в оставшейся части этого руководства.

    На данный момент вы введете название, надпись и описание инструмента-скрипта.

  4. В поле Имя введите ClipandZIP.

    Имя инструмента - это внутреннее уникально идентифицирующее имя, используемое инструментом. Имя может содержать только буквы и цифры. Пробелы и специальные символы не поддерживаются.

  5. В поле Надпись введите Clip and ZIP.

    Надпись инструмента - это понятное пользователю название инструмента на панели инструментов, которое отображается, когда инструмент открыт в диалоговом окне. Надпись может содержать пробелы и специальные символы.

    В следующем окне, Набор инструментов, собственно находится инструмент-скрипт. Путь к панели инструментов и ее название отображаются в зависимости от того, где находится файл .atbx, и не могут быть изменены в окне. Важно понимать, что инструмент-скрипт является не отдельным файлом, а частью файла .atbx.

  6. В поле Описание введите Это инструмент-скрипт, позволяющий выбирать несколько векторных слоев или классов пространственных объектов и вырезать их с помощью одного или нескольких полигональных объектов. Результаты сохраняются в новой базе геоданных, создается ZIP-архив этой базы геоданных для удобной публикации или резервного копирования..

    Информация, которую вы добавили в окно Новый скрипт

  7. Нажмите OK.

    Инструмент-скрипт создается с заданными общими свойствами.

  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. В столбце Надпись введите Входные векторные слои и нажмите Enter.

    Введите надпись для параметра.

    Надпись параметра - это понятное пользователю название параметра, отображаемое на панели инструментов.

    Имя параметра автоматически заполняется из надписи, при этом пробелы заменяются символами подчеркивания. Имя параметра используется внутри инструмента-скрипта и может применяться при настройке параметров инструмента в скрипте Python.

  2. В столбце Тип данных щелкните кнопку Изменить тип данных.

    Щелкните кнопку, чтобы изменить тип данных для параметра.

    Откроется окно Тип данных параметра.

    Откроется окно Тип данных параметра.

    Значение по умолчанию Строка, но вы измените его на Векторный слой.

  3. Щелкните ниспадающий список типа данных, прокрутите список до раздела F и выберите Векторный слой.

    Выберите Векторный слой в качестве типа данных.

    Выбор типа данных Векторный слой позволяет пользователю выбирать векторные слои на активной карте с помощью ниспадающего списка в инструменте или переходить к классам пространственных объектов на диске.

    Вы хотите, чтобы инструмент мог принимать несколько входных векторных слоев.

  4. Щелкните Несколько значений.

    Щелкните Несколько значений.

    Включение Нескольких значений означает, что пользователь может выбрать один или несколько вариантов входных данных для этого параметра инструмента. Это может быть комбинация векторных слоев и классов пространственных объектов.

  5. Щелкните OK, чтобы закрыть окно Тип данных параметра.

    Параметр Входной векторный слой настроен.

  6. В поле Тип примите значение по умолчанию, Обязательный.

    Установка параметра Обязательный означает, что инструмент не может быть запущен без его задания.

  7. В поле Направление примите значение по умолчанию, Входной.

    Установка направления параметра Входной показывает инструменту, что это один из входных слоев или значения, которые он будет обрабатывать. Это также позволяет использовать инструмент в ModelBuilder в тех случаях, когда векторные слои могут быть подключены к инструменту в качестве входных данных.

    На этом первый параметр завершен. Вы можете сразу же проверить, как выглядит инструмент-скрипт с этим единственным параметром.

  8. В окне Свойства инструмента: Clip and ZIP щелкните OK.
  9. На панели Каталог в наборе инструментов Clip_and_ZIP дважды щелкните инструмент Clip and ZIP.

    Этот инструмент-скрипт открывается на панели Геообработка. Первый параметр не отображается. Существует ниспадающий список для выбора векторных слоев на активной карте, а также кнопка обзора для перехода к классам пространственных объектов на диске. Красная звездочка перед надписью параметра указывает на то, что это обязательный параметр.

    Панели инструмента Clip and ZIP с настроенным первым параметром

    На данном этапе вы настраиваете параметры инструмента и просматриваете интерфейс инструмента, чтобы проверить правильность отображения параметров. Вы пока не можете проверить, может ли инструмент работать корректно, поскольку код Python еще не добавлен.

    Примечание:
    Если вы выберете хотя бы один входной векторный слой и запустите инструмент, вы получите сообщение об ошибке.

    Сообщение об ошибке при попытке запустить инструмент

  10. Закройте инструмент.

Добавление параметра Вырезающие полигоны

Далее вы настроите параметр для вырезающих полигонов.

  1. Щелкните правой кнопкой мыши инструмент Clip and ZIP и выберите Свойства.
  2. На вкладке Параметры во второй строке таблицы щелкните в столбце Надпись, введите Вырезающие полигоны и нажмите Enter.

    Строка параметра Вырезающие полигоны частично заполнена.

    Имя параметра изменится на Clip_Polygons.

  3. В столбце Тип данных щелкните кнопку Изменить тип данных.
  4. В поле Тип данных щелкните ниспадающий список и выберите Набор объектов.

    Задайте для типа данных Набор объектов.

    Набор объектов являются упрощенным представлением класса пространственных объектов. В контексте инструмента геообработки набор объектов позволяет инструменту принимать интерактивные входные данные. Пользователь может создавать объекты, рисуя на карте, подобно тому, как вы создавали бы объекты при редактировании с помощью панели Создать объекты. Пользователь также может выбрать векторные слои на активной карте или перейти к классам пространственных объектов на диске.

  5. Щелкните OK, чтобы закрыть окно Тип данных параметра.
  6. В поле Тип примите значение по умолчанию, Обязательный.
  7. В поле Направление примите значение по умолчанию, Входной.

    Далее вы установите фильтр для этого параметра, чтобы параметр Вырезающие полигоны принимал только полигональные объекты в качестве входных данных.

  8. Прокрутите страницу вправо и щелкните в столбце Фильтр.

    Щелкните в столбце Фильтр.

  9. Щелкните ниспадающий список Фильтр и выберите Тип объекта.

    Выберите Тип объекта.

    Откроется окно Фильтр типа объектов.

  10. Щелкните Полигон.

    Щелкните Полигон в Фильтре типа объектов.

    Теперь, когда кто-то запускает инструмент, для входной вырезающей геометрии можно использовать только полигоны.

  11. В окне Фильтр типа объектов щелкните OK.

    Вы настроили параметр Вырезающие полигоны.

Добавление параметра выходной базы геоданных

Далее вы настроите параметр для выходной базы геоданных.

  1. На вкладке Параметры в третьей строке таблицы щелкните в столбце Надпись, введите Вырезающие полигоны и нажмите Enter.
  2. В столбце Тип данных щелкните кнопку Изменить тип данных.
  3. В поле Тип данных щелкните ниспадающий список, выберите Рабочая область и нажмите OK.

    Задайте тип данных для параметра Выходная база геоданных как Рабочая область.

  4. В поле Тип примите значение по умолчанию, Обязательный.
  5. Щелкните в столбце Направление и в ниспадающем меню выберите Выходные данные.

    Задайте Направление как Выходные данные.

    Установка Направление как Выходные данные сообщает инструменту, что это одни из выходных данных, которые он будет создавать. Это также позволяет использовать инструмент в ModelBuilder, где для него будут сгенерированы выходные данные.

  6. Щелкните в столбце Фильтр.
  7. Щелкните ниспадающий список Фильтр и выберите Рабочая область.

    Задание Фильтра как Рабочей области.

  8. В окне Фильтр рабочей области отметьте Локальная база данных.

    Отметьте Локальная база данных.

    Установка для фильтра Локальная база данных означает, что пользователь сможет задать только файловую базу геоданных в качестве выходных данных, а не корпоративную базу геоданных или папку.

  9. Нажмите OK.

    Вы настроили параметр Выходная база геоданных.

Добавление параметра для выходного архива в формате zip

Далее вы настроите параметр для выходного zip-архива.

  1. На вкладке Параметры в четвертой строке таблицы щелкните в столбце Надпись, введите Выходной ZIP-архив и нажмите Enter.
  2. В столбце Тип данных щелкните кнопку Изменить тип данных.
  3. В поле Тип данных щелкните ниспадающий список, выберите Файл и нажмите OK.

    Задания Типа данных как Файл.

    Zip-архив - это файл, поэтому это правильный тип данных.

  4. Щелкните в столбце Направление и в ниспадающем меню выберите Выходные данные.
  5. Щелкните ниспадающий список Фильтр и выберите Файл.

    Задание для Фильтра значения Файл.

  6. В окне Фильтр файлов в поле Расширения введите zip.

    Введите zip.

    Расширение файла должно состоять только из букв расширения, без разделителя расширения в виде точки. Не вводите .zip.

    Расширение файла не чувствительно к регистру.

  7. Нажмите OK.

    Вы добавили все параметры для инструмента.

    Все параметры добавлены.

  8. В окне Свойства инструмента: Clip and ZIP щелкните OK.

    Следующим шагом будет проверка настроенных вами параметров.

Проверка параметров

После того как вы создали все параметры инструмента, вы можете протестировать панель инструментов, чтобы убедиться, что настройки для каждого параметра работают должным образом.

  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, затем нажмите OK.

    Выбор класса объектов bike_routes в базе геоданных DC.gdb.

    Класс объектов bike_routes не был на карте, но вы добавили его в инструмент Clip_and_ZIP.

    Класс объектов bike_routes добавлен в инструмент.

    Это подтверждает, что пользователь может выбрать несколько входных данных, включая векторные слои с активной карты и классы пространственных объектов на диске.

  4. Щелкните инструмент-скетч Вырезающие полигоны.

    Щелкните инструмент-скетч Вырезающие полигоны.

    Ввод скетча набора объектов ограничен полигональными объектами.

    Это предотвратит попытку выбора вырезающих точечных или линейных объектов, что может привести к ошибке.

    Теперь вы проверите выходные данные.

  5. В поле Выходная база геоданных введите C:\Tutorials\PythonTool\Clip, затем щелкните в текстовом поле Выходной ZIP-архив.

    Путь к папке помечается маркером ошибки.

    При вводе пути к папке в параметре Выходная база геоданных появляется значок предупреждения об ошибке.

  6. Наведите курсор на значок предупреждения об ошибке.

    Сообщение об ошибке указывает на неправильный тип рабочей области.

    Появится сообщение об ошибке, указывающее на то, что в заданном вами местоположении нет базы геоданных или это неправильный тип рабочей области.

    Кроме того, если вы введете неправильное расширение файла, например .fdb, оно автоматически изменится на .gdb.

    Аналогичная проверка выполняется и для последнего параметра.

  7. В поле Выходной ZIP-архив введите C:\Tutorials\PythonTool\Clip, затем щелкните в текстовом поле Выходная база геоданных.

    Инструмент добавляет расширение файла .zip к Clip.

    Суффикс 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. На вкладке Выполнение под полем кода щелкните OK.

    Нажмите ОК.

    Изменения во встроенном коде сохраняются автоматически, а желтые маркеры исчезают, когда вы закрываете диалоговое окно свойств инструмента.

  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 будет автоматически сохранен, когда вы закроете окно свойств инструмента.

    В оставшейся части этого руководства вы, в основном, будете открывать файл .py в IDLE, а не редактировать в окне свойств инструмента.

  4. В нижней части поля кода щелкните кнопку Открыть в редакторе скриптов.

    Файл .py откроется в IDLE.

    Скрипт откроется IDLE.

    Имя файла и путь к нему больше не являются временными.

    Примечание:
    Редактировать код файла скрипта .py можно одновременно в поле код на вкладке Выполнение и в IDLE. Однако это не самая лучшая практика. Вы получите предупреждающее сообщение и должны будете определить, какие изменения следует сохранить. Чтобы избежать этого, редактируйте свой скрипт только в одном приложении.

    Теперь, когда вы экспортировали код в файл .py, вы закроете это окно.

  5. В окне Свойства щелкните OK.

    Закройте Свойства.

    Далее вы измените код в соответствии с параметрами инструмента-скрипта.

  6. В IDLE после строки if __name__ == "__main__": замените две строки параметров, которые начинаются с param0 и param1 на следующий код:

        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(0), можно использовать arcpy.GetParameter("Input_feature_layers"). Это позволяет вводить параметры в любом порядке, и вам не нужно знать индекс каждого параметра.

    Первый параметр состоит из списка 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. В IDLE в окне clip_zip_tool.py щелкните и перетащите курсор, чтобы выбрать вставленный код, отступ которого меньше четырех пробелов, в соответствии с содержимым блока кода.

    Строка # Workspace and datasets может иметь отступ, а может и не иметь, в зависимости от того, были ли выбраны пробелы перед комментарием """Script code goes below""" при вставке кода.

    Обязательно остановите выделение перед строкой return.

    Выделение строк для создания отступа.

  10. Щелкните Format, затем щелкните Indent Region.

    Отступы для выбранной области.

    Каждая строка кода теперь имеет отступ на четыре пробела.

    Блок кода с отступом.

  11. Убедитесь, что блок кода функции ClipZip, строки после строки def ClipZip и до строки return включительно имеют отступ в четыре пробела (или больше, для строк в циклах или условных операторах).
  12. В IDLE щелкните Файл и выберите Сохранить.

Удаление жестко заданных значений

В нескольких строках исходного скрипта переменным задаются определенные пути, что называется жестким кодированием путей. Это было необходимо для того, чтобы скрипт мог находить и обрабатывать данные. Однако в инструменте-скрипте пользователь инструмента задает входные и выходные данные, используя элементы управления интерфейсом инструмента. Вы настроили скрипт, чтобы использовать arcpy.GetParameter и arcpy.GetParameterAsText для получения этой информации из интерфейса инструмента. Следующим шагом будет удаление жестко заданных строк.

  1. Удалите все строки, которые содержат жестко заданный путь.

    Это строки, начинающиеся с arcpy.env.workspace = , clip_fc = , gdb = и out_zip =

    Удалите строки с жестко-заданными путями.

  2. Удалите строку arcpy.env.overwriteOutput = True.

    Нет необходимости сохранять эту строку, поскольку свойство overwriteOutput контролируется ArcGIS Pro при запуске кода в качестве инструмента-скрипта.

  3. Сохраните строку кода, которая присваивает значения переменным gdb_path и new_gdb, разделив значение переменной gdb.

    Сохраните строку, разделяющую путь к gdb

  4. Убедитесь, что отступ в строке составляет четыре пробела, на том же уровне, что и в комментарии # Workspace and datasets.

    Теперь вы удалили все строки кода с жестко заданными значениями. Скрипт будет получать значения из параметров инструмента-скрипта.

  5. Сохраните скрипт.

Изменение выражений вывода на сообщения

В исходном скрипте использовались выражения 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 не требуется. Вы удалите это выражение вывода и строку, которая создает список.

  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_racks, bike_routes и bus_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, чтобы убедиться, что он был создан.

    Файл Clip.zip в Windows File Explorer

Вы создали рабочий инструмент-скрипт 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 используется для добавления сообщения о том, что класс пространственных объектов был создан, но он пуст. Две строки условий после if и else должны иметь отступ в четыре пробела относительно предыдущих строк.

  6. Щелкните OK, чтобы закрыть окно инструмента Свойства и сохраните изменения.
  7. Дважды щелкните инструмент Clip and ZIP.
  8. На панели Входные векторные слои нажмите кнопку обзора, и в базе геоданных DC.gdb выберите класс пространственных объектов points_outside и щелкните ОК.

    Класс пространственных объектов points_outside выбран для добавления во входные данные инструмента.

    Этот класс пространственных объектов содержит точечные объекты, которые находятся за пределами полигона шейп-файла neighborhoods. Вы используете его для проверки инструмента.

  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.

    Будут выбраны два комментария и строка возврата.

  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. Щелкните Формат, затем щелкните Indent Region.
  9. Проверьте, что отступы теперь правильные.

    Убедитесь в правильности отступов.

  10. В IDLE щелкните Файл и выберите Сохранить.
  11. Закройте IDLE.

    В ArcGIS Pro появится предупреждение о том, что были внесены изменения.

  12. Щелкните Да.
  13. Нажмите OK и закройте окно свойств инструмента.
  14. Дважды щелкните инструмент Clip and ZIP.
  15. Для Входные векторные слои добавьте слои bike_racks и bike_routes.
  16. Для параметра Вырезающие полигоны нажмите кнопку обзора, в базе геоданных DC.gdb выберите класс пространственных объектов polygon_empty и щелкните ОК.

    Выберите класс объектов polygon_empty.

    Класс объектов polygon_empty – это класс полигональных объектов без каких-либо объектов.

    Значок предупреждения появляется рядом с полем Вырезающие полигоны.

  17. Наведите курсор на значок предупреждения.

    Наведите курсор на значок предупреждения, чтобы увидеть сообщение.

    Добавленный вами код проверки инструмента обнаруживает, что класс полигональных объектов пуст, и выдает предупреждающее сообщение.

    Предупреждение означает, что пользователь все еще может запустить инструмент, но он заранее знает о том, каковы будут результаты. Или, если вы используете setErrorMessage вместо setWarningMessage, появляется сообщение об ошибке, и это может привести к невозможности запуска инструмента. При разработке инструмента необходимо тщательно продумать, какой тип сообщений является наиболее значимым.

    Примечание:
    Используемый здесь код проверки включает в себя инструмент Посчитать строки. Этот инструмент запускается после выбора значения этого параметра. Как правило, вы не хотите использовать инструменты геообработки в коде проверки, поскольку это может занять очень много времени и вызвать непредвиденные проблемы. Инструмент Посчитать строки является исключением, поскольку это очень простой инструмент, который работает быстро даже с очень большими наборами данных.

Добавление значений по умолчанию

Другим типом проверки инструмента является заполнение параметров инструмента значениями по умолчанию. Этот метод используется во многих инструментах геообработки. Например, когда вы запускаете инструмент Вырезание, имя выходного класса пространственных объектов по умолчанию совпадает с именем входного класса объектов, за которым следует окончание _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. Выберите строки, в которых необходимо сделать отступ, затем щелкните Формат и Indent Region.

    Отступы для выбранной области.

    Проблема с отступами решена.

    Проблема с отступами решена.

  8. В IDLE щелкните Файл и выберите Сохранить.
  9. Закройте IDLE.
  10. В ArcGIS Pro, в предупреждении, щелкните Да.
  11. Нажмите OK и закройте окно свойств инструмента.
  12. Дважды щелкните инструмент Clip and ZIP.
  13. Для Входные векторные слои добавьте слои bike_racks и bike_routes.
  14. Для параметра Вырезающие полигоны выберите слой neighborhood.

    Как только первым двум параметрам будет присвоено значение, третий и четвертый параметры будут заполнены значениями по умолчанию. Появляется предупреждающее сообщение, поскольку файлы Clip.gdb и Clip.zip уже существуют.

    Инструмент с заполненными по умолчанию именами выходных данных.

    Инструмент можно запустить с этими предупреждениями, или можно изменить имена выходных данных и запустить инструмент.

В этом руководстве вы узнали, как создать инструмент-скрипт, который предоставляет удобный интерфейс для кода на Python. Вы узнали, как настроить параметры для инструмента-скрипта и как отредактировать код, чтобы он мог принимать параметры из инструмента. Вы также узнали, как удалить жестко заданные пути и добавить возвращаемые кодом сообщения. Наконец, вы узнали, как добавить проверку в свой код, чтобы сделать его более надежным.