Если вы не знакомы с Python, ArcPy или инструментами-скриптами, обратитесь к разделк Введение в Python, ArcPy и инструменты-скрипты, в котором содержится список полезных ссылок.
Как обнаружить проектные данные в своем скрипте
При предоставлении общего доступа к результату в виде пакета или службы и ссылки этого результата на скрипт-инструмент, последний сканируется для определения каких-либо проектных данных, использованных в этом скрипте. При обнаружении проектных данных они консолидируются во временной папке, которая или упаковывается (если необходимо предоставить общий доступ к пакету), или загружается на сервер (если предоставляется общий доступ к сервису).
При сканировании скрипта каждая строка в кавычках (одинарных или двойных), использованная в переменной Python или в качестве аргумента функции, проверяется на надлежащее указание в ней пути к данным. В этом случае под данными принимается:
- Слой в таблице содержания (ArcMap или ArcGlobe)
- папка
- файл
- Набор геоданных, например класс пространственных объектов, шейп-файл, база геоданных, документ карты (.mxd) и файл слоев (.lyr)
В рамках настоящего обсуждения внимание уделяется только данным, которые используются в качестве входа для инструментов геообработки или путей, ссылающихся на другие модули Python. Выходные данные также консолидируются, однако они не считаются проектными данными.
При обнаружении в сценарии строки в кавычках проверка на существование данных проходит следующим образом:
- Ссылается ли строка на слой в таблице содержания?
- Содержит ли строка абсолютный путь к данным (например, "e:\Warehousing\ToolData\SanFrancisco.gdb\streets")?
- Ссылается ли строка на данные, которые размещены относительно самого скрипта? Местоположение скрипта определяется следующим образом:
- Папка, содержащая скрипт.
- Если скрипт встроен в набор инструментов, местоположением является папка, содержащаяся в наборе инструментов.
- Если скрипт содержится в наборе инструментов Python, местоположением является папка, которая содержит набор инструментов Python.
Эти проверки выполняются последовательно. Если проверка выполняется успешно и данные существуют, они будут консолидированы с учетом одного исключения: если предоставляется общий доступ к сервису, проверяется наличие данных в хранилище данных сервера. Если данные содержатся в хранилище данных, они не консолидируются.
Примеры
Приведенные ниже примеры основаны на этой структуре папок:

Относительные пути и папки
Следующий способ поиска данных относительно местоположения сценария является обычным шаблоном, особенно применимым к сервисам, созданным в ArcGIS 10.0. Для справки: приведенный ниже код скрипта содержится в папке Scripts, указанной выше. Папка ToolData содержит SanFrancisco.gdb. В SanFrancisco.gdb содержится класс пространственных объектов Streets. В приведенном ниже примере кода путь к папке ToolData формируется относительно местоположения скрипта (папка Scripts).
import arcpy
import os
import sys
# Get the directory the script lives in.
# Folders will be found relative to this location.
#
scriptPath = sys.path[0]
# Construct paths to ../ToolData/SanFrancisco.gdb/Streets and
# ../ToolData/Warehouse.lyr
#
toolDataPath = os.path.join(scriptPath, "..", "ToolData")
streetFeatures = os.path.join(toolDataPath, "SanFrancisco.gdb", "Streets")
streetLyr = os.path.join(toolDataPath, "Warehouse.lyr")
В приведенном выше коде строка "ToolData" (аргумент к функции os.path.join) проверяется на наличие упоминаемых в ней данных. В этом случае имеется папка ToolData, расположенная относительно местоположения скрипта. Эта папка ToolData будет консолидирована — все ее содержимое (за исключением подпапок, как уже говорилось выше) будет упаковано или загружено на сервер (если только папка ToolData не является частью хранилища данных сервера).
Обратите внимание, что копируется содержимое папки, а не отдельные файлы. Например, в приведенном выше коде конструируется путь к набору e:/Warehousing/ToolData/SanFrancisco.gdb/Streets. Процесс консолидации не изолирует и копирует только набор данных Streets — копируется вся папка ToolData.
Абсолютный путь к набору геоданных
Абсолютный путь начинается с буквы диска, например 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.
Прямые и обратные косые черты
В Windows обратная косая черта (\) используется в качестве разделителя при указании пути. UNIX-системы используют прямую косую черту (/).
Обратная косая черта при написании скрипта
Языки программирования берут свое начало в 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 нуждается в папке в качестве аргумента. Так как 'e:\Warehousing\Scripts' является папкой, будет консолидировано все содержимое папки. Правила копирования содержимого папки применяются и здесь: все содержимое папки копируется, кроме подпапок, которые не являются наборами геоданных.
Код проверки инструмента
Если у вас есть опыт в написании инструментов-скриптов, вы можете использовать собственную логику проверки инструмента. Логика проверки реализована в Python, поэтому код проверки будет отсканирован на наличие данных проекции и модулей, как и любой другой скрипт Python. Например, логика проверки может открыть папку (например, d:\approved_projections), содержащую файлы проекции (.prj) для создания списка выбора пространственных привязок, которые может выбрать клиент при выполнении этого инструмента. Эта папка не является параметром инструмента; она представляет собой данные проекции, используемые в рамках сценария проверки. Здесь применяются те же правила, приведенные выше для скриптов Python, следствием чего становится консолидация папки d:\approved_projections и копирования ее на сервер (если она не была найдена в хранилище данных сервера).
Библиотеки сторонних производителей
Модули сторонних производителей (любой модуль, не являющийся частью установочного пакета Python) не консолидируются. Необходимо убедиться, что модуль установлен на компьютере, где распаковывается пакет. Необходимо предоставить документацию инструмента и пакет, указывающий, какие сторонние модули необходимы. Это не относится к модулям numpy или matplotlib, устанавливаемым вместе с ArcGIS for Desktop.
Знакомство с Python, ArcPy и инструментами-скриптами
Если вы не знакомы с Python, ArcPy и инструментами-скриптами, ниже приведены ссылки, которые помогут вам ознакомиться с этими темами.
| Раздел справки | Ресурсы |
|---|---|
Краткий обзор процесса создания пользовательских инструментов | Основные принципы создания собственных инструментов геообработки. |
Вводные статьи о языках Python и ArcPy. После знакомства с ними можно переходить к более подробным сведениям о Python и ArcPy. | |
Вводная статья о создании пользовательских инструментов-скриптов с помощью Python. | |
После того как вы ознакомились с процессом создания инструмента-скрипта, можно переходить к подробному описанию установки его параметров. |