Skip To Content

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

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

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

  1. Как обнаружить проектные данные, используемые в скрипте, и сделать их доступными на сервере для выполнения задач.
  2. Как обнаружить импортированные модули и сделать их доступными на сервере для выполнения задач.
  3. Как использовать в скриптах проектные данные и параметры модулей Python.
  4. Как обрабатывается код проверки инструмента и взаимодействует с сервером и клиентом.
  5. Как обрабатываются сторонние библиотеки.

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

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

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

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

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

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

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

  1. Ссылается ли строка на слой в таблице содержания?
  2. Содержит ли строка абсолютный путь к данным (например, "e:\Warehousing\ToolData\SanFrancisco.gdb\streets")?
  3. Ссылается ли строка на данные, которые размещены относительно самого скрипта? Местоположение скрипта определяется следующим образом:

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

Примечание:

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

Подсказка:

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

Примеры

Приведенные ниже примеры основаны на этой структуре папок:

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

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

Установка относительных путей к данным

Следующий способ поиска данных относительно местоположения сценария является обычным шаблоном, особенно применимым к сервисам, созданным в ArcGIS 10.0. Папка ToolData содержит SanFrancisco.gdb. В SanFrancisco.gdb содержится класс пространственных объектов Streets. В приведенном ниже примере кода путь к папке ToolData и находящихся в ней наборам данных формируется относительно местоположения скрипта (та же папка, что и для Warehouse.tbx).

import arcpy
import os
import sys
# Get the directory the script lives in.
# Folders and data will be found relative to this location.
#
scriptPath = sys.path[0]
# Construct paths to ../ToolData/SanFrancisco.gdb/Streets and
#                    ../ToolData/Warehouse.lyr
streetFeatures = os.path.join(scriptPath, "ToolData\\SanFrancisco.gdb\\Streets")
streetLyr = os.path.join(scriptPath, "ToolData\\Warehouse.lyr")

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

Относительные пути к папкам

На саму папку ToolData также можно ссылаться и использовать как начальную точку для ссылок на элементы. В приведенном ниже примере кода путь к папке ToolData формируется относительно местоположения скрипта (та же папка, что и для Warehouse.tbx).

import arcpy import os import sys
# Get the directory the script lives in. # Folders and data will be found relative to this location. #
scriptPath = sys.path[0]
# Construct paths to the ToolData folder toolDataFolder = os.path.join(scriptPath, "ToolData")
# Construct path to items inside the folder streetFeatures = os.path.join(toolDataFolder, "SanFrancisco.gdb\\Streets")

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

Обратите внимание, что при ссылке на папку, копируется все содержимое папки, а не отдельные файлы. Например, в приведенном выше коде, несмотря на то, что однозначного пути к файлу Warehouse.lyr нет, этот файл будет консолидирован, поскольку присутствует в указанной папке.

Абсолютный путь к набору геоданных

Абсолютный путь начинается с буквы диска, например e:/, как показано ниже на примере кода.

import arcpy import os
streetFeatures = 'e:/Warehousing/ToolData/SanFrancisco.gdb/Streets'

В вышеприведенном коде консолидируется набор данных Streets и все прочие данные, от которых зависит этот набор (например, классы отношений и домены).

Гибридный пример

import arcpy import os
toolDataPath = r'e:\Warehousing\ToolData' warehouseLyr = os.path.join(toolDataPath, "Warehouse.lyr")

В приведенном выше коде консолидируется все содержимое папки ToolData. Так как консолидируется содержимое папки (за исключением подпапок), Warehouse.lyr консолидируется вместе с другими данными, на которые ссылается Warehouse.lyr.

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

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

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

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

Два слоя из Таблицы содержания используются в инструменте-скрипте. Переменные указывают на простые строки, которые совпадают с именами слоев в документе карты. При публикации этого рабочего процесса на ArcGIS Server данные будут собраны и перемещены на сервер (если они не присутствуют в хранилище данных), а сервис будет хранить ссылки на слои в памяти. Внутри сервиса инструмент будет находить и использовать слои через сопоставление имен.

Примечание:

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

Прямые и обратные косые черты

В Windows обратная косая черта (\) используется в качестве разделителя при указании пути. UNIX-системы используют прямую косую черту (/).

Примечание:

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

Обратная косая черта при написании скрипта

Языки программирования берут свое начало в UNIX, а язык С, как и Python, рассматривает обратную косую черту (\) как знак перехода. Например, \t означает табуляцию. Поскольку пути могут содержать обратные косые черты, необходимо избегать их распознавания как знака перехода. Проще всего конвертировать пути в не форматированные строки Python с помощью директивы указателя r, как показано ниже. Благодаря этому Python будет игнорировать обратные косые черты.

thePath = r"E:\data\telluride\newdata.gdb\slopes"

Дополнительные сведения об определении путей

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

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

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

import arcpy import sys import os
inFeatures = arcpy.GetParameterAsText(0)            # Feature Layer projectDataFolder = arcpy.GetParameterAsText(1)     # Folder myPythonModules = arcpy.GetParameterAsText(2)       # Folder
# Append the path to the utility modules to the system path
#  for the duration of this script. #
sys.path.append(myPythonModules) import myutils # a Python file within myPythonModules
# Construct a variable to hold the Streets feature class found in the
#  project data folder
#
streetsFeatures = os.path.join(projectDataFolder, "SanFrancisco.gdb", "Streets")

При использовании скриптом параметров для всех своих данных, как показано выше, происходит ряд замечательных событий:

  • Вы больше узнаете о данных, которые требуются скрипту, так как они являются параметром и их можно просмотреть в диалоговом окне инструмента. Нет необходимости менять код для определения используемых данных.
  • Внутренняя логика проверки инструментов преобладает: если значение параметра ссылается на данные, которые не существуют, диалоговое окно инструментов отобразит ошибку, и вы не сможете запустить инструмент для получения результатов.
  • Чтобы сбросить местоположение данных, можно просмотреть это местоположение с помощью диалогового окна инструмента, а не путем ввода местоположения в самом скрипте (что легко может привести к ошибкам).
  • Если доступ к результату предоставляется в качестве сервиса, Редактор сервиса задает параметры папки как Режима ввода Константы; при этом клиент не увидит параметры. При публикации две папки будут скопированы на сервер (если только они не зарегистрированы в хранилище данных). Когда задача запускается на сервере, скрипт получает пути к скопированным папкам.

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

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

Примечание:

Установка модулей Python от третьих производителей (за исключением numpy и matplotlib) в ОС Linux требует особого подхода.

Дополнительные сведения об установке модулей Python сторонних производителей в системе Linux

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

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

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

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

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

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

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

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

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

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

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

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

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

Связанные разделы