使用ArcPy修复多个MXD中的数据源?


14

我有大约50 mxd,其中包含我正在经历的所有破碎层并手动重置。

数据是从另一台计算机上移动的,并且文件夹结构已更改,因此它不仅仅是更改的简单过程(示例):

从“ F:\ Data \ Rivers.shp”到“ C:\ Data \ Rivers.shp”

它更像是:

将“ F:\ Data \ Rivers.shp”更改为C:\ Data \ Park \ Water \ Rivers.shp

等等,每个数据都在各自的子文件夹中(边界,蔬菜覆盖,道路等)。

我想制作一个脚本,每当我打开这些mxd之一时就可以重复运行,该脚本至少可以修复大多数我的mxd中发现的一些较常见的层,然后我可以手动修复其余的层。这样,我至少可以节省一些时间。

我一直在使用一些类似的东西:

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

然后的想法是要在上面为我的mxd中的其他常见层添加多个“替换”脚本。

但是,以上脚本甚至无法修复Rivers图层。

如何使它工作,并添加其他具有不同文件路径的要修复的层?

Answers:


14

您使用脚本的方向正确。看来您的问题出在如何将Layer对象与“目录 ” 中的名称进行比较。Layer

当您使用ListLayers函数时,返回的是一个Layer对象。你不能再比较这一个text string,看看他们是平等的,你需要访问该名称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")

要添加更多选择器,您只需扩展if/then代码部分以查找不同的图层名称。

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

只需继续修改name选择器以在中找到任何特定的唯一层.mxd,然后添加一个replaceDataSource函数即可对其进行处理。请注意,我lower在测试名称时使用了该函数。ESRI在其帮助文档中也使用了此功能,其原因可能是它消除了大小写不一致的可能性,从而导致图层名称不匹配。

这是ESRI帮助文章,内容涉及通过Arcpy映射更新和修复数据源

通常,ArcGIS帮助文件非常有用,因为它们包含清晰的解释以及许多 Python代码示例,您可以简单地复制/粘贴和修改它们以适合您的特定需求。

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.