Den vollständigen Pfad der Ebene im Dropdown-Feld für das ArcGIS Python-Skript-Tool auswählen?

11

Ich habe ein Python-Skript-basiertes Tool in ArcGIS. Einer der Parameter für das Werkzeug ist eine Eingabe-Rasterdatei, die ich (unter Verwendung der Eigenschaften des Werkzeugs in der Toolbox) als Rasterebene festgelegt habe. Dies bedeutet, dass ich beim Ausführen des Tools die Option habe, diesen Parameter aus einer Dropdown-Liste der aktuell geladenen Rasterebenen auszuwählen oder durch Navigieren nach einer neuen Rasterebene im Dateisystem zu suchen.

Ich verwende dann den Standardcode arcpy.GetParameterAsText(0), um den Parameter in mein Python-Skript zu übernehmen. Dies funktioniert gut, wenn ich eine Datei durch Durchsuchen des Dateisystems auswähle, da der Text im Dialogfeld den vollständigen Pfad zur Datei darstellt. Wenn ich jedoch nur aus der Dropdown-Liste auswähle, ist der Text, den ich zurückerhalte, nur der Dateiname (z. B. file.tif). .

Der Code, den ich ausführe, muss den vollständigen Pfad zur Datei kennen - wie bekomme ich das?

Wenn ich davon ausgehen könnte, dass sich die Datei immer im Arbeitsbereich befindet, könnte ich den Dateinamen anhängen arcpy.env.workspace, aber das kann ich nicht annehmen. Muss ich alle geladenen Ebenen durchlaufen, bis ich eine mit demselben Namen finde und dann ihren vollständigen Pfad finde, oder gibt es einen einfacheren Weg?

robintw
quelle
3
Ich denke, dass Sie aus der Pulldown-Liste einen Ebenennamen aus Ihrem Inhaltsverzeichnis auswählen (der zufällig mit dem Dateinamen identisch ist). Als Idee können Sie vielleicht ListLayers durchlaufen, um diesen Layernamen zu finden, und nach dem Auffinden auf seine dataSource-Eigenschaft zugreifen, um die Eigenschaften workspacePath und datasetName zu kombinieren.
PolyGeo
Warum brauchst du den vollen Weg? Dieser wichtige Teil der Frage kann jemandem helfen, Ihre Frage mit einem Workaround zu beantworten.
Michael Markieta
@MichaelMarkieta: Ich führe in meinem Python-Skript Code aus, der eine vollständig separate Bibliothek verwendet (außerhalb von allem, was arcpy bereitstellt) und für dessen Verarbeitung der vollständige Pfad der Eingabedatei erforderlich ist.
Robintw

Antworten:

13

Ich hatte vor einiger Zeit das gleiche Problem. Es ist eine ziemlich einfache Lösung, verwenden Sie einfach das Beschreibungstool.

Sie erhalten bereits den Ebenennamen aus Ihren Parametern. Alles, was Sie tun müssen, ist, die Ebene zu beschreiben, den Pfad zu finden und die beiden zusammenzuführen.

layer = arcpy.GetParameterAsText(0)
desc = arcpy.Describe(layer)
path = desc.path
layersource = str(path) + "/" + layer

Das sollte kein Problem machen.

Hoffe das hilft

Cody Brown
quelle
1
Denken Sie daran, dass Sie im obigen Beispiel den Namen desc verwenden müssen, wenn der Layername im Inhaltsverzeichnis nicht mit der Feature-Class übereinstimmt.
Sethdd
Was ist mit dem Fall, dass Sie nicht wissen, ob die Ebene der vollständige Pfad ist oder nicht? Meine Lösung lautet layerource = os.path.join (arcpy.Describe (Ebene) .path, os.path.basename (Ebene)). Ich bin mir auch nicht sicher, ob ich einen Schrägstrich verwenden soll, um Teile des Pfads zu verbinden. Ich finde os.path.join mehr safe ... Sie müssen oben Import-Betriebssysteme hinzufügen.
Miro
Sie, mein Herr, sind ein Lebensretter. Ich habe in den letzten Stunden meinen Kopf gegen meinen Computer geschlagen, um herauszufinden, wie ich meine Eingabepfade dazu bringen kann, mit Variablen zu arbeiten. Der ursprüngliche Code, mit dem ich gearbeitet habe, hat an dem einen Projekt gearbeitet, auf dem ich es ausgeführt habe, aber dann habe ich beim zweiten Projekt, auf dem ich es ausgeführt habe, die 000732 "existiert nicht oder wird nicht unterstützt" erhalten. Ich habe den Code manuell (mit vollständigen Pfaden) im Python-Fenster getestet und es hat funktioniert. Mit dieser Lösung konnte ich den vollständigen Pfad zum Tool arcpy.TableToTable_conversion () mit meinen Variablen und der korrekten Formatierung übergeben. Diese Lösung war schwer zu finden! Vielen Dank!
Zachary Ordo - GISP
3

Wenn Sie die Möglichkeit berücksichtigen möchten, dass der Benutzer ein Raster im Dateisystem angibt:

from os.path import split, join
layer = arcpy.GetParameterAsText(0)

#Check if there is a path on the input parameter. If not, prepend the path.
if not split(layer)[0]:
    layer = join(arcpy.Describe(layer).path, "{}.tif".format(layer))
Paul
quelle
3

Es gibt auch einen etwas kürzeren Weg, dies zu tun. Datenobjekte beschreiben haben die Eigenschaft catalogPath, die den vollständigen Pfad zur Datei darstellt.

Mit der von uns verwendeten 10.1-Version können Sie Folgendes tun:

layer = arcpy.GetParameterAsText(0)
desc = arcpy.Describe(layer)
layersource = desc.catalogPath
zwei linke Füße
quelle
2

Sie könnten arcpy.GetParameter(0)eher als verwenden, arcpy.GetParameterAsText(0)da dies das Ebenenobjekt erhält und nicht nur eine Zeichenfolge mit dem Ebenennamen.

Wenn Sie ein Ebenenobjekt erhalten können, können Sie die LayerEigenschaften direkt abrufen und sparen sich die Notwendigkeit, a auszuführen Describe.

So etwas könnte Ihnen das bringen, was Sie wollen:

import arcpy, os

lyr = arcpy.GetParameter(0)

# Check this is a Layer Object
if hasattr(lyr, "dataSource"): 
    arcpy.AddMessage("Datasource = {}".format(lyr.dataSource))
    filepath = lyr.dataSource
else:
    arcpy.AddMessage("Datasource = {}".format(str(lyr)))
    filepath = str(lyr)
Midavalo
quelle