2 votos

.replaceDataSource() resulta en ValueError: Capa: Error inesperado

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?

2voto

Noam D. Elkies Puntos 17729

OK, aquí está. Si estás obteniendo el siguiente error:

ValueError: Capa: Error inesperado

al hacer .replaceDataSource (un método de capa), significa A o B:

A. que uno de los argumentos está mal, ya sea en términos de ser el tipo de datos incorrecto o la cadena incorrecta, es decir, una ruta que no existe

Los argumentos para .replaceDataSource() son (ejemplos): 1. Ruta del espacio de trabajo: W:\FOR\RSI\DKL\Local_Data\ForestHealth\2009\Data de tipo 2. Tipo de espacio de trabajo: SHAPEFILE_WORKSPACE of type y 3. Nombre del conjunto de datos: IBM_Treatments_May10_2010 de tipo

B. También podría ser que .replaceDataSource está trabajando en el objeto incorrecto. Este es particularmente el caso al usar .replaceDataSource en un objeto de archivo de capa, en lugar de usar .replaceDataSource en una capa dentro de la lista de capas devueltas por arcpy.mapping.ListLayers(objeto de archivo de capa)

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