Error de reemplazo de datos de Arcpy

8

He comprobado las otras respuestas aquí y ninguna de las respuestas me funcionó ...

Es una cuestión "simple" de encontrar una capa por nombre en un mapa y cambiar su fuente de datos.

Aquí está mi guión:

    #-- New Source
    newSource = os.path.join(currDir, lyrZones + "_Dep" + dirNum + ".shp")

    #-- Validation
    if arcpy.Exists(newSource):
        print "The new source exists!"
    else:
        print "Not found!"

    #-- Find the layer and change its source            
    for lyr in arcpy.mapping.ListLayers(mxd):
        if lyr.name == lyrZones:
            print "Layer found!"
            print layers.dataSource
            print "  Replacing source..."
            lyr.replaceDataSource(currDir, "SHAPEFILE_WORKSPACE", newSource)
            print lyr.dataSource

Lo ejecuto desde un script de Python fuera de ArcGIS.

ingrese la descripción de la imagen aquí

Puede ver que la fuente existe, la capa se encuentra, puedo acceder a su fuente de datos imprimiéndola, pero lyr.replaceDataSource produce un error (error inesperado ... no ayuda mucho ...)

He estado trabajando en ello durante 4-5 horas y me faltan soluciones para probar. ¿Alguna idea de lo que puede causar el accidente?

fgcartographix
fuente
1
A primera vista, parece que tienes algunos caracteres extraños en la ruta de tu directorio. Intente mover el archivo de forma a un directorio de prueba como D:\testy vea si eso funciona.
Mintx
Nunca tuve ningún problema con eso antes. El personaje es "#" y es solo un viejo truco de clasificación, por lo que mis proyectos aparecerán primero. Intenté poner mi proyecto en D: / TEMP, pero no funcionó ...
fgcartographix

Respuestas:

4

Sé que esto es bastante antiguo, pero acabo de encontrar este mismo problema y me sorprendió la falta de soluciones. La solución es muy simple, pero no tendría forma de conocerla en base a la ayuda prácticamente inexistente de ESRI:

No incluya la extensión del archivo de forma. ...Eso es.

newSource = os.path.join(currDir, lyrZones + "_Dep" + dirNum + ".shp")

Tiene que leer:

newSource = os.path.join(currDir, '{}_Dep{}'.format(lyrZones, dirNum))
Tom
fuente
1
La pregunta y la respuesta se refieren a los archivos de forma. Sin embargo, encontré un problema similar con una clase de entidad en una Geodatabase Enterprise (también conocida como SDE). Resulta que arcpy.Exists requiere un nombre completo. Sin embargo, layer.replaceDataSource falla si usa un nombre completo, pero funciona si solo usa el nombre de la característica y omite la base de datos y el nombre del propietario.
dvdhns
1

Diversión con depuración! Prueba esto:

for lyr in arcpy.mapping.ListLayers(mxd):
    if lyr.name == lyrZones:
        if lyr.supports("DATASOURCE"):
            print lyr.dataSource
            print currDir
            print newSource
            lyr.replaceDataSource(currDir, "SHAPEFILE_WORKSPACE", newSource, TRUE)
            print "Did we crash yet?"
            print lyr.dataSource
        else:
            print "Layer isn't supported!"
Menta
fuente
Al menos sé que Datasource es compatible. Recibí el mismo mensaje de error. Se bloqueó en "lyr.replaceDataSource (currDir," SHAPEFILE_WORKSPACE ", newSource, True)". No llegué a "¿Nos estrellamos todavía?". Frustrante ...
fgcartographix
Argh, eso apesta. ¿Cuál es el objetivo final que estás tratando de lograr? Tal vez hay otra forma de hacerlo.
Mintx
Tengo 5 plantillas y entre 14 y 50 mapas de cada una (128 mapas en total). Tengo dos capas para actualizar en cada una. El primero es solo un Def. Consulta que manejé como un jefe;) (lyr.definitionQuery = defQueryLines). La otra es una capa de polígono que tiene una simbología de color graduada, pero el archivo tiene que cambiar. Escribí un script que crea una salida para cada mapa y necesito actualizar la fuente y cambiar el valor de simbología (pero creo que es 10.1 que hace eso. Tengo 10.0) para poder mantener la simbología ...
fgcartographix
Por ahora, puedo actualizar el archivo manualmente (el primer lote tiene 20 mapas por lo que no es tan tedioso), pero el siguiente tendrá 50 mapas así que ...
fgcartographix
¿La herramienta tiene que funcionar con un archivo .lyr? Tal vez podría trabajar directamente en un .lyr donde podría cambiar la fuente de datos. No veo ninguna propiedad para cambiar la simbología valye (aunque el campo simbolizado ...)
fgcartographix
1

No sé si esto te ayuda o no, pero he encontrado este error al intentar cambiar las fuentes de datos SDE para una capa. Lo que encontré es que cuando ejecuté desde PyScripter, se puso en cola un proceso python.exe de 64 bits. Obtendría el ValueError. Si forzara la secuencia de comandos para que se ejecute usando el python.exe de 32 bits a través del símbolo del sistema, no obtendría el error. No sé si eso ayudaría a su problema o no, pero vale la pena intentarlo.

Bryan
fuente
Gracias. Todo es de 32 bits, por lo que no puede ser el problema, pero lo tendré en cuenta cuando intente el geoprocesamiento de 64 bits. Por ahora, dejé esa parte de mi guión y reemplacé la fuente a mano ... :(
fgcartographix
1

La mayoría de la información sobre esto está aquí . Pero para resolver esto, entré en la ventana de Python dentro de ArcCatalog para verificar las definiciones de ESRI de cada parámetro en la función .replaceDataSource.

.replaceDataSource (workspace, workspace_type, dataset_name)

espacio de trabajo = espacio de trabajo de nueva fuente de datos

workspace_type = el tipo de espacio de trabajo real que figura en la sección de reemplazo del origen de datos de la ayuda vinculada.

dataset_name = nombre del archivo sin el tipo de archivo (IE: .shp), no el nombre del conjunto de datos en la tabla de contenido. Tampoco es necesario el directorio frente a él.

littlenerrie86
fuente