При публикации результата в Редакторе сервиса для каждого параметра задачи указывается Режим ввода. Выбираемый режим определяет, как клиент будет добавлять значение в параметр задачи. Цель данной статьи – помочь лучше понять, почему некоторые опции режима ввода недоступны для параметра, и предложить способы создания задач, работающих с доступными опциями режима ввода.
Существуют следующие режимы ввода:
- Определяемое пользователем значение: значение для параметра предоставляет клиент.
- Список вариантов: клиент получает список строк (список вариантов) и должен выбрать одну или несколько строк из этого списка. В зависимости от типа входных данных, строки в списке вариантов могут быть именами слоев или простыми опциями ключевых слов.
- Постоянное значение: задача использует значение, которое вы укажете для параметра при создании результата. Поскольку значение является фиксированным, клиент изменить его не может, поэтому оно не станет параметром задачи при публикации сервиса.
Режим ввода вариантов, имеющихся для соответствующего параметра, зависит от типа данных параметра инструмента. Существует три категории типов данных:
- Набор данных: данные, хранящиеся на диске, например, класс пространственных объектов, таблица, папка, документ карты, база данных и т.д.
- Скаляры: все, что не является набором данных, например, числа и строки.
- Таблица значений: особый тип данных, являющийся многостолбцовой таблицей значений.
Наборы данных
Сервис GIS работает с самым простым из всех клиентов: веб-браузером, запущенным на компьютере и не имеющем каких-либо функций GIS. Эти простые клиенты знают лишь, как передавать (отправлять и получать) на сервер пакеты простых данных, например, текст, числа, файлы, а также географические объекты и их атрибуты (поля). В случае с задачами геообработки, наборы данных ГИС можно разделить на две категории: передаваемые и непередаваемые.
- Наборами данных, которые можно передавать, являются объекты, растры, таблицы и файлы. Параметры, содержащие передаваемые наборы данных, поддерживают режим ввода Определяемое пользователем значение.
- Наборами данных, которые нельзя передавать, является все остальное помимо объектов, растров, таблиц и файлов. Существует две категории непередаваемых наборов данных.
- Сложные наборы данных — это такие наборы данных как геометрические сети, наборы сетевых данных, топологии, TIN и т. д. Эти типы данных известны как сложные наборы данных, потому что они воспроизводят сложные связи между простыми объектами.
- Контейнерные наборы данных – это этакие элементы, как папки, файлы, персональные базы геоданных и документы карт (.mxd). Эти типы данных содержат смешанную подборку других наборов данных, поэтому и называются контейнерами.
Определение типа данных параметра инструмента
При определении задачи геообработки, имеющей входные данные объекта или таблицы, одним из Режимов ввода, который можно выбрать в Редакторе сервиса является Определяемое пользователем значение. Можно установить, поддерживается ли Определяемое пользователем значение, до того как войти в Редактор сервиса, для этого нужно определить тип данных параметра инструмента любым из следующих способов:
- Раздел синтаксиса на странице справки инструмента имеет таблицу, в которой описывается каждый параметр. Последний столбец таблицы содержит тип данных параметра.
- В ModelBuilder щелкните переменную правой кнопкой мыши, выберите Свойства (Properties), затем перейдите на закладку Тип данных (Data Type). Тип данных указан в верхней части диалогового окна.
- В случае со инструментом-скриптом в окне Каталог (Catalog) щелкните правой кнопкой мыши на инструменте-скрипте и выберите Свойства (Properties). В диалоговом окне свойств перейдите к закладке Параметры (Parameters). Тип данных каждого параметра указан в таблице параметров.
Списки вариантов и непередаваемые наборы данных
Если входное значение параметра является слоем, связанным с непередаваемым набором данных, в качестве опции режима ввода можно выбрать Список вариантов. Например, на приведенном ниже рисунке изображен параметр Сеть видов передвижения (Transportation mode network) в задаче, которая ищет наилучший маршрут для вида передвижения пользователя – на машине, велосипеде или пешком.
Тип данных этого параметра – Слой набора сетевых данных. Наборы сетевых данных являются сложными наборами данных, которые нельзя передавать через интернет, поэтому Определяемое пользователем значение недоступно для этого параметра. Однако можно использовать Список вариантов, чтобы задать для использования список вариантов имен слоев. Клиент выберет одно из имен слов из списка вариантов, задача будет использовать этот слой, обращаясь к набору сетевых данных, на который ссылается слой и который хранится на сервере.
Самые сложные наборы данных имеют представление соответствующего слоя. В примере, приведенном выше, показаны слои набора сетевых данных. Существуют слои TIN, геостатистические слои, слои наборов данных участков, слои наборов LAS и т. д. При наличии непередаваемого набора данных всегда можно использовать представление его слоя в качестве входных данных. Пример задачи, приведенный выше, создан путем выполнения модели и предоставления слоя Сеть улиц (Street network) в качестве входных данных. Если модель выполняется путем предоставления пути к набору сетевых данных на диске, а не имени слоя, в качестве режима ввода будет задано Постоянное значение. Необходимо запустить инструмент, используя слой в качестве входных данных, чтобы появилась опция Список вариантов.
Подведем итог:
- Клиенты могут отправлять и получать (передавать) через интернет простые объекты, таблицы, растры и файлы.
- Сложные наборы данных, например, наборы сетевых данных, TIN, наборы данных участков и т. п. являются непередаваемыми. Контейнерные наборы данных, например, папки, базы геоданных, документы карт и т. д. также являются непередаваемыми. Т. е. клиент не может создать эти сложные наборы данных или контейнеры и передать их через интернет. Это относится и к самым полнофункциональным клиентам, например, ArcMap.
- Самые сложные наборы данных имеют представления слоя, т.е. можно добавить набор данных в ArcMap и в таблице содержания будет создан слой.
- Можно создать список вариантов имен слоев, и клиент выберет одно или несколько имен слоев в качестве входных данных для задачи. Задача затем будет использовать набор данных, на который ссылается слой.
- Чтобы создать список вариантов имен слоев, необходимо запустить инструмент, используя слой в качестве входных данных. В Редакторе сервиса список вариантов будет заполнен из подходящих слоев таблицы содержания.
- При запуске инструмента с помощью пути к набору данных на диске опция Список вариантов будет недоступна, даже если в таблице содержания есть слои правильного типа.
Примечание:
При публикации списка вариантов имен слоев, данные, на которые ссылаются слои, станут проектными данными и будут скопированы на GIS сервер, если только они уже не находятся в хранилище данных сервера.
Постоянное значение и сложные наборы данных
Если входные данные для задачи являются путем к сложному набору данных (например, D:\mydata\chicago.gdb\transportation\streetnetwork, набор сетевых данных) в качестве Режима ввода (Input mode) будет использоваться Постоянное значение (Constant value). При публикации задачи в режиме ввода Постоянное значение набор данных будет скопирован на сервер (если набор уже не находится в хранилище сервера), и задача будет использовать этот скопированных набор.
При возможности добавить набор данных в ArcMap для создания слоя, можно перезапустить инструмент, используя слой в качестве входных данных. Это позволит создать новый результат, к которому можно предоставить общий доступ, и Редактор сервиса станет поддерживать Список вариантов в качестве режима ввода.
Примечание:
Для геометрических сетей создавать слои нельзя. Параметры, содержащие геометрические сети, всегда будут использовать в качестве режима ввода Постоянное значение.
Постоянное значение и контейнерные наборы данных
Контейнеры – это этакие элементы, как папки, файлы, персональные базы геоданных и документы карт (.mxd). Эти типы данных содержат смешанную подборку других наборов данных, поэтому и называются контейнерами. Контейнеры нельзя передавать, общее правило таково – контейнер и все его содержимое будут скопированы на сервер (если контейнер уже не находится в хранилище сервера), и опубликованное задание будет использовать этот скопированный контейнер. Некоторые распространенные виды контейнеров описываются ниже.
Папки
Если в качестве входных данных используется папка, в качестве Режима ввода будет использовано Постоянное значение. При публикации в режиме ввода Постоянное значение папка и ее содержимое (см. примечание ниже) будут скопированы на сервер (если папка уже не находится в хранилище сервера), и задача будет использовать эту скопированную папку.
Примечание:
Когда в ходе процесса публикации папки копируются на сервер, производится копирование только файлов и наборов геоданных, вложенные папки не копируются. Некоторые наборы геоданных, например, файловые базы геоданных, растры и TIN, формально считаются папками, но если они будут найдены в копируемой папке, то тоже будут скопированы на сервер.
Документы карт (.mxd)
Если в качестве входных данных используется документ карты, в качестве Режима ввода будет использовано Постоянное значение. При публикации в режиме ввода Постоянное значение документ карты, все его слои и наборы данных, на которые ссылаются слои, будут скопированы на сервер, если документ карты уже не находится в хранилище сервера. Если какие-либо из связанных наборов данных не будут найдены в хранилище сервера, они тоже будут скопированы на сервер. Документ карты отправляется на сервер упакованным, на сервере он распаковывается.
Базы геоданных
Если в качестве входных данных используется база геоданных, в качестве Режима ввода будет использовано Постоянное значение. При публикации в режиме ввода Постоянное значение база геоданных и все ее содержимое будут скопированы на сервер (если они уже не находятся в хранилище сервера), и задача будет использовать эту скопированную базу.
Персональные базы геоданных (.mdb) на серверных платформах (64-битная Window и Linux) не поддерживаются и при копировании на сервер будут преобразованы в файловые базы геоданных. Многопользовательские базы геоданных при копировании на сервер также будут преобразованы в файловые базы геоданных.
Непередаваемые выходные данные
Если выходные данные инструмента являются сложным или контейнерным набором данных, то они не могут передаваться обратно клиенту. Параметр выходных данных в Редакторе сервиса покажет Тип данных Строка. На рисунке, приведенном ниже, значение, возвращенное задачей, будет именем созданного набора данных TIN, а не самим набором данных.
Существует несколько опций для работы с непередаваемыми выходными данными.
- Использовать результирующий картографический сервис, чтобы отправить клиенту результат в виде карты. Набор данных клиенту не передается, только карта данных.
- Конвертировать набор данных в передаваемый набор данных. Например, можно использовать инструмент TIN в растр (TIN To Raster), чтобы конвертировать непередаваемый TIN в передаваемый набор растровых данных.
- Создать пакет слоев (.lpk) набора данных, используя один из инструментов в Группе инструментов для слоев и представлений таблиц (Layers and Table Views toolset), а затем применить инструмент Упаковать слои (Package Layer), чтобы создать пакет слоев. Пакет слоев – это файл, а файлы можно передавать через интернет. Клиенту нужно будет распаковать пакет.
- Использовать ZIP-утилиту для создания файла набора данных или папки результата и передать файл .zip клиенту. Клиент должен будет сам разархивировать файл. Образец сервиса вырезания и передачи вырезает слои из изучаемой территории в файловую базу геоданных (и другие форматы), затем создает файл .zip, чтобы передать его клиенту. Если хотите использовать этот метод, перейдите по ссылкам ниже:
Скаляры
Скалярный тип данных содержит все, что не является набором данных. Скалярные типы данных иногда называют простыми типами данных. В геообработке существует множество скалярных типов данных, например, поле (поле в таблице), выражение SQL, выражение калькулятора, списки полей, нечеткая функция и много других. Некоторые используются редко. Другие, например, поле и выражение SQL, распространены широко.
Следующие скалярные типы данных полностью поддерживаются всеми клиентами и могут отправляться и получаться по интернету без необходимости в конвертации: булевы операторы, даты, линейные единицы измерения, числа двойной точности и строки. Все другие скалярные типы данных конвертируются в строки и считаются не поддерживаемыми и непередаваемыми.
Конвертация не поддерживаемых типов скалярных данных в строки редко вызывает проблемы, потому что каждый тип данных имеет четко определенное представление строки — нужно только знать, что он собой представляет, чтобы описать в документах для клиента. В некоторых случаях может потребоваться изменение инструмента, чтобы он создал представление строки, используя другую информацию, предоставленную клиентом. Оба этих метода описываются ниже. Особый вид данных, таблица значений (Value Table) обсуждается в отдельном разделе ниже.
Поиск представления строки параметра
Большинство представлений строк очевидны. Например, представление строки типа данных Поле – это имя поля. Иногда, определить представление строки бывает сложнее.
В следующем примере показан параметр Радиус поиска (Search radius) инструмента ОВР (IDW), использующегося для интерполяции поверхностей от точек. Параметр имеет три составляющих: метод (Переменный (Variable) или Фиксированный (Fixed)) и два значения для Настроек радиуса поиска (Search Radius Settings), как показано ниже.
- Чтобы найти представление строки этого параметра, сначала нужно посмотреть в раздел синтаксиса параметра на странице справки по инструменту. Первый столбец этой таблицы содержит имя параметра, а в некоторых случаях и представление строки. Последний столбец таблицы содержит тип данных параметра. На рисунке, приведенном ниже, показано содержание первого столбца для параметра Радиус поиска, о котором говорилось выше.
Также можете ознакомиться с примерами кода Python, приведенными в нижней части страницы справки по инструменту, так как эти примеры часто используют представление строки параметра.
- Чтобы просмотреть представление строки любого параметра, запустите инструмент, щелкните правой кнопкой мыши результат в окне Результаты и выберите Копировать как фрагмент Python (Copy as Python Snippet). Вставьте фрагмент в текстовый редактор и проверьте его. Вот фрагмент кода (начальные параметры удалены для краткости) для запуска инструмента ОВР: arcpy.gp.Idw_sa(...,"2","VARIABLE 12 250","#"). Просмотрев фрагмент, вы увидите, что представление строки для радиуса поиска (рисунок выше) – "VARIABLE 12 250". Можно еще раз запустить инструмент, изменить значения параметров и скопировать фрагмент Python, чтобы проверить представление строки любого параметра.
После того как представление строки определено, необходимо сообщить об этом клиентам. Делается в документации к задаче.
Создание представления строки внутри инструмента
Для сложных представлений строк или требующих от клиента слишком больших усилий по созданию строки, можно изменить инструмент, чтобы создать строку для клиента. Хорошим примером является тип данных Выражение SQL. В модели, приведенной ниже, типом данных параметра Выражение является выражение SQL. Чтобы запустить эту модель в качестве задачи, клиент должен предоставить подходящую строку выражения SQL.
Если целью задачи является выбор участка на основании имени владельца, можно создать модель, в которой клиент вводит имя владельца, а подходящее SQL выражение вводится за него. Проще всего это сделать, используя замену переменной, как показано ниже. Переменная Имя владельца является строкой. Клиент вводит имя владельца участка, а подходящее SQL выражение создается внутри модели. Другие примеры замены переменной можно найти в статье Примеры замены переменной в модели.
Создание собственных списков вариантов
Многие инструменты геообработки определяют для параметров строк списки вариантов, известные как фильтры списка значений. Инструмент Выбрать в слое по атрибуту (Select Layer By Attribute), показанный выше, имеет список вариантов строк для параметра Тип выборки (НОВАЯ ВЫБОРКА (NEW_SELECTION), ДОБАВИТЬ В ВЫБОРКУ (ADD_TO_SELECTION), УДАЛИТЬ ИЗ ВЫБОРКИ (REMOVE_FROM_SELECTION) и т. д.). Можно создавать собственные списки вариантов для переменных строк, используя фильтры списков значений.
Таблицы значений
Таблица значений – это многостолбцовая таблица, используемая в инструментах Пересечь (Intersect), Слияние (Merge) и многих других. На приведенном ниже рисунке показан инструмент Пересечь и его параметр Входные объекты, который является таблицей значений с двумя столбцами: Объекты и Ранг.
Таблицы значений являются непередаваемыми, в качестве Режима ввода для них используется Постоянное значение в Редакторе сервиса.
Если необходимо, чтобы клиент вводил значения, а не использовал фиксированное значение, нужно будет изменить модель или скрипт так, чтобы он использовал другие типы данных помимо таблицы значений.
Таблицы значений могут иметь любое количество строк, и то, как изменяется инструмент, зависит от того, должен клиент вводить постоянное или переменное число строк. Если какие-либо столбы в таблице значений содержат наборы данных, тогда количество строк будет фиксированным, поскольку каждая строка должна будет иметь собственный параметр, чтобы содержать набор данных.
На приведенном ниже рисунке показан метод, который можно использовать в ModelBuilder для пересечения двух классов пространственных объектов с рангами без использования таблицы значений. Переменные Улицы (Streets) и Парки (Parks) автоматически создаются ModelBuilder при введении их в таблицу значений. Переменные Ранг улиц (Streets Rank) и Ранг парков (Parks Rank) создаются следующим образом:
- Создайте две обособленных переменных типа длинное целое. Переименуйте их и сделайте параметрами модели.
- Откройте инструмент Пересечь и щелкните ячейку в столбце Ранги, как показано ниже. Вы сможете выбрать одну из двух созданных переменных Длинное целое.
Всегда можно создать инструмент-скрипт, принимающий отдельные входные данные, создающий параметр таблицы значений внутри скрипта и затем вызывающий инструмент. Код, приведенный ниже, выполняет пересечение двух классов пространственных объектов без использования параметра таблицы значений.
# Script tool to intersect two feature classes.
#
import arcpy
inFeatures1 = arcpy.GetParameterAsText(0) # data type = Feature layer
inRank1 = arcpy.GetParameterAsText(1) # data type = Long integer
inFeatures2 = arcpy.GetParameterAsText(2) # data type = Feature layer
inRank2 = arcpy.GetParameterAsText(3) # data type = Long integer
outFeatures = arcpy.GetParameterAsText(4) # data type = Feature class
# Default values
#
joinAttributes = "ALL"
xyTolerance = "#"
outputType = "INPUT"
# Construct the value table parameter, a list of lists
#
valueTable = [ [inFeatures1, inRank1], [inFeatures2, inRank2] ]
arcpy.Intersect_analysis(valueTable, outFeatures, joinAttributes,
xyTolerance, outputType)
В примере, приведенном ниже, используется инструмент Слияние по атрибуту (Dissolve), чтобы показать, как использовать представления строк параметров и различное число строк в таблице значений. Инструмент Слияние по атрибуту принимает класс пространственных объектов или слой линий или полигонов и агрегирует объекты на основе значений в одном или нескольких полях параметра Поле(я) слияния (Dissolve Field(s)). В ходе агрегирования можно вычислить статистику для агрегированных объектов с помощью параметра Поле(я) статистики (Statistics Field(s)) – таблица значений.
Задача запустится, когда клиент задаст поля слияния и статистики, найденные во входных объектах. Чтобы сделать это, необходимо создать инструмент-скрипт, принимающий представление строк параметров Поле(я) слияния и Поле(я) статистики, а не представляющий список вариантов полей, найденных в схеме входных объектов. Фактически вы обходите логику, встроенную в диалоговые окна инструмента и Редактора сервис, и выполняете инструмент, используя только представление строк параметров.
# Script tool code to do a Dissolve using strings for the Dissolve Fields(s) and
# Statistics Fields(s) parameters
#
import arcpy
inFeatures = arcpy.GetParameterAsText(0) # data type = Feature layer
outFeatures = arcpy.GetParameterAsText(1) # data type = Feature class
dissolveFields = arcpy.GetParameterAsText(2) # data type = String
statFields = arcpy.GetParameterAsText(3) # data type = String
multi_part = False # Always produce single-part features
unsplit_lines = True # Only dissolve lines if the share common vertex
arcpy.Dissolve_management(inFeatures, outFeatures, dissolveFields, statFields,
multi_part, unsplit_lines)
При выполнении инструмента-скрипта нужно предоставить представление строк для параметров Поле(я) слияния и Поле(я) статистики. Согласно примеру, приведенному выше, Поле(я) слияния = DISTRICT, а Поле(я) статистики = POP98 SUM;NAME FIRST. Подробные сведения о том, как найти представление строк типа данных, см. выше. В Редакторе сервиса можно задать два параметра Определяемого пользователем значения, поскольку они являются строками.