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?
quelle
Antworten:
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.
Das sollte kein Problem machen.
Hoffe das hilft
quelle
Wenn Sie die Möglichkeit berücksichtigen möchten, dass der Benutzer ein Raster im Dateisystem angibt:
quelle
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:
quelle
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
Layer
Eigenschaften direkt abrufen und sparen sich die Notwendigkeit, a auszuführenDescribe
.So etwas könnte Ihnen das bringen, was Sie wollen:
quelle