Отримання повного шляху шару, вибраного у спадному вікні інструменту для скриптів ArcGIS Python?


11

У ArcGIS у мене є інструмент на основі сценарію Python. Один з параметрів інструменту - це растровий файл, який я встановив (використовуючи властивості інструменту в панелі інструментів) як растровий шар. Це означає, що при виконанні інструменту я отримую можливість вибрати цей параметр із випадаючого списку поточно завантажених растрових шарів або за допомогою навігації знайти новий растровий шар у файловій системі.

Тоді я використовую стандартний arcpy.GetParameterAsText(0)код для введення параметра в мій сценарій Python. Це добре працює, коли я вибираю файл, переглядаючи файлову систему, оскільки текст у діалоговому вікні - це повний шлях до файлу, але коли я просто вибираю зі спадного списку, текст, який я повертаю, - це лише ім'я файлу (наприклад, file.tif) .

Код, який я виконую, повинен знати повний шлях до файлу - як це отримати?

Якби я міг припустити, що файл завжди знаходився в робочій області, тоді я міг би додати ім'я файлу arcpy.env.workspace, але не можу цього припустити. Чи потрібно мені перебирати всі завантажені шари, поки я не знайду той самий ім’я, а потім знайду його повний шлях, чи є більш простий шлях?


3
Я думаю, що те, що ви обираєте зі спадного списку, - це назва шару з вашого TOC (який трапляється таким самим, як його ім'я файлу). Як ідея, можливо, ви можете повторити програму ListLayers, щоб знайти це ім'я шару та щойно знайшли доступ до його властивості dataSource, щоб об’єднати властивості workpacePath та набір данихName.
PolyGeo

Навіщо потрібен повний шлях? Ця важлива частина запитання може допомогти комусь відповісти на ваше запитання разом із роботою.
Майкл Маркієта

@MichaelMarkieta: Я виконую деякий код у своєму скрипті Python, який використовує абсолютно окрему бібліотеку (за межами всього, що надає arcpy), і для її обробки потрібен повний шлях вхідного файлу.
robintw

Відповіді:


13

У мене був той самий випуск деякий час назад. Це досить просте виправлення, просто використовуйте інструмент опису.

Ви вже отримуєте назву шару зі своїх параметрів. Отже, все, що вам потрібно зробити, це описати шар, знайти шлях, а потім об'єднати два.

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

Це не повинно це робити.

Сподіваюсь, це допомагає


1
Просто майте на увазі, якщо ім'я шару в TOC не є таким, як клас Feature, вам потрібно буде використовувати desc.name у наведеному вище прикладі.
Сетдд

Що з випадку, коли ви не знаєте, чи є шар чи не повний шлях? Моє рішення - слой ресурсів = os.path.join (arcpy.Describe (шар) .path, os.path.basename (шар)) - також не впевнений у використанні слэш для приєднання частин шляху, я знаходжу os.path.join більше безпечно ... Потрібно додати OS імпорту вгорі.
Миро

Ви, пан, рятівник. Я бив головою об комп'ютер протягом останніх декількох годин, намагаючись зрозуміти, як змусити мої вхідні шляхи працювати зі змінними. Оригінальний код, з яким я працював, працював над одним проектом, над яким я його запустив, але потім я отримав 000732 "не існує або не підтримується" для другого проекту, на якому я його запустив. Я перевіряв код вручну (з повними шляхами) у вікні Python, і він працював. Це рішення дозволило мені пройти повний шлях до інструменту arcpy.TableToTable_conversion () з моїми змінними та правильним форматуванням. Це рішення було важко знайти! Дякую!
Захарі Ордо - ГІСП

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

Існує трохи коротший спосіб зробити це також. Описати об'єкти даних мають властивість 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
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.