กำลังรับเส้นทางเต็มของเลเยอร์ที่เลือกในกล่องดรอปดาวน์สำหรับเครื่องมือสคริปต์ ArcGIS Python หรือไม่


11

ฉันมีเครื่องมือที่ใช้สคริปต์ Python ใน ArcGIS หนึ่งในพารามิเตอร์สำหรับเครื่องมือคือไฟล์อินพุตแรสเตอร์ซึ่งฉันได้ตั้งค่าไว้ (โดยใช้คุณสมบัติของเครื่องมือภายในกล่องเครื่องมือ) ให้เป็นเลเยอร์แบบแรสเตอร์ ซึ่งหมายความว่าเมื่อฉันรันเครื่องมือฉันจะได้รับตัวเลือกให้เลือกพารามิเตอร์นั้นจากรายการดรอปดาวน์ของเลเยอร์แรสเตอร์ที่โหลดในปัจจุบันหรือโดยการนำทางเพื่อค้นหาเลเยอร์แรสเตอร์ใหม่ภายในระบบไฟล์

ฉันใช้arcpy.GetParameterAsText(0)รหัสมาตรฐานเพื่อรับพารามิเตอร์ลงในสคริปต์ Python ของฉัน สิ่งนี้ใช้ได้ดีเมื่อฉันเลือกไฟล์โดยเรียกดูผ่านระบบไฟล์เนื่องจากข้อความในกล่องโต้ตอบเป็นเส้นทางแบบเต็มไปยังไฟล์ แต่เมื่อฉันเลือกจากรายการแบบเลื่อนลงข้อความที่ฉันได้รับกลับเป็นเพียงชื่อไฟล์ (เช่นfile.tif) .

รหัสที่ฉันกำลังเรียกใช้จำเป็นต้องทราบเส้นทางแบบเต็มไปยังไฟล์ - ฉันจะได้รับสิ่งนี้ได้อย่างไร

หากฉันสามารถสันนิษฐานได้ว่าไฟล์นั้นอยู่ในพื้นที่ทำงานเสมอฉันก็สามารถต่อท้ายชื่อไฟล์ได้arcpy.env.workspaceแต่ฉันไม่สามารถสรุปได้ ฉันจำเป็นต้องวนซ้ำทุกเลเยอร์ที่โหลดจนกว่าฉันจะหาชื่อที่มีชื่อเดียวกันแล้วค้นหาเส้นทางแบบเต็มหรือมีวิธีที่ง่ายกว่าหรือไม่


3
ฉันคิดว่าสิ่งที่คุณกำลังเลือกจากรายการแบบเลื่อนลงคือชื่อเลเยอร์จาก TOC ของคุณ (ซึ่งเกิดขึ้นเหมือนกับชื่อไฟล์) ตามแนวคิดคุณอาจทำซ้ำผ่าน ListLayers เพื่อค้นหาชื่อเลเยอร์นั้นและเมื่อพบการเข้าถึงคุณสมบัติ dataSource เพื่อรับ workspacePath และคุณสมบัติ datasetName รวมกัน
PolyGeo

ทำไมคุณต้องใช้เส้นทางแบบเต็ม? ส่วนสำคัญของคำถามนี้อาจช่วยให้ใครบางคนตอบคำถามของคุณด้วยการแก้ไข
Michael Markieta

@MichaelMarkieta: ฉันกำลังเรียกใช้รหัสบางส่วนในสคริปต์ Python ของฉันที่ใช้ไลบรารีแยกต่างหากอย่างสมบูรณ์ (นอกสิ่งที่ arcpy ให้) และที่ต้องใช้เส้นทางแบบเต็มของไฟล์อินพุตเพื่อทำการประมวลผล
robintw

คำตอบ:


13

ฉันมีปัญหาเดียวกันในขณะที่กลับ เป็นการแก้ไขที่ง่ายมากเพียงใช้เครื่องมืออธิบาย

คุณได้รับชื่อเลเยอร์จากพารามิเตอร์ของคุณแล้ว ดังนั้นสิ่งที่คุณต้องทำคืออธิบายเลเยอร์ค้นหาเส้นทางแล้วผสานทั้งสอง

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

ที่ควรทำไม่มีปัญหา

หวังว่านี่จะช่วยได้


1
เพียงจำไว้ว่าชื่อเลเยอร์ใน TOC นั้นไม่เหมือนกับคลาสคุณลักษณะคุณจะต้องใช้ desc.name ในตัวอย่างด้านบน
Sethdd

ถ้าอย่างนั้นคุณไม่ทราบว่าเลเยอร์เป็นหรือไม่เต็มเส้นทาง? วิธีการแก้ปัญหาของฉันคือ layerource = os.path.join (arcpy.Describe (layer) .path, os.path.basename (เลเยอร์)) - ยังไม่แน่ใจเกี่ยวกับการใช้เครื่องหมายทับเพื่อเข้าร่วมส่วนของเส้นทางฉันค้นหา os.path.join เพิ่มเติม ปลอดภัย ... ต้องเพิ่มระบบการนำเข้าที่ด้านบน
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

มีวิธีที่สั้นกว่าเล็กน้อยในการทำเช่นนี้ อธิบายวัตถุข้อมูลมีคุณสมบัติ catalogPath ซึ่งเป็นเส้นทางแบบเต็มไปยังไฟล์

ด้วยเวอร์ชัน 10.1 ที่เราใช้คุณสามารถ:

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

2

คุณสามารถใช้arcpy.GetParameter(0)แทนที่จะarcpy.GetParameterAsText(0)เป็นแบบนี้จะได้รับวัตถุชั้นมากกว่าเพียงแค่สตริงที่มีชื่อชั้น

ถ้าคุณได้รับวัตถุชั้นคุณจะได้รับคุณสมบัติตรงและประหยัดไม่ต้องทำLayerDescribe

บางสิ่งเช่นนี้อาจทำให้คุณได้รับสิ่งที่คุณต้องการ:

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
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.