在日常 GIS 工作中,我们经常会遇到这样的场景:
不同部门/同事给你发送了多个 MXD 工程文件;
每个 MXD 中都保存了一些图层,但图层排列、分组、符号化不完全一致;
你需要把多个 MXD 的图层 整理到一个工程里统一管理;
手工拖图层太累,而且图层一多也容易出错。
于是,一个“自动合并多个 MXD 的工具”就非常必要了。
本文将带你了解:
🔍 为什么 MXD 合并很麻烦
🖼️ 场景示例(含对比图)
🧠 脚本逻辑讲解
🛠️ 完整可运行工具代码(含 arcpy)
✔️ ArcGIS 工具箱封装方法
🎯 使用效果展示
ArcMap 中 MXD 的图层结构通常是这样的:
组图层 A
├─ 图层 1
├─ 图层 2
└─ 图层 3
图层 4
组图层 B
├─ 图层 5
└─ 图层 6
如果直接遍历所有图层,会出现:
同一 MXD 的子图层被重复复制
组图层结构乱掉
图层顺序混乱
项目巨大 ACAD 内容无法拷贝
因此在合并时必须要做过滤,只导入“顶层图层”。
你的图片正是这种结构 👇
(左:两个独立 MXD) →(右:自动合并到一个 MXD)
左:map1.mxd
中:map2.mxd
右:合并后的 map_union.mxd
每个 MXD 内容都包含:
普通图层:l1、f1、宗地图面
分析图层:_Erase、_切除大宗
自己创建的组图层 test1(图层被归类整理)
最终目标是:
脚本最终实现的效果与你图片完全一致:
👇
(右侧结果:一个 MXD 下保留 test1 组图层 + 各顶层图层)
脚本中最关键的判断是:
if lyr.longName == lyr.name:
ArcMap 中:
lyr.longName 是完整路径(如 “test1\l1”)
lyr.name 是图层名(如 “l1”)
当两者相同 → 说明图层没有父级 → 顶层图层
这让脚本能做到:
不把 test1 里包含的 l1、f1 再复制进去
保留 test1 整个组图层的完整结构
这一步非常关键,否则 MXD 会被复制得一团糟。
下面是你提供的脚本,我做了格式优化,并加上注释说明,适合放入 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
新建一个 .pyt 或 .tbx 工具箱
新建一个 Script Tool
参数设置如下:
| 参数 | 类型 | 说明 |
|---|---|---|
| mxd_list | Multiple Value(File) | 输入多个 MXD |
| output_mxd | File | 输出的新 MXD |
在 ArcMap 中打开你的 Toolbox
双击 MXD 合并工具
选择多个 MXD(可多选)
设置输出路径
点击运行
你会看到像这样👇
开始处理 MXD:map2.mxd
添加图层:test1
添加图层:宗地图面
添加图层:大宗0912_吴畲_Erase
……

