¿Reparación de fuentes de datos en múltiples MXDs utilizando ArcPy?

14

Tengo alrededor de 50 mxd con todas las capas rotas por las que he estado pasando y restableciendo manualmente.

Los datos se movieron de otra computadora y se modificó la estructura de carpetas, por lo que no es solo un simple proceso de cambio (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 todo tipo 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 abra uno de estos mxd que al menos repare algunas de las capas más comunes que se encuentran en la mayoría de mis mxd, y luego puedo reparar manualmente el resto. 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")

Entonces, la idea sería agregar de alguna manera múltiples scripts de "reemplazo" en lo anterior para otras capas comunes que están en mi mxd.

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

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

Chaz
fuente

Respuestas:

14

Estás en el camino correcto con tu guión. Parece que su problema radica en cómo está comparando el Layerobjeto, con el Nombre del Layeren la Tabla de contenido .

Cuando utiliza la función ListLayers , lo que se devuelve es un Layerobjeto. No puede comparar esto con a text stringpara ver si son iguales, necesita acceder al Nombre del en su Layerlugar.

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 if/thenparte 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 nameselector para encontrar cualquier capa única particular en su .mxd, y agregue una replaceDataSourcefunción para manejarlo. Tenga en cuenta que utilicé la lowerfunción al probar el nombre. ESRI también lo utiliza en sus documentos de ayuda, con el razonamiento probable de que elimina la posibilidad de inconsistencias en la capitalización, lo que provoca una falta de coincidencia en el nombre de la capa.

Aquí está el artículo de ayuda de ESRI sobre Actualización y corrección de orígenes de datos con Arcpy Mapping

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

Consigue espacial
fuente