Ändern des Datenquellenpfads mit Feature-Dataset in * .lyr-Dateien mithilfe von ArcPy?

11

Wie kann man mit arcpy die Quelldatenpfade für jede Layer-Datei in Ordner X ändern?

Ich habe das Aktualisieren und Korrigieren von Datenquellen mit arcpy.mapping so gut ich kann verfolgt, aber alles, was ich bekomme, ist eine nicht hilfreiche Datei , Runtime error <type 'exceptions.ValueError'>: Layer: Unexpected errordie mir nicht genug sagt, um Fehler zu beheben , die falsch sind oder fehlen.

Hier ist der Code (vereinfacht zum Testen einer Single-Layer-Datei):

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

und die Ergebnisse:

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

((Abschnitt 'Update' in eine Antwort verschoben))

matt wilkie
quelle
Das Runtime error...oben zitierte stammt aus der interaktiven Python-Shell in Arccatalog, die keinen Traceback liefert. Die Ergebnisse mit Traceback werden aus einer Befehlsshell kopiert.
Matt Wilkie
1
Verschieben Sie Daten in ein Feature-Dataset oder in einen Arbeitsbereich oder aus diesem heraus?
Geographika
@geographika: Ja, das FDS ändert sich ebenso wie der Arbeitsbereich. Ich wurde durch die Dokumentation irregeführt , in der steht, dass das FDS nicht angegeben wird und dass MXDs und Lyrs sie ignorieren. Validieren hingegen ignoriert sie nicht oder zumindest nicht vollständig (siehe meine Antwort).
Matt Wilkie

Antworten:

7

Es sieht so aus, als ob die richtige Methode zum Wechseln von Arbeitsbereichen UND Feature-Datasets lyr.replaceDataSource () ist . Hier ist mein Arbeitsskript:

''' 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

Beim Testen scheint die Validierung bei dieser Methode wieder anders zu sein: Sie überprüft, ob der neue Arbeitsbereich gültig ist, ignoriert jedoch die Feature-Class und die Feature-Datasets. Dies bedeutet, dass kein Fehler zurückgegeben wird, wenn der Ziel-FC nicht vorhanden ist.

Wenn andererseits die Ziel-FC auch innerhalb eines anderen Feature-Datasets vorhanden ist, wird der neue Datenquellenpfad entsprechend angepasst, unabhängig davon, ob die Validierung wahr oder falsch ist.

Update: jetzt auf Github , um das Teilen und Überarbeiten zu vereinfachen.

matt wilkie
quelle
Funktioniert dies, wenn ich die .lyr-Quell-shp-Datei durch eine neue ersetzen möchte? Ich erhalte ValueError: Layer: Unerwarteter Fehler.
GeorgeC
@GeorgeC - Ich weiß, dass dies ein alter Beitrag ist, aber falls jemand dies über eine Suchmaschine findet, wird die Lösung für diesen Fehler wahrscheinlich die .shp aus dem Datensatznamen löschen. IOW das dritte Argument, um DataSource zu ersetzen, muss "newfile" sein, nicht "newfile.shp"
perrygeo
6

Das nicht hilfreiche bedeutet unexpected errorin diesem Fall so etwas wie "neuer Pfad existiert nicht" . Der optionale validateParameter ist standardmäßig True, wenn nichts angegeben ist. Mit false wird das Skript ohne Fehler abgeschlossen, aber die resultierenden Layer-Dateien waren immer noch fehlerhaft, obwohl der Zielpfad und die Feature-Class vorhanden sind.

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

Ergebnis

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

Zusätzlich zu dem anfänglichen Unwissen, dass validate standardmäßig true ist, erschwerten ein Fehler oder zumindest ein sehr eigenartiges Verhalten die Fehlerbehebung. Aktualisieren und Korrigieren von Datenquellen mit arcpy.mapping besagt , dass die Namen von Feature-Datasets nicht in den Arbeitsbereichspfad aufgenommen werden sollen. Feature-Datasets sind Teil des Arbeitsbereichs. Wenn beispielsweise eine Feature-Class von einer eigenständigen Feature-Class in ein Feature-Dataset verschoben wird, wird ein Map-Dokument weiterhin geöffnet, ohne dass der Layer unterbrochen wird. " Und " Wenn ein Layer oder eine Tabelle in einem Map-Dokument oder einer Layer-Datei vorhanden ist Wenn sie in ein Feature-Dataset verschoben oder aus diesem entfernt werden, sollten ihre Links nicht unterbrochen werden. "

Es stellt sich heraus, dass validate einen etwas anderen Winkel hat. Ja, es spielt keine Rolle, wo sich in der neuen Geodatabase (Arbeitsbereich) die Ziel-Feature-Class befindet , auf der obersten Ebene oder in einem völlig anderen Feature-Dataset. Der Zielarbeitsbereich muss jedoch ein Feature-Dataset mit demselben Namen enthalten, da sonst die Validierung fehlschlägt .

Unterbrochene und "feste" Ebenen, wie sie in Arccatalog und Arcmap angezeigt werden

Quellen :

matt wilkie
quelle