Mendapatkan path penuh lapisan yang dipilih dalam kotak drop-down untuk alat skrip ArcGIS Python?

11

Saya memiliki alat berbasis skrip Python di ArcGIS. Salah satu parameter untuk alat ini adalah file input raster, yang telah saya atur (menggunakan properti alat dalam kotak alat) menjadi Raster Layer. Ini berarti bahwa ketika saya menjalankan alat saya mendapatkan opsi untuk memilih parameter itu dari daftar dropdown lapisan raster yang saat ini dimuat, atau dengan menavigasi untuk menemukan lapisan raster baru dalam sistem file.

Saya kemudian menggunakan arcpy.GetParameterAsText(0)kode standar untuk mendapatkan parameter ke skrip Python saya. Ini berfungsi dengan baik ketika saya memilih file dengan menelusuri melalui sistem file, karena teks dalam dialog adalah path lengkap ke file, tetapi ketika saya hanya memilih dari daftar dropdown, teks yang saya dapatkan kembali hanyalah nama file (mis. file.tif) .

Kode yang saya jalankan perlu mengetahui path lengkap ke file - bagaimana cara mendapatkannya?

Jika saya bisa berasumsi bahwa file itu selalu di ruang kerja maka saya dapat menambahkan nama file arcpy.env.workspace, tetapi saya tidak bisa berasumsi itu. Apakah saya perlu mengulangi semua layer yang dimuat hingga saya menemukan satu dengan nama yang sama, dan kemudian menemukan path lengkapnya, atau adakah cara yang lebih mudah?

Robintw
sumber
3
Saya berpikir bahwa apa yang Anda pilih dari daftar tarik turun adalah nama lapisan dari TOC Anda (yang kebetulan sama dengan nama filenya). Sebagai ide mungkin Anda dapat mengulangi melalui ListLayers untuk menemukan nama layer itu dan sekali ditemukan mengakses properti dataSource untuk mendapatkan workspacePath dan properti datasetName digabungkan.
PolyGeo
Mengapa Anda membutuhkan path lengkap? Bagian penting dari pertanyaan ini mungkin dapat membantu seseorang menjawab pertanyaan Anda dengan menyelesaikannya.
Michael Markieta
@MichaelMarkieta: Saya sedang menjalankan beberapa kode dalam skrip Python saya yang menggunakan pustaka yang benar-benar terpisah (di luar apa pun yang disediakan oleh arcpy) dan yang memerlukan path lengkap dari file input untuk melakukan pemrosesan.
robintw

Jawaban:

13

Saya memiliki masalah yang sama beberapa waktu lalu. Ini adalah perbaikan yang cukup mudah, cukup gunakan alat uraikan.

Anda sudah mendapatkan nama layer dari parameter Anda. Jadi yang harus Anda lakukan adalah mendeskripsikan layer, temukan path lalu gabungkan keduanya.

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

Itu seharusnya tidak masalah.

Semoga ini membantu

Cody Brown
sumber
1
Perlu diingat jika nama Layer di TOC tidak sama dengan Kelas Fitur, Anda harus menggunakan desc.name pada contoh di atas.
Sethdd
Bagaimana dengan case Anda tidak tahu apakah layer path lengkap atau tidak? Solusi saya adalah layersource = os.path.join (arcpy.Describe (layer) .path, os.path.basename (layer)) - juga tidak yakin tentang menggunakan garis miring untuk bergabung dengan bagian-bagian jalan, saya menemukan os.path.join lagi safe ... Perlu menambahkan os impor di bagian atas.
Miro
Anda adalah penyelamat. Saya telah mengalahkan kepala saya terhadap komputer saya selama beberapa jam terakhir mencoba mencari cara untuk mendapatkan jalur input saya untuk bekerja dengan variabel. Kode asli yang saya kerjakan bekerja pada satu proyek tempat saya menjalankannya, tetapi kemudian saya mendapatkan 000732 "tidak ada atau tidak didukung" pada proyek kedua saya menjalankannya. Saya menguji kode secara manual (dengan jalur penuh) di jendela Python & berhasil. Solusi ini memungkinkan saya untuk melewatkan path lengkap ke alat arcpy.TableToTable_conversion () dengan variabel saya & pemformatan yang benar. Solusi ini sulit ditemukan! Terima kasih!
Zachary Ordo - GISP
3

Jika Anda ingin memperhitungkan kemungkinan bahwa pengguna dapat menentukan raster dalam sistem file:

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))
Paul
sumber
3

Ada cara yang sedikit lebih pendek untuk melakukan ini juga. menggambarkan objek data memiliki properti catalogPath yang merupakan path lengkap ke file.

Dengan versi 10.1 yang kami gunakan, Anda dapat melakukan:

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

Anda bisa menggunakan arcpy.GetParameter(0)daripada arcpy.GetParameterAsText(0)karena ini akan mendapatkan objek layer bukan hanya string dengan nama layer.

Jika Anda bisa mendapatkan objek layer Anda bisa mendapatkan Layerproperti secara langsung dan menyimpan harus melakukan Describe.

Sesuatu seperti ini mungkin memberi Anda apa yang Anda inginkan:

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)
Midavalo
sumber
0

Inilah yang akhirnya saya gunakan. Itu bekerja seperti pesona.

lyr = arcpy.mapping.ListLayers(mxd)[0]
desc = arcpy.Describe(lyr)
layersource = desc.catalogPath
print layersource
Sanjay Singh Negi
sumber