如何搜寻目录树并将Mxd relativePaths更改为true?


9

我有大量的项目文件夹,其中每个项目文件夹可以具有许多子文件夹。这些子文件夹可以包含mxds,shapefile,个人gdb和fgdb。在许多情况下,用户忘记保存mxds之前会选中“使用相对路径”,因此,当复制文件夹时,数据源链接会断开。

我想编写一个独立的arcpy脚本,该脚本在目录中进行爬网,打开每个mxd,将relativePaths设置为true,然后保存mxd。是否有某个脚本可以在某处执行此操作?

MapDocument对象上的relativePaths属性是只读的。还有其他方法可以改变这一点吗?


我不确定是否可以使用该工作流程。但是我认为可行的方法是,自动打开每个.mxd,将所有数据源和信息从原始.mxd复制到具有相对路径的新空白.mxd中,然后重新保存新的。如果您的第一种方法最终无法解决,则只是一个解决方法。
Mowry

我认为这是不可能的。但是,您可以获得使用绝对路径及其作者的所有文档的列表,并通过严厉的电子邮件将其垃圾邮件。
肖恩

Answers:


6

使用以下python脚本可以做到这一点(感谢ESRI论坛的 Neil Clemmons的帮助)。您将需要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


2

在10.0中是不可能的,但是我已经在Python中使用ArcObjects成功完成了相对简单的任务,例如编写.NET应用程序会显得过大,但是在arcpy / arcgisscripting模块中并未公开必需的功能。使用os.walk爬行目录树部分。

对于ArcObjects位,用于IMapDocument.Open()打开MXD(不必在ArcMap中将其打开),强制转换为true IMxDocument并设置RelativePaths为true,然后使用IMapDocument.Save()保存它。


您是否已验证这确实解决了相对路径?
詹森·谢里尔

我自己没有尝试过,不,但是此线程表明它应该可以工作:forums.esri.com/Thread.asp?
c=93&f=1154&t=260812

另外,我确定Kirk已经知道如何执行此操作:forums.esri.com/Thread.asp?
c=93&f=992&t=64946

@ blah238这是VBA,我需要一个独立的arcpy脚本。
Kirk Kuykendall

1
问题是使用arcpy而不是.NET进行的,并且据我所知,arcpy在10.0下是不可能的(请参阅答案中的第一个链接)。
blah238 2012年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.