Extrahieren nach Attributen mit ModelBuilder mit Benutzereingabe?

11

Mit ModelBuilder möchte ich ein Tool erstellen, mit dem ein Benutzer den Wert oder die Werte auswählen kann, die zum Extrahieren eines Shapefiles verwendet werden.

Ich habe eine Paketebene mit einem Feld "Parcel_Type". Ich möchte, dass der Benutzer die Art des zu extrahierenden Pakets auswählen kann. Wenn der Benutzer die Pakete mit dem Typ "EL" extrahieren möchte, muss er nur "EL" als Variable eingeben. Wenn er "EL" und "CDD" eingeben möchte, muss er sie als Multi-Variablen eingeben. Das wäre die einzige menschliche Interaktion mit dem Modell.

Wie kann ich diese Variablen in meinem Modell verwenden?

Dom
quelle

Antworten:

14

Bei dieser Art von Operation wird fast immer eine WHERE-Klausel geschrieben, daher halte ich es für angebracht, zumindest ein wenig Python zu verwenden.

Auch wenn dies mit ModelBuilder, IMO, möglich ist, könnte das Erstellen eines Python- Skript-Tools mit benutzerdefinierter Validierung und besserer Kontrolle über die Parametereinstellungen eine bessere Benutzererfahrung bieten - beispielsweise indem die Dropdown-Menüs Field und MultiValue * die entsprechenden Dropdown-Menüs verwenden Sie können Werte auswählen, anstatt sie eingeben zu müssen.

* Möglicherweise nicht sicher über MultiValue-Parameter

Da dies jedoch eine fortgeschrittenere Übung für ein anderes Thema ist, bleibe ich beim ModelBuilder-Ansatz und verwende Python nur zum Erstellen der WHERE-Klausel:

  1. Erstellen Sie ein neues Modell
  2. Erstellen Sie Variablen (klicken Sie mit der rechten Maustaste auf die leere Zeichenfläche und klicken Sie auf Variable hinzufügen ) für die eingegebenen Parameter Feature Layer , Field und MultiValue .
  3. Klicken Sie mit der rechten Maustaste auf diese und wählen Sie Modellparameter
  4. Fügen Sie der Zeichenfläche ein Werkzeug zum Berechnen von Werten (Datenverwaltung) hinzu . Verbinden Sie die 3 Variablen als Voraussetzung damit (nur zur Anzeige in diesem Fall, aber in anderen Situationen kann dies einen Unterschied in der Ausführungsreihenfolge bewirken).
  5. Doppelklicken Sie auf das Werkzeug Wert berechnen, um es einzurichten:

    5a. Kopieren Sie Folgendes in das Feld Ausdruck (passen Sie es an Ihre Variablennamen an):

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

    5b. Kopieren / Einfügen ist folgendes in den Codeblock - Box:

    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. Legen Sie den Ausgabedatentyp als SQL-Ausdruck fest .

    5d. Klicken Sie auf OK, klicken Sie mit der rechten Maustaste auf die Ausgabevariable im Werkzeug Wert berechnen und benennen Sie sie in eine aussagekräftigere Variable wie "WHERE-Klausel" um.

  6. Fügen Sie der Zeichenfläche ein Tool zum Auswählen von Ebenen nach Attributen (Datenverwaltung) hinzu . Verbinden Sie die Variablen Feature Layer und WHERE-Klausel mit dem Werkzeug Layer nach Attribut auswählen.
  7. Fügen Sie der Zeichenfläche ein Werkzeug zum Kopieren von Funktionen (Datenverwaltung) hinzu . Verbinden Sie die Ausgabe des Werkzeugs "Ebene nach Attribut auswählen" mit dem Werkzeug "Features kopieren". Klicken Sie mit der rechten Maustaste auf die Variable Ausgabe-Feature-Class und überprüfen Sie den Modellparameter und (optional) die Optionen Zur Anzeige hinzufügen.

    An dieser Stelle sollte es ungefähr so ​​aussehen: Modell Leinwand

  8. Unter der Modell -> Modelleigenschaften Menü ihm einen guten Namen und Label geben und speichern und zu schließen.

  9. Doppelklicken Sie in ArcToolbox auf das Modell, um das Modelldialogfeld aufzurufen. Geben Sie Ihre Parameter ein und klicken Sie auf OK. Die ausgewählten Features sollten in eine neue Feature-Class exportiert und zur Karte hinzugefügt werden (wenn Sie in der Ausgabe-Feature-Class "Zur Anzeige hinzufügen" aktiviert haben).

    Modelldialog

ANMERKUNGEN:

  • Sie können immer Werte fest codieren und keine Variablen "parametrisieren", die der Benutzer nicht ändern soll, wie z. B. die Feature-Layer- oder Feldparameter. Ich mag es einfach, Tools zu haben, die generisch / wiederverwendbar sind, also habe ich diese Modellparameter erstellt. Tatsächlich würde ich das generische Modell einfach per Drag & Drop in ein neues Modell ziehen und dann Ihre vordefinierten Parameter festlegen. Auf diese Weise können Sie mehrere verschiedene vordefinierte "Wrapper" -Modelle erstellen, aber nur ein zugrunde liegendes Modell erledigt die Arbeit Wenn Sie die Funktionalität ändern müssen, müssen Sie sie nur an einer Stelle ändern.

  • Wenn Sie Glück haben wie ich, müssen Sie das Modell nicht validieren und einige Dummy-Daten angeben, um sie nach der Validierung zu entfernen (beachten Sie, dass alle Modellelemente leer / weiß sind, was bedeutet, dass sie nicht "betriebsbereit" sind). - aber ich konnte es trotzdem ausführen, nachdem ich die Parameter im Modelldialog ausgefüllt hatte).

blah238
quelle
3

Sie können auch ein einfaches Geoverarbeitungswerkzeug namens "Auswählen" verwenden, um diesen Workflow zu erreichen, wenn Ihre GUI-Anforderungen nicht dem genauen Dialog entsprechen, der durch @ blah238 dargestellt wird.

Verwenden Sie das Suchfenster, um es zu finden, oder gehen Sie zu ArcToolbox> Analyse-Tools> Extrahieren> Auswählen.

Mit dem Auswahlwerkzeug (Analyse) können Sie Features mithilfe eines beliebigen Felds (Attributs) aus einer Feature-Class extrahieren.

Matt
quelle