起因
最近项目需要打印大量图纸,手动导出效率低下,网上大量教程都是使用易智瑞默认输出方式,官方原代码地址与样式如下
mxd = arcpy.mapping.MapDocument("CURRENT")
for pageNum in range(1, mxd.dataDrivenPages.pageCount + 1):
mxd.dataDrivenPages.currentPageID = pageNum
arcpy.mapping.ExportToPNG(mxd, r"C:\Temp\ParcelAtlas_Page" + str(pageNum) + ".png")
del mxd
调试
实际使用中,发现上述代码在一定情况下输出成果会没有正确识别到数据驱动索引,导致输出图纸都是一张,为了调试,在代码中增加输出log记录参数,跟同事多方搜索确认,重新调整后,确定缺少参数,调试log记录如下:
2023-10-24 00:07:13,855 INFO: JCFW
2023-10-24 00:07:13,857 INFO: 整景.tif
2023-10-24 00:07:13,858 INFO: i.FID = 0
2023-10-24 00:07:13,858 INFO: pageNum = 1
2023-10-24 00:07:13,858 INFO: i.TFH = K44G083052
2023-10-24 00:07:13,858 INFO: i.FID = 1
2023-10-24 00:07:13,858 INFO: pageNum = 1
2023-10-24 00:07:13,858 INFO: i.FID = 2
2023-10-24 00:07:13,858 INFO: pageNum = 1
2023-10-24 00:07:13,861 INFO: layer.name = JCFW
2023-10-24 00:08:34,377 INFO: JCFW
2023-10-24 00:08:34,378 INFO: 整景.tif
2023-10-24 00:08:34,378 INFO: i.FID = 0
2023-10-24 00:08:34,378 INFO: pageNum = 1
2023-10-24 00:08:34,380 INFO: i.TFH = K44G083052
2023-10-24 00:08:34,380 INFO: i.FID = 1
2023-10-24 00:08:34,380 INFO: pageNum = 1
2023-10-24 00:08:34,380 INFO: i.FID = 2
2023-10-24 00:08:34,380 INFO: pageNum = 1
2023-10-24 00:08:34,381 INFO: layer.name = JCFW
log日志中发现,对应用于分幅的图框JCFW确实被识别,调用FID字段进行遍历数据行,输出文件所需要的名称字段TFH也能识别到,但是在输出PageNum却一直在单循环FID导致输出的实际文件均为同一张图片。
结果
为方便理解,调整后代码与注释如下所示:
#数据驱动批量导出调查底图(20231024修正)
import sys
#导入Python内置的sys模块,这个模块提供了一种与Python解释器进行交互的方式。
reload(sys)
#重新加载sys模块
sys.setdefaultencoding('utf8')
#设置Python的默认编码为'utf8'。
mxd = arcpy.mapping.MapDocument("CURRENT")
#创建一个地图文档对象,该对象名为"CURRENT",表示当前打开的地图文档
shp = 'JCFW'
#定义一个字符串变量shp,值为'JCFW',于后续查询或操作的图层或文件的标识,传入调取数据参数
field_name = 'TFH'
#定义一个字符串变量field_name,它的值为'TFH',调用传入数据的字段名称作为驱动字段
for pageNum in range(1, mxd.dataDrivenPages.pageCount + 1):
#这是一个for循环,声明数据变量为pageNum,基于数据驱动页面循环遍历地图文档中的每一页
mxd.dataDrivenPages.currentPageID = pageNum
#将当前页设置为刚刚遍历到的页码pageNum,调用变量pageNum执行下步操作
row = mxd.dataDrivenPages.pageRow
#pageCount 获取当前页的数据行属性,属性返回启用了“数据驱动页面”的地图文档 (.mxd) 的总页数。选中“显示页面”后在“数据驱动页面”工具条中显示此值;它代表 y 的第 y 页,共 x 页。
arcpy.mapping.ExportToJPEG(mxd, r"D:\\图纸\\" + row.getValue(field_name) + ".jpg",resolution = 50)
#调用ExportToJPEG函数,将当前页的地图导出为JPEG格式的图片,图片的文件名是基于row中对应字段的值(通过row.getValue(field_name)获取)
#定义输出路径至D:\图纸\
#设置输出图片的分辨率为50dpi,(标准图幅使用300)
del mxd
#结束代码前删除地图文档对象mxd以释放资源
总结
易智瑞的帮助文档太坑人了,差了一个mxd.dataDrivenPages.pageRow参数就导致文件输出有问题。
如果要批量输出PDF或者PNG,只需要把第19行mapping.ExportToJPEG参数中的JPEG改成对应PNG或者PDF就可以。
修正代码引用:DataDrivenPages用于提供对已启用“数据驱动页面”的地图文档内管理各个页面的方法和属性的访问。