Extraindo por atributo usando o ModelBuilder com entrada do usuário?

11

Usando o ModelBuilder, quero criar uma ferramenta que permita ao usuário escolher o valor ou valores que serão usados ​​para extrair um arquivo de forma.

Eu tenho uma camada de parcela com um campo "Parcel_Type". Desejo que o usuário possa escolher o tipo de parcela a ser extraída. Portanto, se o usuário quiser extrair as parcelas com um tipo "EL", ele precisará apenas inserir "EL" como uma variável. Se ele quiser digitar "EL" e "CDD", ele precisará inseri-los como multi-variáveis. Essa seria a única interação humana com o modelo.

Então, como posso usar essas variáveis ​​no meu modelo?

Dom
fonte

Respostas:

14

Esse tipo de operação quase sempre envolve escrever uma cláusula WHERE, então eu acho que usar pelo menos um pouco de Python está em ordem.

Além disso, embora isso seja possível com o ModelBuilder, IMO, a criação de uma ferramenta de script Python com validação personalizada e mais controle sobre as configurações de parâmetros pode proporcionar uma melhor experiência ao usuário - por exemplo, criando os menus suspensos Field e MultiValue * que você pode escolher valores em vez de precisar digitá-los.

* possivelmente, na verdade, não tenho certeza sobre os parâmetros do MultiValue

No entanto, como esse é um exercício mais avançado para outro tópico, continuarei com a abordagem ModelBuilder, usando Python apenas para criar a cláusula WHERE:

  1. Crie um novo modelo
  2. Crie variáveis ​​(clique com o botão direito do mouse na tela vazia e clique em Adicionar variável ) para os parâmetros de entrada Feature Layer , Field e MultiValue .
  3. Clique com o botão direito do mouse em cada uma delas e selecione Parâmetro do Modelo
  4. Adicione uma ferramenta Calcular valor (gerenciamento de dados) à tela. Conecte as 3 variáveis ​​a ele como pré-condições (apenas para exibição neste caso, mas isso pode fazer a diferença na ordem de execução em outras situações).
  5. Clique duas vezes na ferramenta Calcular valor para configurá-lo:

    5a Copie / cole o seguinte na caixa Expressão (ajuste para corresponder aos nomes das variáveis):

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

    5b Copie / cole o seguinte na caixa Code Block :

    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

    5c. Defina o tipo de dados de saída como uma expressão SQL .

    5d. Clique em Ok e clique com o botão direito do mouse na variável de saída da ferramenta Calcular Valor e renomeie-a para algo mais descritivo, como "Cláusula WHERE".

  6. Adicione uma ferramenta Selecionar camada por atributo (Gerenciamento de dados) à tela. Conecte as variáveis ​​Feature Layer e WHERE Clause à ferramenta Select Layer By Attribute.
  7. Adicione uma ferramenta Recursos de cópia (Gerenciamento de dados) à tela. Conecte a saída da ferramenta Selecionar camada por atributo à ferramenta Recursos de cópia. Clique com o botão direito do mouse na variável Classe de recurso de saída e verifique o Parâmetro do modelo e (opcionalmente) as opções Adicionar à exibição .

    Neste ponto, deve ser algo como isto: Model Canvas

  8. No menu Modelo -> Propriedades do modelo, dê um bom nome e rótulo e salve e feche-o.

  9. Clique duas vezes no modelo no ArcToolbox para exibir a caixa de diálogo do modelo. Digite seus parâmetros e clique em OK. Ele deve exportar os recursos selecionados para uma nova classe de recursos e adicioná-los ao mapa (se você marcou "Adicionar à exibição" na classe de recursos de saída).

    Caixa de diálogo Modelo

NOTAS:

  • Você sempre pode codificar valores e não "parametrizar" variáveis ​​que não deseja que o usuário altere, como a camada de recurso ou os parâmetros de campo. Eu apenas gosto de ter ferramentas genéricas / reutilizáveis, então criei esses parâmetros de modelo. Na verdade, o que eu faria é simplesmente arrastar e soltar o modelo genérico em um novo modelo e, em seguida, definir seus parâmetros predefinidos - dessa forma, você pode criar vários modelos "wrapper" predefinidos diferentes, mas apenas um modelo subjacente fazendo o trabalho. se você precisar alterar sua funcionalidade, precisará alterá-la apenas em um local.

  • Se você tiver sorte como eu, não precisará validar o modelo e fornecer alguns dados fictícios apenas para removê-los após a validação (observe como todos os elementos do modelo estão em branco / branco, o que significa que não estão "prontos para serem executados" - mas consegui executá-lo de qualquer maneira ao preencher os parâmetros na caixa de diálogo do modelo).

blah238
fonte
3

Você também pode usar uma ferramenta simples de geoprocessamento chamada Selecionar para obter esse fluxo de trabalho se seus requisitos de GUI não forem para o diálogo preciso ilustrado por @ blah238.

Use a janela Pesquisar para encontrá-lo ou vá para ArcToolbox> Ferramentas de Análise> Extrair> Selecionar.

A ferramenta Selecionar (Análise) permite extrair recursos usando qualquer campo (atributo) de uma classe de recurso.

Matt
fonte