Создание сервисов геообработки с помощью скриптов Python

Более подробно:

Большинство инструментов-скриптов Python, которые успешно запускаются на вашем компьютере, будут успешно опубликованы и запущены как сервис геообработки - вам не нужно изменять свой скрипт. Однако, если вы столкнулись с проблемами, это может быть связано с тем, что ваш скрипт использует много проектных данных, что означает ввод данных не в качестве параметра, или с использованием выражения import для импорта модулей Python, которые вы разработали. В этом случае данный раздел может оказаться полезным, так как в нем уделяется внимание перечисленным ниже аспектам:

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

Если вы не знакомы с Python, ArcPy или инструментами-скриптами, перейдите в раздел Введение в Python, ArcPy и инструменты-скрипты ниже, содержащий список полезных ссылок.

Как создаются пути к данным проекта и как их найти

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

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

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

  • Слой в таблице содержания вашей карты или сцены
  • папка
  • файл
  • Набор геоданных, такой как класс пространственных объектов, шейп-файл, база геоданных, карта (.mapx) или файл слоя (.lyrx)

При обнаружении в сценарии строки в кавычках проверка на существование данных проходит следующим образом:

  • Ссылается ли строка на слой на панели Содержание?
  • Содержит ли строка абсолютный путь к данным, (например "e:\Warehousing\ToolData\SanFrancisco.gdb\streets")?
  • Ссылается ли строка на данные, которые находятся определенным образом относительно известного местоположения, например, файла проекта .aprx или скрипта?

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

Примечание:

Если консолидируются папки, копируются только файлы и наборы геоданных, содержащиеся в папке; подпапки не копируются. Некоторые наборы геоданных, например файловые базы геоданных и растры, формально считаются папками, однако они также являются наборами геоданных, поэтому будут копироваться. Если папка содержит файлы слоев (.lyrx) или документы карты (.mapx), все данные, на которые ссылаются файл слоев или документ карты, также консолидируются, так что любые процедуры arcpy.mp в скрипте могут получить доступ к данным, на которые имелись ссылки.

Подсказка:

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

Пример

Следующий пример основывается на структуре папок проекта:

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

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

Процедура arcpy.mp обеспечивает возможность получения homeFolder или defaultGeodatabase для данного проекта. Пути можно строить в модуле Python os. В следующем примере класс объектов в базе геоданных WebTools.gdb задается и символизируется с помощью файла слоя, находящегося в папке LYRXs:


import arcpy
import os

# The ArcGIS Project is used to build paths from the defaultGeodatabase and 
# homeFolder using os.path.join

# Reference the CURRENT project with ArcGIS Pro open, or point to an .aprx on 
# disk
prj = arcpy.mp.ArcGISProject("CURRENT")
arcpy.CopyFeatures_management(os.path.join(prj.defaultGeodatabase, "study_sites"), 
                              "in_memory/tempSite")

# Create a variable to reference the LYRX folder
lyrxFolder = os.path.join(prj.homeFolder, "LYRXs")
arcpy.ApplySymbologyFromLayer_management("in_memory/tempSite", 
                                         os.path.join(lyrxFolder, "Site4.lyrx"))

В приведенном выше коде класс объектов study_sites и файл Site4.lyrx (вместе с данными, на которые он ссылается) будут проверены, чтобы увидеть, ссылаются ли они на существующие данные. Эти наборы данных будут собраны и загружены на сервер (если только папка, в которой они находятся, не была зарегистрирована как часть хранилища данных сервера).

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

Ссылки на слои, как данные проекта

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

Слои, использующиеся в инструменте-скрипте Python

Переменные (extentMask и rasterLayer) указывают на простые строки, которые совпадают с именами слоев в документе карты. Данные будут консолидированы, доступны в сервисе геообработки при его публикации на вашем портале (если на них нет ссылок в хранилище данных) и будут содержать ссылку на слои в оперативной памяти. Такое совпадение имен слоев на карте и в тексте вашего скрипта позволит инструменту работать со слоями.

Примечание:

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

Импорт других модулей Python

Пользовательский скрипт может импортировать другие разработанные скрипты. Например, в приведенном ниже коде показан импорт модуля Python с именем myutils.py, который находится в той же папке, что и родительский скрипт, и содержит процедуру getFIDName:


import arcpy
import myutils

inFeatures = arcpy.GetParameterAsText(0)
inFID = myutils.getFIDName(inFeatures)

При появлении инструкции import местоположение скрипта определяется в следующем порядке:

  1. Та же папка, содержащая скрипт. Если скрипт встроен в набор инструментов, используется папка, содержащаяся в наборе инструментов.
  2. Папка, которая указана в системной переменной PYTHONPATH.
  3. Любая папка, на которую ссылается системная переменная PATH.
Если импортируемый скрипт находится в любой из этих папок, скрипт консолидируется. Процесс сканирования является рекурсивным — импортированный скрипт также сканируется на наличие проектных данных и импортируется в соответствии со всеми приведенными выше правилами.

Другим способом ссылки на модули, которые следует импортировать, является использование метода sys.path.append. Это позволяет задать путь к папке, содержащей скрипты, которые следует импортировать.


import arcpy
import sys
import os

# Append the path to the utility modules to the system path
# for the duration of this script.
myPythonModules = r'e:\Warehousing\Scripts'
sys.path.append(myPythonModules)
import myutils  # A Python file within myPythonModules

В приведенном выше коде следует обратить внимание, что метод sys.path.append нуждается в папке в качестве аргумента. Так как r'e:\Warehousing\Scripts' является папкой, будет консолидировано все содержимое папки. Правила копирования содержимого папки применяются и здесь: все содержимое папки копируется, кроме подпапок, которые не являются наборами геоданных.

Примечание:

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

Модули сторонних производителей

Модули и библиотеки сторонних производителей (любой модуль, не являющийся частью установочного пакета Python) не консолидируются. Вы сами должны следить, чтобы модули были загружены на сервер и запускались правильно. Это не применимо к numpy, matplotlib и другим модулям, установленным по умолчанию на вашем ArcGIS Server. Для развертывания сторонних модулей Python обратитесь к разделу Развертывание пользовательских пакетов Python для ArcGIS Server.

Код проверки инструмента

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

Логика проверки реализована в Python, поэтому код проверки будет отсканирован на наличие проектных данных и модулей, как и любой другой скрипт Python. Например, ваша логика проверки может открыть папку (например, d:\approved_projections), содержащую файлы проекций (.prj), чтобы создать список выбора пространственных привязок, которые клиент может использовать, когда сервер запускает ваш инструмент. Эта папка не является параметром инструмента; она представляет собой данные проекта, используемые в рамках скрипта проверки. Здесь применяются те же правила, приведенные выше для скриптов Python, следствием чего становится консолидация папки d:\approved_projections и копирования ее на сервер (если она не была найдена в хранилище данных сервера).

Знакомство с Python, ArcPy и инструментами-скриптами

Если вы не знакомы с Python, ArcPy и инструментами-скриптами, в таблице приведены ссылки, которые помогут вам ознакомиться с этими темами:

Раздел справкиРесурсы

Справочник по инструментам геообработки

Подробная информация о каждом инструменте геообработки.

Что такое язык ArcPy?

Вводные темы по ArcPy. После знакомства с ними можно переходить к более подробным разделам о пакете сайта ArcPy.

Краткий обзор процесса создания инструментов в Python

Что такое инструмент-скрипт?

Вводные статьи о создании пользовательских инструментов-скриптов с помощью Python.

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

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