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

Скрипты 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.
    Примечание:

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

  4. В ArcGIS Pro нажмите Открыть другой проект.

    Кнопка Открыть другой проект

  5. В окне Открыть проект перейдите к папке PythonTool, щелкните Python Tool.aprx и нажмите ОК.

    Проект PythonTool в окне Открыть проект

    Откроется проект.

    Проект по умолчанию отображает карту Вашингтона, округ Колумбия.

    На карте показано несколько классов объектов в районе Вашингтона, округ Колумбия.

  6. Если панель Каталог не отображается, на ленте на вкладке Вид щелкните Панель Каталог.
  7. В панели Каталог разверните Папки и разверните PythonTool.
  8. Разверните базу геоданных DC.gdb.

    База геоданных 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 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 и выберите Обновить.

    Опция Обновить

  8. На панели Каталог в папке PythonTool убедитесь, что база геоданных Clip.gdb была создана.

    База геоданных Clip.gdb.

  9. Разверните базу геоданных Clip.gdb.

    Вырезанные классы пространственных объектов

  10. В базе геоданных Clip.gdb щелкните правой кнопкой bike_racks и выберите Добавить к текущей карте.

    Опция Добавить к текущей карте

    На карту добавлен новый вырезанный слой bike_racks. Он добавлен на карту и закреплен в границах района.

    Карта с вырезанным слоем bike_racks

    Этот слой показывает, что скрипт сработал. Слой bike_racks можно удалить.

  11. На панели Содержание щелкните правой кнопкой мыши по вырезанному слою bike_racks и выберите Удалить.

    Вы также удалите Clip.gdb. Вы заново создадите эту базу геоданных, когда позднее запустите инструмент-скрипт в соответствии с настоящим пособием.

  12. На панели Каталог щелкните правой кнопкой Clip.gdb и выберите Удалить.
  13. В File Explorer перейдите к папке C:\Tutorials\PythonTool.

    Файл Clip.zip добавлен в папку.

    Файл Clip.zip

    Вы снова создадите это файл .zip позднее, также с помощью инструмента-скрипта. Его можно удалить.

  14. Щелкните правой кнопкой Clip.zip и выберите Удалить.

Автономный скрипт работает так, как задумано. Если вы хотите использовать скрипт для разных наборов данных, вы можете открыть скрипт и изменить пути. Это не очень удобно для тех, кто не так хорошо знаком со скриптами Python. Также легко допустить ошибки при изменении путей в скрипте. Далее вы разработаете инструмент-скрипт Python с удобным интерфейсом.


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

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

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

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

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

    Опция Набор инструментов (.atbx)

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

    Новый набор инструментов

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

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

    Поле Надпись

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

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

    Кнопка Изменить тип данных

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

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

    Опция Векторный слой

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

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

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

    Опция Несколько значений

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

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

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

  8. Убедитесь, что для Тип установлено значение Обязательный.

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

  9. Убедитесь, что для Направление задано Входной.

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

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

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

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

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

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

    Примечание:

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

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

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

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

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

    Надпись Вырезающие полигоны

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

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

    Опция Набор объектов

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

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

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

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

    Столбец Фильтр

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

    Опция Тип объекта

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

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

    Опция Полигон

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

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

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

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

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

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

    Тип данных рабочей области

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

    Опция выходные данные

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

  7. Щелкните столбец Фильтр и выберите Рабочая область.

    Опция Рабочая область

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

    Опция Локальная база данных

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

  9. Нажмите OK.

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

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

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

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

    Опция Файл

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

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

    Опция Файл для столбца Фильтр

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

    Окно Фильтр файлов

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

  8. Нажмите OK.

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

    Все параметры инструмента

  9. В окне Свойства инструмента щелкните OK.

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

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

  1. На панели Каталог в наборе инструментов Clip_and_ZIP дважды щелкните инструмент Clip and ZIP.

    Откроется инструмент Clip and ZIP. Все параметры, которые вы настроили на предыдущих шагах, теперь отображаются на панели инструментов.

    Инструмент Clip and ZIP со всеми параметрами

  2. Для Входные векторные слои выберите bike_racks.

    Инструмент с добавленным слоем bike_racks

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

  3. Для Входной набор классов объектов щелкните кнопку Обзор.
  4. Перейдите к базе геоданных DC.gdb. Щелкните bike_routes и нажмите OK.

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

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

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

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

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

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

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

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

    Параметр выходной базы геоданных с ошибкой

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

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

    Сообщение об ошибке

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

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

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

    Суффикс ZIP в параметре Выходной ZIP-архив

  9. В поле Выходной ZIP-архив введите C:\Tutorials\PythonTool\Clip.zipped. Шелкните поле Выходная база геоданных.

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

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

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

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

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

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

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

Редактирование исполняемого кода

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

  1. Щелкните правой кнопкой мыши инструмент Clip and ZIP и выберите Свойства.
  2. Щелкните вкладку Выполнение.

    Вкладка Выполнение

    На вкладке показан шаблон кода 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.

    Кнопка 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. Щелкните Файл и выберите Сохранить.

    Опция Сохранить в меню Файл

  10. Закройте IDLE.

    Код, который вы добавили в IDLE, теперь находится в поле кода.

    Новый код в поле кода

Сохранение скрипта в отдельном файле

Код, с которым вы работали до сих пор, был встроен в набор инструментов. Вы также можете экспортировать код в файл .py для использования в выбранном вами редакторе Python.

  1. На вкладке Выполнение над полем скрипта, щелкните зеленую стрелку кнопки Экспортировать скрипт в файл.

    Кнопка Экспорт скрипта в файл

  2. В окне Экспорт скрипта убедитесь, что выбрана папка PythonTool. Для Имя введите clip_zip_tool.py.

    Опция Имя

    Внимание:

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

  3. Щелкните Сохранить.

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

    Путь к файлу скрипта .py в поле кода

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

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

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

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

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

    Скрипт в IDLE

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

    Примечание:

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

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

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

    Кнопка 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 с параметрами

    Эта строка вызывает функцию 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 щелкните Файл и выберите Открыть.

    Опция Открыть в меню Файл

  2. В папке C:\Tutorials\PythonTool щелкните 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.

    Код в блоке кода для определения функции.

    Вы закончили работу с исходным скриптом.

  8. Закройте окно скрипта clip_zip.py.

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

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

  9. В окне clip_zip_tool.py щелкните и перетащите курсор, чтобы выбрать вставленный код, отступ которого меньше четырех пробелов, в соответствии с содержимым блока кода. Остановите выборку перед строкой return.

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

    Строки для отступа

  10. Щелкните Формат и выберите Отступ области.

    Опция Область отступа в меню Формат

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

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

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

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

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

    Строка, разделяющая путь к базе геоданных

  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")

    Третье выражение вывода с использованием arcpy.AddMessage.

  4. Щелкните Файл и выберите Сохранить.

    Заключительный раздел кода, который создает ZIP-файл, не требует никаких изменений.

  5. Закройте IDLE.

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

Теперь инструмент готов к проверке.

  1. В ArcGIS Pro на панели Каталог разверните базу геоданных DC.gdb.

    База геоданных DC

  2. Щелкните правой кнопкой bike_routes и выберите Добавить в текущую карту.
  3. Разверните набор инструментов Clip_and_ZIP.atbx и дважды щелкните инструмент 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.

    Параметры инструмента Clip and ZIP

  9. Щелкните Запустить.

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

  10. Щелкните Просмотреть подробности.

    Кнопка Просмотреть подробности

    В окне Подробная информация в разделе Сообщения отображаются сообщения, сгенерированные инструментом с использованием кода, который вы изменили, заменив операторы print на arcpy.AddMessage.

  11. Закройте окно Подробной информации.
  12. Щелкните вкладку Каталог.

    База геоданных Clip.gdb добавлена в папку проекта.

    Clip.gdb в папке проекта

    Zip-архив не отображается на панели Каталог, но вы можете использовать File Explorer, чтобы убедиться, что он был создан.

    Файл Clip.zip в 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. Для Входной набор классов объектов щелкните кнопку Обзор.
  9. Перейдите к базе геоданных DC.gdb. Выберите класс объектов points_outside и щелкните OK.

    Класс пространственных объектов points_outside

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

  10. Для второго поля входные векторные слои выберите слой bike_routes.
  11. Для Вырезающие полигоны выберите слой neighborhood.
  12. Для Выходная база геоданных введите следующий путь: C:\Tutorials\PythonTool\Clip_empty.gdb.
  13. Для Выходной ZIP-архив введите следующий путь: C:\Tutorials\PythonTool\Clip_empty.zip.
  14. Щелкните Запустить.

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

  15. Щелкните Просмотреть подробности в баннере.

    Кнопка Просмотреть подробности

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

    Сообщения инструмента с предупреждением

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

  16. Закройте сообщения Clip and ZIP и инструмент Clip and ZIP.

    Этот тип проверки выполняется после запуска инструмента и создания выходных данных. Также можно использовать проверку перед запуском инструмента.

Использование проверки наличия пустых входных данных

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

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

  1. На панели Каталог щелкните правой кнопкой мыши инструмент Clip and ZIP и выберите Свойства.
  2. Щелкните вкладку Проверка.

    Вкладка Проверка

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

    Код шаблона ToolValidator

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

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

  3. Щелкните Открыть в редакторе скриптов.

    Кнопка Открыть в редакторе скриптов

  4. Выделите три строки в блоке кода def updateMessages.

    Два комментария и строка возврата

  5. Замените комментарии и выражение return, скопировав и вставив следующий код:

    # When the clip polygon 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

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

    Отступы для нового кода

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

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

  7. Щелкните Формат и выберите Отступ области.

    Отступы теперь правильные.

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

  8. Щелкните Файл и выберите Сохранить.
  9. Закройте IDLE.

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

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

    Класс объектов polygon_empty

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

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

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

    Предупреждающий значок и сообщение

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

    Предупреждение означает, что пользователь все еще может запустить инструмент, но он заранее знает о том, каковы будут результаты. Или, если вы используете 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. Щелкните Файл и выберите Сохранить.
  8. Закройте IDLE.
  9. В ArcGIS Pro для предупреждающего сообщения щелкните Да.
  10. Нажмите OK и закройте окно свойств инструмента.
  11. Дважды щелкните инструмент Clip and ZIP.
  12. Для Входные векторные слои добавьте слои bike_racks и bike_routes.
  13. Для Вырезающие полигоны выберите слой neighborhood.

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

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

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

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

Вы можете найти больше учебных пособий в галерее учебных пособий.