Riparare le origini dati in più MXD usando ArcPy?


14

Ho circa 50 mxd con tutti i livelli rotti che ho attraversato e che ho ripristinato manualmente.

I dati sono stati spostati da un altro computer e la struttura delle cartelle è stata modificata, quindi non è solo un semplice processo di modifica (esempio):

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

è più simile a:

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

e così via per tutti i tipi di dati (confini, copertura vegetale, strade, ecc.) ciascuno nella propria sottocartella.

Voglio creare uno script che posso eseguire ripetutamente ogni volta che apro uno di questi mxd che riparerebbe almeno alcuni dei livelli più comuni che si trovano nella maggior parte dei miei mxd e quindi posso riparare manualmente il resto. In questo modo posso almeno risparmiare un po 'di tempo.

Ho usato qualcosa sulla falsariga di:

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'idea sarebbe quindi di aggiungere in qualche modo più script "sostituisci" in precedenza per altri layer comuni che si trovano nei miei mxd.

Tuttavia, lo script sopra non risolve nemmeno il livello Rivers.

Come posso farlo funzionare e anche aggiungere altri livelli da riparare con percorsi di file diversi?

Risposte:


14

Sei sulla strada giusta con la tua sceneggiatura. Sembra che il tuo problema risieda nel modo in cui stai confrontando l' Layeroggetto, con il Nome del Layernel Sommario .

Quando si utilizza la funzione ListLayers , ciò che viene restituito è un Layeroggetto. Non puoi quindi confrontare questo con un text stringper vedere se sono uguali, devi invece accedere al Nome del Layer.

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

Per aggiungere più selettori, è sufficiente espandere la if/thenparte del codice per cercare nomi di layer diversi.

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

Continua semplicemente a modificare il nameselettore per trovare un particolare livello univoco nel tuo .mxde aggiungi una replaceDataSourcefunzione per gestirlo. Si noti che ho usato la lowerfunzione durante il test per il nome. Questo viene anche usato da ESRI nei loro documenti di aiuto, con il ragionamento probabile che rimuove la possibilità di incoerenze nella capitalizzazione, causando una discrepanza nel nome del livello.

Ecco l'articolo della Guida ESRI sull'aggiornamento e la correzione delle origini dati con Arcpy Mapping

I file della Guida di ArcGIS in generale sono molto utili in quanto contengono spiegazioni chiare e molti esempi di codice Python che puoi semplicemente copiare / incollare e modificare per soddisfare le tue esigenze specifiche.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.