Stai ricevendo il percorso completo del layer selezionato nella casella a discesa per lo strumento di script ArcGIS Python?


11

Ho uno strumento basato su script Python in ArcGIS. Uno dei parametri per lo strumento è un file raster di input, che ho impostato (utilizzando le proprietà dello strumento all'interno della casella degli strumenti) per essere un livello raster. Ciò significa che quando eseguo lo strumento ottengo l'opzione per selezionare quel parametro da un elenco a discesa dei livelli raster attualmente caricati o navigando per trovare un nuovo livello raster all'interno del filesystem.

Sto quindi usando il arcpy.GetParameterAsText(0)codice standard per ottenere il parametro nel mio script Python. Funziona bene quando seleziono un file sfogliando il filesystem, poiché il testo nella finestra di dialogo è il percorso completo del file, ma quando seleziono semplicemente dall'elenco a discesa il testo che ottengo è solo il nome del file (ad es. file.tif) .

Il codice che sto eseguendo deve conoscere il percorso completo del file: come posso ottenerlo?

Se potessi supporre che il file fosse sempre nell'area di lavoro, allora potrei aggiungere il nome del file arcpy.env.workspace, ma non posso supporre che. Devo scorrere tutti i layer caricati fino a quando non ne trovo uno con lo stesso nome, quindi trovo il suo percorso completo o esiste un modo più semplice?


3
Sto pensando che quello che stai scegliendo dall'elenco a discesa sia un nome di livello dal tuo sommario (che sembra essere lo stesso del suo nome file). Come idea, forse puoi iterare attraverso ListLayers per trovare quel nome di layer e una volta trovato accedere alla sua proprietà dataSource per ottenere le proprietà workspacePath e datasetName.
PolyGeo

Perché hai bisogno del percorso completo? Questa parte importante della domanda potrebbe aiutare qualcuno a rispondere alla tua domanda con una soluzione.
Michael Markieta,

@MichaelMarkieta: sto eseguendo un po 'di codice nel mio script Python che sta utilizzando una libreria completamente separata (al di fuori di tutto ciò che arcpy fornisce) e che richiede il percorso completo del file di input per eseguire l'elaborazione.
Robintw,

Risposte:


13

Ho avuto lo stesso problema qualche tempo fa. È una soluzione abbastanza semplice, basta usare lo strumento di descrizione.

Stai già ottenendo il nome del livello dai tuoi parametri. Quindi tutto ciò che devi fare è descrivere il livello, trovare il percorso e unire i due.

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

Questo non dovrebbe fare alcun problema.

Spero che questo ti aiuti


1
Tieni presente che se il nome del livello nel sommario non è lo stesso della classe caratteristica, dovrai utilizzare desc.name nell'esempio sopra.
Sethdd,

Che dire del caso che non sai se il layer è o non è percorso completo? La mia soluzione è layersource = os.path.join (arcpy.Describe (layer) .path, os.path.basename (layer)) - inoltre, non sono sicuro di usare la barra per unire parti del percorso, trovo os.path.join altro sicuro ... È necessario aggiungere il sistema operativo di importazione nella parte superiore.
Miro,

Signore, siete un vero toccasana. Ho battuto la testa contro il mio computer per le ultime ore cercando di capire come far funzionare i miei percorsi di input con le variabili. Il codice originale con cui stavo lavorando ha funzionato su un progetto su cui l'ho eseguito, ma poi ho ottenuto 000732 "non esiste o non è supportato" sul secondo progetto su cui l'ho eseguito. Ho testato il codice manualmente (con percorsi completi) nella finestra di Python e ha funzionato. Questa soluzione mi ha permesso di passare l'intero percorso allo strumento arcpy.TableToTable_conversion () con le mie variabili e la formattazione corretta. Questa soluzione è stata difficile da trovare! Grazie!
Zachary Ordo - GISP,

3

Se si desidera tenere conto della possibilità che l'utente possa specificare un raster all'interno del filesystem:

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))

3

C'è anche un modo un po 'più breve per farlo. descrivono che gli oggetti dati hanno una proprietà catalogPath che è il percorso completo del file.

Con la versione 10.1 che stiamo usando, puoi fare:

layer = arcpy.GetParameterAsText(0)
desc = arcpy.Describe(layer)
layersource = desc.catalogPath

2

Puoi usare arcpy.GetParameter(0)piuttosto che arcpy.GetParameterAsText(0)come questo otterrà l'oggetto layer piuttosto che solo una stringa con il nome del layer.

Se riesci a ottenere un oggetto layer, puoi ottenere Layerdirettamente le proprietà e non devi fare nulla Describe.

Qualcosa del genere potrebbe darti quello che vuoi:

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)

0

Ecco cosa ho finito per usare. Esso funziona magicamente.

lyr = arcpy.mapping.ListLayers(mxd)[0]
desc = arcpy.Describe(lyr)
layersource = desc.catalogPath
print layersource
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.