Réparer des sources de données dans plusieurs MXD à l'aide d'ArcPy?

14

J'ai environ 50 mxd avec toutes les couches cassées que j'ai parcourues et réinitialisées manuellement.

Les données ont été déplacées d'un autre ordinateur et la structure des dossiers a été modifiée de sorte qu'il ne s'agit pas simplement d'un simple processus de modification (exemple):

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

c'est plus comme:

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

et ainsi de suite pour toutes sortes de données (limites, couverture végétale, routes, etc.) chacune dans son propre sous-dossier.

Je veux créer un script que je peux exécuter à plusieurs reprises chaque fois que j'ouvre l'un de ces mxd qui réparerait au moins certaines des couches les plus courantes que l'on trouve dans la plupart de mes mxd, puis je peux réparer manuellement le reste. De cette façon, je peux au moins me faire gagner du temps.

J'utilise quelque chose comme:

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")

L'idée serait alors d'ajouter en quelque sorte plusieurs scripts de «remplacement» dans ce qui précède pour d'autres couches communes qui sont dans mes mxd.

Cependant, le script ci-dessus ne corrige même pas la couche Rivers.

Comment puis-je le faire fonctionner et ajouter d'autres couches à réparer qui ont des chemins de fichiers différents?

Chaz
la source

Réponses:

14

Vous êtes sur la bonne voie avec votre script. Il semble que votre problème réside dans la façon dont vous comparez l' Layerobjet, au nom du Layerdans la table des matières .

Lorsque vous utilisez la fonction ListLayers , ce qui est renvoyé est un Layerobjet. Vous ne pouvez pas ensuite comparer cela à un text stringpour voir s'ils sont égaux, vous devez accéder au nom de la à la Layerplace.

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")

Pour ajouter plus de sélecteurs, vous développez simplement la if/thenpartie du code pour rechercher différents noms de calque.

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")

Continuez simplement à modifier le namesélecteur pour trouver une couche unique particulière dans votre .mxd, et ajoutez une replaceDataSourcefonction pour la gérer. Veuillez noter que j'ai utilisé la lowerfonction lors du test du nom. Ceci est également utilisé par ESRI dans leurs documents d'aide, le raisonnement étant probablement qu'il supprime le risque d'incohérences dans la capitalisation, provoquant une incohérence dans le nom de la couche.

Voici l'article d'aide d'ESRI sur la mise à jour et la correction des sources de données avec Arcpy Mapping

Les fichiers d'aide d'ArcGIS en général sont très utiles car ils contiennent des explications claires et de nombreux exemples de code Python que vous pouvez simplement copier / coller et modifier pour répondre à vos besoins spécifiques.

Obtenez spatial
la source