Hinzufügen von beliebigem Code zu ArcGIS ModelBuilder?

11

Gibt es eine Möglichkeit, einem ArcGIS-Modell beliebige Codefragmente hinzuzufügen?

Ich stelle mir etwas Ähnliches vor wie den "show code block", den Ausdrucksgenerator in der erweiterten Beschriftung oder im Feldrechner .

Zum Beispiel könnte mein aktuelles Projekt stark davon profitieren, den Benutzernamen der Person abzurufen, die das Tool ausführt. Ich weiß, dass dies in Python einfach ist import os; os.environ.get('USERNAME'). Ich denke, ich könnte dieses Snippet schreiben, get_username.pyes einer Toolbox in Arccatalog hinzufügen, dieses Tool dann dem Modell hinzufügen und es als erforderlichen Modellparameter für mein aktuelles Tool verwenden. Das ist eine Menge Arbeit für eine so kleine Sache, und beim nächsten Mal möchte ich vielleicht etwas anderes, wie eine Inline-Variablensubstitution oder eine zusammengesetzte Variable .

Ich denke, ein Code-Snippet-Tool oder ähnliches könnte all diese Anforderungen auf generische, allgemein hilfreiche Weise erfüllen.

matt wilkie
quelle
verrückter Gedanke: Was ist mit einem Python-Befehlszeilenfenster , das anstelle des Ausdrucksgenerators den Verlauf speichert, damit das Modell ihn wiederverwenden kann?
Matt Wilkie
2
Eigentlich bin ich wirklich auf der Suche nach der gesamten Python-Bibliothek, die dem Model Builder genauso zugänglich gemacht werden soll wie Arcgis-Tools. aber das ist nur verrücktes Gerede (richtig?)
Matt Wilkie
Großartige Idee! Sie möchten Code-Snippets im laufenden Betrieb in ein "Tool" schreiben, das das Snippet verarbeitet und die Ergebnisse zurückgibt, oder? In Ihrem Beispiel würde das "Tool" also <aktueller Benutzername> zurückgeben, der dann auf andere nachgeschaltete Tools angewendet werden könnte.
RyanKDalton
@ RyanDalton, ja das ist genau richtig.
Matt Wilkie

Antworten:

3

Neue Antwort auf einen alten Beitrag, um zu verdeutlichen, wie ein wiederverwendbares Modell erstellt werden kann.

Öffnen Sie das Modell Einfügen-> Nur Modellwerkzeuge-> Wert berechnen.

Geben Sie im Ausdruck Folgendes ein: getuser()

Geben Sie im Codeblock Folgendes ein:

def getuser():
    import getpass
    return getpass.getuser()

(Siehe " Abrufen des Benutzernamens in einem bestimmten Format " für die Quelle des Benutzernamen-Code-Snippets von @ChadCooper.)

Wählen Sie als Datentyp String.

Geben Sie hier die Bildbeschreibung ein

Benennen Sie den Ausgabekreis in um username. Das Endergebnismodell sieht folgendermaßen aus: Verwenden des Werkzeugs "Wert berechnen"

Anschließend können Sie dieses Modell einfach in zukünftige Modelle ziehen und in zukünftigen Modellen oder Skripten auf die Variable% username% verweisen. Stellen Sie nur sicher, dass dieses Modell ausgeführt wird, bevor Sie versuchen, auf die Variable% username% zuzugreifen. Sie können dies unter Verwendung einer Vorbedingung tun .

RyanKDalton
quelle
Ryan, vielleicht könnten Sie erläutern, warum die Ausgabe ein [P] -Arameter ist, und ein Beispiel für das Modul zeigen, das in einem anderen Modul enthalten ist. Ich war anfangs sehr verwirrt, warum P für eine Ausgabe, da es bei Parametern normalerweise nur um Eingaben geht.
Matt Wilkie
@mattwilkie, Sie benötigen keine Eingabeparameter, da das Python-Skript die Eingaben von Ihrem System "liest". Sie müssen jedoch die Ausgabe (den Benutzernamen) zu einem Parameter machen, damit Sie die Ergebnisse in ein anderes Modell oder Python-Skript übernehmen können. Der nächste Schritt wäre die Übergabe des Parameters username an ein "E-Mail-Skript", das automatisch den Ausgabeparameter uesrname als Eingabe für die E-Mail-Adresse "To" verwendet.
RyanKDalton
10

Tatsächlich können Sie dies mit dem Tool Wert berechnen (Datenverwaltung) tun .

Es ist nicht besonders elegant (der gesamte Quellcode für das Tool wird bei jeder Ausführung im Protokoll gedruckt), und der Editor (eigentlich nur ein Textfeld) ist miserabel.

Ich würde vorschlagen, Module zu schreiben, aus denen Sie dann Funktionen importieren und aufrufen können, und dann müssten Sie nur sehr kurze Schnipsel in den Dialog schreiben. Ansonsten ist es einfach nicht sehr sauber.

Der Wert berechnen ist auf allen Lizenzstufen für Arcgis v10 verfügbar. Mit v9.x steht Arcview nur zur Verfügung, wenn die Spatial- oder 3D Analyst-Erweiterungen installiert sind ( ref ).

blah238
quelle
Danke! Dies funktionierte ziemlich gut für das, was ich heute brauchte ( %USERNAME%in eine .sde-Datenbankverbindung einfügen ). Einverstanden, dass der Editor diesen Namen nicht verdient, funktioniert gut als Einfügeziel.
Matt Wilkie
1
Zu 9.x gibt der Wortlaut der CV-Hilfeseite an, dass das Tool möglicherweise verfügbar ist, wenn die SA / 3D-Erweiterungen lediglich installiert sind . Möglicherweise kann es verwendet werden, ohne dass die Erweiterung lizenziert oder aktiviert ist.
Matt Wilkie
"Ich würde vorschlagen, Module zu schreiben, die Sie dann importieren können" - das ist eine wirklich gute Idee!
Curtis Price
2

Vielleicht verstehe ich die Frage falsch, aber es scheint, dass die Funktionalität des Python-Skript-Tools in ArcToolBox genau das ist, wonach Sie suchen:

http://help.arcgis.com/de/arcgisdesktop/10.0/help/index.html#/Integrating_scripts_within_a_model/002w0000006n000000/

http://help.arcgis.com/de/arcgisdesktop/10.0/help/index.html#//001500000006000000.htm

Sie können auch mehrere andere Skriptsprachen verwenden / kombinieren (R in diesem Beispiel):

http://help.arcgis.com/de/arcgisdesktop/10.0/help/index.html#//002w0000007w000000

Brent Edwards
quelle
3
Das funktioniert (und so würde ich es machen), aber Matt nannte diese Methode in seiner Frage ausdrücklich "viel Arbeit für so eine kleine Sache" :)
nmpeterson