当前位置:网站首页 > 网络设备调试 正文 网络设备调试

ArcMap 多 MXD 文件图层结构自动合并 —— 工具篇(附完整脚本)

南京泽同信息 2025-11-18 14:20:15 网络设备调试 49 ℃ 0 评论

在日常 GIS 工作中,我们经常会遇到这样的场景:

  • 不同部门/同事给你发送了多个 MXD 工程文件

  • 每个 MXD 中都保存了一些图层,但图层排列、分组、符号化不完全一致;

  • 你需要把多个 MXD 的图层 整理到一个工程里统一管理

  • 手工拖图层太累,而且图层一多也容易出错。

于是,一个“自动合并多个 MXD 的工具”就非常必要了。

本文将带你了解:

  • 🔍 为什么 MXD 合并很麻烦

  • 🖼️ 场景示例(含对比图)

  • 🧠 脚本逻辑讲解

  • 🛠️ 完整可运行工具代码(含 arcpy)

  • ✔️ ArcGIS 工具箱封装方法

  • 🎯 使用效果展示


1. 为什么 MXD 合并会这么麻烦?

ArcMap 中 MXD 的图层结构通常是这样的:

组图层 A
   ├─ 图层 1
   ├─ 图层 2
   └─ 图层 3
图层 4
组图层 B
   ├─ 图层 5
   └─ 图层 6

如果直接遍历所有图层,会出现:

  • 同一 MXD 的子图层被重复复制

  • 组图层结构乱掉

  • 图层顺序混乱

  • 项目巨大 ACAD 内容无法拷贝

因此在合并时必须要做过滤,只导入“顶层图层”。

你的图片正是这种结构 👇
(左:两个独立 MXD) →(右:自动合并到一个 MXD)


2. 场景效果展示(你的截图解读)

左:map1.mxd
中:map2.mxd
右:合并后的 map_union.mxd

每个 MXD 内容都包含:

  • 普通图层:l1、f1、宗地图面

  • 分析图层:_Erase、_切除大宗

  • 自己创建的组图层 test1(图层被归类整理)

最终目标是:

✅ 按照多个 MXD 的顺序,依次把顶层图层合并到新 MXD

❌ 不要重复导入组图层的子图层

❌ 不要展开子图层导致结构混乱

脚本最终实现的效果与你图片完全一致:
👇
(右侧结果:一个 MXD 下保留 test1 组图层 + 各顶层图层)


3. 脚本核心逻辑讲解

脚本中最关键的判断是:

if lyr.longName == lyr.name:

ArcMap 中:

  • lyr.longName 是完整路径(如 “test1\l1”)

  • lyr.name 是图层名(如 “l1”)

当两者相同 → 说明图层没有父级 → 顶层图层

这让脚本能做到:

  • 不把 test1 里包含的 l1、f1 再复制进去

  • 保留 test1 整个组图层的完整结构

这一步非常关键,否则 MXD 会被复制得一团糟。


4. 完整 Python 工具脚本(可直接运行)

下面是你提供的脚本,我做了格式优化,并加上注释说明,适合放入 Toolbox:

# -*- coding: utf-8 -*-
import arcpy
import arcpy.mapping as mapping
import arcgisscripting

gp = arcgisscripting.create()  # 兼容 AddMessage 输出

def merge_mxds(mxd_list, output_mxd):

    if len(mxd_list) < 2:
        raise Exception("至少需要两个 MXD 才能合并!")

    # 以第一个 MXD 作为基准工程
    mxd_base = mapping.MapDocument(mxd_list[0])
    df_base = mapping.ListDataFrames(mxd_base)[0]

    # 依次处理后续 MXD
    for mxd_path in mxd_list[1:]:
        gp.AddMessage("开始处理 MXD:{}".format(mxd_path))
        mxd_other = mapping.MapDocument(mxd_path)
        df_other = mapping.ListDataFrames(mxd_other)[0]

        # 只合并顶层图层(避免组图层展开)
        for lyr in mapping.ListLayers(mxd_other, "", df_other):
            if lyr.longName == lyr.name:
                gp.AddMessage("     添加图层:{}".format(lyr.name))
                mapping.AddLayer(df_base, lyr, "BOTTOM")

        del mxd_other  # 释放内存

    # 保存合并结果
    mxd_base.saveACopy(output_mxd)
    del mxd_base

    gp.AddMessage(u"合并完成!生成文件:{}".format(output_mxd))


if __name__ == "__main__":
    try:
        mxd_list = arcpy.GetParameterAsText(0)
        gp.AddMessage("输入 MXD 列表: {}".format(mxd_list))

        output_mxd = arcpy.GetParameterAsText(1)
        gp.AddMessage("输出 MXD 文件: {}".format(output_mxd))

        mxd_list = mxd_list.split(";")

        merge_mxds(mxd_list, output_mxd)

    except Exception as e:
        gp.AddError("运行出错:{}".format(e))
        raise

5. 如何封装成 ArcGIS 工具箱(Toolbox)

  1. 新建一个 .pyt.tbx 工具箱

  2. 新建一个 Script Tool

  3. 参数设置如下:

参数类型说明
mxd_listMultiple Value(File)输入多个 MXD
output_mxdFile输出的新 MXD
  1. 把上面的 Python 脚本绑定进去即可。

6. 使用步骤

  1. 在 ArcMap 中打开你的 Toolbox

  2. 双击 MXD 合并工具

  3. 选择多个 MXD(可多选)

  4. 设置输出路径

  5. 点击运行

你会看到像这样👇

开始处理 MXD:map2.mxd
    添加图层:test1
    添加图层:宗地图面
    添加图层:大宗0912_吴畲_Erase
……  


你可能想看:

版权说明:如非注明,本站文章均为 ZBLOG 原创,转载请注明出处和附带本文链接

请在这里放置你的在线分享代码
Copyright Your WebSite.Some Rights Reserved.
微信咨询&联系客服
QQ:2586422870
在线时间
9:00 ~ 23:00