ArcGIS arcpy代码工具——数据驱动工具批量导出MXD文档并同步导出图片

功能说明:

使用arcgis制图,有时候需要对某个图层中的所有要素进行制图,布局样式基本不变,这时候使用 数据驱动页面 工具配合arcpy代码就能非常方便的实现了。
本文以XZQ图层为数据层,制作每个村的MXD文档,并输出村的示意图。
本代码目标为:

  • 1 根据XZQ图层中的字段,如村名字段”XZQMC“,逐个保存MXD文档。
  • 2 同步输出村示意图。

1 准备工作

打开ArcMap,加载XZQ等数据层,设置页面布局,添加要素如指北针、比例尺等。

设置数据驱动页面

数据图层选择XZQ,名称字段选择”XZQMC"(此处的字段代码中会引用,作为MXD的名称字段),排序字段一般选择“BSM”。 注意: 行政区名称不能有重复值,即名称字段不能重复,否则在保存MXD文档时会报错。根据需要也可以选择“BSM”、“TBBH”等作为名称。

请添加图片描述

页面范围设置

1 地图范围是数据驱动显示的要素与图框的距离,默认最佳大小值是125%,要素与图框间距适中,如果设置100%即为要素最外边界与图框相交,此时页面布局被数据驱动要素填满,页面不美观。该比例可以尝试修改,最终显示效果还受到 “页面显示比例尺” 制约;
2 页面显示比例尺,比例尺四舍五入到10 、100、1000等整数值,会自动调整要素的显示大小。
3 居中显示并保存当前比例,此选项要素显示适中,但比例尺较为凌乱,不宜在图面上再添加比例尺要素。、
4 数据驱动比例,可以在要素属性表中设置一个比例尺字段,针对每个要素设置一个最佳比例尺,在此处调用,则数据驱动比例尺按设
定比例尺显示,一般用在特别精准的制图。

驱动2

保存MXD文档

保存设置好的MXD文档,因为我的软件环境是ArcGIS10.8,python2.7版本,对中文支持较差,所以最后为全英文目录。

2 代码分段

(1)设定基础数据

//设定基础
mxdfile = r"d:/test.mxd"  # 设置完毕数据驱动操作后,MXD文档位置
fc = r"d:/test.mdb/XZQ"  # 数据驱动页面的 图层名称。此处只是交代 驱动图层的名称,语句不参与运行。
path = r'd:/mulu'  # 修改自己想要存放的目录
mxd = arcpy.mapping.MapDocument(mxdfile) # 打开 mxd文档

我是使用Pycharm来运行代码的,如果想要将代码复制粘贴到ArcGIS的python窗口中运行,最后一行代码可以修改为:

//在ArcGIS中运行代码
mxd = arcpy.mapping.MapDocument("CURRENT") # 即 在mxd文档打开状态下,调用当前活动MapDocument

(2)调用数据驱动

假设XZQ图层有100个要素,数据驱动页面的页面,是从1开始顺序排序到100。
而python的循环范围range(*a,b)是从 a 开始至 “b-1” 结束,即数量比(a,b)区间少一个,即99个;
如果没有 a ,直接 range 100 ,则默认从0开始,至 99结束,但是数据驱动页面起始页1,没有起始页0;
所以 range范围为(1,数据驱动页数 +1),即range(1,101),从1开始至100,刚好100页。

//调用数据驱动
for pageNum in range(1, mxd.dataDrivenPages.pageCount + 1):
    mxd.dataDrivenPages.currentPageID = pageNum
    fieldname = u"xzqmc"  # 修改自己想要的字段,双引号内为字段名称*必填*
    # fieldname = u"BSM"  # 修改自己想要的字段,双引号内为字段名称*必填*
    a = mxd.dataDrivenPages.pageRow.getValue(fieldname) # 名称字段,调用 XZQ层的“xzqmc”字段数据

(3)循环保存MXD文档和导出图片

调用mxd.saveACopy()和arcpy.mapping.ExportToJPEG()保存文档和图片到 (1)设定基础数据 设置的目录中,
文档名称调用 (2)调用数据驱动 设置的名称字段 a
如果 该目录不存在,可以判断并新建该目录。代码如下:

//循环保存MXD文档和导出图片
    if os.path.exists(path):
        outpic = os.path.join(path, str(a))
        print(outpic)
        arcpy.mapping.ExportToJPEG(mxd, outpic, resolution=300)  # 按照字段名称出图
        mxd.saveACopy(outpic + ".mxd")  # 按照字段名称 保存mxd
    else:
        print("当前目录下不存在该文件夹,调用 makedirs 创建该文件夹")
        os.makedirs(path)
        outpic = os.path.join(path, str(a))
        print(outpic)
        arcpy.mapping.ExportToJPEG(mxd, outpic, resolution=300)
        mxd.saveACopy(outpic + ".mxd")

(4)关闭MXD文档

循环完毕后,关闭MXD文档,清除缓存。

//关闭文档
del mxd

(5)结果展示

XZQ图层中按照每个村的要素保存了一个MXD文档,并同步导出了该村图片。效果如下:
请添加图片描述
请添加图片描述

3 完整代码

# -*- coding: utf-8 -*-
import sys
import arcpy
import os

reload(sys)
sys.setdefaultencoding('utf-8')

mxdfile = r"d:/test.mxd"  # 设置完毕数据驱动操作后,MXD文档位置
fc = r"d:/test.mdb/XZQ"  # 数据驱动页面的 图层名称。此处只是交代 驱动图层的名称,语句不参与运行。
path = r'd:/mulu'  # 修改自己想要存放的目录
mxd = arcpy.mapping.MapDocument(mxdfile)

for pageNum in range(1, mxd.dataDrivenPages.pageCount + 1):
    mxd.dataDrivenPages.currentPageID = pageNum
    fieldname = u"xzqmc"  # 修改自己想要的字段,双引号内为字段名称*必填*
    # fieldname = u"BSM"  # 修改自己想要的字段,双引号内为字段名称*必填*
    a = mxd.dataDrivenPages.pageRow.getValue(fieldname)
    if os.path.exists(path):
        outpic = os.path.join(path, str(a))
        print(outpic)
        arcpy.mapping.ExportToJPEG(mxd, outpic, resolution=300)  # 按 照字段名称出图
        mxd.saveACopy(outpic + ".mxd")  # 按照字段名称 保存mxd
    else:
        print("当前目录下不存在该文件夹,调用 makedirs 创建该文件夹")
        os.makedirs(path)
        outpic = os.path.join(path, str(a))
        print(outpic)
        arcpy.mapping.ExportToJPEG(mxd, outpic, resolution=300)
        mxd.saveACopy(outpic + ".mxd")

del mxd

4 封装为函数

上面的代码还可以精简优化,可以将代码封装为函数,在函数外设置参数后运行即可,方便使用。
优化后的代码如下:

# coding: utf-8
import sys
import arcpy
import os

reload(sys)
sys.setdefaultencoding('utf-8')


def export_pages(mxdfile, path, fieldname):
    mxd = arcpy.mapping.MapDocument(mxdfile)
    try:
        # 确保目标目录存在
        if not os.path.exists(path):
            os.makedirs(path)

        for pageNum in range(1, mxd.dataDrivenPages.pageCount + 1):
            mxd.dataDrivenPages.currentPageID = pageNum
            # 使用指定字段获取值
            a = mxd.dataDrivenPages.pageRow.getValue(fieldname)
            # 构建输出图片路径
            outpic = os.path.join(path, str(a))
            print(outpic)
            # 导出为JPEG
            arcpy.mapping.ExportToJPEG(mxd, outpic, resolution=300)
            # 保存为MXD副本
            mxd.saveACopy(outpic + ".mxd")
    except Exception as e:
        print("Error encountered: {}".format(e))
    finally:
        # 清理MapDocument对象
        del mxd


# 调用函数,传入相应参数
mxdfiles = r"d:/test.mxd"
fc = r"d:/test.mdb/XZQ"  # 数据驱动页面的 图层名称。此处只是交代 驱动图层的名称,语句不参与运
fieldnames = u"xzqmc"    # 直接在这里指定 数据驱动设置 的 “名称字段” 字段名
savepath = r'd:/mulu'    # 保存目录
export_pages(mxdfiles, savepath, fieldnames)

5 后记

以上代码演示了数据驱动工具配合arcpy代码快速批量出图,单个MXD文档方便后期单独维护,注意将调用的 数据库 (.mdb 或者 .gdb)一并保存,否则数据驱动将丢失链接。syq

  • 9
    点赞
  • 52
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 10
    评论
ArcGIS批量导出MXD文件可以通过使用ArcPy模块来实现。ArcPyArcGIS的Python站点软件包,它提供了一组工具和函数,可以用于自动化地执行各种GIS任务。 要批量导出MXD文件,首先需要创建一个Python脚本。在该脚本中,我们可以使用ListFiles函数来获取指定文件夹中的所有MXD文件的路径。然后,我们可以使用Mapping模块中的ExportToPDF函数将每个MXD文件导出为PDF文件。 以下是一个示例脚本: import arcpy import os # 设置工作环境 arcpy.env.workspace = r"C:\path\to\folder\containing\mxd\files" # 获取所有MXD文件的路径 mxd_files = arcpy.ListFiles("*.mxd") # 循环处理每个MXD文件 for mxd_file in mxd_files: # 创建MXD文档对象 mxd = arcpy.mapping.MapDocument(os.path.join(arcpy.env.workspace, mxd_file)) # 导出为PDF文件 output_pdf = os.path.join(r"C:\path\to\output\folder", os.path.splitext(mxd_file)[0] + ".pdf") arcpy.mapping.ExportToPDF(mxd, output_pdf) # 释放MXD对象 del mxd 脚本中的环境变量arcpy.env.workspace指定了包含MXD文件的文件夹的路径。此后,通过调用arcpy.ListFiles函数并指定通配符“*.mxd”,我们可以获取文件夹中的所有MXD文件的路径。 然后,通过使用arcpy.mapping.MapDocument函数,我们可以创建MXD文档对象。在处理完MXD文件后,我们使用arcpy.mapping.ExportToPDF函数将MXD导出为PDF文件。将输出PDF的路径指定为目标文件夹中的与MXD文件相同的文件名。 最后,通过删除MXD对象(del mxd),我们可以释放内存并确保脚本能够继续处理下一个MXD文件。 通过运行此脚本,您可以批量导出MXD文件为PDF文件并保存在指定的输出文件夹中。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 10
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

da-peng-song

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

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

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

打赏作者

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

抵扣说明:

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

余额充值