ArcGIS Pythonスクリプトツールのドロップダウンボックスで選択されたレイヤーのフルパスを取得しますか?


11

ArcGISにPythonスクリプトベースのツールがあります。ツールのパラメーターの1つは入力ラスターファイルで、これは(ツールボックス内のツールのプロパティを使用して)ラスターレイヤーとして設定しました。つまり、ツールを実行すると、現在ロードされているラスターレイヤーのドロップダウンリストからそのパラメーターを選択するか、ファイルシステム内で新しいラスターレイヤーを見つけるためにナビゲートするオプションが表示されます。

次に、標準arcpy.GetParameterAsText(0)コードを使用して、Pythonスクリプトにパラメーターを取得しています。私は、ダイアログのテキストとして、ファイルシステムをブラウズして、ファイルを選択すると、これは、ファイルへの完全なパスがあるが、私はちょうどドロップダウンリストから選択したときに、私は戻って取得テキストはファイル名だけで正常に動作します(例:。 file.tif)。

私が実行しているコードは、ファイルへのフルパスを知っている必要があります-これをどうやって取得しますか?

ファイルが常にワークスペースにあると想定できる場合、ファイル名をarcpy.env.workspaceに追加できますが、それを想定することはできません。同じ名前のレイヤーが見つかるまでロードされたすべてのレイヤーを反復処理し、そのフルパスを見つける必要がありますか、それとも簡単な方法がありますか?


3
プルダウンリストから選択しているのは、TOCのレイヤー名(たまたまそのファイル名と同じ)であると考えています。考えとして、ListLayersを反復処理してそのレイヤー名を見つけ、見つかったらそのdataSourceプロパティにアクセスして、workspacePathプロパティとdatasetNameプロパティを組み合わせることができます。
PolyGeo

完全なパスが必要なのはなぜですか?質問のこの重要な部分は、誰かが回避策であなたの質問に答えるのに役立つかもしれません。
マイケルマルキエタ

@MichaelMarkieta:私はPythonスクリプトでコードを実行していますが、これは完全に独立したライブラリ(arcpyが提供するもの以外)を使用しており、処理を行うには入力ファイルのフルパスが必要です。
-robintw

回答:


13

私はしばらく前に同じ問題を抱えていました。これは非常に簡単な修正で、describeツールを使用するだけです。

パラメータから既にレイヤー名を取得しています。したがって、必要なのは、レイヤーを記述し、パスを見つけて、2つをマージすることだけです。

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を上部に追加する必要があります。
ミロ

あなたは命の恩人です。私は、入力パスを変数で動作させる方法を見つけようとして、ここ数時間コンピューターに向かって頭を痛めています。私が作業していた元のコードは、実行した1つのプロジェクトで動作しましたが、実行した2番目のプロジェクトで000732が「存在しないか、サポートされていません」と表示されました。Pythonウィンドウでコードを(フルパスで)手動でテストしましたが、うまくいきました。このソリューションにより、変数と正しいフォーマットを使用して、arcpy.TableToTable_conversion()ツールにフルパスを渡すことができました。この解決策を見つけるのは困難でした!ありがとう!
ザカリーオルド-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

これを行うには少し短い方法があります。記述データオブジェクトには、ファイルへのフルパスである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)
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.