Extraire par attribut à l'aide de ModelBuilder avec une entrée utilisateur?


11

En utilisant ModelBuilder, je veux créer un outil qui permettra à un utilisateur de choisir la ou les valeurs qui seront utilisées pour extraire un fichier de formes.

J'ai une couche parcellaire avec un champ "Parcel_Type". Je souhaite que l'utilisateur puisse choisir le type de colis à extraire. Donc, si l'utilisateur veut extraire les parcelles avec un type "EL", il n'aura qu'à entrer "EL" comme variable. S'il veut taper "EL" et "CDD", il doit les saisir comme multi-variables. Ce serait la seule interaction humaine avec le modèle.

Alors, comment puis-je utiliser ces variables dans mon modèle?

Réponses:


14

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:

  1. Créer un nouveau modèle
  2. 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 .
  3. Cliquez avec le bouton droit sur chacun d'eux et sélectionnez Paramètres du modèle
  4. 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).
  5. 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".

  6. 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.
  7. 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: Toile de modèle

  8. 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.

  9. 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).

    Boîte de dialogue Modèle

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).


3

Vous pouvez également utiliser un outil de géotraitement simple appelé Sélectionner pour réaliser ce flux de travail si vos exigences GUI ne sont pas pour la boîte de dialogue précise illustrée par @ blah238.

Utilisez la fenêtre Rechercher pour le trouver ou accédez à ArcToolbox> Outils d'analyse> Extraire> Sélectionner.

L' outil Sélectionner (analyse) vous permet d'extraire des entités à l'aide de n'importe quel champ (attribut) d'une classe d'entités.

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.