Найти в Дзене

Автоматизация рабочих процессов. Часть 3: Python

Оглавление

В предыдущих публикациях были рассмотрены два способа автоматизации рабочих процессов: пакетная геообработка и ModelBuilder.

В данной части мы попробуем разобраться, как можно выполнять геообработку с помощью Python и пакета (библиотеки) ArcPy.

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

С технической точки зрения, инструменты геообработки представляют собой функции ArcPy и разница заключается лишь в том, каким образом они запускаются (вызываются) - через интерфейс ArcGIS Pro, консоль окна Python или интегрированную среду разработки (IDLE, PyCharm).

От выбранного способа запуска зависит, будет ли это отдельная функция или фрагмент кода (консоль окна Python) или полностью готовый скрипт (.py) для интегрированной среды разработки.

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

Окно Python

Открыть окно Python можно из группы Геообработка на вкладке Анализ.

Открытие окна Python
Открытие окна Python

Преимущества окна Python:

  • функционал ArcPy доступен по умолчанию
  • удобный запуск инструментов геообработки и просмотр результатов
  • запуск как отдельных команд, так и фрагментов кода
  • редактирование и повторный запуск ранее запущенных функций
  • взаимодействие со слоями карты
  • импорт и экспорт кода
  • справка и всплывающие подсказки для выбора параметров команд

Добавим на карту любой векторный слой (в нашем примере это будет линейный слой с реками - rivers) и попробуем с помощью окна Python получить какую-нибудь информацию о нём.

Введём в командной строке следующий код:

arcpy.management.GetCount('rivers')

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

Интерактивный список с подсказками
Интерактивный список с подсказками

Давайте разберёмся, что делает данный код.

arcpy - обращаемся к пакету (библиотеке) ArcPy

management - обращаемся к модулю (набор инструментов) Управление данными

GetCount() - вызываем функцию (инструмент) Посчитать строки

'rivers' - название слоя на карте

Результатом выполнения этой команды будет количество объектов в слое:

Таблица атрибутов слоя rivers и результат выполнения команды в окне Python
Таблица атрибутов слоя rivers и результат выполнения команды в окне Python

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

Создание базы геоданных

Чтобы узнать синтаксис инструмента, обратимся к справке.

Обратите внимание, что у инструмента есть обязательные параметры, без указания которых он не запустится и дополнительные (заключены в фигурные скобки {}) - ими можно пренебречь.

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

Введём в командной строке следующий код:

arcpy.management.CreateFileGDB("C:/example", "copy.gdb")

В результате выполнения этой команды в папке "C:/example" будет создана новая пустая база геоданных "copy.gdb":

Новая БГД создана
Новая БГД создана
Подсказка: чтобы указанный выше код отработал успешно, целевая папка должна быть создана заранее

Копирование набора данных в созданную БГД

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

Введём в командной строке следующий код:

arcpy.management.Copy('rivers', 'c:/example/copy.gdb/rivers_copy')

Как результат - класс объектов появится в целевой базе геоданных:

Скопированный класс объектов в целевой БГД
Скопированный класс объектов в целевой БГД

Построение буферных зон

По аналогии с предыдущими инструментами синтаксис ищем в справке.

В командной строке введём следующий код:

arcpy.analysis.Buffer('c:/example/copy.gdb/rivers_copy', 'c:/example/copy.gdb/rivers_buffer', '50 meters')

После выполнения в базе геоданных появится класс объектов буферных зон:

Класс объектов буферных зон в БГД
Класс объектов буферных зон в БГД

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

После последовательного запуска трёх команд окно Python выглядит так:

Вид окна Python после выполнения нескольких команд
Вид окна Python после выполнения нескольких команд

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

Но что если мы хотим поделиться нашим скриптом с коллегами или просто сохранить результат вне текущего проекта?

Для таких случаев предусмотрена возможность экспорта содержимого окна Python в файл с расширением .py.

Щелкните в окне Python на любой строчке и выберите Сохранить запись:

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

Далее откроется диалоговое окно, в котором необходимо выбрать папку и указать название файла скрипта:

Диалоговое окно Сохранить запись
Диалоговое окно Сохранить запись

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

После сохранения файл скрипта можно просматривать и вносить в него правки без использования интерфейса ArcGIS Pro.

Например, можно использовать обычный Блокнот или более продвинутый Notepad++.

Мы будем использовать интегрированную среду Python IDLE, которая устанавливается автоматически вместе с ArcGIS Pro, поскольку помимо редактирования скрипта хотели бы иметь возможность его выполнить.

С помощью Проводника Windows находим файл скрипта, щелкаем по нему правой кнопкой мыши, чтобы вызвать контекстное меню и выбираем Edit with IDLE (ArcGIS Pro):

Контекстное меню файла скрипта
Контекстное меню файла скрипта

Скрипт откроется в окне редактора Python IDLE. Он включает в себя весь код, который мы ранее вводили в окне Python и закомментированные сообщения (с символом # в начале строки):

Скрипт в окне редактора Python IDLE
Скрипт в окне редактора Python IDLE

Удалим все закомментированные строки.

Добавим в самом начале скрипта следующую строчку:

import arcpy

Данная строка импортирует пакет (библиотеку) ArcPy, чтобы мы могли работать с его инструментами.

В исходном скрипте она отсутствовала, т.к мы вводили команды в окно Python внутри ArcGIS Pro, которому функционал ArcPy доступен по умолчанию.

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

Автономный скрипт, конечно же, ничего не знает про слой на карте, поэтому нам дополнительно необходимо указать путь до источника данных слоя rivers:

arcpy.management.Copy('c:/source/topo.gdb/rivers', 'c:/example/copy.gdb/rivers_copy')

Также рекомендуем добавить в скрипт строку:

arcpy.env.overwriteOutput = True

Данная строка позволяет перезаписывать выходные данные, что полезно в процессе отладки, когда скрипт запускается несколько раз.

Теперь наш скрипт выглядит следующим образом:

Исправленный скрипт в окне редактора Python IDLE
Исправленный скрипт в окне редактора Python IDLE

Запуск и отладка скрипта

Запустить скрипт можно из окна редактора Python IDLE через меню Run > Run Module, либо нажатием горячей клавиши F5:

Запуск скрипта из окна редактора Python IDLE
Запуск скрипта из окна редактора Python IDLE

После запуска появится окно IDLE Shell, с помощью которого можно отслеживать процесс выполнения скрипта:

Окно IDLE Shell
Окно IDLE Shell

Если в скрипте есть ошибки, информация о них появится в окне IDLE Shell.

Пример ошибки в процессе выполнения скрипта
Пример ошибки в процессе выполнения скрипта

В данном примере мы удалили один символ в пути к папке, что привело к появлению сообщения об ошибке.

Оптимизация скрипта и добавление комментариев

Опытные пользователи наверное обратили внимание на главную проблему этого скрипта - использование абсолютных путей в инструментах:

arcpy.management.CreateFileGDB("C:/example", "copy.gdb")

Недостаток очевиден: при необходимости поменять путь или название целевой БГД, нужно будет это сделать во всех строчках, где они используются.

Да, наш скрипт небольшой, всего 3 инструмента, но что если рабочий процесс более сложный и состоит из десятка инструментов?

Правильным решением тут будет использование переменных для путей к данным, названиям БГД и классов объектов.

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

Добавим в скрипт следующие переменные:

n_path="C:/example"
n_gdb="copy.gdb"
s_fc="c:/source/topo.gdb/rivers"
t_fc="c:/example/copy.gdb/rivers_copy"
b_fc="c:/example/copy.gdb/rivers_buffer"

И заменим на эти переменные пути в инструментах:

Добавление переменных в скрипт
Добавление переменных в скрипт

Для более удобного процесса отладки и отслеживания процесса выполнения скрипта, можно добавить строчки, которые будут выводить в окне IDLE Shell информационные сообщения по мере выполнения инструментов:

print(f"The geodatabase {n_gdb} has been created.")
print(f"The feature class {s_fc} has been copied as {t_fc}.")
print(f"The buffer zones for feature class {t_fc} has been created as {b_fc}.")
Информационные сообщения в окне IDLE Shell
Информационные сообщения в окне IDLE Shell

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

Комментарии могут облегчить понимание скрипта, упростить процесс дальнейшего изменения.

Особенно это полезно, когда возвращаешься к работе над скриптом через некоторое время.

Строка с комментариями должна начинаться с символа решетки #.

В итоговом варианте наш скрипт будет выглядеть так:

Итоговый скрипт
Итоговый скрипт

Полезная информация

Справочник по ArcGIS Pro Python

Руководство пользователя Python

Уроки "Изучение Python в ArcGIS Pro" (Learn ArcGIS)

Другие статьи цикла:

Автоматизация рабочих процессов. Часть 1: пакетная геообработка

Автоматизация рабочих процессов. Часть 2: ModelBuilder