ArcGIS Python 스크립트 도구의 드롭 다운 상자에서 레이어의 전체 경로를 선택하고 있습니까?


11

ArcGIS에 Python 스크립트 기반 도구가 있습니다. 도구의 매개 변수 중 하나는 입력 래스터 파일이며 도구 상자 내의 도구 속성을 사용하여 래스터 레이어로 설정했습니다. 즉, 도구를 실행할 때 현재로드 된 래스터 레이어의 드롭 다운 목록에서 또는 파일 시스템에서 새 래스터 레이어를 찾도록 탐색하여 해당 매개 변수를 선택할 수있는 옵션이 제공됩니다.

그런 다음 표준 arcpy.GetParameterAsText(0)코드를 사용하여 매개 변수를 Python 스크립트로 가져옵니다. 내가 대화 상자의 텍스트로, 파일 시스템을 탐색하여 파일을 선택하면이 파일의 전체 경로입니다,하지만 난 그냥 드롭 다운 목록에서 선택했을 때 내가 돌아올 텍스트가 바로 파일 이름입니다 잘 작동 (예. file.tif) .

내가 실행중인 코드는 파일의 전체 경로를 알아야합니다. 어떻게 얻습니까?

파일이 항상 작업 공간에 있다고 가정 할 수 있다면 파일 이름을에 추가 arcpy.env.workspace할 수는 있지만 그럴 수는 없습니다. 같은 이름의 레이어를 찾은 다음 전체 경로를 찾을 때까지로드 된 모든 레이어를 반복해야합니까? 아니면 더 쉬운 방법이 있습니까?


3
풀다운 목록에서 선택하는 것이 TOC의 레이어 이름 (파일 이름과 동일 함)이라고 생각합니다. 아이디어로 ListLayers를 반복하여 해당 레이어 이름을 찾은 후 일단 dataSource 속성에 액세스하여 workspacePath 및 datasetName 속성을 결합 할 수 있습니다.
PolyGeo

전체 경로가 필요한 이유는 무엇입니까? 질문의이 중요한 부분은 누군가가 해결 방법으로 질문에 대답하는 데 도움이 될 수 있습니다.
Michael Markieta

@ MichaelMarkieta : Python 스크립트에서 완전히 별도의 라이브러리 (arpy가 제공하는 것 이외의)를 사용하고 처리를 위해 입력 파일의 전체 경로가 필요한 일부 코드를 실행 중입니다.
robintw

답변:


13

나는 다시 같은 문제가 있었다. 설명 도구를 사용하면 쉽게 해결할 수 있습니다.

이미 매개 변수에서 레이어 이름을 가져 왔습니다. 레이어를 설명하고 경로를 찾은 다음 두 개를 병합하기 만하면됩니다.

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

아무 문제 없습니다.

도움이 되었기를 바랍니다


1
TOC의 레이어 이름이 피쳐 클래스와 동일하지 않은 경우 위의 예에서 desc.name을 사용해야합니다.
Sethdd

레이어가 전체 경로인지 아닌지 모르는 경우는 어떻습니까? 내 솔루션은 layersource = os.path.join (arcpy.Describe (layer) .path, os.path.basename (layer))-슬래시를 사용하여 경로의 일부를 결합하는 것에 대해 확실하지 않은 경우 os.path.join 안전 ... 맨 위에 가져 오기 OS를 추가해야합니다.
Miro

당신은 생명의 은인입니다. 입력 경로를 변수와 함께 사용하는 방법을 알아 내려고 지난 몇 시간 동안 컴퓨터에 대해 머리를 숙이고있었습니다. 내가 작업 한 원래 코드는 내가 실행 한 프로젝트에서 작동했지만 두 번째 프로젝트에서 000732 "존재하지 않거나 지원되지 않습니다"를 얻었습니다. 파이썬 창에서 수동으로 코드를 테스트했습니다 (전체 경로 포함). 이 솔루션을 사용하면 변수 및 올바른 형식으로 arcpy.TableToTable_conversion () 도구의 전체 경로를 전달할 수있었습니다. 이 솔루션은 찾기가 어려웠습니다! 감사!
Zachary Ordo-GISP

3

사용자가 파일 시스템 내에 래스터를 지정할 수있는 가능성을 설명하려면 다음을 수행하십시오.

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

이 작업을 수행하는 조금 더 짧은 방법이 있습니다. describe 데이터 오브젝트에는 파일의 전체 경로 인 catalogPath 특성이 있습니다.

우리가 사용하는 10.1 버전으로 다음을 수행 할 수 있습니다.

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

2

레이어 이름을 가진 문자열이 아닌 레이어 객체를 가져 오기 때문에 arcpy.GetParameter(0)대신 사용할 수 있습니다 arcpy.GetParameterAsText(0).

레이어 객체를 얻을 수 있다면 Layer속성을 직접 가져 와서 할 필요가 없습니다 Describe.

이 같은 것은 당신이 원하는 것을 얻을 수 있습니다 :

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

여기에 내가 사용한 것이 있습니다. 그것은 매력처럼 작동합니다.

lyr = arcpy.mapping.ListLayers(mxd)[0]
desc = arcpy.Describe(lyr)
layersource = desc.catalogPath
print layersource
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.