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:
- Crie um novo modelo
- 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 .
- Clique com o botão direito do mouse em cada uma delas e selecione Parâmetro do Modelo
- 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).
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".
- 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.
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:
No menu Modelo -> Propriedades do modelo, dê um bom nome e rótulo e salve e feche-o.
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).
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).