При публикации результата в Редакторе сервиса для каждого параметра задачи указывается Режим ввода. Выбираемый режим определяет, как клиент будет добавлять значение в параметр задачи. Цель данной статьи – помочь лучше понять, почему некоторые опции режима ввода недоступны для параметра, и предложить способы создания задач, работающих с доступными опциями режима ввода.
Существуют следующие режимы ввода:
- Определяемое пользователем значение: значение для параметра предоставляет клиент.
- Список вариантов: клиент получает список строк (список вариантов) и должен выбрать одну или несколько строк из этого списка. В зависимости от типа входных данных, строки в списке вариантов могут быть именами слоев или простыми опциями ключевых слов.
- Постоянное значение: задача будет использовать значение, предоставленное вами при создании результата. Поскольку значение является фиксированным, клиент изменить его не может, поэтому оно не станет параметром задачи при публикации сервиса.
Режим ввода вариантов, имеющихся для соответствующего параметра, зависит от типа данных параметра инструмента. Существует три категории типов данных:
- Набор данных: данные, хранящиеся на диске, например, класс пространственных объектов, таблица, папка, документ карты, база данных и т.д.
- Скаляры: все, что не является набором данных, например, числа и строки.
- Таблица значений: особый тип данных, являющийся многостолбцовой таблицей значений.
Наборы данных
Сервис GIS работает с самым простым из всех клиентов: веб-браузером, запущенным на компьютере и не имеющем каких-либо функций GIS. Эти простые клиенты умеют только передавать (отправлять и получать) на сервер пакеты простых данных, например, текст, числа, файлы, а также географические объекты и их атрибуты (поля). В случае с задачами геообработки, наборы данных GIS можно разделить на две категории: передаваемые и непередаваемые.
- Переносными наборами данных являются объекты, растры, таблицы и файлы. Параметры, содержащие переносные наборы данных, поддерживают режим ввода Определяемое пользователем значение.
- Не переносными наборами данных является все то, что не является объектами, растрами, таблицами и файлами. Существует две категории непередаваемых наборов данных.
- Сложные наборы данных – это такие наборы данных, как геометрические сети, наборы сетевых данных, топологии, TIN и т. д. Эти типы данных известны как сложные наборы данных, потому что они воспроизводят сложные связи между простыми объектами.
- Контейнерные наборы данных – это такие элементы, как папки, файлы, персональные базы геоданных и документы карт (.mxd). Эти типы данных содержат смешанную подборку других наборов данных, поэтому и называются контейнерами.
Определение типа данных параметра инструмента
Чтобы определить, поддерживает ли параметр задачи режим ввода Определяемое пользователем значение, можно в Редакторе сервисов посмотреть, появится ли этот режим ввода в качестве опции. Можно установить, поддерживается ли режим Определяемое пользователем значение, до входа в Редактор сервиса; для этого нужно определить тип данных параметра инструмента любым из следующих способов:
- Раздел синтаксиса на странице справки инструмента содержит таблицу с описанием всех этих параметров. Последний столбец таблицы содержит тип данных параметра.
- В ModelBuilder щелкните правой кнопкой Свойства, затем перейдите на вкладку Тип данных. Тип данных указан в верхней части диалогового окна.
- Для инструмента-скрипта в окне Каталог щелкните правой кнопкой мыши на инструменте-скрипте и выберите Свойства. В диалоговом окне свойств перейдите на вкладку Параметры. Тип данных каждого параметра указан в таблице параметров.
Списки вариантов и непередаваемые наборы данных
Если входное значение параметра является слоем, который ссылается на не переносной набор данных, в качестве варианта режима ввода можно выбрать Список вариантов. Например, параметр Сеть режимов передвижения в задаче, в которой требуется найти наилучший маршрут для следующих режимов передвижения – на машине, на велосипеде или пешком.
Тип данных этого параметра – Слой набора сетевых данных. Наборы сетевых данных являются сложными наборами данных, которые нельзя передавать через интернет, поэтому Определяемое пользователем значение недоступно для этого параметра. Можно использовать Список вариантов, чтобы задать для использования список вариантов имен слоев. В списке вариантов клиент выберет одно из имен слоев, и этот выбранный клиентом слой будет использоваться в задаче, в которой будет использоваться набор сетевых данных, на который этот слой ссылается и который сохранен на сервере.
Самые сложные наборы данных имеют представление соответствующего слоя. В примере, приведенном выше, показаны слои набора сетевых данных. Другие сложные наборы данных включают слои TIN, слои геостатистики, слои земельных участков и слои наборов данных LAS. При наличии непередаваемого набора данных всегда можно использовать представление его слоя в качестве входных данных. В приведенном выше примере задача создана путем выполнения модели, где в качестве входных данных использовался слой Сеть улиц. Если модель выполняется на основе указанного пути к набору сетевых данных, а не на основе имени слоя, то для режима ввода будет задано Постоянное значение. Необходимо выполнить этот инструмент, используя в качестве входных данных слой, чтобы появилась опция Список вариантов.
Подведем итог:
- Клиенты могут отправлять и получать (передавать) через интернет простые объекты, таблицы, растры и файлы.
- Сложные наборы данных, например, наборы сетевых данных, TIN и наборы данных участков являются непередаваемыми. Наборы данных, являющиеся контейнерами, например, папки, базы геоданных и документы карт, также не передаются. Т. е. клиент не может создать эти сложные наборы данных или контейнеры и передать их через интернет. Это относится даже к полнофункциональным клиентам, таким как ArcMap.
- Самые сложные наборы данных имеют представления слоя, т.е., добавив набор данных в ArcMap, в таблице содержания будет создан слой.
- Можно создать список вариантов имен слоев, и клиент выберет одно или несколько имен слоев в качестве входных данных для задачи. Затем задача будет использовать тот набор данных, на который ссылается слой.
- Чтобы создать список вариантов имен слоев, необходимо запустить инструмент, используя слой в качестве входных данных. В Редакторе сервиса список вариантов будет заполнен из подходящих слоев таблицы содержания.
- При запуске инструмента с помощью пути к набору данных на диске опция Список вариантов будет недоступна, даже если в таблице содержания есть слои правильного типа.
Примечание:
При публикации списка вариантов имен слоев, данные, на которые ссылаются слои, станут проектными данными и будут скопированы на GIS сервер, если только они уже не находятся в хранилище данных сервера.
Постоянное значение и сложные наборы данных
Если входные данные для задачи являются путем к сложному набору данных (например, D:\mydata\chicago.gdb\transportation\streetnetwork, набор сетевых данных), то в качестве Режима ввода будет использоваться Постоянное значение. При публикации задачи в режиме ввода Постоянное значение набор данных будет скопирован на сервер (если набор уже не находится в хранилище сервера), и задача будет использовать этот скопированных набор.
При возможности добавить набор данных в ArcMap для создания слоя, можно перезапустить инструмент, используя слой в качестве входных данных. Это позволит создать новый результат, к которому можно предоставить общий доступ, и Редактор сервиса станет поддерживать Список вариантов в качестве режима ввода.
Примечание:
Для геометрических сетей создавать слои нельзя. Параметры, содержащие геометрические сети, всегда будут использовать в качестве режима ввода Постоянное значение.
Постоянное значение и контейнерные наборы данных
Контейнеры – это этакие элементы, как папки, файлы, персональные базы геоданных и документы карт (.mxd). Эти типы данных содержат смешанную подборку других наборов данных, поэтому и называются контейнерами. Контейнеры нельзя передавать, общее правило таково – контейнер и все его содержимое будут скопированы на сервер (если контейнер уже не находится в хранилище сервера), и опубликованное задание будет использовать этот скопированный контейнер. Некоторые распространенные виды контейнеров описываются ниже.
Папки
Если в качестве входных данных используется папка, в качестве Режима ввода будет использовано Постоянное значение. При публикации в режиме ввода Постоянное значение папка и ее содержимое (см. примечание ниже) будут скопированы на сервер (если папка уже не находится в хранилище сервера), и задача будет использовать эту скопированную папку.
Примечание:
Когда в ходе процесса публикации папки копируются на сервер, производится копирование только файлов и наборов геоданных, вложенные папки не копируются. Некоторые наборы геоданных, например, файловые базы геоданных, растры и TIN, формально считаются папками, но если они будут найдены в копируемой папке, то тоже будут скопированы на сервер.
Документы карт (.mxd)
Если в качестве входных данных используется документ карты, в качестве Режима ввода будет использовано Постоянное значение. При публикации в режиме ввода Постоянное значение документ карты, все его слои и наборы данных, на которые ссылаются слои, будут скопированы на сервер, если документ карты уже не находится в хранилище сервера. Если какие-либо из связанных наборов данных не будут найдены в хранилище сервера, они тоже будут скопированы на сервер. Документ карты упаковывается, пересылается на сервер и на сервере распаковывается.
Базы геоданных
Если в качестве входных данных для задачи используется база геоданных, в качестве Режима ввода будет использовано Постоянное значение. При публикации в режиме ввода Постоянное значение база геоданных и все ее содержимое будут скопированы на сервер (если они уже не находятся в хранилище сервера), и задача будет использовать эту скопированную базу.
Персональные базы геоданных (.mdb) на серверных платформах (64-битные операционные системы) не поддерживаются и при копировании на сервер будут преобразованы в файловые базы геоданных. Многопользовательские базы геоданных при копировании на сервер также будут преобразованы в файловые базы геоданных.
Непередаваемые выходные данные
Если выходные данные инструмента являются сложным или контейнерным набором данных, то они не могут передаваться обратно клиенту. Параметр выходных данных в Редакторе сервиса покажет Тип данных Строка. На рисунке, приведенном ниже, значение, возвращенное задачей, будет именем созданного набора данных TIN, а не самим набором данных.
Существует несколько опций для работы с непередаваемыми выходными данными.
- Использовать результирующий картографический сервис, чтобы отправить клиенту результат в виде карты. Набор данных клиенту не передается, только карта данных.
- Конвертировать набор данных в передаваемый набор данных. Например, можно использовать инструмент TIN в растр, чтобы конвертировать не переносной TIN в переносной набор растровых данных.
- Создать пакет слоев (.lpk) набора данных, используя один из инструментов в Группе инструментов для слоев и представлений таблиц, а затем применить инструмент Упаковать слои, чтобы создать пакет слоев. Пакет слоев – это файл, а файлы можно передавать через интернет. Клиенту нужно будет распаковать пакет.
- Использовать ZIP-утилиту для создания файла набора данных или папки результата и передать файл .zip клиенту. Клиент должен будет сам разархивировать файл. Образец сервиса вырезания и передачи вырезает слои из изучаемой области в файловую базу геоданных (и другие форматы), затем создает файл .zip, чтобы передать его клиенту. Если хотите использовать этот метод, перейдите по ссылкам ниже:
Скаляры
Скалярный тип данных содержит все, что не является набором данных. Скалярные типы данных иногда называют простыми типами данных. В геообработке существует множество скалярных типов данных, например, поле (поле в таблице), выражение SQL, выражение калькулятора, списки полей, нечеткая функция и много других. Некоторые используются редко. Другие, например, поле и выражение SQL, распространены широко.
Следующие скалярные типы данных полностью поддерживаются всеми клиентами и могут отправляться и получаться по интернету без необходимости в конвертации: булевы операторы, даты, линейные единицы измерения, числа двойной точности и строки. Все другие скалярные типы данных конвертируются в строки и считаются не поддерживаемыми и непередаваемыми.
Конвертация не поддерживаемых типов скалярных данных в строки редко вызывает проблемы, потому что каждый тип данных имеет четко определенное представление строки — нужно только знать, что он собой представляет, чтобы описать в документах для клиента. В некоторых случаях может потребоваться изменение инструмента, чтобы он создал представление строки, используя другую информацию, предоставленную клиентом. Оба этих метода описываются ниже. Особый вид данных, таблица значений (Value Table) обсуждается отдельно в разделе ниже.
Поиск представления строки параметра
Большинство представлений строк очевидны. Например, представление строки типа данных Поле – это имя поля. Иногда нужно копнуть чуть глубже, чтобы найти представление строки.
В следующем примере показан параметр Радиус поиска инструмента IDW (обратное взвешенное состояние), использующегося для интерполяции поверхностей от точек. Этот параметр имеет три составляющих: метод (Переменный или Фиксированный) и два значения для Параметры радиуса поиска, как показано ниже.
- Чтобы найти строковое представление этого параметра, сначала нужно посмотреть в раздел синтаксиса параметров на странице справки по инструменту. Первый столбец этой таблицы содержит имя параметра, а в некоторых случаях и представление строки. Последний столбец таблицы содержит тип данных параметра. На рисунке, приведенном ниже, показано содержание первого столбца для параметра Радиус поиска, о котором говорилось выше.
Также можете ознакомиться с примерами кода Python, приведенными в нижней части страницы справки по инструменту, так как эти примеры часто используют представление строки параметра.
- Для просмотра любого параметра в строковом представлении запустите инструмент, щелкните правой кнопкой мыши результат в окне Результаты и выберите Копировать как фрагмент Python. Вставьте фрагмент в текстовый редактор и проверьте его. Вот фрагмент кода (начальные параметры удалены для краткости) для запуска инструмента ОВР: arcpy.gp.Idw_sa(...,"2","VARIABLE 12 250","#").. Просмотрев фрагмент, вы увидите, что представление строки для радиуса поиска (рисунок выше) – "VARIABLE 12 250". Можно еще раз запустить инструмент, изменить значения параметров и скопировать фрагмент Python, чтобы проверить представление строки любого параметра.
После того как представление строки определено, необходимо сообщить об этом клиентам. Делается в документации к задаче.
Создание представления строки внутри инструмента
Для сложных представлений строк или требующих от клиента слишком больших усилий по созданию строки, можно изменить инструмент, чтобы создать строку для клиента. Хорошим примером является тип данных Выражение SQL. В модели, приведенной ниже, типом данных параметра Выражение является выражение SQL. Чтобы запустить эту модель в качестве задачи клиент должен ввести корректный текст выражения SQL.
Если целью задачи является выбор участка на основании имени владельца, можно создать модель, в которой клиент вводит имя владельца, а подходящее SQL выражение вводится за него. Это легко сделать, используя замену переменной, как показано ниже. Переменная Имя владельца является строковой. Клиент вводит имя владельца участка, а подходящее SQL выражение создается внутри модели. Другие примеры замены переменной можно найти в статье Примеры замены переменной в модели.
Создание собственных списков вариантов
Многие инструменты геообработки определяют для параметров строк списки вариантов, известные как фильтры списка значений. Инструмент Выбрать в слое по атрибуту, показанный выше, имеет список вариантов строк для параметра Тип выборки (НОВАЯ ВЫБОРКА (NEW_SELECTION), ДОБАВИТЬ В ВЫБОРКУ (ADD_TO_SELECTION), УДАЛИТЬ ИЗ ВЫБОРКИ (REMOVE_FROM_SELECTION) и т. д.). Можно создавать собственные списки вариантов для переменных строк, используя фильтры списков значений.
Таблицы значений
Таблица значений – это многостолбцовая таблица, которая используется в том числе в инструментах Пересечь и Слияние. На приведенном ниже рисунке показан инструмент Пересечь и его параметр Входные объекты, который является таблицей значений с двумя столбцами: Объекты и Ранг.
Таблицы значений являются не переносными, в качестве Режима ввода для них используется Постоянное значение в Редакторе сервиса.
Если необходимо, чтобы клиент вводил значения, а не использовал фиксированное значение, нужно будет изменить модель или скрипт так, чтобы он использовал другие типы данных помимо таблицы значений.
Таблицы значений могут иметь любое количество строк, и то, как изменяется инструмент, зависит от того, должен клиент вводить постоянное или переменное число строк. Если какие-либо столбы в таблице значений содержат наборы данных, тогда количество строк будет фиксированным, поскольку каждая строка должна будет иметь собственный параметр, чтобы содержать набор данных.
На приведенном ниже рисунке показан метод, который можно использовать в ModelBuilder для пересечения двух классов пространственных объектов с рангами без использования таблицы значений. Переменные Улицы и Парки автоматически создаются в ModelBuilder, если их вводят в таблицу значений. Переменные Ранг улиц и Ранг парков создаются следующим образом:
- Создайте две обособленных переменных типа длинное целое. Переименуйте их и сделайте параметрами модели.
- Откройте инструмент Пересечь и щелкните ячейку в столбце Ранги, как показано ниже. Вы сможете выбрать одну из двух созданных переменных Long.
Всегда можно создать инструмент-скрипт, принимающий отдельные входные данные, создающий параметр таблицы значений в рамках скрипта и затем вызывающий инструмент. Код, приведенный ниже, выполняет пересечение двух классов пространственных объектов без использования параметра таблицы значений.
# 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)
В примере, приведенном ниже, инструмент Слияние по атрибуту используется для того, чтобы показать, как использовать строковые представления параметров и разное число строк в таблице значений. Инструмент Слияние по атрибуту принимает класс пространственных объектов или слой линий или полигонов и агрегирует объекты на основе значений в одном или нескольких полях параметра Поля слияния. В ходе агрегирования можно вычислить статистику для агрегированных объектов с параметром Поля статистики – Таблица значений.
Задача запустится, когда клиент задаст поля слияния и статистики, найденные во входных объектах. Чтобы сделать это, необходимо создать инструмент-скрипт, принимающий строковое представление параметров Поля слияния и Поля статистики, а не представляющий список вариантов полей, найденных в схеме входных объектов. Фактически вы обходите логику, встроенную в диалоговые окна инструмента и Редактор сервисов, и выполняете инструмент, используя только строковое представление параметров.
# 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. (См. выше подробные сведения о том, как найти представление строк типа данных.) В Редакторе сервиса эти два параметра можно задать в качестве Определяемого пользователем значения, поскольку они являются строковыми.