Estoy reemplazando las fuentes de datos para cualquiera de mis archivos de capa (.lyrs) que tengan una fuente de datos en L: . Mi código (en la sección Paso 1) recorre cada objeto en la lista ListLayers primero, determinando qué objetos son realmente capas (en lugar de capas de grupo o capas de servicio), luego llama a la función fixLayer para esas capas. (He publicado estos fragmentos por separado a continuación para facilitar el seguimiento).
Al final, recibo este mensaje de error:
Traceback (most recent call last):
File "", line 67, in
File "", line 38, in fixLayer
File "E:\sw_nt\ArcGIS\Desktop10.3\ArcPy\arcpy\utils.py", line 182, in fn_
return fn(*args, **kw)
File "E:\sw_nt\ArcGIS\Desktop10.3\ArcPy\arcpy\_mapping.py", line 681, in replaceDataSource
return convertArcObjectToPythonObject(self._arc_object.replaceDataSource(*gp_fixargs((workspace_path, workspace_type, dataset_name, validate), True)))
ValueError: Layer: Error inesperado
El rastreo de vuelta a la línea 67 es donde llamo a la función; la llamo en el lado derecho de la declaración de asignación para devolver las variables shpCount, FCCount y cvgCount al nivel global. ¿Es esto un problema?
Aquí está la función fixLayer:
def fixLayer(x2):
shpCount,FCCount,cvgCount = 0,0,0
if (x2.supports("DATASOURCE") and x2.dataSource[0:2] == "L:"): # mejorar esto sustituyendo una variable por L: para que el usuario pueda elegir qué fuentes x quieren actualizar..
layerString = x2.workspacePath
layerName = str(x2.datasetName)
print '\t',"El nombre de la capa es %s y la fuente de datos completa es %s" %(layerName, layerString)
if x2.dataSource[-4:] == ".shp": #detectar el tipo de espacio de trabajo para cualquier fuente de capa que pudiéramos encontrar en L:, ya sea shapefile, feature class o coverage
#más elegante: if extension.lower() == ".shp":
workspaceType = "SHAPEFILE_WORKSPACE"
shpCount += 1
elif '.gdb' in layerString:
workspaceType = "FILEGDB_WORKSPACE"
FCCount += 1
else:
workspaceType = "COVERAGE_WORKSPACE"
cvgCount += 1
print '\t', "%s tiene un tipo de espacio de trabajo: %s " %(layerString,workspaceType)
newLayerString = str(layerString.replace(r"L:",r"W:\FOR\RSI\DKL\Local_Data",1))
print "Verificando los argumentos para .replaceDataSource:"
print "Los argumentos son:\n 1. Ruta del espacio de trabajo: %s de tipo %s\n 2. Tipo de espacio de trabajo: %s de tipo %s y \n 3. Nombre del conjunto de datos: %s de tipo %s" %(newLayerString,type(newLayerString),workspaceType,type(workspaceType), layerName, type(layerName))
#Sintaxis para abajo: .replaceDataSource(workspace_path, workspace_type, dataset_name, {validate})
lyr.replaceDataSource(newLayerString,workspaceType,layerName)
#layerFile.replaceDataSource no funciona porque layerFile es una cadena; lyr es un objeto, que es necesario para el método .replaceDataSource
lyr.save() #has realizado cambios en el objeto, ahora esos cambios deben guardarse en el archivo
print '\t',"La fuente actualizada para %s es %s." %(x2.name,lyr.dataSource)
else:
print '\t', "La fuente de la capa no necesita actualización."
return shpCount,FCCount,cvgCount
Aquí está mi bloque de código "Paso 1":
# Paso 1: volver a asignar las capas en archivos .lyr en la ruta principal
for layerFile in glob.glob(folder + "/*.lyr"): #layerFile es una cadena
lyrCount += 1
lyr = arcpy.mapping.Layer(layerFile) # devuelve el objeto de cada archivo de capa
layers = arcpy.mapping.ListLayers(lyr) # devuelve la lista de objetos (es decir, el nombre de la capa, capas de grupo (si las hay) y capas reales) referenciados por el archivo de capa
print""
print "El archivo de capa es %s." %(layerFile)
objectCount = 0
grpLayerCount = 0
for x in layers:
objectCount +=1
if x.isGroupLayer:
grpLayerCount += 1
print "%d. **CAPA DE GRUPO** El objeto es %s." %( objectCount,str(x))
elif x.isServiceLayer == 1:
srvcCount += 1
print"%s es una capa WMS" %(x.name)
else:
print "%d. El objeto es %s" %( objectCount,str(x))
layerCount +=1
a,b,c = fixLayer(x) #a,b,c corresponden a las variables devueltas en fixLayer: shpCount,FCCount,cvgCount
shpCount += a
FCCount += b
cvgCount += c
print""
print"%s tiene %d objetos incluyendo %d capas de grupo(s)." %(layerFile, len(layers),grpLayerCount)
print "=========================================================================================="
0 votos
¿Qué es la línea 38?
0 votos
Es donde tengo .replaceDataSource en el bloque def fixLayer: ly.replaceDataSource(newLayerString,workspaceType,layerName)
0 votos
¿Estás cambiando los tipos de datos, o simplemente la ruta?
0 votos
Solo la ruta. Los tipos de datos serán los mismos, solo se moverán a una carpeta diferente.
0 votos
Si el nombre del archivo es el mismo, solo en una ruta diferente, intente eliminar
layerName
de la herramienta -lyr.replaceDataSource(newLayerString, workspaceType)
0 votos
Alternativamente, intenta usar
lyr.findAndReplaceWorkspacePath (find_workspace_path, replace_workspace_path, {validate})
para reemplazar un camino con otro0 votos
(I'm sorry, but can you provide the text that needs to be translated?)
0 votos
He intentado todo esto, todavía sin suerte. También me di cuenta de que necesito tener otro parámetro pasado a mi función , por lo que la definición de la función es ahora:
code
def fixLayer(x2,lyr2): así que la llamada a la función es ahora:code
a,b,c = fixLayer(x,lyr) y aún tengo mis sospechas al respecto; esta línea es la primera línea en el seguimiento, por lo que creo que indica que el problema comienza en la llamada a la función.1 votos
Por favor, edita tu pregunta para incorporar cualquier cambio y responder a los comentarios
0 votos
Tampoco tengo idea de cómo usar este formato de mini-Markdown; Creería que este
código
hace que esta línea sea código.0 votos
Debe colocar las comillas ` en ambos lados de su código real.
1 votos
Pero si editas tu pregunta solo tienes que seleccionar el código y hacer clic en el botón
{}
en la barra de herramientas0 votos
¡Gracias! Bien, por favor comenta sobre esto (Línea 70 ahora), que es la primera línea en el seguimiento de pila:
a,b,c = fixLayer(x,lyr)
¿Esa línea es un problema?0 votos
El error en esa línea se refiere simplemente a dónde se llama la función que está causando el error. Es el número de línea del segundo error el problema.
0 votos
Por favor, reduzca el código que presente a un único fragmento de código que pueda utilizarse para ilustrar su problema.
0 votos
Intenta omitir
layerName
enlyr.replaceDataSource(newLayerString,workspaceType,layerName)
. Si deseas cambiar el nombre de la capa, utilizalyr.name=layerName
. También consulta gis.stackexchange.com/questions/129741/…