☰
ArcGIS按图斑批量出图:数据驱动页面与ArcPy全流程指南
2026/10/15 10:17:59 网站建设 项目流程

简介:一份ArcGIS按图斑批量出图的实战操作文档,面向需要处理卫片图斑、地类图斑等大量数据的GIS工作者。文档聚焦Data Driven Pages(数据驱动页面)功能,配合Python脚本自动遍历图斑并导出JPG,彻底取代手动逐张出图的低效流程。资源为单个doc文档,大小约29KB。内容包括数据驱动页面的图层、名称字段、排序字段、显示范围与比例尺配置方法,布局中动态文本的添加技巧,以及可直接运行的arcpy导出脚本示例。脚本基于arcpy.mapping模块读取mxd文件,通过currentPageID切换页面,依据图斑编号自动命名并输出PNG或JPG图片,图像大小与质量均可按需调整。文中附带卫片图斑1、2、3的批量出图实际案例,并给出ArcGIS 10.2环境搭配Notepad++执行脚本的前提与排错提示。目前已有8249人学习,适合有一定ArcMap基础、希望提升批量制图效率的GIS工程师参考使用。

1. 按图斑批量出图:不是打印作业,是一条容易翻车的流水线

Arcgis按图斑批量出图,听着像把一张图打印几百遍,真正做过的人都知道,问题从来不在“出图”这个动作,而在每个图斑怎么套框、怎么定比例尺、怎么把编号和属性动态填到图面里。在卫片执法和图斑核查这类活儿里,图斑数量动辄几百上千,手动逐图斑缩放导出,白天干到后半夜也干不完,还容易漏页、错页、文件名对不上。我见过太多人把时间耗在重复劳动上,却不知道ArcGIS的数据驱动页面(Data Driven Pages)能让每张图自动换范围、换标注、换标题。下面不讲按钮教程,直接按“先理需求、再搭框架、最后填坑”的顺序,把这套方案讲清楚。

适合谁?自然资源领域的业务人员、第三方测绘工程师,只要你手头有图斑面文件和底图,这篇文章能让你少走至少两遍弯路。

2. 先理清需求:一张图斑图里到底要装什么,比例尺该怎么定

2.1 一张标准图斑图的六件套

在开始做数据驱动页面之前,先别急着打开ArcMap。跟你说个血泪经验:很多人在批量出图上翻车,不是不会用工具,而是根本不知道最终交付的图长什么样。你先找一张别人做好的成果图,或者从项目资料里翻一张历史图,拆开看,里面至少有六样东西:

  • 底图:通常是遥感影像或者地形图,用于交代图斑周边的地理环境。
  • 图斑边界:带颜色填充和边线,能一眼看出这个图斑的位置和形状。
  • 图斑属性标注:图斑编号、地类名称、面积,这几个几乎必备。
  • 图幅要素:图名、比例尺、指北针、图例。
  • 坐标信息:经纬度或公里网,有些地方还要求带中央经线。
  • 辅助信息:制图人、审核人、出图日期。

这六件套不是每张图都一字排开,而是按出图比例和版面空间来排。我一般会把图斑放在版面中间,图例放在右侧,比例尺和指北针放在图斑下方,图名放在正上方。动态文本负责让图斑编号、面积、地类名称自动切换,图例和比例尺固定在版面的某个位置。如果你所在的项目有固定的出图模板,那么更省事——先套模板,再改数据驱动页面。如果是从零开始,建议先花半小时把这个版式在布局视图里摆好,不要等导出来了才想起来缺指北针。

2.2 批量出图的本质:每个图斑都是一套独立的“动态制图环境”

ArcGIS按图斑批量出图,核心机制是数据驱动页面。它把每个图斑当作一个“页面”,页面范围自动缩放到图斑边界加边距,页面上的文本、图例、比例尺通过动态变量自动替换。这跟普通的打印排版有本质区别:普通排版是固定范围、固定标注,而批量出图要求每一页的范围、标注、比例尺都随着图斑变化。

以数据驱动页面里最常见的两个变量为例:一个是“页面范围”,它由索引图斑的外接矩形决定;另一个是“页面名称”,它可以绑定到图斑编号字段。你插入动态文本时,选“数据驱动页面 -> 页面名称”就能让它跟着图斑走。比例尺也要做动态处理——固定比例尺在大小不一的图斑面前完全失效,正确的做法是让比例尺从页面范围自动计算,或者用一个已经计算好的字段来指定。前者简单,但对大小差异极大的图斑,会导致小图斑比例尺很大、大图斑比例尺很小,图面效果不统一。后者灵活,需要你在属性表里多算一个“最佳比例尺”字段,这个在第6章详细讲。

2.3 数据预处理:坐标系、字段完整性和几何错误,一个都不能漏

批量出图最怕的就是“测试时一切正常,全量跑的时候某几个图斑跑飞了”。绝大多数情况是数据本身有问题。我建议你在做数据驱动页面之前,花二十分钟把图斑数据做一次预处理,能帮你省掉后面至少两小时的排查时间。

第一,坐标系。底图、影像、图斑层必须在同一个投影坐标系下。卫片数据通常是西安80或CGCS2000的高斯克吕格投影,而下载的影像可能是Web墨卡托。如果直接叠加,不仅范围对不上,出图时图斑会跑到图框外。我的习惯是:把所有矢量统一投影到CGCS2000_3_Degree_GK_CM_XXX(按当地中央经线选),影像也投影到同一坐标系,这样距离、面积、比例尺都一致。

第二,字段完整性。先检查有没有唯一的图斑编号。一般卫片图斑会有“图斑编号”字段,但有些是混合字段,比如“图斑号_地块号”,这会导致页面名称带斜杠或非法字符,后面脚本命名就会报错。我会新增一个TBBH字段,用计算字段的方式生成干净的编号,比如“YWB_20230501_001”。同时把地类名称、面积等字段一并整理好,面积单位统一为平方米或亩,并在字段别名里写清楚,这样动态文本框才不会引用错字段。

第三,几何质量。在ArcToolbox里用“检查几何”工具跑一遍,把自相交、空几何的图斑找出来。如果图斑有自相交,数据驱动页面在计算外接矩形时会得到错误范围,可能导出空白页。修复直接用“修复几何”工具,原数据最好备份一份,这些操作不允许撤销。

上面这三步做完,你的数据才是“干净”的,后面搭起来才会顺。别嫌麻烦,我见过有人跳过几何检查,结果200个图斑里有3个导出来是白纸,排查了一下午才发现是几何问题。

3. 数据驱动页面:把每个图斑装进一个可自动导出的页面

3.1 准备图斑数据与字段:TBBH、DLMC、MJ,再加一个SCALE

在创建数据驱动页面之前,先把属性表整理成下面这样。这不是拍脑袋定的,而是制图动态文本、比例尺、脚本命名都依赖这些字段。

字段名类型示例值用途
TBBHTextYWB_20230501_001页面名称、导出文件名、图斑唯一标识
DLMCText旱地动态文本显示地类名称
MJDouble1523.6动态文本显示面积,单位平方米
DLBMText0103地类代码,图例分类用
SCALELong5000最佳比例尺分母,可选字段

如果原始数据里有现成的编号,直接用;没有就新建一个TBBH字段,用字段计算器做字符串拼接,比如把“地块编号”和“图斑序号”拼起来。注意TBBH不能有空格、斜杠、冒号,这些字符在Windows文件名里是非法的,除非你想在脚本里再做一次清洗。

字段准备好之后,另存一份文件地理数据库的要素类,别直接在原始shapefile上操作。常见做法是把图斑、影像、境界等全部放到一个MXD里,并保证图斑图层在内容列表里排在最上面、且可视。

3.2 创建数据驱动页面:用图斑图层做索引

这一步是核心。如果你用的是ArcMap 10.x,打开“视图 -> 数据驱动页面 -> 设置数据驱动页面”。在弹出的对话框里,勾选“启用数据驱动页面”,然后:

  • 图层:选择你的图斑面要素图层。
  • 名称字段:选择TBBH字段,这样每个页面就有了自己的名字。
  • 范围:保持“最佳”模式(通常选“全部要素”)。

这里有个容易踩的细节:“名称字段”不一定是TBBH字段,可以是任意字段,但它直接决定动态文本里“页面名称”显示什么,所以务必用唯一的编号字段。如果你的图斑数量很大(超过500个),勾选“仅选择范围内的要素”可以避免每次刷新都卡顿,但这个选项对页面生成有影响,建议测试时别勾,全量跑之前再看情况。

设置完成后,ArcMap窗口右下角会出现页面切换控件,你可以一页一页翻。此时地图范围会跟着图斑跳,但先别高兴——你还需要设置裁剪和边距,否则图斑会紧贴图框边,甚至被切掉一部分。

3.3 三个关键参数:页面尺寸、裁剪范围、边距

页面尺寸在“页面和打印设置”里调。我一般用A4纵向,因为卫片图斑大多狭长,纵向版面更容易容纳图例和标题。如果你要铺到A3或自定义尺寸,注意比例尺分母和字体会跟着变,建议页面尺寸一经确定就别再改,测试时改一次,全量前再确认一次。

裁剪范围是第二个关键参数。在数据驱动页面设置对话框的“范围”选项卡里,选择“使用数据驱动页面范围裁剪”。这样每张图只显示当前图斑周边的底图,不会串到隔壁图斑去。然后设置边距——这个边距是图斑外接矩形向外扩的距离,单位是米。该填多少?我一般填图斑最长边的20%~30%,至少不小于一种常见比例尺下的5毫米距离。例如图斑最长边约1000米,边距可以填200米。如果图斑大小差异很大,固定边距会导致小图斑边界离图框很近,大图斑又太空。这时可以勾选“按百分比扩展”,填10%~20%,这样每个图斑的边距都跟自身大小成比例。

提示:边距的单位跟随数据框的坐标系。如果数据是地理坐标系(经纬度),这里填的是度,不是米,比例尺计算也会乱。所以强烈建议提前投影。

第三是比例尺模式。在“数据驱动页面设置”里,比例尺可以选择“自动”或者“固定”。自动模式下,ArcGIS根据页面范围和页面尺寸计算比例尺;固定模式下,所有页面使用同一个比例尺,适合面积差异不大、形状规矩的图斑。卫片图斑面积跨度大,建议先用自动模式跑一遍,再检查几张不同大小的图斑,如果比例尺变化太大导致图面不协调,再用SCALE字段去控制(第6章会说)。

3.4 动态文本、图例与比例尺:让每张图自动换内容

现在开始做版面。先在布局视图里把版式排好:图名放顶部,图斑放在地图框内,图例放在右下角,比例尺放在图斑下方。

插入动态文本时,在布局视图里选择菜单“插入 -> 动态文本”,然后选“数据驱动页面 -> 页面名称”,这时页面上出现一个类似<dyn type="page" property="name"/>的占位符,它会显示当前页面的TBBH值。同理,再插入“图斑面积”和“地类名称”的动态文本,但这两个字段需要你在属性表里改成别名,否则动态文本无法正确显示。

图例要设置为“仅显示当前可见要素”。右键图例 -> 属性 -> 图例项目,勾选“仅显示当前地图范围内可见的要素”。否则图例会把底图里可能出现的所有图层、所有类别全部列出来,每张图都一样,根本起不到图例的作用。比例尺则使用动态比例尺,右键比例尺 -> 属性 -> 在“比例尺”选项卡里选择“根据页面自动缩放”,这样它会跟随当前页面范围实时更新。

到这里,一个能逐页预览的数据驱动页面就搭好了。你可以按右下角的翻页按钮,看看每个图斑是否都装进图框、标注是否完整。确认无误后,再用下方的“导出页面”按钮输出PDF或打印到打印机。但对于几百上千个图斑,手动点导出并不比手动出图快多少,真正的效率提升要靠脚本,这是下一章的事。

4. 用ArcPy脚本把批量导出升级成一条流水线

4.1 为什么还要写脚本:界面操作救急不救穷

如果你只是偶尔出一次,数据驱动页面的“导出页面”按钮完全够用。但卫片图斑核查往往是周期性工作,本月出一次,下月又来一批新的。每次都在界面上重复设置、重复导出,不仅慢,而且容易在反复点击中漏掉一页。更麻烦的是,如果领导临时要求把PDF换成JPG,或者从200张里挑出地类编号以“01”开头的图斑单独出图,界面操作会让你重新折腾一遍。

所以我习惯把“模板MXD + ArcPy脚本”固化下来。模板MXD负责版式和数据驱动页面配置,脚本负责循环、命名、导出。这样下次来新数据时,只需要替换MXD里的数据源,跑一遍脚本就完事。而且脚本可以在后台跑,不用一直盯着ArcMap,减少崩溃概率。

4.2 最小可用脚本:按图斑编号导出PDF

下面这段脚本是多个类似项目里用过的简化版。它读取一个配置好数据驱动页面的MXD,逐页导出PDF,文件名直接用页面名称(即TBBH)。复制之前,请确认ArcMap版本是10.x且安装了Desktop的Python环境。

# -*- coding: utf-8 -*- import arcpy import os mxd_path = r"D:\gis_work\attendance_template.mxd" # 你的模板MXD out_dir = r"D:\gis_work\output" # 输出目录 dpi = 150 # 导出分辨率 mxd = arcpy.mapping.MapDocument(mxd_path) try: if mxd.dataDrivenPages.pageCount > 0: for i in range(1, mxd.dataDrivenPages.pageCount + 1): mxd.dataDrivenPages.currentPageID = i # 读取当前页面在索引图层上的TBBH字段值 tbbh = mxd.dataDrivenPages.pageRow.getValue("TBBH") print("正在导出:{}".format(tbbh)) pdf_path = os.path.join(out_dir, tbbh + ".pdf") arcpy.mapping.ExportToPDF(mxd, pdf_path, resolution=dpi) finally: del mxd print("全部导出完成")

这段脚本的逻辑很简单:先用MapDocument打开模板MXD,然后判断数据驱动页面是否正常启用。循环从1到pageCount,每轮把当前页面ID设为i,用pageRow.getValue拿到这一页对应的图斑编号,拼接成输出路径,再调用ExportToPDF导出。注意ExportToPDF的第二个参数是输出路径,第三个参数是关键字参数resolution,控制分辨率。dpi=150是常规交付标准,如果只是屏幕预览,96就够了;要印刷或打印纸质图,可以调到200或300,但文件大小和导出时间会明显增加。

4.3 脚本参数说明与扩展:格式、命名、过滤

上面脚本里的两个变量可以灵活调整。dpi一般设为150,因为卫片图斑成果通常用于电脑查看或打印A4纸,150足够清晰,文件也不会太大。如果你想导出JPG,只需把ExportToPDF换成arcpy.mapping.ExportToJPEG,但注意JPG格式不支持图层透明度和矢量信息,后续要放大查看会模糊。个人的习惯是:内部交流用JPG,正式提交用PDF,两者都通过脚本生成。

文件名命名上,tbbh + ".pdf"有个隐患:如果TBBH里含中文字符或空格,虽然Windows能创建,但在某些内部系统里会乱码。建议在脚本里加一行清洗逻辑,把非字母数字下划线的字符替换成下划线:

import re safe_name = re.sub(r'[^\w\-]', '_', tbbh) pdf_path = os.path.join(out_dir, safe_name + ".pdf")

另外,如果你只想导出部分图斑,比如“地类名称是旱地”的那些,可以在循环里加过滤条件。因为mxd.dataDrivenPages.pageRow只是当前页面的索引行,你可以自己访问mxd.dataDrivenPages.dataSource拿到索引图层,然后用arcpy.SearchCursor去遍历字段。但我更推荐一个简单的办法:在MXD里对索引图层应用定义查询,比如DLBM LIKE '01%',然后数据驱动页面就只对查询结果生成页面。脚本不需要改动,只要在跑之前把定义查询改一下。这个技巧在批量处理不同批次时非常好用,可以不用改脚本,只改MXD的查询条件。

还有一个细节:ExportToPDF默认使用当前MXD的页面尺寸和打印机设置,如果之前你手动打印过其他尺寸,MXD里的页面设置可能被改掉。所以最稳妥的办法是:每次跑脚本前,人工确认模板MXD的页面设置是正确的,不要用脚本去修改它,因为不同ArcMap版本的API略有差异。

5. 按图斑出图避坑指南:五条最常见的翻车现场

5.1 现象:图斑太大,比例尺自动缩得很小,图面空荡荡

导出图斑面积特别大的图,发现图斑只占版面一小块,四周全是底图,比例尺显示1:50000,根本看不清地类边界。原因在于ArcMap自动计算比例尺时,优先保证整个图斑外接矩形放进图框,如果给的边距是百分比,那图斑越大,边距绝对距离也越大,比例尺自然就越小。而且动态比例尺显示的是页面的实际比例,在图面上显得很小,但图斑细节完全丢失。

解决思路有三条,按项目要求选一条:一是限制边距为固定值,比如统一200米,这样大图斑的比例尺不会太小,但小图斑又会贴边;二是用SCALE字段,在每个图斑上手工或批量填好期望的比例尺分母,然后在数据驱动页面设置里选择“使用比例尺字段”,让每张图用不同的固定比例尺;三是接受自动比例尺,但对特别大的图斑单独调整版面,比如分幅出图。我通常是先给图斑按面积大小分档,大图斑单独跑一个更小比例尺的模板,小图斑用默认模板,程序上就是多准备一个MXD。

5.2 现象:相邻图斑共边,导出后发现图斑边界被图框切掉一半

卫片图斑之间往往有共边,尤其是一片连续的耕地。在测试页里明明看到了整个图斑,但导出后发现图斑的一侧被图框裁掉了。原因是“数据驱动页面范围”是以图斑外接矩形为基础,再加上边距,但如果边距太小,共边的相邻图斑会“贴”在页面边缘,制图输出时又做了边缘裁剪,视觉上就像被切了。

解决方法是把边距加大到至少30~50米,或者用百分比模式设15%~25%。如果已经用百分比还出问题,检查一下图斑几何,看是否有极长极窄的图斑,它的外接矩形可能很宽大,导致上下留白很多而左右贴边。这时需要单独处理这些狭长图斑,比如按一定距离加宽边距。我见过最离谱的案例是某个图斑宽度只有5米,长度800米,自动范围算出来左右只留2米边距,导出后整个图斑就是一条竖线,几乎看不见。后来在预处理阶段把这类狭长图斑单独标记,手工调整边距,才勉强过关。

5.3 现象:图斑编号标注压盖地类边界,图面乱成一团

当图斑比较小时,动态文本标注和图斑边界挤在一起,字压线、线压字。这在ArcMap里是制图渲染的经典问题。原因是标注引擎默认在要素内部放置文本,没有考虑外部边界,而且插入的动态文本框可能覆盖在地图上。

解决方法是:给标注设置“缓冲”或者“掩膜”。右键图层 -> 标注 -> 放置属性,勾选“放置时移除冲突要素”,并在“要素掩膜”里用符号层掩膜,让标注位置更清晰。如果用的是动态文本(比如放在图斑中央的图斑编号),可以在文本框属性中设置背景色和晕圈,让文字背景盖住底图内容。另外,如果图斑面积太小,标注根本放不下,建议把编号放到图斑外的引线上,或者干脆只在地图框外的标题区显示,不在图面内显示。就是这种小细节,决定了每张图是不是耐看。

5.4 现象:换台电脑打开PDF,字体变方块,填充符号失踪

批量导出的PDF在项目组内流转,有同事打开后发现图中中文变成了方框,或者图斑填充颜色消失了,只剩边线。最常见的原因是ArcMap导PDF时没有嵌入字体,或者符号库依赖的样式文件没随MXD一起走。在这台电脑上看到的效果,换一台没有安装相同字体的机器就会乱。

解决方法是:尽量使用Windows自带的宋体、黑体、Arial,不要用第三方下载字体;导出PDF时,在ArcMap的“导出地图”对话框中勾选“将字体嵌入文档”。ArcPy的ExportToPDF函数本身并不提供嵌入字体的直接参数,所以在脚本全量导出前,先在界面里手动导出一次测试页,确认字体都嵌入成功,再跑脚本。另外,如果成果还需要给上级建库系统使用,PDF格式建议选Acrobat 8兼容,避免高版本特性导致低版本打不开。

5.5 现象:几百个图斑一起导出,ArcMap越来越卡,跑到一半崩溃

这大概是所有人都会遇到的一关。原因很明显:数据驱动页面每翻一页,ArcMap都要重新计算范围、渲染图层、更新动态文本,几百页连续渲染对内存和CPU压力很大。如果图斑数据量本身就大(比如几十万条),卡顿更严重。

解决措施分四步,按顺序执行:第一,关闭不必要的图层,只保留影像底图、图斑层和必要的境界层,临时参考图层全部删掉;第二,把影像数据做缓存,或者使用金字塔,减少动态渲染开销;第三,分段导出,比如每100页导出一个PDF,然后用PDF合并工具合并,这样即使中途崩溃,损失也有限;第四,改用ArcGIS Pro的Map Series功能,它比ArcMap的数据驱动页面更稳定,内存管理更好。如果能换到Pro,强烈建议用Pro跑超过500页的任务。如果还在ArcMap上,可以考虑安装64位后台地理处理补丁,但在数据驱动页面导出时这个补丁不一定生效。

6. 进阶:把批量出图固化成一键交付的工程习惯

6.1 用“最佳比例尺”字段实现智能比例尺

前面提到SCALE字段,这里给它一个可落地的计算方式。在预处理阶段,用图斑面积除以版面可用面积,换算出一个接近的比例尺分母,再取整到常用的比例尺系列(500、1000、2000、5000、10000等)。然后在数据驱动页面设置里选择“比例尺 -> 使用字段中的比例尺”,并指定SCALE字段。这样大图斑用大分母,小图斑用小分母,所有图斑在版面上拥有近似相同的视觉尺寸。我一般在属性表里用字段计算器完成,遇到计算出来的值不在常用系列里,用Python函数取最近档位。

6.2 输出目录与命名规范

建议输出目录按日期和批次建两级,比如output\20260501\,文件名统一为“批次号_图斑编号_地类名称”。批次号来自工作名称,地类名称可能含中文,文件名里中文没有大问题,但如果你要上传到某些系统,建议只保留“批次号_图斑编号”。项目验收前,可以写一个小脚本检查输出PDF数量是否等于图斑数量,还能顺便比对文件名字典序和属性表里的图斑编号是否一一对应。

6.3 最后一道检查:抽页验证与模板复用

全量导出前,先导出一页测试,重点看三处:图斑是否完整在框内、图斑编号是否和页面名称一致、比例尺数值是否合理。我习惯导完50页就随机抽3页打开,如果发现测试页里没注意的问题,比如某一类图斑比例尺异常,赶紧回去改模板。改完模板后,必须重新从第一页跑起,不要只在出错的那一页接着跑。这个习惯让我避免了好几次返工。

说实话,按图斑批量出图这件事,工具层面的门槛不高,真正的门槛在于对数据和版式的控制力。我现在每次拿到新图斑数据,都会先花半小时做预处理,再配置一个专用模板,最后才跑脚本。这套流程一旦固化下来,出图就不再是加班理由了。希望帮到你。

本文还有配套的精品资源,点击获取

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询