Большинство инструментов-скриптов Python, которые успешно запускаются на вашем компьютере, будут успешно опубликованы и запущены как веб-инструмент на ArcGIS Enterprise или как сервис геообработки на автономном ArcGIS Server, вам не нужно изменять скрипт.
Построение путей к данным проекта
Важной составляющей многих скриптов 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.management.CopyFeatures(os.path.join(prj.defaultGeodatabase, "study_sites"),
"memory/tempSite")
# Create a variable to reference the LYRX folder
lyrxFolder = os.path.join(prj.homeFolder, "LYRXs")
arcpy.management.ApplySymbologyFromLayer("memory/tempSite",
os.path.join(lyrxFolder, "Site4.lyrx"))
В приведенном выше коде класс объектов study_sites и файл Site4.lyrx (вместе с данными, на которые он ссылается) будут проверены, чтобы увидеть, ссылаются ли они на существующие данные. Эти наборы данных будут собраны и загружены на сервер (если только папка, в которой они находятся, не была зарегистрирована как часть хранилища данных сервера).
Переменная lyrxFolder содержит относительный путь к папке или файлам слоев. Эта папка будет собрана – все ее содержимое (за исключением подпапок, как уже говорилось выше) будет упаковано или загружено на сервер (если только папка lyrxFolder не является частью хранилища данных сервера).
Ссылки на слои, как данные проекта
Не совсем обычный способ использования слоев в качестве данных проекта может привести к значительному увеличению производительности в инструментах-скриптах Python. В коде Python выше используются полные пути к классам объектов и файлам слоя. При запуске веб-инструмента он должен сначала открыть набор данных, что требует максимальной производительности. Использование слоев в скрипте будет держать данные открытыми и кэшированными для более быстрой реализации. На следующем рисунке показано, как подбираются и используются в скрипте Python слои из таблицы содержания проекта:

Переменные (extentMask и rasterLayer) указывают на простые строки, которые совпадают с именами слоев в документе карты. Данные будут собраны и доступны в веб-инструменте при публикации на вашем портале (если на них не ссылается хранилище данных) и будут содержать ссылку на хранящиеся в памяти слои. Такое совпадение имен слоев на карте и в тексте скрипта позволит инструменту работать со слоями.
Примечание:
При использовании слоев в инструменте-скрипте как внутренних данных проекта, скрипт становится зависимым от связанной карты. Нельзя запустить инструмент из другой карты, если на ней отсутствуют эти слои. Этот подход снижает общую универсальность инструмента-скрипта, поэтому он наиболее подходит для создания веб-инструментов.
Импорт других модулей Python
Скрипт может импортировать другие разработанные вами скрипты. Например, в приведенном ниже коде показан импорт модуля Python с именем myutils.py, который находится в той же папке, что и родительский скрипт, и содержит метод getFIDName:
import arcpy
import myutils
inFeatures = arcpy.GetParameterAsText(0)
inFID = myutils.getFIDName(inFeatures)При появлении инструкции import местоположение скрипта определяется в следующем порядке:
- Та же папка, содержащая скрипт. Если скрипт встроен в набор инструментов, используется папка, содержащаяся в наборе инструментов.
- Папка, на которую ссылается системная переменная PYTHONPATH.
- Любая папка, на которую ссылается системная переменная 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.
Код проверки инструмента
Инструменты-скрипты поддерживают пользовательскую логику проверки инструментов. Проверка поддерживает такое поведение как включение и отключение параметров, задание значений по умолчанию и обновление строковых ключевых слов. Без возможности проверки пользовательская логика проверки инструментов не обеспечивает большую ценность для клиентов веб-инструментов. Однако, с возможностью проверки клиенты могут иметь аналогичный опыт проверки запуска веб-инструмента по сравнению с запуском инструмента локально.
Возможность проверки
Когда клиент отправляет запрос проверки на веб-инструмент или на сервис геообработки, класс ToolValidator запускается. Чтобы обеспечить лучший опыт для пользователей вашего инструмента, пишите только быстрый код проверки. Хотя вы можете использовать код проверки, который откроет набор данных или изменит значение или схему входного объекта или таблицы, проверка будет медленной, и она не будет отправлять измененный объект или таблицу обратно пользователю веб-инструмента.
Следующие часто используемые пользовательские проверки полностью поддерживаются возможностью проверки. Дополнительные возможности проверки также поддерживаются Python, за исключением изменения значения входного объекта, таблицы или растра.
На основании значения одного параметра будет обновлен фильтр другого параметра.
def updateParameters(self):
if self.params[0].value < 1000:
self.params[1].filter.list = ["A4", "Letter"]
elif self.params[0].value < 5000:
self.params[1].filter.list = ["A3", "Tabloid"]
else:
self.params[1].filter.list = ["A2", "ANSI C"]
returnЕсли первый параметр имеет значение, второй параметр будет включен; в противном случае второй параметр будет отключен.
def updateParameters(self):
if self.params[0].value:
self.params[1].enabled = True
else:
self.params[1].enabled = False
returnЕсли пользователь не предоставил значение параметра, код проверки обновит значение параметра на заданную строку.
def updateParameters(self):
if not self.params[3].altered:
self.params[3].value = "Default map authored by " + self.params[2].valueAsText
returnБудет предоставлено сообщение на основе типа геометрии входных данных.
def updateMessages(self):
self.params[0].clearMessage()
if self.params[0].valueAsText:
shapetype = arcpy.Describe(self.params[0]).shapeType.lower()
if shapetype == "point":
self.params[0].setWarningMessage("Choosing a point layer may result long running time of the tool.")
elif shapetype == "polygon":
self.params[0].setErrorMessage("Polygon inputs are not supported temporarily.")
returnЭти конфигурации в функции initializeParameters будут влиять на инструмент при его публикации или при перезапуске сервиса геообработки.
def initializeParameters(self):
self.params[5].parameterDependencies = [4]
self.params[7].category = "Detailed configurations"
returnКлиенты веб-инструментов не могут запускать логику проверки инструмента, только сервер имеет эту возможность. Когда клиент отправляет запрос на выполнение задачи в сервис, логика проверки будет выполняться на сервере. Если проверка вызывает ошибку, задача останавливается. Если вы возвращаете сообщения из вашего сервиса, клиент не получит сообщения от процедур проверки. Обычно код проверки инструмента как часть опубликованного веб-инструмента имеет меньшее значение, чем при работе инструмента в настольном приложении. Вам может понадобиться работать с копией веб-инструмента, имеющей сокращенный или удаленный код проверки, и опубликовать ее как веб-инструмент. Для работы веб-инструмента вам необходимо разработать логику проверки в приложении.
Логика проверки реализована в Python, поэтому код проверки будет сканирован на наличие данных проекта и модулей, как и любой другой скрипт Python. Например, логика проверки может открыть папку, если папка не является параметром инструмента: она представляет собой данные проекта, используемые в рамках скрипта проверки. Здесь применяются те же правила, приведенные выше для скриптов Python, папка c будет консолидирована и скопирована на сервер (если она не была найдена в хранилище данных сервера).
Знакомство с Python, ArcPy и инструментами-скриптами
Если вы не знакомы с Python, ArcPy или инструментами-скриптами, в таблице приведены ссылки, которые помогут вам ознакомиться с этими темами:
| Раздел справки | Ресурсы |
|---|---|
Вводные темы по геообработке. | |
Вводные темы по ArcPy. | |
Вводные статьи о создании пользовательских инструментов-скриптов с помощью Python. | |
После того как вы ознакомились с процессом создания инструмента-скрипта, этот раздел подробно описывает установку его параметров. |