Разработка веб-инструментов с помощью скриптов 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.

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

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

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

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

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