Obtendo o caminho completo da camada selecionado na caixa suspensa da ferramenta de script ArcGIS Python?

11

Eu tenho uma ferramenta baseada em script Python no ArcGIS. Um dos parâmetros para a ferramenta é um arquivo raster de entrada, que eu defini (usando as propriedades da ferramenta na caixa de ferramentas) para ser uma Camada Raster. Isso significa que, quando executo a ferramenta, obtenho a opção de selecionar esse parâmetro em uma lista suspensa de camadas de varredura carregadas no momento ou navegando para encontrar uma nova camada de varredura no sistema de arquivos.

Em seguida, estou usando o arcpy.GetParameterAsText(0)código padrão para obter o parâmetro no meu script Python. Isso funciona bem quando seleciono um arquivo navegando pelo sistema de arquivos, pois o texto na caixa de diálogo é o caminho completo para o arquivo, mas quando seleciono na lista suspensa o texto que recebo é apenas o nome do arquivo (por exemplo, file.tif) .

O código que estou executando precisa saber o caminho completo para o arquivo - como faço para obtê-lo?

Se eu pudesse assumir que o arquivo estava sempre no espaço de trabalho, poderia anexar o nome do arquivo arcpy.env.workspace, mas não posso assumir isso. Preciso percorrer todas as camadas carregadas até encontrar uma com o mesmo nome e depois encontrar o caminho completo ou existe uma maneira mais fácil?

robintw
fonte
3
Estou pensando que o que você está escolhendo na lista suspensa é um nome de camada do seu sumário (que por acaso é o mesmo que o nome do arquivo). Como uma idéia, talvez você possa percorrer o ListLayers para encontrar o nome da camada e, uma vez encontrado, acessar sua propriedade dataSource para obter as propriedades workspacePath e datasetName combinadas.
PolyGeo
Por que você precisa do caminho completo? Esta parte importante da pergunta pode ajudar alguém a responder sua pergunta com uma solução alternativa.
Michael Markieta
@ MichaelMarkieta: Estou executando algum código no meu script Python que usa uma biblioteca completamente separada (fora de qualquer coisa que o arcpy forneça) e que exija o caminho completo do arquivo de entrada para que ele possa processar.
robintw

Respostas:

13

Eu tive o mesmo problema há um tempo. É uma solução bastante fácil, basta usar a ferramenta de descrição.

Você já está recebendo o nome da camada de seus parâmetros. Então, tudo o que você precisa fazer é descrever a camada, encontrar o caminho e mesclar os dois.

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

Isso não deve causar problemas.

Espero que isto ajude

Cody Brown
fonte
1
Lembre-se de que se o nome da camada no sumário não for o mesmo que a classe de recursos, você precisará usar o desc.name no exemplo acima.
Sethdd 25/02
E se você não souber se a camada está ou não no caminho completo? Minha solução é layersource = os.path.join (arcpy.Describe (layer) .path, os.path.basename (layer)) - também não tenho certeza sobre o uso de barra para unir partes do caminho, acho que os.path.join more seguro ... Precisa adicionar o SO de importação na parte superior.
Miro
Você senhor é um salva-vidas. Eu tenho batido minha cabeça contra o meu computador nas últimas horas tentando descobrir como fazer com que meus caminhos de entrada funcionem com variáveis. O código original com o qual eu trabalhava trabalhava no projeto em que o executei, mas o 000732 "não existe ou não é suportado" no segundo projeto em que o executei. Testei o código manualmente (com caminhos completos) na janela do Python e funcionou. Esta solução me permitiu passar o caminho completo para a ferramenta arcpy.TableToTable_conversion () com minhas variáveis ​​e formatação correta. Esta solução foi difícil de encontrar! Obrigado!
Zachary Ordo - GISP
3

Se você deseja considerar a possibilidade de o usuário especificar uma varredura no sistema de arquivos:

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))
Paulo
fonte
3

Há uma maneira um pouco mais curta de fazer isso também. Os objetos de dados descrever têm uma propriedade catalogPath, que é o caminho completo para o arquivo.

Com a versão 10.1 que estamos usando, você pode:

layer = arcpy.GetParameterAsText(0)
desc = arcpy.Describe(layer)
layersource = desc.catalogPath
dois pés esquerdos
fonte
2

Você pode usar arcpy.GetParameter(0)e não, arcpy.GetParameterAsText(0)pois isso obterá o objeto de camada, em vez de apenas uma string com o nome da camada.

Se você pode obter um objeto de camada, pode obter as Layerpropriedades diretamente e evitar a necessidade de fazer a Describe.

Algo assim pode dar o que você deseja:

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
fonte