Uzyskiwanie pełnej ścieżki wybranej warstwy w rozwijanym polu dla narzędzia skryptowego ArcGIS Python?

11

Mam narzędzie skryptowe Python w ArcGIS. Jednym z parametrów tego narzędzia jest wejściowy plik rastrowy, który ustawiłem (używając właściwości narzędzia w przyborniku), aby był warstwą rastrową. Oznacza to, że kiedy uruchamiam narzędzie, dostaję opcję wyboru tego parametru z listy rozwijanej aktualnie załadowanych warstw rastrowych lub nawigując, aby znaleźć nową warstwę rastrową w systemie plików.

Następnie używam standardowego arcpy.GetParameterAsText(0)kodu, aby wprowadzić parametr do mojego skryptu Python. Działa to dobrze, gdy wybieram plik podczas przeglądania systemu plików, ponieważ tekst w oknie dialogowym jest pełną ścieżką do pliku, ale gdy wybieram z listy rozwijanej, tekst, który otrzymuję, jest tylko nazwą pliku (np. file.tif) .

Kod, który uruchamiam, musi znać pełną ścieżkę do pliku - jak go zdobyć?

Gdybym mógł założyć, że plik zawsze znajdował się w obszarze roboczym, mógłbym dołączyć do niego nazwę pliku arcpy.env.workspace, ale nie mogę tego założyć. Czy muszę iterować wszystkie załadowane warstwy, dopóki nie znajdę jednej o tej samej nazwie, a następnie nie znajdę jej pełnej ścieżki, czy też istnieje łatwiejszy sposób?

robintw
źródło
3
Myślę, że to, co wybierasz z rozwijanej listy, to nazwa warstwy z twojego spisu treści (która jest taka sama jak nazwa pliku). Pomysłem może być iteracja ListLayers w celu znalezienia nazwy warstwy, a po znalezieniu dostępu do jej właściwości dataSource w celu połączenia właściwości workspacePath i datasetName.
PolyGeo
Dlaczego potrzebujesz pełnej ścieżki? Ta ważna część pytania może pomóc komuś odpowiedzieć na twoje pytanie z obejściem.
Michael Markieta
@MichaelMarkieta: Korzystam z kodu w skrypcie Pythona, który korzysta z całkowicie oddzielnej biblioteki (poza wszystkim, co zapewnia Arcpy) i który wymaga pełnej ścieżki pliku wejściowego, aby mógł przetwarzać.
robintw

Odpowiedzi:

13

Jakiś czas temu miałem ten sam problem. Jest to dość łatwa poprawka, wystarczy użyć narzędzia opisz.

Otrzymujesz już nazwę warstwy na podstawie swoich parametrów. Więc wszystko, co musisz zrobić, to opisać warstwę, znaleźć ścieżkę, a następnie połączyć obie.

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

To nie powinno stanowić problemu.

Mam nadzieję że to pomoże

Cody Brown
źródło
1
Pamiętaj tylko, że jeśli nazwa warstwy w spisie treści nie jest taka sama jak klasa elementów, w powyższym przykładzie będziesz musiał użyć desc.name.
Sethdd
Co z przypadkiem, gdy nie wiesz, czy warstwa jest lub nie jest pełną ścieżką? Moje rozwiązanie to layerource = os.path.join (arcpy.Describe (layer) .path, os.path.basename (layer)) - również nie jestem pewien, czy do łączenia części ścieżki używasz ukośnika, znajduję os.path.join więcej bezpieczne ... Musisz dodać importowany system operacyjny na górze.
Miro
Pan jest ratownikiem. Od kilku godzin walę głową z komputerem, próbując wymyślić, jak sprawić, by moje ścieżki wejściowe działały ze zmiennymi. Oryginalny kod, nad którym pracowałem, pracował nad jednym projektem, w którym go uruchomiłem, ale potem dostałem 000732 „nie istnieje lub nie jest obsługiwany” w drugim projekcie, w którym go uruchomiłem. Testowałem kod ręcznie (z pełnymi ścieżkami) w oknie Pythona i zadziałało. To rozwiązanie pozwoliło mi przekazać pełną ścieżkę do narzędzia arcpy.TableToTable_conversion () z moimi zmiennymi i poprawnym formatowaniem. Trudno było znaleźć to rozwiązanie! Dzięki!
Zachary Ordo - GISP
3

Jeśli chcesz uwzględnić możliwość określenia przez użytkownika rastra w systemie plików:

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))
Paweł
źródło
3

Jest to również nieco krótszy sposób. Opis obiektów danych ma właściwość catalogPath, która jest pełną ścieżką do pliku.

Dzięki używanej przez nas wersji 10.1 możesz:

layer = arcpy.GetParameterAsText(0)
desc = arcpy.Describe(layer)
layersource = desc.catalogPath
twoLeftFeet
źródło
2

Możesz użyć arcpy.GetParameter(0)zamiast arcpy.GetParameterAsText(0)tego, ponieważ otrzyma obiekt warstwy, a nie tylko ciąg z nazwą warstwy.

Jeśli możesz uzyskać obiekt warstwy, możesz uzyskać Layerwłaściwości bezpośrednio i oszczędza to konieczności robienia Describe.

Coś takiego może dać ci to, czego chcesz:

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
źródło
0

Oto, czego użyłem. To działa jak urok.

lyr = arcpy.mapping.ListLayers(mxd)[0]
desc = arcpy.Describe(lyr)
layersource = desc.catalogPath
print layersource
Sanjay Singh Negi
źródło