Exportieren von Daten aus der Ausgabe von Collect Values ​​in ArcGIS ModelBuilder?


11

Ich spiele gerade mit ModelBuilder. Ich habe ein Bild des Modells hinzugefügt, das ich gerade habe.

Dieses Modell iteriert derzeit 6 Shapefiles, sodass jeder der Ausgabewerte 6 Ziffern in einer Liste enthält. Ich kann keine Möglichkeit finden, die Werte aus diesen Listen in eine Tabelle / Textdatei oder ähnliches zu extrahieren.

Gibt es eine Möglichkeit, dies zu tun?

Modell-

Dies wird angezeigt, wenn ich nach dem Ausführen des Modells 'Ausgabewerte' öffne: Geben Sie hier die Bildbeschreibung ein

Ich möchte nur irgendwie diese 6 Zahlen greifen ...


Dies ist im Grunde das gleiche, was Sie hier richtig fragen? gis.stackexchange.com/questions/25922/… Das Sammeln von Werten macht genau das. Wenn Sie die Hilfe lesen, werden Sie darauf hingewiesen, dass Werte erfasst werden, die an ein anderes Tool übergeben werden können. Was versuchst du mit den Werten zu machen? Protokollieren Sie sie nur in einer Datei oder benötigen Sie sie für die weitere Verarbeitung?
TheJones

Ich möchte sie nur in einer Datei protokollieren. Ich kann kein Tool finden, in das die Ausgabewerte im Model Builder eingegeben werden können, um sie zu extrahieren.
JPD

Antworten:


17

Sie können dies mit dem Tool " Wert berechnen" (Datenverwaltung) und etwas Python-Magie tun . Siehe auch diese verwandte Frage: Fügen Sie dem Arcgis Model Builder beliebigen Code hinzu?

Eine mehrwertige Variable ist nur eine durch Semikolons getrennte Zeichenfolge. Die folgende multivaluesToCsvFunktion teilt die mehrwertigen Variablen in Listen auf und transponiert sie in Zeilen, die dann in eine CSV- Textdatei (durch Kommas getrennter Wert) geschrieben werden.

Modelliteratoren führen ALLE Prozesse im Modell einmal pro Iteration aus. Dies ist für unser Tool "Wert berechnen" unerwünscht, das wir am Ende nur einmal ausführen möchten. Um dies zu erreichen, erstellen Sie ein anderes äußeres Modell, um das ursprüngliche innere Modell zu verpacken. Dies wird im Hilfethema Integrieren eines Modells in ein Modell erläutert .

Hier ist also, was Sie tun müssen, damit dies funktioniert:

Inneres Modell - Iteriert Feature-Classes, verarbeitet sie und sammelt Werte:

  1. Fügen Sie in Ihrem ursprünglichen Modell, das unser "inneres" Modell sein wird, ein weiteres Werkzeug zum Sammeln Namevon Werten hinzu , um die Werte der Variablen zu sammeln , damit wir die Werte der Entfernungsstatistik den entsprechenden Namen der Feature-Classes zuordnen können.
  2. Stellen Sie die Eingabe- und Ausgabevariablen als Modellparameter bereit (klicken Sie mit der rechten Maustaste auf ein Oval und aktivieren Sie Modellparameter). Führen Sie dies für jede Ausgabe der Tools zum Sammeln von Werten sowie für alle erforderlichen Eingabeparameter aus, z. B. für den Eingabearbeitsbereich.
  3. Speichern und schließen Sie das innere Modell.

Äußeres Modell - Führt das innere Modell aus und führt das Werkzeug "Wert berechnen" nur einmal aus, wenn das innere Modell abgeschlossen ist:

  1. Erstellen Sie ein neues Modell - dies wird unser "äußeres" Modell sein.
  2. Fügen Sie eine Variable vom Typ hinzu Folder, mit der Sie angeben können, wo die CSV-Ausgabedatei erstellt werden soll.
  3. Fügen Sie eine Variable vom Typ hinzu String, mit der Sie den Namen der Ausgabe-CSV-Datei angeben können .
  4. Fügen Sie das innere Modell zum neuen Modell hinzu (ziehen Sie es per Drag & Drop aus ArcToolbox oder klicken Sie mit der rechten Maustaste und fügen Sie Daten oder Werkzeug hinzu, navigieren Sie zum inneren Modell und klicken Sie auf Hinzufügen).
  5. Erstellen Sie Variablen für alle Parameter des inneren Modells, die Sie aus dem äußeren Modell festlegen möchten, z. B. den Eingabearbeitsbereich (klicken Sie mit der rechten Maustaste auf das innere Modell und wählen Sie Variable aus Parameter erstellen).
  6. Fügen Sie dem neuen Modell das Werkzeug Wert berechnen hinzu
  7. Fügen Sie Folgendes in die entsprechenden Felder des Werkzeugs "Wert berechnen" ein:

    Ausdruck :

    multivaluesToCsv(r"%Output CSV File Location%", "%Output CSV File Name%", "%Feature Class Names%", "%Minimum Distance Values%", "%Average Distance Values%", "%Maximum Distance Values%")
    • Dies verwendet die Inline-Variablensubstitution , um die Modellvariablen an die Funktion zu übergeben. Passen Sie es an die Namen Ihrer Modellvariablen an.
    • Das rVorherige "%Output CSV File Location%"ist wichtig: Dies zeigt an, dass dies eine Rohzeichenfolge ist . Da Windows-Dateisystempfade normalerweise Backslashes enthalten (ein Escape-Zeichen in Python), müssen wir dies verwenden, um zu verhindern, dass Python die Backslashes und nachfolgenden Zeichen als Sonderzeichenfolgen falsch interpretiert.
    • Stellen Sie sicher, dass die Inline-Variablen in Anführungszeichen gesetzt werden, da Python ohne sie Anführungszeichen anstelle von Zeichenfolgen denkt.

    Codeblock:

    import os, csv
    
    def multivaluesToCsv(csvfilepath, csvfilename, fcnames, minvalues, avgvalues, maxvalues):
        ext = 'csv' # Define output file extension (e.g. csv or txt)
        header = ['FC', 'MIN', 'AVG', 'MAX'] # Define header row (column names)
    
        # Join CSV file path and name, adding extension if necessary
        csvfile = os.path.join(csvfilepath, os.extsep.join((csvfilename, ext)) if not os.path.splitext(csvfilename)[1].lower().endswith(ext) else csvfilename)
    
        # Open text file for writing
        with open(csvfile, 'wb') as f:
            w = csv.writer(f)
            w.writerow(header) # Write header row
            rows = zip(*map(lambda x: x.split(';'), [fcnames, minvalues, avgvalues, maxvalues])) # Transpose the semicolon-delimited values into rows
            w.writerows(rows)
        return csvfile
    
  8. (Optional) Stellen Sie die Eingabe- und Ausgabevariablen als Modellparameter bereit, wenn Sie sie über den Werkzeugdialog des Modells ausführen oder mit anderen Modellen / Skripten verketten möchten. Die einzige Ausgabe des äußeren Modells ist die CSV-Datei.

  9. (Optional) Verbinden Sie die Eingangsvariablen und die inneren Modellausgaben als Voraussetzung mit dem Werkzeug Wert berechnen. Ich denke nicht, dass dies tatsächlich einen Effekt hat, es macht nur visuell klarer, was los ist.

Ich habe dies mit ModelBuilder getestet und zum Laufen gebracht (siehe Screenshots).

Inneres Modell : Inneres Modell

Äußeres Modell: Äußeres Modell

Das innere Modell führt alle Prozesse einmal pro Feature-Class aus, und das Tool "Wert berechnen" wird am Ende einmal ausgeführt, um die CSV-Datei einmal und nur einmal auszugeben.


Hallo, danke, dass du dir so viel Mühe gegeben hast und entschuldige dich für meine späte Antwort. Ich versuche, das Modell wie beschrieben auszuführen, aber ich habe Probleme mit der CSV. Ich habe eine leere CSV-Datei in Excel erstellt, sie gespeichert und dann in das Modell geladen. FEHLER 000539: Fehler beim Ausführen des Ausdrucks: multivaluesToCsv (r "% CSV-Datei%", "% FC-Namenswerte%", "% Minimalwerte%", "% Durchschnittswerte%", "% Maximalwerte%") <Typ 'Ausnahmen .IOError '>: [Errno 13] Berechtigung verweigert: u'% CSV-Datei% 'Fehler beim Ausführen (Wert berechnen). Ich bekomme immer wieder diesen Fehler. Meine CSV heißt CSVFile.csv.
JPD

1
Einfach behoben - das ist die perfekte Lösung. Vielen Dank für deine Hilfe!
JPD

Der Python-Code erstellt die CSV-Datei für Sie, ohne dass Sie sie zuvor erstellen müssen. Wie Sie jedoch gesehen haben, wird die Datei beim Öffnen in Excel gesperrt, und Python kann sie erst schreiben, wenn Sie sie schließen.
blah238

2
Zu Ihrer Information Ich habe die Anweisungen und Screenshots aktualisiert, um verschachtelte Modelle zu verwenden, um zu vermeiden, dass der Wert mehrmals berechnet wird, und um das Problem zu beheben, bei dem die Textdatei zuvor vorhanden sein musste (Sie geben jetzt den Ausgabespeicherort und den Dateinamen als zwei separate Parameter an).
blah238

Hervorragende Antwort! Hat mir geholfen, ein ähnliches Problem bei der Ausgabe von Statistiken zur Überprüfung der geostatistischen Schichtkreuzvalidierung in eine CSV-Datei zu lösen. Danke @ blah238!
Cotton.Rockwood

1

Die Ausgabe, die Ihr Modell beschreibt, ist einfach ein Wert, der in der Attributtabelle aktualisiert wird, nicht wahr? Können Sie die mit dem aktualisierten Shapefile verknüpfte DBF-Datei nicht einfach öffnen?

Andernfalls sollte Table Select (Analyse-Tools> Extrahieren) mit einer SQL-Abfrage funktionieren.


Hallo, danke für deine Antwort. Ich fürchte, es aktualisiert nicht die DBF-Datei jedes Shapefiles. Das Hinzufügen von 'Table Select' zum Model Builder funktioniert ebenfalls nicht, da ich weder 'Minimum / Average / Maximum Distance' noch 'Output Values' als Eingabe für das Tool verbinden kann.
JPD
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.