La modifica del percorso dell'origine dati che coinvolge il set di dati delle funzionalità nei file * .lyr utilizzando ArcPy?


11

Come si possono cambiare i percorsi dei dati di origine per ogni file di livello nella cartella X usando arcpy?

Ho seguito l' aggiornamento e la correzione delle fonti di dati con arcpy.mapping nel miglior modo possibile, ma tutto quello che ottengo è un aiuto inutile Runtime error <type 'exceptions.ValueError'>: Layer: Unexpected errorche non mi dice abbastanza per risolvere ciò che è sbagliato o mancante.

Ecco il codice (semplificato per testare un file a singolo strato):

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

e i risultati:

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

((spostato la sezione "aggiorna" in una risposta))


il Runtime error...citato sopra proviene dalla shell interattiva di Python in Arccatalog, che non fornisce un traceback. I risultati con traceback vengono copiati da una shell dei comandi.
Matt Wilson

1
Stai spostando o spostando i dati da un set di dati di funzionalità a un'area di lavoro?
geographika

@geographika: sì, l'FDS sta cambiando così come l'area di lavoro. Sono stato ingannato dalla documentazione che dice che non specifica l'FDS, e che i mxd e i lyr li ignorano. Convalida d'altra parte non li ignora, o almeno non completamente (vedi la mia risposta).
matt wilkie

Risposte:


7

Sembra che il metodo corretto da utilizzare quando si cambiano le aree di lavoro E i set di dati delle caratteristiche è lyr.replaceDataSource () . Ecco il mio script di lavoro:

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

Nel test sembra convalidare in questo metodo è ancora diverso: verifica la nuova area di lavoro è valido, ma ignora i set di dati di classe e dispongono di funzionalità - che significa che non restituirà un errore se il bersaglio FC non c'è.

D'altra parte, se è presente l'FC di destinazione, anche all'interno di un set di dati di caratteristiche diverse, il nuovo percorso dell'origine dati viene adattato di conseguenza indipendentemente dal fatto che validare sia vero o falso.

Aggiornamento: ora su Github per consentire una più facile condivisione e revisione.


Funziona quando voglio sostituire il file shp di origine .lyr con uno nuovo? Ottengo ValueError: Layer: errore imprevisto.
GeorgeC

@GeorgeC - So che si tratta di un vecchio post, ma nel caso in cui qualcuno lo trovi tramite il motore di ricerca, è probabile che la soluzione a questo errore elimini il file .shp dal nome del set di dati. IOW il terzo argomento per sostituire DataSource deve essere "newfile" e non "newfile.shp"
perrygeo,

6

Il non utile unexpected errorin questo caso significa qualcosa come "il nuovo percorso non esiste" . Il validateparametro facoltativo viene impostato su True se non specificato. Con false, lo script viene completato senza errori ma i file di layer risultanti sono stati comunque interrotti anche se esistono il percorso di destinazione e la classe di caratteristiche.

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

risultato

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

Oltre a non conoscere inizialmente la convalida per impostazione predefinita impostata su true, un bug o almeno un comportamento molto bizzarro ha reso difficile la risoluzione dei problemi. L'aggiornamento e la correzione delle origini dati con arcpy.mapping indica Non includere i nomi dei set di dati delle caratteristiche nel percorso dell'area di lavoro. I set di dati delle funzioni fanno parte dell'area di lavoro. Se una classe di caratteristiche, ad esempio, viene spostata dall'essere una classe di caratteristiche autonoma in un set di dati di caratteristiche, un documento della mappa verrà comunque aperto senza che il livello venga interrotto " e " Se un livello o una tabella all'interno di un documento della mappa o di un file di livello viene spostato all'interno o all'esterno di un set di dati di funzionalità, i relativi collegamenti non devono essere interrotti. "

Si scopre che validare ha un angolo leggermente diverso su questo. Sì, non importa dove risiede nel nuovo geodatabase (area di lavoro) la classe di caratteristiche di destinazione , al livello superiore o in un set di dati di caratteristiche completamente diverso. Tuttavia, l'area di lavoro di destinazione deve contenere un set di dati di funzionalità con lo stesso nome o la convalida non riesce .

Livelli rotti e "fissi", come appaiono in Arccatalog e Arcmap

Fonti :

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.