¿Cómo puedo rastrear el árbol de directorios y cambiar Mxd relativePaths a verdadero?

9

Tengo una gran cantidad de carpetas de proyectos donde cada carpeta de proyecto puede tener muchas subcarpetas. Estas subcarpetas pueden contener mxds, shapefiles, gdb's y fgdb's personales. En muchos casos, el usuario se olvidó de verificar "Usar rutas relativas" antes de guardar los mxds, por lo que cuando se copia la carpeta, los enlaces de origen de datos se rompen.

Me gustaría escribir una secuencia de comandos arcpy independiente que rastree los directorios, abra cada mxd, establezca las rutas relativas en verdadero y luego guarde el mxd. ¿Hay algún script que haga esto en alguna parte?

La propiedad relativePaths en el objeto MapDocument es de solo lectura. ¿Hay alguna otra forma de cambiar esto?

Kirk Kuykendall
fuente
No estoy seguro de si esto es posible o no usar ese flujo de trabajo. Pero lo que sí creo que podría funcionar es si abre automáticamente cada .mxd, copia todas las fuentes de datos e información de ese .mxd original en un nuevo .mxd en blanco que tiene las rutas relativas marcadas, y luego vuelve a guardar el nuevo. Solo una idea como solución alternativa si su primer camino termina siendo imposible.
MLowry
No creo que sea posible. Sin embargo, puede obtener una lista de todos los documentos utilizando rutas absolutas y sus autores y enviarles SPAM con un correo electrónico severo.
Sean

Respuestas:

6

Esto es posible utilizando el siguiente script de Python (gracias a Neil Clemmons en el foro de ESRI ). Necesitará la biblioteca de tipos y el módulo Snippets de 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
Stev_k
fuente
Consulte también el hilo canónico local para usar el módulo Fragmentos de Pierssen en ¿Cómo accedo a ArcObjects desde Python?
Matt Wilkie
2

No es posible en 10.0 , pero he tenido cierto éxito al usar ArcObjects en Python para tareas relativamente simples como esta en las que escribir una aplicación .NET sería excesivo, pero la funcionalidad necesaria no se expuso en los módulos arcpy / arcgisscripting. Use os.walk para rastrear la parte del árbol de directorios.

Para el bit ArcObjects, úselo IMapDocument.Open()para abrir el MXD (sin tener que abrirlo en ArcMap), convertirlo IMxDocumenty establecerlo RelativePathsen verdadero, y úselo IMapDocument.Save()para guardarlo.

blah238
fuente
¿Has verificado que esto realmente corrige los caminos a relativo?
Jason Scheirer
No lo he probado, no, pero este hilo sugiere que debería funcionar: foros.esri.com/Thread.asp?c=93&f=1154&t=260812
blah238
También estoy seguro de que Kirk ya sabe cómo hacer esto: forum.esri.com/Thread.asp?c=93&f=992&t=64946 :)
blah238
@ blah238 Eso es VBA, lo que necesito es un script arcpy independiente.
Kirk Kuykendall el
1
La pregunta se refería a hacer esto con arcpy, no con .NET, y según tengo entendido, no es posible hacerlo con arcpy en 10.0 (vea el primer enlace en mi respuesta).
blah238