赞
踩
使用arcgis制图,有时候需要对某个图层中的所有要素进行制图,布局样式基本不变,这时候使用 数据驱动页面 工具配合arcpy代码就能非常方便的实现了。
本文以XZQ图层为数据层,制作每个村的MXD文档,并输出村的示意图。
本代码目标为:
打开ArcMap,加载XZQ等数据层,设置页面布局,添加要素如指北针、比例尺等。
数据图层选择XZQ,名称字段选择”XZQMC"(此处的字段代码中会引用,作为MXD的名称字段),排序字段一般选择“BSM”。 注意: 行政区名称不能有重复值,即名称字段不能重复,否则在保存MXD文档时会报错。根据需要也可以选择“BSM”、“TBBH”等作为名称。
1 地图范围是数据驱动显示的要素与图框的距离,默认最佳大小值是125%,要素与图框间距适中,如果设置100%即为要素最外边界与图框相交,此时页面布局被数据驱动要素填满,页面不美观。该比例可以尝试修改,最终显示效果还受到 “页面显示比例尺” 制约;
2 页面显示比例尺,比例尺四舍五入到10 、100、1000等整数值,会自动调整要素的显示大小。
3 居中显示并保存当前比例,此选项要素显示适中,但比例尺较为凌乱,不宜在图面上再添加比例尺要素。、
4 数据驱动比例,可以在要素属性表中设置一个比例尺字段,针对每个要素设置一个最佳比例尺,在此处调用,则数据驱动比例尺按设
定比例尺显示,一般用在特别精准的制图。
保存设置好的MXD文档,因为我的软件环境是ArcGIS10.8,python2.7版本,对中文支持较差,所以最后为全英文目录。
//设定基础
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
假设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”字段数据
调用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")
循环完毕后,关闭MXD文档,清除缓存。
//关闭文档
del mxd
XZQ图层中按照每个村的要素保存了一个MXD文档,并同步导出了该村图片。效果如下:
# -*- coding: utf-8 -*- import sys import arcpy import os reload(sys) sys.setdefaultencoding('utf-8') mxdfile = r"d:/test.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
以上代码演示了数据驱动工具配合arcpy代码快速批量出图,单个MXD文档方便后期单独维护,注意将调用的 数据库 (.mdb 或者 .gdb)一并保存,否则数据驱动将丢失链接。syq
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。