Обновление схемы в наборе инструментов
У каждого выходного параметра следующих типов: класс пространственных объектов, таблица, растр или рабочая область – есть объект схемы. Только у выходных классов пространственных объектов, таблиц, растров и рабочих областей есть объект схемы, у других типов его нет. Объект схемы создается для вас процессом геообработки. К схеме осуществляется доступ через объект 'параметр', и устанавливаются правила для описания выходных данных инструмента. После установки правил схемы код внутренней проверки анализирует эти правила и обновляет описание выходных данных.
Для проверки, настройка заключается в следующем:
- Во время первого открытия диалогового окна инструмента вызывается getParameterInfo. Для описания выходных данных устанавливаются статические правила (правила, которые не изменяются вводимыми пользователем данными). На этом этапе не создается описания на выходе, так как пользователь не указал значения ни для одного из параметров (если вы не задали значений по умолчанию).
- Как только пользователь начинает как-либо работать с диалоговым окном, происходит вызов updateParameters (обновить параметры).
- updateParameters может изменить схему с учетом динамического поведения, которое нельзя установить с помощью параметрических зависимостей (например, добавление нового поля с помощью Добавить поле (Add Field)).
- После процедуры updateParameters запускаются подпрограммы внутренней проверки, а правила, найденные в схеме, применяются для обновления описания выходных данных.
- Затем происходит вызов updateMessages (обновить сообщения). Вы можете изучить предупреждения и сообщения об ошибках, которые выводятся внутренней процедурой оценки, и изменить их или добавить свои пользовательские предупреждения или сообщения об ошибках.
Все свойства объекта схема (schema) доступны для чтения и записи, за исключением тип (type), который доступен только для чтения.
Имя свойства |
Значение(я) |
---|---|
тип (type) |
Строка: "Объект", "Таблица", "Растр" , "Контейнер" (для рабочих областей и наборов данных объектов) (Свойство доступно только для чтения) |
clone (клон) |
Булево |
правилоТипОбъекта (featureTypeRule) |
Строка: "КакОпределено", "ПерваяЗависимость" |
типОбъекта (featureType) |
Строка: "Простой", "Аннотация", "Размерность" |
geometryTypeRule |
Строка: "Неизвестный", "ПерваяЗависимость", "Mин", "Maкс", "КакОпределено" |
Тип Геометрии (geometryType) |
Строка "Точка", "Мультиточка", "Полилиния", "Полигон" |
ЭкстентПравило (extentRule) |
Строка: "КакОпределено", "ПерваяЗависимость", "Пересечение", "Объединение", "Среда" |
экстент (extent) |
Объект Экстент |
Правило поля (fieldsRule) |
Строка: "Нет", "ПерваяЗависимость", "ПерваяЗависимостьFIDs", "Все", "ВсеNoFIDs", "ВсеFIDsТолько" |
дополнительныеПоля (additionalFields) |
Список объектов поля Python |
ПравилоРазмерЯчейки (cellSizeRule) |
Строка: "КакОпределено", "ПерваяЗависимость", "Mин", "Maкс", "Среда" |
размерячейки (сellsize) |
Двойная точностьи |
ПравилоРастра (rasterRule) |
Строка: "ПерваяЗависимость", "Mин", "Maкс", "Целое", "Плавающее" |
правилоРастровогоФормата (rasterFormatRule) |
Строка: "Img", "Грид" |
additionalChildren |
Список наборов данных Python для добавления в схему рабочей области |
Использование FirstDependency (Первая Зависимость)
Некоторые из правил могут быть установлены на "FirstDependency", что означает, что будет использовано значение первого параметра, найденного в наборе массива зависимостей параметров с помощью parameter.parameterDependencies. В примере кода, приведенном ниже, параметр 2 имеет два зависимых параметра, 0 и 1, и первой зависимостью является параметр 0.
# Set the dependencies for the output and its schema properties
#
parameters[2].parameterDependencies = [parameters[0].name, parameters[1].name]
Если любой зависимый параметр содержит несколько значений (список значений), будет использовано первое значение из списка.
type (тип)
Свойство тип (type) доступно только для чтения, и устанавливается геообработкой.
clone (клон)
При истинном значении, процедуре геообработки дается инструкция создать точную копию (клон) описания в первом зависимом параметре. Значение по умолчанию – false. Обычно вы устанавливаете параметр clone равным true (истина) в методе getParameterInfo: Если первый зависимый параметр является многозначным (список значений), клонируется первое значение в многозначном списке значений.
- Если значением parameter.parameterType является Производный ("Derived"), то будет сделана точная копия. Это поведение инструмента Добавить поле (Add Field).
- Если значением parameter.parameterType является Обязательный ("Required"), то также будет сделана точная копия, но путь к каталогу, содержащему набор данных, будет изменен. Пути каталога состоят из двух частей: рабочая область и базовое имя. Например:
E:/Data/TestData/netcity.gdb/infrastructure/roads
- Workspace = E:/Data/TestData/netcity.gdb/infrastructure
- Base name = roads
- Базовое имя является таким же, как базовое имя для первого входного параметра, содержащего набор данных (не первого зависимого, а именно первого параметра) с добавленным именем инструмента-скрипта (например, roads_MyTool).
- Рабочей области присвоены настройки параметров среды временной рабочей области. Если она пустая, то используются настройки параметров среды текущей рабочей области. Если она также пуста, то используется рабочая область первого входного параметра, содержащего набор данных. Если рабочая область установлена только на чтение, то используется системная временная директория.
После установки clone на значение исходный, все методы, основанные на правилах, такие как featureTypeRule, geometryTypeRule и extentRule, устанавливаются на значение ПерваяЗависимость("FirstDependency").
Два примера кода ниже выполняют одинаковую работу. Оба примера основаны на том, как инструмент Вырезать (Сlip) создает выходную схему.
class ExampleClipTool1(object):
def __init__(self):
self.label = "Example Clip tool 1"
self.description = "Explicitly setting all rules"
def getParameterInfo(self):
# Input feature class
param0 = arcpy.Parameter(
displayName="Input Features",
name="in_features",
datatype="GPFeatureLayer",
parameterType="Required",
direction="Input")
# Input table
param1 = arcpy.Parameter(
displayName="Clip Features",
name="clip_features",
datatype="GPFeatureLayer",
parameterType="Required",
direction="Input")
# Input workspace
param2 = arcpy.Parameter(
displayName="Output Feature Class",
name="out_feature_class",
datatype="DEFeatureClass",
parameterType="Required",
direction="Output")
# Set the dependencies for the output and its schema properties
# The two input parameters are feature classes.
#
param2.parameterDependencies = [param0.name, param1.name]
# Feature type, geometry type, and fields all come from the first
# dependency (parameter 0), the input features
#
param2.schema.featureTypeRule = "FirstDependency"
param2.schema.geometryTypeRule = "FirstDependency"
param2.schema.fieldsRule = "FirstDependency"
# The extent of the output is the intersection of the input features
# and the clip features (parameter 1)
#
param2.schema.extentRule = "Intersection"
params = [param0, param1, param2]
return params
class ExampleClipTool2(object):
def __init__(self):
self.label = "Example Clip tool 2"
self.description = "Using clone to set rules to FirstDependency, then overriding the extent rule"
def getParameterInfo(self):
# Input feature class
param0 = arcpy.Parameter(
displayName="Input Features",
name="in_features",
datatype="GPFeatureLayer",
parameterType="Required",
direction="Input")
# Input table
param1 = arcpy.Parameter(
displayName="Clip Features",
name="clip_features",
datatype="GPFeatureLayer",
parameterType="Required",
direction="Input")
# Input workspace
param2 = arcpy.Parameter(
displayName="Output Feature Class",
name="out_feature_class",
datatype="DEFeatureClass",
parameterType="Required",
direction="Output")
# Set the dependencies for the output and its schema properties
# The two input parameters are feature classes.
#
param2.parameterDependencies = [param0.name, param1.name]
param2.schema.clone = True
params = [param0, param1, param2]
return params
def updateParameters(self, parameters):
# The only property of the clone that changes is that the extent
# of the output is the intersection of the input features
# and the clip features (parameter 1)
#
parameters[0].schema.extentRule = "Intersection"
return
featureTypeRule
Данная настройка определяет тип объекта для выходного класса объектов. Данное правило не применяется к выходным растрам или таблицам.
Значение |
Описание |
---|---|
"КакОпределено" |
Тип объекта будет определен с помощью свойства ТипОбъекта (featureType). |
"ПерваяЗависимость" |
Тип объекта будет таким же, как и первый параметр в зависимостях. Если первый зависимый параметр содержит несколько значений (список значений), будет использовано первое значение из списка. |
featureType
Когда значением featureTypeRule является КакОпределено ("AsSpecified"), то значение ТипОбъекта (featureType) используется для определения типа объекта для выходных объектов.
Значение |
Описание |
---|---|
"Простой" |
Выходной класс объектов будет содержать простые объекты. Тип геометрии объектов определяется с помощью ПравилоТипаГеометрии (geometryTypeRule). |
"Аннотация" |
Выходной класс объектов будет содержать объекты аннотаций. |
"Размерность" |
Выходной класс объектов будет содержать объекты-размеры. |
geometryTypeRule
Данная настройка определяет тип геометрии (например, точка или полигон) для выходного класса объектов.
Значение |
Описание |
---|---|
"Неизвестный" |
Это установка по умолчанию. Чаще всего вам будет доступна возможность определить тип геометрии в обновитьПараметры (updateParameters()), основываясь на значениях других параметров. Вам только нужно установить правило на Неизвестный ("Unknown"), если у вас нет достаточной информации для определения типа геометрии. |
"ПеоваяЗависимость" |
Тип геометрии является тем же, что и первый зависимый параметр. Если первый зависимый параметр содержит несколько значений (список значений), будет использовано первое значение из списка. |
"Mин", "Maкс" |
Проверяет геометрии всех зависимых параметров и устанавливает тип выходной геометрии на минимальный или максимальный найденный тип. "Mин" и "Maкс" определяются следующим образом:
|
"КакОпределено" |
Тип геометрии будет определен с помощью значения свойства ТипГеометрии (geometryType). |
geometryType
Установите его на тип геометрии для использования ("Точка", "Мультиточка", "Полилиния", или "Полигон"), в случае если значением ПравилоТипаГеометрии (geometryTypeRule) является КакОпределено ("AsSpecified").
extentRule
Значение |
Описание |
---|---|
"КакОпределено" |
Выходной экстент будет определен свойством extent. |
"ПерваяЗависимость" |
Выходной экстент является таким же, что и первый зависимый параметр. Если первый зависимый параметр содержит несколько значений (список значений), будет использовано первое значение из списка. |
"Пересечение" |
Выходной экстент будет геометрическим пересечением всех зависимых параметров. (Это то, что использует инструмент Вырезать (Сlip), как показано ниже.) |
"Объединение" |
Выходной экстент будет геометрическим объединением всех зависимых параметров. |
"Среда" |
Выходной экстент будет вычислен на основе настроек параметров среды выходного экстента. |
Пример:
# The extent of the output is the intersection of the input features
# and the clip features (the dependent parameters)
#
parameters[2].schema.extentRule = "Intersection"
extent
Установите его на тот экстент, который вы хотите использовать, если значением extentRule является "AsSpecified". Вы можете также задать экстент с помощью строки с разделителем пробелы, или объекта списка Python с четырьмя значениями. Нужная последовательность: xmin, ymin, xmax, ymax.
parameters[2].schema.extentRule = "AsSpecified"
parameters[2].schema.extent = "123.32 435.8 987.3 567.9"
или используя список Python
xmin = 123.32
ymin = 435.8
xmax = 987.3
ext = [xmin, ymin, xmax, 567.9]
parameters[2].schema.extent = ext
fieldsRule
fieldsRule определяет, какие поля будут существовать в выходной таблице или классе объектов.
В таблице, приведенной ниже, FID означает Feature ID, но реально связано с полем ObjectID, взятым в каждом классе объектов или таблице.
Значение |
Описание |
---|---|
"Нет" |
Никакие поля не выводятся, кроме поля, содержащего ID объекта. |
"ПерваяЗависимость" |
Выходные поля будут такими же, что и первый зависимый параметр. Если первый зависимый параметр содержит несколько значений (список значений), будет использовано первое значение из списка. |
"ПерваяЗависимостьFIDs" |
Только ObjectID первого зависимого входного объекта будет записано в выходные объекты. |
"Все" |
Все поля в списке зависимых параметров будут выходными. |
"ВсеNoFIDs" |
Все поля будут записаны в выходной класс объектов, кроме поля, содержащего ObjectID. |
"ВсеFIDsOnly" |
Все поля, содержащие ObjectID, записаны в выходной класс объектов. Больше ни одно поле из входного класса не будет записано в выходной. |
аdditionalFields
Кроме полей, которые были добавлены применением правила ПравилоПолей (fieldsRule), вы можете добавить дополнительные поля к выходному классу. дополнительныеПоля (additionalFields) берет список Python объектов полей.
cellSizeRule
Это определяет размер ячейки выходных растров или гридов.
Значение |
Описание |
---|---|
"КакОпределено" |
Выходной размер ячейки будет определен свойством размерЯчейки (сellSize). |
"ПерваяЗависимость" |
Размер ячейки вычисляется из первого зависимого параметра. Если первым зависимым параметром является растр, то используется его размер ячейки. Для других типов зависимых параметров, таких как классы объектов или наборы данных объектов, для вычисления размера ячейки используется экстент данных. Если первый зависимый параметр содержит несколько значений (список значений), будет использовано первое значение из списка. |
"Mин", "Maкс" |
"Mин" означает, что выходной размер ячейки является наименьшим размером ячейки у зависимых параметров. "Maкс" означает, что берется наибольший размер ячейки у зависимых параметров. |
"Среда" |
Выходной размер ячейки будет вычислен на основе настроек параметров средыразмер ячейки (cellsize). |
cellSize
Установите его на тот размер ячейки, который вы хотите использовать, если значением ПравилоРазмераЯчейки (сellSizeRule) является КакОпределено ("AsSpecified").
rasterRule
Данный параметр определяет тип данных выходного растра - целочисленный или число с плавающей точкой.
Значение |
Описание |
---|---|
"ПерваяЗависимость" |
Тип данных (целый или с плавающей точкой) является тем же, что и у первого зависимого параметра. Если первый зависимый параметр содержит несколько значений (список значений), будет использовано первое значение из списка. |
"Mин", "Maкс" |
Целое число считается меньшим, чем число с плавающей точкой. Например, если есть два зависимых параметра, один содержит целочисленные значения, а второй - числа с плавающей точкой, "Mин" выдаст выходные значения как целочисленные, а "Maкс" - как числа с плавающей точкой. |
"Целочисленный" |
Выходной растр содержит целочисленные значения. |
"Плавающий" |
Выходной растр содержит значения - числа с плавающей точкой. |
rasterFormatRule
Это определяет формат выходного растра: Грид ("Grid") или "Img". По умолчанию, значением является "Img", это формат ERDAS IMAGINE. "Грид" - это формат Esri.
additionalChildren
Рабочая область является контейнером для наборов данных (объектов, таблиц и растров). Эти наборы данных являются дочерними для рабочей области (вы можете считать рабочую область родителем по отношению к ним). Если ваш инструмент добавляет набор данных к новой или существующей рабочей области, вы можете обновить описание рабочей области, добавив описания дочерних объектов. Например, вы можете использовать инструмент, который получает список классов объектов (многозначный элемент), обновляет их некоторым способом, и затем записывает измененные классы объектов в существующую рабочую область. Если инструмент используется в ModelBuilder, рабочая область получается как выходной результат инструмента, и вы можете захотеть использовать эту рабочую область в качестве входного параметра для инструмента ВыбратьДанные (Select Data). ВыбратьДанные (Select Data) позволяет вам выбрать дочерний набор данных из контейнера и использовать его, как входной параметр для другого инструмента.
Входной параметр для additionalChildren - это один или более описаний дочерних элементов. Существует две формы описания дочерних элементов:
Форма |
Описание |
---|---|
Объект значение (value) |
Класс объектов, таблица, растр, объект-измерение или объект аннотации, как результат свойства значение (value). |
Объект списка Python в форме [тип (type), имя (name), поля, экстент, пространственная привязка (fields, extent, spatial reference)] |
Список Python, содержащий добавляемое описание к дочерним элементам Необходимы только первые два элемента в списке - тип и имя. Остальные аргументы являются необязательными. |
При добавлении более одного дочернего элемента, вы предоставляете список описаний дочерних элементов. Если вы добавляете дочерний элемент, используя форму объекта списка Python, вы создадите список списков для additionalChildren.
Форма списка Python имеет 5 аргументов, как описано в следующей таблице.
Аргумент |
Тип |
Описание |
---|---|---|
тип (type) |
необходимые данные |
Одно из следующих значений: Точка ("Point"), Мультиточка ("Multipoint"), Полилиния ("Polyline"), Полигон ("Polygon"), Таблица ("Table"), Растр ("Raster"), Аннотация ("Annotation"), Размерность ("Dimension") |
название |
необходимые данные |
Название набора данных. Это может быть просто базовое имя набора данных (улицы ("streets")) или полный путь к каталогу ("E:\mydata\test.gdb\infrastructure\streets"). Если предоставляется полный путь к каталогу, игнорируется все, кроме базового имени (" улицы (streets)"). |
поля |
опционально |
Список объектов поля Python. Содержит поля, принадлежащие дочернему элементу, если они известны. |
экстент (еxtent) |
опционально |
Строка или список Python, содержащие пространственный экстент для дочернего элемента. |
пространственная привязка (spatial reference) |
опционально |
Объект пространственной привязки. |
Данные аргументы должны быть приведены в указанном порядке. Чтобы пропустить необязательный аргумент, используйте ключевое слово PythonNone, или "#".
Ниже приведены примеры задания схемы рабочей области. Эти примеры основаны на инструменте-скрипте, который имеет следующие аргументы:
Имя параметра |
Свойства | |
---|---|---|
0 |
Входной класс объектов |
Класс объектов - входной. |
1 |
Входная таблица |
Таблица - входная. |
2 |
Входная рабочая область |
Рабочая область - входная (существующая рабочая область, содержащая результаты применения инструмента). |
3 |
Извлеченная рабочая область |
Рабочая область - Извлеченный выходной результат, полученный из Входной рабочей области. Схема данной рабочей области была изменена, чтобы содержать дополнительные дочерние элементы. |
Инструмент получает входные класс объектов и таблицу, копирует оба элемента в рабочую область, добавляет новое поле в класс объектов, затем создает новый класс полигональных объектов в рабочей области. (Реальная работа инструмента не важна, поскольку он используется только для иллюстрации настройки схемы рабочей области.) Пример кода, приведенный ниже, построенный на другом, начинается с простого использования additionalChildren. Если вы захотите встроить и протестировать некоторые из приведенных кодов, вы можете тестировать код, используя модель, показанную ниже.
В процедуре getParameterInfo, клонируется выходная рабочая область из параметра (param2).
class ExampleTool(object):
def __init__(self):
self.label = "Example tool"
self.description = "Example of parameter dependencies"
def getParameterInfo(self):
#Define parameter definitions
# Input feature class
param0 = arcpy.Parameter(
displayName="Input feature class",
name="in_features",
datatype="GPFeatureLayer",
parameterType="Required",
direction="Input")
# Input table
param1 = arcpy.Parameter(
displayName="Input table",
name="in_table",
datatype="GPTableView",
parameterType="Required",
direction="Input")
# Input workspace
param2 = arcpy.Parameter(
displayName="Input workspace",
name="in_workspace",
datatype="DEWorkspace",
parameterType="Required",
direction="Input")
# Derived workspaces
param3 = arcpy.Parameter(
displayName="Derived workspace",
name="out_workspace",
datatype="DEWorkspace",
parameterType="Derived",
direction="Output")
# Set dependencies to the input workspace parameter
param3.parameterDependencies = [param0.name]
# Copy all existing contents to output
param3.schema.clone = True
params = [param0, param1, param2, param3]
return params
Пример: Скопируйте два входных элемента (без изменений) в выходную рабочую область:
def updateParameters(self, parameters):
inFC = parameters[0].value # input feature class
inTable = parameters[1].value # input table
inWS = parameters[2].value # input workspace
if inFC and inTable and inWS:
parameters[3].schema.additionalChildren = [inFC, inTable]
return
Пример: Инструмент создает новый класс полигональных объектов. Единственные известные свойства для этого нового класса объектов (при проверке) - это имя ("SummaryPolygon") и тип ("polygon").
def updateParameters(self, parameters):
children = [] # New empty list
children.append(parameters[0].value)
children.append(parameters[1].value)
children.append(["polygon", "SummaryPolygon"])
parameters[3].schema.additionalChildren = children
return
Пример: Добавьте поле во входной класс объектов.
def updateParameters(self, parameters):
# Create a field object with the name "Category" and type "Long"
#
newField = arcpy.Field()
newField.name = "Category"
newField.type = "Long"
# Describe the input feature class in order to get its list of fields. The 9.3
# version of the geoprocessing object returns fields in a Python list, unlike
# previous versions, which returned fields in an enumerator.
#
desc = arcpy.Describe(parameters[0].value)
fieldList = desc.fields
# Add the new field to the list
#
fieldList.append(newField)
# Create a new child based on the input feature class, but with the
# additional field added
#
newChild = [desc.shapeType, desc.catalogPath, fieldList,
desc.extent, desc.spatialReference]
# Now create our list of children and add to the schema
#
children = []
children.append(newChild)
children.append(inTable)
children.append(["polygon", "SummaryPolygon"])
parameters[3].schema.additionalChildren = children
return
Чтобы создать поля для класса SummaryPolygon (это новый полигональный класс объектов), создайте список полей, используя шаблон, приведенный в примере выше.
Пример: Ввод множества значений
В этом примере, первый параметр является объектом со множеством значений из классов объектов. Каждый класс объектов из множественного объекта копируется в извлеченную рабочую область. Новое поле НомерПроекта ("ProjectID") добавляется к каждому из скопированных классов объектов.
# 0 - input features (multivalue)
# 1 - input workspace
# 2 - derived workspace
def updateParameters(self, parameters):
inVT = parameters[0].value # multivalue ValueTable
inWS = parameters[1].value # WorkSpace
# Add each feature class to the output workspace. In addition,
# add a new field "ProjectID" to each feature class
#
if inVT and inWS:
rowCount = inVT.rowCount # Row count in MultiValue table
children = []
newField = arcpy.Field()
newField.name = "ProjectID"
newField.type = "Long"
for row in range(0, rowCount):
value = inVT.getValue(row, 0)
if value:
d = arcpy.Describe(value)
fieldList = d.fields
# Note -- not checking if field already exists
#
fieldList.append(newField)
# Create new child with additional ProjectID
# field and add child to list of children
#
child = [d.shapeType, d.catalogPath, fieldList]
children.append(child)
parameters[2].schema.additionalChildren = children
return