12 votos

¿Camino que implica función conjunto de datos en archivos *.lyr con ArcPy de origen de datos cambiantes?

¿Cómo se puede cambiar el origen de datos de rutas de acceso para cada capa del archivo en la carpeta X el uso de arcpy?

Yo he seguido la Actualización y fijación de las fuentes de datos con arcpy.la asignación de lo mejor que puedo, pero todo lo que veo es un ineficiente Runtime error <type 'exceptions.ValueError'>: Layer: Unexpected error que no se lo dirá a mí lo suficiente como para solucionar lo que está mal o que falta.

Aquí está el código (simplificado para probar un solo archivo de 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

((movido 'actualización' de la sección en una respuesta))

8voto

Greg Puntos 1756

Parece que el método correcto para utilizar cuando se cambian los espacios de trabajo Y en función de los conjuntos de datos es lyr.replaceDataSource(). Aquí está mi guión 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 validar en este método es distinto: se verifica la nueva área de trabajo es válido, pero se ignora la función de la clase y la función de los conjuntos de datos, lo que significa que no devuelve un error si el FC de destino no está allí.

Por otro lado, si el objetivo de FC está presente, incluso en el interior de una característica diferente del conjunto de datos, la nueva ruta de origen de datos se adapta en consecuencia, independientemente de validar si es verdadero o falso.

Actualización: ahora en Github para facilitar el compartir y la revisión.

7voto

Greg Puntos 1756

La ineficiente unexpected error en este caso significa algo así como "la nueva ruta de acceso no existe". El facultativo validate parámetro valor por defecto es True si no se especifica. Con datos falsos, la secuencia de comandos completa sin errores, pero la capa resultante archivos todavía estaban rotos, incluso a pesar de que la ruta de destino y de la clase de entidad no 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 inicialmente no saber validar el valor por defecto es true, un error, o al menos algunos muy peculiar comportamiento hizo que la solución de este difícil. Actualización y fijación de las fuentes de datos con arcpy.asignación dice que no incluya los nombres de función de los conjuntos de datos en el área de trabajo de la ruta. Característica de los conjuntos de datos son parte del área de trabajo. Si una clase de entidad, por ejemplo, se pasó de ser una característica independiente de la clase en un dataset de entidad, un documento de mapa, todavía sin abrir la capa está roto", y "Si una capa o tabla en un documento de mapa o el archivo de capa que se mueve dentro o fuera de un dataset de entidades, sus enlaces no debe ser quebrantada."

Resulta que validar tiene un ángulo ligeramente diferente en esto. Sí no importa donde en la nueva geodatabase (área de trabajo), la entidad de destino de clase reside, en el nivel superior o en un dataset de entidad. Sin embargo, el objetivo del área de trabajo debe contener una función de conjunto de datos con el mismo nombre o validar falla.

Broken and "fixed" layers, as they look in Arccatalog and Arcmap

Fuentes:

i-Ciencias.com

I-Ciencias es una comunidad de estudiantes y amantes de la ciencia en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X