ArcGIS arcpy代码工具——批量对MXD文件的页面布局设置修改

本文介绍了如何使用Python的arcpy模块批量修改MXD文件的页面布局,包括设置居中显示、调整比例尺、设定页面尺寸,并导出图片。代码通过选择特定要素来确定布局范围,然后进行缩放和保存修改。适用于GIS领域的批量地图处理工作。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

功能说明:

MXD的页面设置包括尺寸设置,要素布局设置,比例尺设置等,本文以批量处理土地利用现状分幅图为例。
土地利用现状分幅图较为常见,一般成果图为600*600尺寸,图幅框居中显示,四周空白区较为平均。
本代码目标为:

  • 1 缩放页面布局至对应的图幅框范围居中
  • 2 设置页面布局比例尺
  • 3 导出JPG图片
  • 4 保存MXD布局

1 修改前的分幅图状态

分幅图生成一般有几种方式,一种方式是专业建库软件的分幅图输出功能,此类分幅图一般幅面较为标准不需要调整;
一种方式是arcgis插件工具生成分幅图,此类产出的分幅图有个别幅面不居中,或者布局尺寸错误,需要调整一下。
如下图:

不居中

尺寸不对

2 代码分段

(1)设置工作空间,获取MXD文件 。

// 设置工作空间
arcpy.env.workspace = r"D:\临时";
// 获取所有mxd文件的路径
mxd_files = arcpy.ListFiles("*.mxd")

分幅图列表
我的分幅图列表如上图,是以分幅图编号为名称的,方便查找。

(2)循环遍历每个mxd文件 。

// 循环遍历每个mxd文件
for mxd_file in mxd_files:
    mxd_name = mxd_file[:-4];
	print(mxd_name)  # 方便查看进度

(3)打开mxd文档 。

// 打开mxd文档
mxd = arcpy.mapping.MapDocument(os.path.join(arcpy.env.workspace, mxd_file))

打开遍历的当前MXD文档,准备修改页面布局。

(4)设置页面布局,使目标要素居中显示 。

修改页面布局,主要是修改 dataframe 的范围和位置。
在这里插入图片描述arcpy.Extent() 方法用于创建一个表示地理范围的对象,如下代码:

// 修改页面布局
df.extent = arcpy.Extent(41427034, 4605727, 41429662, 4608015)

表示一个矩形范围,该矩形范围的左下角坐标为 (41427034, 4605727),右上角坐标为 (41429662, 4608015)。即页面布局将该坐标围成的区域,居中显示在页面布局中心位置。

本文以分幅图为例子,居中显示的范围应该是图幅号对应的分幅区域,如何实现让页面布局居中显示该分幅区域?
思路如下:

  • 1 生成一个全域覆盖的图幅结合图表,要素设置名称字段以图幅编号命名;
  • 2 通过属性选择,使分幅图对应的分幅结合图要素处于选择状态,即选中该要素
    (本文实际操作是复制粘贴该要素到一个闲置空白图层,复制粘贴过程期间该要素一直为选择状态);
  • 3 使用 .getSelectedExtent() 方法将页面布局,缩放至当前选择的要素范围;
  • 4 清除 要素选择状态。
    在这里插入图片描述
// 复制粘贴指定要素 到 指定图层
	// 选择要素
 	in_layer_name = 'JFB'  # 图幅结合图
    out_data_name = "LSM_" + mxd_name  # 闲置空白图层,粘贴的目标层
    in_layer = arcpy.mapping.ListLayers(mxd, in_layer_name)[0]
    out_data = arcpy.mapping.ListLayers(mxd, out_data_name)[0]

    name = 'MapName =\'' + mxd_name + '\''  # 属性选择要素,字段名称为 [MapName]
    arcpy.SelectLayerByAttribute_management(in_layer, "NEW_SELECTION", name)  # 选择要素
    
    //追加要素 复制所选要素到 LSM 图层
    schemaType = "NO_TEST"  # "TEXT"   检查字段匹配性
    fieldMappings = ""
    subtype = ""
    arcpy.Append_management(in_layer, out_data, schemaType, fieldMappings, subtype)
    
    //获取第一个数据框
    df = arcpy.mapping.ListDataFrames(mxd)[0]

	//缩放至 当前选择要素
	 df.extent = in_layer.getSelectedExtent(True)  # 缩放至当前选择的要素范围
	 arcpy.SelectLayerByAttribute_management(in_layer, "CLEAR_SELECTION")  # 清除 选择
	 arcpy.arcpy.DeleteFeatures_management(out_data)  # 删除清空 LSM层的 过程要素

(5)设置页面布局的比例尺 。

// 设置视图比例尺
df.scale = 5000  # 示例修改比例尺为5000

(6)设置页面布局的位置和尺寸 。

常用的纸张A4纸的尺寸为 210×297mm,常用的绘图仪卷筒纸的尺寸 宽度为 620mm,打印一张分幅图的尺寸为
600×600mm ,两侧保留装订区域。

页面布局的要素称为dataframe,该区域是显示数据要素的区域,范围可以在打印机纸张范围内部,也可以超出打印机纸张范围外(但是超出纸张范围如果有要素,那么打印或导出图片的时候该超出部分将丢失)。
dataframe的定位点为坐下角,此点向上为高度,此地向右为宽度,单位为MXD地图页面大小显示单位,默认为mm毫米。

本文显示区域为分幅图区域,居中显示,外围无数据,故设置左下角定位点坐标为 纸张外。

// 定位点设置
df.elementPositionX, df.elementPositionY = 10.5, -20.5  # 元素左下角位置 X坐标 Y坐标;

在这里插入图片描述
dataframe尺寸设置为 600×600 mm。

// 尺寸设置
df.elementWidth, df.elementHeight = 600, 580  # 元素宽度,高度;

(7)导出图片 。

同步导出图片,方便检查工作。

// 导出图片
arcpy.mapping.ExportToJPEG(mxd, os.path.join(arcpy.env.workspace, mxd_name), resolution=300) #分辨率300;

修改后状态,页面布局居中显示。如下图:
1
请添加图片描述

(8)保存MXD并关闭 。

上述的修改设置,最终需要保存修改,否则MXD的状态还是设置前的状态。

// 保存修改后的mxd文档
mxd.save();
// 释放mxd文档对象
del mxd;

3 完整代码

# coding=utf-8
import time
import arcpy
import os


# 设置工作空间
arcpy.env.workspace = r"D:\临时"

# 获取所有mxd文件的路径
mxd_files = arcpy.ListFiles("*.mxd")

# 循环遍历每个mxd文件
for mxd_file in mxd_files:
    mxd_name = mxd_file[:-4]
    print(mxd_name)  # 方便查看进度

    # 打开mxd文档
    mxd = arcpy.mapping.MapDocument(os.path.join(arcpy.env.workspace, mxd_file))

    # 复制粘贴指定要素 到 指定图层
    # 选择要素
    in_layer_name = 'JFB'  # 图幅结合图
    out_data_name = "LSM_" + mxd_name  # 闲置空白图层,粘贴的目标层
    in_layer = arcpy.mapping.ListLayers(mxd, in_layer_name)[0]
    out_data = arcpy.mapping.ListLayers(mxd, out_data_name)[0]

    name = 'MapName =\'' + mxd_name + '\''
    arcpy.SelectLayerByAttribute_management(in_layer, "NEW_SELECTION", name)  # 选择要素

    # 追加要素 复制所选要素到 LSM 图层
    schemaType = "NO_TEST"  # "TEXT"   检查字段匹配性
    fieldMappings = ""
    subtype = ""
    arcpy.Append_management(in_layer, out_data, schemaType, fieldMappings, subtype)

    # 获取第一个数据框
    df = arcpy.mapping.ListDataFrames(mxd)[0]

    # 缩放至 当前选择要素
    df.extent = in_layer.getSelectedExtent(True)  # 缩放至当前选择的要素范围
    arcpy.SelectLayerByAttribute_management(in_layer, "CLEAR_SELECTION")  # 清除 选择
    arcpy.arcpy.DeleteFeatures_management(out_data)  # 删除清空 LSM层的 过程要素

    df.scale = 5000  # 示例修改比例尺为 1:5000

    df.elementPositionX, df.elementPositionY = 10.5, -20.5  # 元素左下角位置 X坐标 Y坐标

    # 600 纸张的尺寸(按卷筒打印纸 尺寸 600*600)
    df.elementWidth, df.elementHeight = 600, 600  # 元素宽度,高度

    arcpy.mapping.ExportToJPEG(mxd, os.path.join(arcpy.env.workspace, mxd_name), resolution=300)
    print("完成")  # 方便查看进度

    # 保存修改后的mxd文档
    mxd.save()

    # 释放mxd文档对象
    del mxd

    time.sleep(5)  # 暂停 休息几秒钟,释放缓存

4 后记

关于默认打印机和默认纸张设置,我的MXD文档在制作时已经设置过纸张标准大小 :
在这里插入图片描述
我有尝试使用arcpy设置页面纸张,未能成功。我的软件环境为 ArcGIS Desktop 10.8.1,网上搜索结果说 ArcGIS Pro可实现该功能。欢迎各位对以上功能进行完善,大家互相交流学习。syq

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

da-peng-song

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值