Lấy đường dẫn đầy đủ của lớp được chọn trong hộp thả xuống cho công cụ tập lệnh ArcGIS Python?


11

Tôi có một công cụ dựa trên tập lệnh Python trong ArcGIS. Một trong các tham số cho công cụ là tệp raster đầu vào mà tôi đã đặt (sử dụng các thuộc tính của công cụ trong hộp công cụ) thành Lớp raster. Điều này có nghĩa là khi tôi thực thi công cụ, tôi có tùy chọn chọn tham số đó từ danh sách thả xuống của các lớp raster hiện đang được tải hoặc bằng cách điều hướng để tìm một lớp raster mới trong hệ thống tệp.

Sau đó tôi đang sử dụng arcpy.GetParameterAsText(0)mã tiêu chuẩn để đưa tham số vào tập lệnh Python của mình. Điều này hoạt động tốt khi tôi chọn một tệp bằng cách duyệt qua hệ thống tệp, vì văn bản trong hộp thoại là đường dẫn đầy đủ đến tệp, nhưng khi tôi chỉ chọn từ danh sách thả xuống, văn bản tôi nhận được chỉ là tên tệp (ví dụ. file.tif) .

Mã tôi đang chạy cần biết đường dẫn đầy đủ đến tệp - làm thế nào để tôi có được mã này?

Nếu tôi có thể giả sử rằng tệp luôn ở trong không gian làm việc thì tôi có thể nối thêm tên tệp vào arcpy.env.workspace, nhưng tôi không thể cho rằng. Tôi có cần lặp đi lặp lại qua tất cả các lớp được tải cho đến khi tôi tìm thấy một lớp có cùng tên, và sau đó tìm đường dẫn đầy đủ của nó, hoặc có cách nào dễ dàng hơn không?


3
Tôi nghĩ rằng những gì bạn đang chọn từ danh sách kéo xuống là tên lớp từ TOC của bạn (tên này giống với tên tệp của nó). Như một ý tưởng, có lẽ bạn có thể lặp qua ListLayers để tìm tên lớp đó và một khi tìm thấy truy cập thuộc tính dataSource của nó để có được các thuộc tính workspacePath và tập dữ liệuName.
PolyGeo

Tại sao bạn cần đường dẫn đầy đủ? Phần quan trọng này của câu hỏi có thể giúp ai đó trả lời câu hỏi của bạn bằng một công việc xung quanh.
Michael Markieta

@MichaelMarkieta: Tôi đang chạy một số mã trong tập lệnh Python đang sử dụng một thư viện hoàn toàn riêng biệt (bên ngoài bất kỳ thứ gì mà Arcpy cung cấp) và yêu cầu đường dẫn đầy đủ của tệp đầu vào để xử lý.
robintw

Câu trả lời:


13

Tôi đã có cùng một vấn đề một thời gian trở lại. Đây là một sửa chữa khá dễ dàng, chỉ cần sử dụng công cụ mô tả.

Bạn đã nhận được tên lớp từ các tham số của bạn. Vì vậy, tất cả những gì bạn phải làm là mô tả lớp, tìm đường dẫn sau đó hợp nhất hai.

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

Điều đó sẽ làm nó không có vấn đề.

Hi vọng điêu nay co ich


1
Chỉ cần ghi nhớ nếu tên Lớp trong TOC không giống với Lớp Tính năng, bạn sẽ cần sử dụng desc.name trong ví dụ trên.
Sethdd

Điều gì về trường hợp bạn không biết nếu lớp là hoặc không đầy đủ đường dẫn? Giải pháp của tôi là layerource = os.path.join (arcpy.Describe (layer) .path, os.path.basename (layer)) - cũng không chắc chắn về việc sử dụng dấu gạch chéo để nối các phần của đường dẫn, tôi tìm thấy os.path.join nhiều hơn an toàn ... Cần thêm os nhập ở đầu.
Miro

Bạn là một cứu cánh. Tôi đã đập đầu vào máy tính của tôi trong vài giờ qua để cố gắng tìm ra cách để đường dẫn đầu vào của tôi hoạt động với các biến. Mã ban đầu tôi đang làm việc với một dự án mà tôi đã chạy nó, nhưng sau đó tôi đã nhận được 000732 "không tồn tại hoặc không được hỗ trợ" trong dự án thứ hai mà tôi đã chạy nó. Tôi đã kiểm tra mã theo cách thủ công (với các đường dẫn đầy đủ) trong cửa sổ Python và nó đã hoạt động. Giải pháp này cho phép tôi chuyển đường dẫn đầy đủ đến công cụ arcpy.TableToTable_conversion () với các biến và định dạng chính xác của tôi. Giải pháp này rất khó tìm! Cảm ơn!
Zachary Ordo - GISP

3

Nếu bạn muốn tính đến khả năng người dùng có thể chỉ định raster trong hệ thống tệp:

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

Có một chút ngắn hơn để làm điều này cũng có. mô tả các đối tượng dữ liệu có thuộc tính catalogPath là đường dẫn đầy đủ đến tệp.

Với phiên bản 10.1 chúng tôi đang sử dụng, bạn có thể làm:

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

2

Bạn có thể sử dụng arcpy.GetParameter(0)chứ không phải arcpy.GetParameterAsText(0)vì điều này sẽ có được đối tượng lớp chứ không chỉ là một chuỗi với tên lớp.

Nếu bạn có thể có được một đối tượng lớp, bạn có thể lấy các Layerthuộc tính trực tiếp và tiết kiệm phải làm một Describe.

Một cái gì đó như thế này có thể giúp bạn có được những gì bạn muốn:

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)
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.