У каждого выходного параметра следующих типов: класс пространственных объектов, таблица, растр или рабочая область – есть объект схемы. Только у выходных классов пространственных объектов, таблиц, растров и рабочих областей есть схема; у других типов её нет. Объект схемы создается для вас процессом геообработки. К схеме осуществляется доступ через объект 'параметр', и устанавливаются правила для описания выходных данных инструмента. После установки правил схемы код внутренней проверки анализирует эти правила и обновляет описание выходных данных.
Для проверки, настройка заключается в следующем:
- Во время первого открытия диалогового окна инструмента вызывается getParameterInfo. Для описания выходных данных устанавливаются статические правила (правила, которые не изменяются вводимыми пользователем данными). На этом этапе не создается описания на выходе, так как пользователь не указал значения ни для одного из параметров (если вы не задали значений по умолчанию).
- Как только пользователь начинает как-либо работать с диалоговым окном, происходит вызов updateParameters.
- updateParameters может изменить объект схемы с учетом динамического поведения, которое нельзя установить с помощью параметрических зависимостей (например, добавление нового поля с помощью Добавить поле).
- После процедуры updateParameters запускаются подпрограммы внутренней проверки, а правила, найденные в объекте схемы, применяются для обновления описания выходных данных.
- Затем происходит вызов updateMessages. Вы можете изучить предупреждения и сообщения об ошибках, которые выводятся внутренней процедурой оценки, и изменить их или добавить свои пользовательские предупреждения или сообщения об ошибках.
Все свойства schema доступны для чтения и записи, за исключением type, которое доступно только для чтения.
Имя свойства | Значение |
---|---|
type | String: "Feature", "Table", "Raster" , "Container" (для рабочих областей и наборов данных объектов) |
clone | Boolean |
featureTypeRule | String: "AsSpecified", "FirstDependency" |
featureType | String: "Simple", "Annotation", "Dimension" |
geometryTypeRule | String: "Unknown", "FirstDependency", "Min", "Max", "AsSpecified" |
geometryType | String: "Point", "Multipoint", "Polyline", "Polygon" |
extentRule | String: "AsSpecified", "FirstDependency", "Intersection", "Union", "Environment" |
extent | Объект Extent |
fieldsRule | String: "None", "FirstDependency", "FirstDependencyFIDs", "All", "AllNoFIDs", "AllFIDsOnly" |
additionalFields | Список объектов Field |
cellSizeRule | String: "AsSpecified", "FirstDependency", "Min", "Max", "Environment" |
cellSize | Double |
rasterRule | String: "FirstDependency", "Min", "Max", "Integer", "Float" |
rasterFormatRule | String: "Img", "Grid" |
additionalChildren | Список наборов данных для добавления в схему рабочей области |
Использование 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 равен "Производный", будет создана точная копия. Это было поведение инструмента Добавить поле.
- Если значением parameter.parameterType является "Обязательный", то будет создана точная копия, но путь к каталогу, содержащему набор данных, будет изменен. Пути каталога состоят из двух частей: рабочая область и базовое имя, например E:/Data/TestData/netcity.gdb/infrastructure/roads.
- Рабочая область = E:/Data/TestData/netcity.gdb/infrastructure
- Исходное имя = roads
- Базовое имя является тем же, что и базовое имя для первого входного параметра, содержащего набор данных (не первой зависимости, но первого параметра), с добавленным именем инструмента-скрипта (например, roads_MyTool).
- Рабочей области присвоены настройки параметров среды временной рабочей области. Если она пустая, то используются настройки параметров среды текущей рабочей области. Если она также пуста, то используется рабочая область первого входного параметра, содержащего набор данных. Если рабочая область установлена только на чтение, то используется системная временная директория.
После установки clone на true все методы, основанные на правилах, такие как featureTypeRule, geometryTypeRule и extentRule, устанавливаются на значение "FirstDependency".
Два примера кода ниже выполняют одинаковую работу. Оба примера основаны на том, как инструмент Вырезать создает выходную схему.
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
Этот параметр определяет тип объекта выходного класса объектов. Это правило не влияет на выходные растровые данные или таблицы.
Значение | Описание |
---|---|
"AsSpecified" | Тип объекта будет определяться свойством featureType. |
"FirstDependency" | Тип объекта будет таким же, как и первый влияющий параметр. Если первый влияющий параметр содержит несколько значений (список значений), будет использоваться первое значение в этом списке. |
featureType
Если значением featureTypeRule является "AsSpecified", то значение в featureType используется для указания типа объекта выходных данных.
Значение | Описание |
---|---|
"Simple" | Выходные данные будут содержать простые объекты. Тип геометрии объектов указывается с помощью geometryTypeRule. |
"Annotation" | Выходные данные будут содержать объекты аннотаций. |
"Dimension" | Выходные данные будут содержать объекты размеров. |
geometryTypeRule
Этот параметр определяет тип геометрии (например, точка или полигон) выходного класса объектов.
Значение | Описание |
---|---|
"Unknown" | Это установка по умолчанию. Обычно вы должны иметь возможность определить тип геометрии в updateParameters на основе значений других параметров. Вам только нужно установить правило на "Unknown", если у вас нет достаточной информации для определения типа геометрии. |
"FirstDependency" | Тип геометрии будет совпадать с первым влияющим параметром. Если первый влияющий параметр содержит несколько значений (список значений), будет использоваться первое значение в этом списке. |
"Min", "Max" | Проверяются геометрии всех зависимых параметров и устанавливается тип выходной геометрии на минимальный или максимальный найденный тип. "Min" и "Max" пределяются следующим образом:
|
"AsSpecified" | Тип геометрии будет определен значением свойства geometryType. |
geometryType
Установите это значение для типа геометрии ("Point", "Multipoint", "Polyline" или "Polygon") когда geometryTypeRule равно "AsSpecified".
extentRule
Значение | Описание |
---|---|
"AsSpecified" | Выходной экстент будет указан в свойстве extent. |
"FirstDependency" | Выходной экстент будет совпадать с первым влияющим параметром. Если первый влияющий параметр содержит несколько значений (список значений), будет использоваться первое значение в этом списке. |
"Intersection" | Выходным экстентом будет геометрическое пересечение всех влияющих параметров. (Это то, что использует инструмент Вырезать, как показано ниже.) |
"Union" | Выходным экстентом будет геометрическое объединение всех влияющих параметров. |
"Environment" | Выходной экстент будет вычислен на основе настроек Параметров среды экстента. |
Пример
# 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". Можно задать экстент в виде строки, разделенной пробелами, или списка с четырьмя значениями. Последовательность такова: xmin, ymin, xmax, ymax.
parameters[2].schema.extentRule = "AsSpecified"
parameters[2].schema.extent = "123.32 435.8 987.3 567.9"
# Alternatively use a list, as follows:
# parameters[2].schema.extent = [123.32, 435.8, 987.3, 567.9]
fieldsRule
fieldsRule определяет, какие поля будут у выходного класса объектов или таблицы.
В таблице, приведенной ниже, FID означает Feature ID, но реально связано с полем ObjectID в каждом классе объектов или таблице.
Значение | Описание |
---|---|
"None" | Никакие поля, кроме ObjectID, выводиться не будут. |
"FirstDependency" | Выходные поля будут совпадать с первым влияющим параметром. Если первый влияющий параметр содержит несколько значений (список значений), будет использоваться первое значение в этом списке. |
"FirstDependencyFIDs" | Только ObjectID первого зависимого входного параметра будет записан в выходные данные. |
"All" | Выводятся все поля в списке зависимых параметров. |
"AllNoFIDs" | Выводятся все поля кроме ObjectID. |
"AllFIDsOnly" | Выводятся все поля ObjectID, но другие поля из входных параметров не записываются. |
additionalFields
Помимо полей, добавленных приложением в fieldsRule, в выходные данные можно добавить дополнительные поля. additionalFields получает список объектов-полей.
cellSizeRule
Это определяет размер ячейки выходных растров или гридов.
Значение | Описание |
---|---|
"AsSpecified" | Размер выходной ячейки указан в свойстве cellSize. |
"FirstDependency" | Размер ячейки вычисляется на основе первого зависимого параметра. Если первым зависимым параметром является растр, используется его размер ячейки. Для других типов зависимых параметров, таких как классы объектов или наборы данных объектов, для вычисления размера ячейки используется экстент данных. Если первый влияющий параметр содержит несколько значений (список значений), будет использоваться первое значение в этом списке. |
"Min", "Max" | "Min" означает, что размер выходной ячейки является наименьшим размером ячейки у зависимых параметров. "Max" означает, что берется наибольший размер ячейки у зависимых параметров. |
"Environment" | Размер выходной ячейки рассчитывается на основе параметра среды Размер ячейки. |
cellSize
Установите для него значение размера ячейки, которое будет использоваться, когда cellSizeRule равно "AsSpecified".
rasterRule
Определяет тип данных (integer или float) в выходных растровых данных.
Значение | Описание |
---|---|
"FirstDependency" | Тип данных (integer или float) будет совпадать с первым влияющим параметром. Если первый влияющий параметр содержит несколько значений (список значений), будет использоваться первое значение в этом списке. |
"Min", "Max" | Целое число считается меньшим, чем число с плавающей точкой. Например, если есть два зависимых параметра, один содержит целочисленные значения, а второй – числа с плавающей точкой, "Min" выдаст выходные значения как целочисленные, а "Max" – как числа с плавающей точкой. |
"Integer" | Выходной растр содержит целочисленные значения. |
"Float" | Выходной растр содержит значения – числа с плавающей точкой. |
rasterFormatRule
Это определяет формат выходного растра: "Grid" или "Img". По умолчанию значением является "Img", это формат ERDAS IMAGINE. "Grid" - это формат Esri.
additionalChildren
Рабочая область является контейнером для наборов данных (объектов, таблиц и растров). Эти наборы данных являются дочерними для рабочей области (вы можете считать рабочую область родителем по отношению к ним). Если инструмент добавляет набор данных к новой или существующей рабочей области, вы можете обновить описание рабочей области, добавив описания дочерних объектов. Например, вы можете использовать инструмент, который получает список классов объектов (многозначный элемент), обновляет их некоторым способом, и затем записывает измененные классы объектов в существующую рабочую область. Если инструмент используется в ModelBuilder, рабочая область является выходным результатом инструмента, и вы можете использовать эту рабочую область в качестве входного параметра для инструмента Выбрать данные. ВыбратьДанные позволяет вам выбрать дочерний набор данных из контейнера и использовать его, как входной параметр для другого инструмента.
Входной параметр для additionalChildren – это одно или более описаний дочерних элементов. Существует две формы описания дочерних элементов:
Форма | Описание |
---|---|
Объект value | Значение класс объектов, таблица, растр, объект-размер или объект аннотации, как результат свойства value. |
Объект списка в форме [type, name, fields, extent, spatial reference] | Список, содержащий добавляемое описание к дочерним элементам Необходимы только первые два элемента списка, type и name. Остальные аргументы являются необязательными. |
При добавлении более одного дочернего элемента предоставьте список описаний дочерних элементов. Если вы добавляете дочерний элемент в форму списка, создайте список списков для additionalChildren.
Форма списка имеет 5 аргументов, как описано в следующей таблице.
Аргумент | Тип | Описание |
---|---|---|
type | Обязательный | Одно из следующих значений: "Point", "Multipoint", "Polyline", "Polygon", "Table", "Raster", "Annotation", "Dimension" |
name | Обязательный | Название набора данных. Это может быть базовое имя набора данных (streets) или полный путь к каталогу (E:\mydata\test.gdb\infrastructure\streets). Если предоставлен полный путь к каталогу, игнорируется все, кроме базового имени ("улицы (streets)"). |
fields | Дополнительный | Список объектов поля. Содержит поля, принадлежащие дочернему элементу, если они известны. |
extent | Дополнительный | Строка или список , содержащие пространственный экстент для дочернего элемента. |
spatial reference | Дополнительный | Объект пространственной привязки. |
Данные аргументы должны быть приведены в указанном порядке. Чтобы пропустить необязательный аргумент, используйте None или '#'.
Ниже приведены примеры задания схемы рабочей области. Эти примеры основаны на инструменте-скрипте, который имеет следующие аргументы:
Индекс параметра | Имя параметра | Свойство |
---|---|---|
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
Example: Copy the two inputs (no modifications) to the output workspace:
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
Example: The tool creates a new polygon feature class. The only properties known about this new feature class (when validating) are the name ("SummaryPolygon") and type ("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
Example: Add a field to the input feature class.
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 (новый полигональный класс объектов), создайте список объектов полей по образцу, приведенному в примере выше.
Example: Multivalue input
In this example, the first parameter is a multivalue of feature classes. Each feature class in the multivalue is copied to the derived workspace. A new field, "ProjectID", is added to each of the copied feature classes.
# 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