Ce type d'opération implique presque toujours d'écrire une clause WHERE, donc je pense qu'il est préférable d'utiliser au moins un peu de Python.
De plus, bien que cela soit possible avec ModelBuilder, IMO, la création d'un outil de script Python avec une validation personnalisée et un contrôle accru des paramètres de paramètres pourrait offrir une meilleure expérience utilisateur - par exemple, en créant les menus déroulants des paramètres Field et MultiValue * qui vous pouvez choisir des valeurs au lieu de devoir les saisir.
* éventuellement, en fait pas sûr des paramètres MultiValue
Cependant, comme il s'agit d'un exercice plus avancé pour un autre sujet, je m'en tiendrai à l'approche ModelBuilder, en utilisant Python uniquement pour créer la clause WHERE:
- Créer un nouveau modèle
- Créez des variables (cliquez avec le bouton droit sur le canevas vide et cliquez sur Ajouter une variable ) pour les paramètres de couche d'entités , de champ et de valeurs multiples en entrée .
- Cliquez avec le bouton droit sur chacun d'eux et sélectionnez Paramètres du modèle
- Ajoutez un outil Calculer la valeur (gestion des données) au canevas. Connectez-y les 3 variables comme conditions préalables (juste pour montrer dans ce cas, mais cela peut faire une différence dans l'ordre d'exécution dans d'autres situations).
Double-cliquez sur l'outil Calculer la valeur pour le configurer:
5a. Copiez / collez ce qui suit dans la zone Expression (ajustez pour correspondre à vos noms de variables):
buildWhereClauseMultiValue(r"%Feature Layer%","%Field%","%Values%")
5b. Copiez / collez les éléments suivants dans la zone Bloc de code :
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. Définissez le type de données de sortie comme une expression SQL .
5d. Cliquez sur OK et cliquez avec le bouton droit sur la variable de sortie de l'outil Calculer la valeur et renommez-la en quelque chose de plus descriptif comme "WHERE Clause".
- Ajoutez un outil Sélectionner une couche par attribut (gestion des données) au canevas. Connectez les variables Feature Layer et WHERE Clause à l'outil Select Layer By Attribute.
Ajoutez un outil de copie des fonctionnalités (gestion des données) au canevas. Connectez la sortie de l'outil Sélectionner un calque par attribut à l'outil Copier des entités. Cliquez avec le bouton droit sur la variable Classe d'entités en sortie et vérifiez les paramètres du modèle et (éventuellement) les options Ajouter à l'affichage .
À ce stade, cela devrait ressembler à ceci:
Dans le menu Modèle -> Propriétés du modèle , donnez-lui un bon nom et une bonne étiquette, puis enregistrez-le et fermez-le.
Double-cliquez sur le modèle dans ArcToolbox pour afficher la boîte de dialogue du modèle. Saisissez vos paramètres et cliquez sur OK. Il doit exporter les entités sélectionnées vers une nouvelle classe d'entités et l'ajouter à la carte (si vous avez coché "Ajouter à l'affichage" dans la classe d'entités en sortie).
REMARQUES:
Vous pouvez toujours coder en dur les valeurs et non pas "paramétrer" les variables que vous ne voulez pas que l'utilisateur modifie comme la couche d'entités ou les paramètres de champ. J'aime juste avoir des outils génériques / réutilisables, j'ai donc fait ces paramètres de modèle. En fait, ce que je ferais serait simplement de glisser-déposer le modèle générique dans un nouveau modèle, puis de définir vos paramètres prédéfinis - de cette façon, vous pouvez créer plusieurs modèles "wrapper" prédéfinis différents, mais un seul modèle sous-jacent fait le travail, donc si vous avez besoin de changer sa fonctionnalité, vous n'avez qu'à la changer en un seul endroit.
Si vous êtes chanceux comme moi, vous n'aurez pas à valider le modèle et à fournir des données factices uniquement pour le supprimer après validation (notez comment tous les éléments du modèle sont vides / blancs, ce qui signifie qu'ils ne sont pas "prêts à fonctionner" - mais j'ai quand même pu l'exécuter en remplissant les paramètres dans la boîte de dialogue du modèle).