Obtenir le chemin complet de la couche sélectionné dans la liste déroulante pour l'outil de script ArcGIS Python?

11

J'ai un outil basé sur un script Python dans ArcGIS. L'un des paramètres de l'outil est un fichier raster en entrée, que j'ai défini (en utilisant les propriétés de l'outil dans la boîte à outils) pour être une couche raster. Cela signifie que lorsque j'exécute l'outil, j'ai la possibilité de sélectionner ce paramètre dans une liste déroulante des couches raster actuellement chargées, ou en naviguant pour trouver une nouvelle couche raster dans le système de fichiers.

J'utilise ensuite le arcpy.GetParameterAsText(0)code standard pour obtenir le paramètre dans mon script Python. Cela fonctionne bien lorsque je sélectionne un fichier en parcourant le système de fichiers, car le texte dans la boîte de dialogue est le chemin d'accès complet au fichier, mais lorsque je sélectionne simplement dans la liste déroulante, le texte que je récupère n'est que le nom de fichier (par exemple file.tif) . .

Le code que j'utilise doit connaître le chemin d'accès complet au fichier - comment puis-je l'obtenir?

Si je pouvais supposer que le fichier était toujours dans l'espace de travail, je pourrais ajouter le nom de fichier à arcpy.env.workspace, mais je ne peux pas le supposer. Dois-je parcourir toutes les couches chargées jusqu'à ce que j'en trouve une du même nom, puis trouve son chemin complet, ou existe-t-il un moyen plus simple?

robintw
la source
3
Je pense que ce que vous choisissez dans la liste déroulante est un nom de couche de votre table des matières (qui se trouve être le même que son nom de fichier). Comme idée, vous pouvez peut-être parcourir ListLayers pour trouver ce nom de couche et une fois trouvé accéder à sa propriété dataSource pour obtenir les propriétés workspacePath et datasetName combinées.
PolyGeo
Pourquoi avez-vous besoin du chemin complet? Cette partie importante de la question pourrait aider quelqu'un à répondre à votre question avec une solution de contournement.
Michael Markieta
@MichaelMarkieta: J'exécute du code dans mon script Python qui utilise une bibliothèque complètement distincte (en dehors de tout ce que fournit arcpy) et qui nécessite le chemin complet du fichier d'entrée pour qu'il puisse effectuer son traitement.
robintw

Réponses:

13

J'ai eu le même problème il y a quelque temps. C'est une solution assez simple, utilisez simplement l'outil de description.

Vous obtenez déjà le nom de la couche à partir de vos paramètres. Il vous suffit donc de décrire le calque, de trouver le chemin puis de fusionner les deux.

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

Cela ne devrait pas poser de problème.

J'espère que cela t'aides

Cody Brown
la source
1
N'oubliez pas que si le nom de la couche dans la table des matières n'est pas le même que la classe d'entités, vous devrez utiliser desc.name dans l'exemple ci-dessus.
Sethdd
Qu'en est-il du cas où vous ne savez pas si la couche est ou non le chemin complet? Ma solution est layersource = os.path.join (arcpy.Describe (layer) .path, os.path.basename (layer)) - également pas sûr d'utiliser la barre oblique pour joindre des parties de chemin, je trouve os.path.join plus sûr ... Besoin d'ajouter des os d'importation en haut.
Miro
Vous monsieur êtes une bouée de sauvetage. Cela fait plusieurs heures que je me bats la tête contre mon ordinateur en essayant de comprendre comment faire fonctionner mes chemins d'entrée avec des variables. Le code d'origine avec lequel je travaillais a fonctionné sur le seul projet sur lequel je l'ai exécuté, mais j'ai ensuite obtenu le 000732 "n'existe pas ou n'est pas pris en charge" sur le deuxième projet sur lequel je l'ai exécuté. J'ai testé le code manuellement (avec les chemins d'accès complets) dans la fenêtre Python et cela a fonctionné. Cette solution m'a permis de passer le chemin complet vers l'outil arcpy.TableToTable_conversion () avec mes variables et un formatage correct. Cette solution était difficile à trouver! Merci!
Zachary Ordo - GISP
3

Si vous souhaitez tenir compte de la possibilité que l'utilisateur spécifie un raster dans le système de fichiers:

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
la source
3

Il existe également un moyen un peu plus court de le faire. Les objets de données décrivent ont une propriété catalogPath qui est le chemin d'accès complet au fichier.

Avec la version 10.1 que nous utilisons, vous pouvez faire:

layer = arcpy.GetParameterAsText(0)
desc = arcpy.Describe(layer)
layersource = desc.catalogPath
deux pieds gauches
la source
2

Vous pouvez utiliser arcpy.GetParameter(0)plutôt que arcpy.GetParameterAsText(0)car cela obtiendra l'objet calque plutôt qu'une simple chaîne avec le nom du calque.

Si vous pouvez obtenir un objet calque, vous pouvez obtenir Layerdirectement les propriétés et éviter d'avoir à faire un Describe.

Quelque chose comme ça pourrait vous donner ce que vous voulez:

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
la source
0

Voici ce que j'ai fini par utiliser. Il fonctionne comme un charme.

lyr = arcpy.mapping.ListLayers(mxd)[0]
desc = arcpy.Describe(lyr)
layersource = desc.catalogPath
print layersource
Sanjay Singh Negi
la source