Извлечение по атрибуту Использование ModelBuilder с пользовательским вводом?


11

Используя ModelBuilder, я хочу создать инструмент, который позволит пользователю выбирать значение или значения, которые будут использоваться для извлечения шейп-файла.

У меня есть слой участков с полем "Parcel_Type". Я хочу, чтобы пользователь мог выбрать тип извлекаемой посылки. Таким образом, если пользователь хочет извлечь посылки с типом «EL», он должен будет только ввести «EL» в качестве переменной. Если он хочет ввести «EL» и «CDD», ему нужно ввести их как несколько переменных. Это было бы единственным человеческим взаимодействием с моделью.

Итак, как я могу использовать эти переменные в моей модели?

Ответы:


14

Этот тип операции почти всегда включает в себя написание предложения WHERE, так что я думаю, что нужно использовать хотя бы немного Python.

Кроме того, хотя это возможно сделать с ModelBuilder, IMO, создание инструмента сценариев Python с настраиваемой проверкой и большим контролем над настройками параметров может обеспечить лучший пользовательский опыт - например, с помощью раскрывающихся меню параметров Field и MultiValue *, которые Вы можете выбрать значения вместо того, чтобы вводить их.

* возможно, на самом деле не уверен насчет параметров MultiValue

Однако, поскольку это более сложное упражнение для другой темы, я буду придерживаться подхода ModelBuilder, использующего только Python для создания предложения WHERE:

  1. Создать новую модель
  2. Создайте переменные (щелкните правой кнопкой мыши пустой холст и выберите « Добавить переменную» ) для входных параметров « Слой объектов» , « Поле» и « Многозначное значение» .
  3. Щелкните правой кнопкой мыши по каждому из них и выберите параметр модели.
  4. Добавьте инструмент « Расчет стоимости» («Управление данными») на холст. Подключите к нему 3 переменные в качестве предварительных условий (только для показа в этом случае, но это может иметь значение в порядке выполнения в других ситуациях).
  5. Дважды щелкните инструмент Calculate Value, чтобы настроить его:

    5а. Скопируйте / вставьте следующее в поле « Выражение» (настройте в соответствии с именами переменных):

    buildWhereClauseMultiValue(r"%Feature Layer%","%Field%","%Values%")

    5б. Скопируйте / вставьте следующее в поле « Блок кода» :

    import arcpy
    
    def buildWhereClauseMultiValue(table, field, values):
        """Takes a semicolon-delimited list of values and constructs a SQL WHERE
        clause to select those values within a given field and table."""
    
        # Add DBMS-specific field delimiters
        fieldDelimited = arcpy.AddFieldDelimiters(arcpy.Describe(table).path, field)
    
        # Split multivalue at semicolons and strip quotes
        valueList = [value[1:-1] if (value.startswith("'") and value.endswith("'")) else value for value in values.split(';')]
    
        # Determine field type
        fieldType = arcpy.ListFields(table, field)[0].type
    
        # Add single-quotes for string field values
        if str(fieldType) == 'String':
            valueList = ["'%s'" % value for value in valueList]
    
        # Format WHERE clause in the form of an IN statement
        whereClause = "%s IN(%s)" % (fieldDelimited, ', '.join(valueList))
        return whereClause
    

    5с. Установите выходной тип данных как выражение SQL .

    5d. Нажмите кнопку «ОК» и щелкните правой кнопкой мыши выходную переменную из инструмента «Вычислить значение» и переименуйте ее в нечто более описательное, например «WHERE Clause».

  6. Добавьте инструмент Выбрать слой по атрибуту (Управление данными) на холст. Подключите переменные Feature Layer и WHERE Clause к инструменту Select Layer By Attribute.
  7. Добавьте инструмент Копировать объекты (Управление данными) на холст. Соедините выходные данные инструмента Выбрать слой по атрибуту с инструментом Копировать объекты. Щелкните правой кнопкой мыши переменную Output Feature Class и проверьте параметр модели и (опционально) параметры Add to Display .

    На данный момент это должно выглядеть примерно так: Модель холста

  8. В меню « Модель -> Свойства модели» дайте ему хорошее имя и метку, а затем сохраните и закройте его.

  9. Дважды щелкните модель в ArcToolbox, чтобы открыть диалоговое окно модели. Введите ваши параметры и нажмите ОК. Он должен экспортировать выбранные объекты в новый класс объектов и добавить его на карту (если вы отметили «Добавить к отображению» в выходном классе объектов).

    Модель Диалог

ЗАМЕТКИ:

  • Вы всегда можете жестко задавать значения, а не «параметризировать» переменные, которые вы не хотите, чтобы пользователь изменял, например, векторный слой или параметры поля. Мне просто нравится иметь инструменты, которые являются общими / многоразовыми, поэтому я сделал эти параметры модели. Фактически, я бы просто перетащил универсальную модель в новую модель, а затем установил свои предопределенные параметры - таким образом, вы можете создать несколько разных предопределенных моделей «обертки», но только одна базовая модель будет работать, поэтому если вам нужно изменить его функциональность, вам нужно изменить его только в одном месте.

  • Если вам повезло, как и мне, вам не нужно будет проверять модель и предоставлять некоторые фиктивные данные только для того, чтобы удалить ее после проверки (обратите внимание, что все элементы модели пустые / белые, то есть они не «готовы к запуску») - но я смог запустить его после заполнения параметров в диалоговом окне модели).


3

Вы также можете использовать один простой инструмент геообработки, который называется Select, для достижения этого рабочего процесса, если ваши требования к графическому интерфейсу не соответствуют точному диалоговому окну, показанному @ blah238.

Используйте окно поиска, чтобы найти его или перейдите в ArcToolbox> Инструменты анализа> Извлечь> Выбрать.

Инструмент Выбрать (Анализ) позволяет извлекать объекты, используя любое поле (атрибут) из класса объектов.

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.