Получение полного пути слоя, выбранного в раскрывающемся списке для скриптового инструмента ArcGIS Python?


11

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

Затем я использую стандартный arcpy.GetParameterAsText(0)код, чтобы получить параметр в моем скрипте Python. Это прекрасно работает, когда я выбираю файл, просматривая файловую систему, так как текст в диалоговом окне - это полный путь к файлу, но когда я просто выбираю из выпадающего списка, возвращаемый текст - это просто имя файла (например, file.tif). ,

Код, который я запускаю, должен знать полный путь к файлу - как мне это получить?

Если бы я мог предположить, что файл всегда был в рабочей области, то я мог бы добавить имя файла arcpy.env.workspace, но я не могу предположить, что это. Нужно ли перебирать все слои, которые загружены, пока я не найду один с тем же именем, а затем найду его полный путь, или есть более простой способ?


3
Я думаю, что вы выбираете из выпадающего списка имя слоя из вашего оглавления (которое совпадает с именем файла). В качестве идеи, возможно, вы можете перебрать ListLayers, чтобы найти имя этого слоя и, найдя его, получить доступ к его свойству dataSource, чтобы объединить свойства workspacePath и datasetName.
PolyGeo

Зачем вам нужен полный путь? Эта важная часть вопроса может помочь кому-то ответить на ваш вопрос с обходным путем.
Майкл Маркиета

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

Ответы:


13

У меня была такая же проблема некоторое время назад. Это довольно легко исправить, просто воспользуйтесь инструментом описания.

Вы уже получаете имя слоя из ваших параметров. Так что все, что вам нужно сделать, это описать слой, найти путь и объединить их.

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

Это должно сделать это без проблем.

Надеюсь это поможет


1
Просто имейте в виду, что если имя слоя в оглавлении не совпадает с классом объектов, вам потребуется использовать desc.name в приведенном выше примере.
Sethdd

Как насчет случая, когда вы не знаете, является ли слой полным или нет полного пути? Мое решение - layerource = os.path.join (arcpy.Describe (layer) .path, os.path.basename (layer)) - также не уверен насчет использования косой черты для соединения частей пути, я обнаружил, что os.path.join больше безопасно ... Нужно добавить импорт ОС вверху.
Миро

Вы, сэр, спасатель. Последние несколько часов я бился головой о компьютер, пытаясь понять, как заставить мои пути ввода работать с переменными. Исходный код, с которым я работал, работал над одним проектом, на котором я его запускал, но затем я получил 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.