Come posso eseguire la scansione dell'albero delle directory e cambiare Mxd relativePaths su true?


9

Ho un gran numero di cartelle di progetto in cui ogni cartella di progetto può avere molte sottocartelle. Queste sottocartelle possono contenere mxds, shapefile, gdb e fgdb personali. In molti casi l'utente ha dimenticato di controllare "Usa percorsi relativi" prima di salvare i mxds, quindi quando la cartella viene copiata, i collegamenti all'origine dati vengono interrotti.

Vorrei scrivere uno script arcpy autonomo che striscia attraverso le directory, apre ogni mxd, imposta il relativePaths su true, quindi salva il mxd. C'è una sceneggiatura che lo fa da qualche parte?

La proprietà relativePaths sull'oggetto MapDocument è di sola lettura. C'è un altro modo per cambiarlo?


Non sono sicuro di ciò sia possibile o non utilizzare quel flusso di lavoro. Ma ciò che penso potrebbe funzionare è se si apre automaticamente ogni .mxd, si copiano tutte le fonti di dati e le informazioni da quel .mxd originale in un nuovo .mxd vuoto che ha i relativi percorsi controllati, e quindi si salva di nuovo quello nuovo. Solo un'idea come soluzione se il tuo primo modo non è possibile.
MLowry

Non penso sia possibile. Tuttavia, potresti ottenere un elenco di tutti i documenti utilizzando percorsi assoluti e i loro autori e SPAM con un'e-mail severa.
Sean,

Risposte:


6

Questo è possibile usando il seguente script python (grazie a Neil Clemmons nel forum ESRI ). Avrai bisogno della libreria di comtypes e del modulo Snippets di Pierssen Consulting.

from Snippets import GetLibPath, InitStandalone
from comtypes.client import GetModule, CreateObject
import os

m = GetModule(GetLibPath() + 'esriCarto.olb')
InitStandalone()
file_dir = r'C:\dir'
for filename in os.listdir(file_dir):
   fullpath = os.path.join(file_dir, filename)
   p = CreateObject(m.MapDocument, interface=m.MapDocument)
   p.Open(fullpath)
   newpath = os.path.join(file_dir,'Changed_' + filename)
   p.SaveAs(newpath,True,False)
   del p

Vedi anche il thread canonico locale per l'utilizzo del modulo Snippets di Pierssen in Come posso accedere ad ArcObjects da Python?
Matt Wilson

2

Non è possibile in 10.0 , ma ho avuto qualche successo con ArcObjects in Python per attività relativamente semplici come questa in cui scrivere un'applicazione .NET sarebbe eccessivo, ma la funzionalità necessaria non è stata esposta nei moduli arcpy / arcgisscripting. Utilizzare os.walk per la ricerca per indicizzazione della parte dell'albero della directory.

Per il bit ArcObjects, utilizzare IMapDocument.Open()per aprire MXD (senza doverlo aprire in ArcMap), eseguire il cast IMxDocumente impostare RelativePathssu true e utilizzare IMapDocument.Save()per salvarlo.


Hai verificato che questo risolve effettivamente i percorsi relativi?
Jason Scheirer,

Non l'ho provato da solo, no, ma questo thread suggerisce che dovrebbe funzionare: forums.esri.com/Thread.asp?c=93&f=1154&t=260812
blah238

Inoltre sono sicuro che Kirk sappia già come fare: forums.esri.com/Thread.asp?c=93&f=992&t=64946 :)
blah238

@ blah238 Questo è VBA, ciò di cui ho bisogno è uno script arcpy autonomo.
Kirk Kuykendall,

1
La domanda era in riferimento a farlo con arcpy, non .NET, e come ho capito non è possibile fare con arcpy alla 10.0 (vedi il primo link nella mia risposta).
blah238,
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.