Zmieniasz ścieżkę źródła danych obejmującą zestaw danych funkcji w plikach * .lyr przy użyciu ArcPy?

11

Jak zmienić źródłowe ścieżki danych dla każdego pliku warstwy w folderze X za pomocą arcpy?

I już po Uaktualnianie i ustalania źródeł danych arcpy.mapping najlepiej jak mogę, ale wszystko otrzymuję jest nieprzydatny Runtime error <type 'exceptions.ValueError'>: Layer: Unexpected error, który nie mów mi wystarczy, aby rozwiązywać problemy, co jest złe lub brakuje.

Oto kod (uproszczony do testowania pliku jednowarstwowego):

import arcpy, os

fname = r'K:\Layers\xxx.lyr'
lyr = arcpy.mapping.Layer(fname)
oldpath = lyr.workspacePath
print 'oldpath: ', oldpath
lyr.findAndReplaceWorkspacePath(oldpath, r'C:\some\other.gdb')
print 'newpath: ', lyr.workspacePath

i wyniki:

oldpath:  K:\Canvec_Utility\Temp.gdb
Traceback (most recent call last):
  File "x10x.py", line 12, in <module>
    lyr.findAndReplaceWorkspacePath(oldpath, r'C:\some\other.gdb')
  File "C:\ESRI\ArcGIS\Desktop10.0\arcpy\arcpy\utils.py", line 181, in fn_
    return fn(*args, **kw)
  File "C:\ESRI\ArcGIS\Desktop10.0\arcpy\arcpy\_mapping.py", line 601, in findAndReplaceWorkspacePath
    return convertArcObjectToPythonObject(self._arc_object.findAndReplaceWorkspacePath(*gp_fixargs((find_workspace_path, replace_workspace_path, validate), True
)))
ValueError: Layer: Unexpected error

((przeniesiono sekcję „aktualizacja” do odpowiedzi))

matowe wilkie
źródło
Runtime error...cytowany powyżej interakcyjnego powłoki pytona w ArcCatalog, który nie daje traceback. Wyniki ze śledzeniem są kopiowane z powłoki poleceń.
matt wilkie
1
Czy przenosisz dane do lub z zestawu danych funkcji, a także obszaru roboczego?
geographika
@geographika: tak FDS się zmienia, podobnie jak przestrzeń robocza. Zostałem wprowadzony w błąd przez dokumentację, która mówi, że nie określaj FDS, a mxd i lyr je ignorują. Walidacja z drugiej strony nie ignoruje ich, a przynajmniej nie całkowicie (patrz moja odpowiedź).
matt wilkie

Odpowiedzi:

7

Wygląda na to, że poprawną metodą używaną podczas przełączania obszarów roboczych ORAZ zestawów danych funkcji jest lyr.replaceDataSource () . Oto mój działający skrypt:

''' Change the datasource path for the given layer file '''

import arcpy, os

# layer file to re-path
fname = arcpy.GetParameterAsText(0)
# new path to workspace containing the feature class
target_wspace = arcpy.GetParameterAsText(1)
# where to save the layer files
savedir = arcpy.GetParameterAsText(2)

lyr = arcpy.mapping.Layer(fname)

fixed_fname = os.path.join(savedir, lyr.longName)

print '\nOld layer properties (%s)' % (fname)
print 'workspace:\t', lyr.workspacePath
print 'full path:\t', lyr.dataSource

try:
    lyr.replaceDataSource(target_wspace, 'FILEGDB_WORKSPACE', lyr.datasetName, True)
    lyr.saveACopy(fixed_fname)
except:
    print arcpy.GetMessages()

print '\nNew layer properties (%s)' % (fixed_fname)
print 'workspace:\t', lyr.workspacePath
print 'full path:\t', lyr.dataSource

del lyr

Podczas testowania wydaje się, że poprawność w tej metodzie jest inna: sprawdza, czy nowy obszar roboczy jest poprawny, ale ignoruje klasę elementów i zestawy danych elementów - co oznacza, że ​​nie zwróci błędu, jeśli docelowego FC nie ma.

Z drugiej strony, jeśli docelowy FC jest obecny, nawet w innym zestawie danych funkcji, nowa ścieżka źródła danych jest odpowiednio dostosowywana niezależnie od tego, czy sprawdzanie poprawności jest prawdziwe czy fałszywe.

Aktualizacja: teraz w Github, aby umożliwić łatwiejsze udostępnianie i zmiany.

matowe wilkie
źródło
Czy to działa, gdy chcę zastąpić źródłowy plik shp .lyr nowym? Otrzymuję ValueError: Layer: Nieoczekiwany błąd.
GeorgeC
@GeorgeC - Wiem, że jest to stary post, ale na wypadek, gdyby ktokolwiek znalazł to za pośrednictwem wyszukiwarki, rozwiązanie tego błędu prawdopodobnie spowoduje usunięcie pliku .shp z nazwy zbioru danych. IOW trzeci argument zastępujący DataSource musi być „newfile”, a nie „newfile.shp”
perrygeo
6

Niepomocna unexpected errorw tym przypadku oznacza coś takiego jak „nowa ścieżka nie istnieje” . Opcjonalny validateparametr ma domyślną wartość True, jeśli nie został określony. Przy false, skrypt kończy się bezbłędnie, ale wynikowe pliki warstw były nadal uszkodzone, mimo że istnieje ścieżka docelowa i klasa obiektów.

...    
lyr.findAndReplaceWorkspacePath(oldpath, r'C:\some\other.gdb', False)
...

wynik

oldpath:  K:\code\Canvec\Scripts\Temp.gdb
newpath:  C:\some\other.gdb

Oprócz początkowej niewiedzy o sprawdzeniu poprawności domyślnie ustawiono wartość true, błąd lub przynajmniej bardzo dziwne zachowanie utrudniało rozwiązywanie problemów. Aktualizacja i naprawa źródeł danych za pomocą arcpy.mapping mówi: Nie dołączaj nazw zestawów danych funkcji do ścieżki obszaru roboczego. Zestawy danych elementów są częścią obszaru roboczego. Jeśli na przykład klasa obiektów zostanie przeniesiona z samodzielnej klasy obiektów do zestawu danych elementów, dokument mapy będzie nadal otwarty bez uszkodzenia warstwy ” i „ Jeśli warstwa lub tabela w dokumencie mapy lub pliku warstwy zostanie przeniesiony do zbioru danych funkcji lub z niego usunięty, ich łącza nie powinny być uszkodzone ”.

Okazuje się, że walidacja ma nieco inny kąt. Tak, nie ma znaczenia, gdzie w nowej geobazie (obszarze roboczym) znajduje się docelowa klasa obiektów , na najwyższym poziomie lub w zupełnie innym zestawie danych obiektów. Jednak docelowy obszar roboczy musi zawierać zestaw danych funkcji o tej samej nazwie lub sprawdzenie poprawności kończy się niepowodzeniem .

Złamane i „naprawione” warstwy, jak wyglądają w Arccatalog i Arcmap

Źródła :

matowe wilkie
źródło