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

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

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

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

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

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

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

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

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

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

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

  1. Ссылается ли строка на слой на панели Содержание?
  2. Содержит ли строка абсолютный путь к данным (например, "e:\Warehousing\ToolData\SanFrancisco.gdb\streets")?
  3. Ссылается ли строка на данные, которые находятся определенным образом относительно известного местоположения, например, файла проекта .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 и инструментами-скриптами, в таблице приведены ссылки, которые помогут вам ознакомиться с этими темами:

Раздел справкиСодержание

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

Основные принципы создания собственных инструментов геообработки.

Что такое Python?

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

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

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

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

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

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

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