¿Cambiar la ruta del origen de datos que involucra el conjunto de datos de entidades en archivos * .lyr usando ArcPy?

11

¿Cómo se pueden cambiar las rutas de datos de origen para cada archivo de capa en la carpeta X usando arcpy?

He seguido Actualizando y arreglando las fuentes de datos con arcpy.mapping lo mejor que puedo, sin embargo, todo lo que obtengo es un poco útil Runtime error <type 'exceptions.ValueError'>: Layer: Unexpected errorque no me dice lo suficiente como para solucionar lo que está mal o falta.

Aquí está el código (simplificado para probar un archivo de una sola capa):

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

y los resultados:

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

((movió la sección 'actualizar' a una respuesta))

wilkie mate
fuente
lo Runtime error...citado arriba es del shell interactivo de python en Arccatalog, que no proporciona un rastreo. Los resultados con el rastreo se copian desde un shell de comandos.
Matt Wilkie
1
¿Está moviendo datos dentro o fuera de un conjunto de datos de características, así como un espacio de trabajo?
geographika
@geographika: sí, el FDS está cambiando, así como el espacio de trabajo. Me engañó la documentación que dice que no especifique el FDS, y que mxd y lyr los ignoran. Validar por otro lado no los ignora, o al menos no completamente (ver mi respuesta).
Matt Wilkie

Respuestas:

7

Parece que el método correcto para usar al cambiar espacios de trabajo Y conjuntos de datos de características es lyr.replaceDataSource () . Aquí está mi script de trabajo:

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

En las pruebas, parece que validar en este método es diferente nuevamente: verifica que el nuevo espacio de trabajo sea válido, pero ignora la clase de entidad y los conjuntos de datos de entidad, lo que significa que no devolverá un error si el FC objetivo no está allí.

Por otro lado, si el FC objetivo está presente, incluso dentro de un conjunto de datos de características diferente, la nueva ruta de origen de datos se adapta en consecuencia independientemente de si la validación es verdadera o falsa.

Actualización: ahora en Github para permitir compartir y revisar más fácilmente.

wilkie mate
fuente
¿Funciona esto cuando quiero reemplazar el archivo shp de origen .lyr con uno nuevo? Obtengo ValueError: Layer: Error inesperado.
GeorgeC
@GeorgeC: Sé que esta es una publicación antigua, pero en caso de que alguien encuentre esto a través del motor de búsqueda, es probable que la solución a este error elimine el .shp del nombre del conjunto de datos. IOW el tercer argumento para reemplazar DataSource necesita ser "newfile" no "newfile.shp"
perrygeo
6

Lo inútil unexpected erroren este caso significa algo así como "no existe una nueva ruta" . El validateparámetro opcional predeterminado es True si no se especifica. Con falso, la secuencia de comandos se completa sin error, pero los archivos de capa resultantes aún se rompieron a pesar de que la ruta de destino y la clase de entidad existen.

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

resultado

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

Además de no conocer inicialmente la validación predeterminada a verdadero, un error, o al menos un comportamiento muy peculiar hizo que la solución de problemas sea difícil. Actualizar y corregir fuentes de datos con arcpy.mapping dice No incluir los nombres de datasets de entidades en la ruta del espacio de trabajo. Los conjuntos de datos de entidades son parte del espacio de trabajo. Si una clase de entidad, por ejemplo, pasa de ser una clase de entidad independiente a un conjunto de datos de entidad, un documento de mapa aún se abrirá sin que se rompa la capa " , y " Si una capa o tabla dentro de un documento de mapa o archivo de capa se mueve dentro o fuera de un conjunto de datos de características, sus enlaces no deben romperse ".

Resulta que validar tiene un ángulo ligeramente diferente en esto. Sí, no importa en qué parte de la nueva geodatabase (espacio de trabajo) resida la clase de entidad de destino , en el nivel superior o en un conjunto de datos de entidad completamente diferente. Sin embargo, el espacio de trabajo de destino debe contener un conjunto de datos de características con el mismo nombre o la validación falla .

Capas rotas y "fijas", como se ven en Arccatalog y Arcmap

Fuentes :

wilkie mate
fuente