¿Reparando las fuentes de datos en múltiples MXD usando ArcPy?

14

Tengo unos 50 mxd con todas las capas rotas por las que he estado pasando y reiniciando manualmente.

Los datos se movieron de otra computadora y se cambió la estructura de la carpeta, por lo que no es solo un proceso simple de cambiar (ejemplo):

"F: \ Data \ Rivers.shp" a "C: \ Data \ Rivers.shp"

es más como:

"F: \ Data \ Rivers.shp" a C: \ Data \ Park \ Water \ Rivers.shp

y así sucesivamente para todos los tipos de datos (límites, cobertura vegetal, carreteras, etc.) cada uno en su propia subcarpeta.

Quiero crear un script que pueda ejecutar repetidamente cada vez que abro uno de estos mxd que al menos repararía algunas de las capas más comunes que se encuentran en la mayoría de mis mxd, y luego puedo reparar el resto manualmente. De esa manera al menos puedo ahorrarme algo de tiempo .

He estado usando algo en la línea de:

import arcpy
mxd = arcpy.mapping.MapDocument("CURRENT")

for lyr in arcpy.mapping.ListLayers(mxd):
    if lyr == "Rivers": #Should this be the layner name in TOC or FC name?
        lyr.replaceDataSource(r"C:\Data\Park\Water", "SHAPEFILE_WORKSPACE", "Rivers")

La idea entonces sería agregar de alguna manera varios scripts de "reemplazo" en las anteriores para otras capas comunes que están en mi mxd.

Sin embargo, el script anterior ni siquiera corrige la capa Rivers.

¿Cómo puedo hacer que funcione, y también agregar otras capas para reparar que tengan diferentes rutas de archivo?

    
pregunta Chaz 06.09.2012 - 16:40

1 respuesta

14

Estás en el camino correcto con tu script. Parece que su problema radica en cómo está comparando el objeto Layer con el Nombre del Layer en la Tabla de contenido .

Cuando utiliza la función ListLayers , lo que se devuelve es un objeto Layer . No puedes comparar esto con un text string para ver si son iguales, debes acceder al Nombre del Layer en su lugar.

import arcpy
mxd = arcpy.mapping.MapDocument("CURRENT")

for lyr in arcpy.mapping.ListLayers(mxd):
    if lyr.name.lower() == "rivers": #This should be the Layer name in the TOC?
        lyr.replaceDataSource(r"C:\Data\Park\Water", "SHAPEFILE_WORKSPACE", "Rivers")

Para agregar más selectores, simplemente expande la parte if/then del código para buscar diferentes nombres de capa.

for lyr in arcpy.mapping.ListLayers(mxd):
    if lyr.name.lower() == "rivers": #This should be the Layer name in the TOC?
        lyr.replaceDataSource(r"C:\Data\Park\Water", "SHAPEFILE_WORKSPACE", "Rivers")
    elif lyr.name.lower() == "streets":
        lyr.replaceDataSource(r"C:\Data\Facilities\Streets", "SHAPEFILE WORKSPACE", "Streets")

Simplemente continúe modificando el selector name para encontrar cualquier capa única en particular en su .mxd , y agregue una función replaceDataSource para manejarlo. Tenga en cuenta que usé la función lower al probar el nombre. ESRI también lo utiliza en sus documentos de ayuda, con el razonamiento probable de que elimina la posibilidad de incoherencias en el uso de mayúsculas, lo que provoca una falta de coincidencia en el nombre de la capa.

Aquí está el artículo de ayuda de ESRI en Actualizando y arreglando los datos. Mapeo Arcpy

Los archivos de Ayuda para ArcGIS en general son muy útiles ya que contienen explicaciones claras, y un lote de ejemplos de código de Python que puede simplemente copiar / pegar y modificar para satisfacer sus necesidades específicas.

    
respondido por el Get Spatial 06.09.2012 - 17:53

Lea otras preguntas en las etiquetas