¿Obtiene la ruta completa de la capa seleccionada en el cuadro desplegable para la herramienta de script ArcGIS Python?

11

Tengo una herramienta basada en script Python en ArcGIS. Uno de los parámetros para la herramienta es un archivo ráster de entrada, que he configurado (usando las propiedades de la herramienta dentro de la caja de herramientas) para que sea una capa ráster. Esto significa que cuando ejecuto la herramienta tengo la opción de seleccionar ese parámetro de una lista desplegable de capas ráster cargadas actualmente, o navegando para encontrar una nueva capa ráster dentro del sistema de archivos.

Luego estoy usando el arcpy.GetParameterAsText(0)código estándar para obtener el parámetro en mi script Python. Esto funciona bien cuando selecciono un archivo navegando a través del sistema de archivos, ya que el texto en el cuadro de diálogo es la ruta completa al archivo, pero cuando solo selecciono de la lista desplegable, el texto que recibo es solo el nombre de archivo (p. Ej. file.tif) .

El código que estoy ejecutando necesita conocer la ruta completa del archivo. ¿Cómo obtengo esto?

Si pudiera suponer que el archivo siempre estaba en el espacio de trabajo, podría agregar el nombre de archivo arcpy.env.workspace, pero no puedo suponer eso. ¿Necesito recorrer en iteración todas las capas que están cargadas hasta que encuentre una con el mismo nombre y luego encuentre su ruta completa, o hay una manera más fácil?

robintw
fuente
3
Estoy pensando que lo que está eligiendo de la lista desplegable es un nombre de capa de su TOC (que resulta ser el mismo que su nombre de archivo). Como idea, tal vez pueda iterar a través de ListLayers para encontrar ese nombre de capa y una vez encontrado acceder a su propiedad dataSource para obtener las propiedades workspacePath y datasetName combinadas.
PolyGeo
¿Por qué necesitas el camino completo? Esta parte importante de la pregunta podría ayudar a alguien a responder su pregunta con una solución alternativa.
Michael Markieta
@MichaelMarkieta: estoy ejecutando un código en mi script de Python que está usando una biblioteca completamente separada (fuera de todo lo que proporciona arcpy) y que requiere la ruta completa del archivo de entrada para que pueda procesarla.
robintw

Respuestas:

13

Tuve el mismo problema hace un tiempo. Es una solución bastante fácil, solo use la herramienta de descripción.

Ya está obteniendo el nombre de la capa de sus parámetros. Entonces, todo lo que tiene que hacer es describir la capa, encontrar la ruta y luego fusionar las dos.

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

Eso no debería ser un problema.

Espero que esto ayude

Cody Brown
fuente
1
Solo tenga en cuenta que si el nombre de la capa en la tabla de contenido no es el mismo que el de la clase de entidad, deberá usar desc.name en el ejemplo anterior.
Sethdd
¿Qué pasa con el caso de que no sepa si la capa es o no la ruta completa? Mi solución es layersource = os.path.join (arcpy.Describe (layer) .path, os.path.basename (layer)) - tampoco estoy seguro de usar la barra para unir partes de la ruta, encuentro os.path.join más seguro ... Necesito agregar import os en la parte superior.
Miro
Usted señor es un salvavidas. He estado golpeándome la cabeza contra mi computadora durante las últimas horas tratando de descubrir cómo hacer que mis rutas de entrada funcionen con variables. El código original con el que estaba trabajando funcionó en el único proyecto en el que lo ejecuté, pero luego obtuve el 000732 "no existe o no es compatible" en el segundo proyecto en el que lo ejecuté. Probé el código manualmente (con rutas completas) en la ventana de Python y funcionó. Esta solución me permitió pasar la ruta completa a la herramienta arcpy.TableToTable_conversion () con mis variables y el formato correcto. ¡Esta solución fue difícil de encontrar! ¡Gracias!
Zachary Ordo - GISP
3

Si desea tener en cuenta la posibilidad de que el usuario especifique un ráster dentro del sistema de archivos:

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))
Pablo
fuente
3

Hay una forma un poco más corta de hacer esto también. Los objetos de datos de descripción tienen una propiedad catalogPath que es la ruta completa al archivo.

Con la versión 10.1 que estamos usando, puede hacer:

layer = arcpy.GetParameterAsText(0)
desc = arcpy.Describe(layer)
layersource = desc.catalogPath
dos pies izquierdos
fuente
2

Puede usarlo en arcpy.GetParameter(0)lugar de hacerlo, arcpy.GetParameterAsText(0)ya que obtendrá el objeto de capa en lugar de solo una cadena con el nombre de la capa.

Si puede obtener un objeto de capa, puede obtener las Layerpropiedades directamente y ahorra tener que hacer un Describe.

Algo como esto podría darte lo que quieres:

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
fuente
0

Esto es lo que terminé usando. Funciona a las mil maravillas.

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