在ArcGIS Python脚本工具的下拉框中是否选择了图层的完整路径?


11

我在ArcGIS中有一个基于Python脚本的工具。该工具的参数之一是输入栅格文件,我已将其设置为栅格层(使用工具箱中的工具属性)。这意味着当我执行该工具时,我可以选择从当前加载的栅格图层的下拉列表中选择该参数,或者通过导航在文件系统中查找新的栅格图层。

然后,我使用标准arcpy.GetParameterAsText(0)代码将参数放入我的Python脚本中。当我通过文件系统进行浏览,如对话框中的文本选择一个文件也能正常工作是对文件的完整路径,但是,当我刚刚从下拉列表中选择我回来的文本只是文件名(如file.tif) 。

我正在运行的代码需要知道文件的完整路径-如何获得此文件?

如果我可以假定文件始终在工作区中,则可以将文件名附加到arcpy.env.workspace,但是我不能假设。我是否需要遍历所有已加载的层,直到找到具有相同名称的层,然后找到其完整路径,或者是否有更简单的方法?


3
我在想,您从下拉列表中选择的是TOC中的图层名称(恰好与其文件名相同)。作为一个想法,您可以遍历ListLayers来找到该图层名称,并且一旦找到该图层名称,就可以访问其dataSource属性以将workspacePath和datasetName属性组合在一起。
PolyGeo

为什么需要完整的路径?问题的这一重要部分可能会帮助他人通过变通办法回答您的问题。
Michael Markieta 2012年

@MichaelMarkieta:我正在Python脚本中运行一些代码,该代码使用完全独立的库(arcpy提供的任何库之外),并且需要输入文件的完整路径来进行处理。
robintw 2012年

Answers:


13

我前一段时间也遇到过同样的问题。这很简单,只需使用describe工具即可。

您已经从参数中获取了图层名称。因此,您要做的就是描述图层,找到路径,然后将两者合并。

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更多安全...需要在顶部添加import os。
米罗(Miro)

先生,您是救命稻草。在过去的几个小时中,我一直不停地抬头,试图弄清楚如何使我的输入路径与变量一起使用。我使用的原始代码是在我运行过的那个项目上工作的,但是随后我在运行它的第二个项目上得到了000732“不存在或不受支持”。我在Python窗口中手动测试了代码(具有完整路径),它可以正常工作。该解决方案使我可以使用变量和正确的格式将完整路径传递给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)

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.