基于ArcGIS 的批量制图研究与应用

2023-02-05 13:57
经纬天地 2023年6期
关键词:批量图层制图

陈 杨

(山东省地质测绘院,山东济南 250003)

0 引言

地图是测绘与地理信息的重要载体,可以科学地表达自然和社会经济现象的分布特征及其相互关系。随着现代测绘科学技术突飞猛进的发展,制作地图的数据源逐渐多元化,地图制作也早已由传统方法手段向计算机和GIS 技术发展。现代地图一般先制作成电子数据格式存储和应用,有需要时打印输出成纸质地图。

依据不同的分类方式,地图的分类多种多样,但通常都包含图形要素、数学要素、辅助要素和补充说明等。在整套整批的每张地图中,辅助要素和补充说明都是相同或类似的,比如某种专题图的分幅图[1]。所以在制作分幅专题图时会涉及很多重复的工作,如果每张地图都采用单独编辑制作和输出的方式,将会耗费大量的人力、物力和时间,造成资源的浪费。因此,要实现地图制作的批量化和自动化,需要创建可自动执行的工作流来记录步骤过程[2]。

本文利用山东省各市、(区)县数据,以山东省市、(区)县行政区划图制作为实例,详细论述了完全基于数据驱动制图模块和以ArcPy 结合数据驱动制图模块两种方法批量制作和输出地图的技术方法。最后,对于如何结合形状指数动态修改地图比例尺进行了展望。

1 ArcGIS批量制图的优势

随着现代测绘科学技术的发展,学科之间的不断深度融合呈加强趋势,传统测绘概念正逐渐被“大测绘”所替代。近年来,GIS 技术以得天独厚的优势在测绘数据批处理方面起着越来越重要的作用。作为一款非常优秀的GIS 软件,ArcGIS 在行业内有着最高的市场占有率和知名度[3],在地图生产制作方面具有强大的工具和功能,二次开发功能更能满足用户个性化的使用需求。

1.1 数据驱动制图模块

ArcGIS 提供了“数据驱动页面”工具,可以利用单个地图文档(mxd 文件)方便快捷地创建一系列布局页面。用户在实际应用中不需要进行二次开发,只需配置好其中一幅地图的模板,利用mxd 文件中的索引要素将地图分割为多个部分[4],然后为每个索引要素生成相应页面,可以实现零代码方式批量输出地图。

1.2 ArcPy

ArcPy(ArcPy 站点包)作为Python 语言的第三方库,为用户提供了使用Python 操作地理处理工具的接口。ArcPy 由数据访问模块(arcpy.da)、制图模块(arcpy.mapping)、ArcGIS Spatial Analyst 扩展模块(arcpy.sa)和ArcGIS Network Analyst 扩展模块(arcpy.na)等组成,包含了大量、丰富的函数和类,可以根据用户具体需求定制开发出处理地理数据的实用性程序。

制图模块(arcpy.mapping)集成于ArcGIS for Desktop,可以方便地处理地图文档(.mxd 格式)和图层文件(.lyr 格式)。它继承了Python 语言简洁实用的特点,不仅很好地封装了ArcMap 的地图交互功能,还扩展了数据驱动页面的功能[5],可方便地用于自动执行地图批量生产。另外,可将制图模块脚本发布为地理信息数据处理服务,还可将脚本功能提供给Web 应用程序。

2 基于ArcGIS批量制图研究

2.1 数据准备与制图需求

以山东省各市、(区)县行政区要素数据作为本文研究内容的基础数据,现根据需求的格式和样式批量制作并输出山东省各市、(区)县两级的行政区区划图,要求每个市单独输出为一个图幅文件。

2.2 完全基于数据驱动制图模块批量制图

2.2.1 数据驱动页面定义和设置

在ArcMap 环境中调出“数据驱动页面”工具条,对数据驱动页面中的“定义”和“范围”选项卡进行设置。在“定义”选项卡设置中,主要是进行索引图层设置,选定某一图层作为制图的索引要素数据;在“范围”选项卡中,主要是设置地图显示范围等参数,在此处可选择“最佳大小”单选框,“大小”处输入125%,表示每幅图显示范围为本幅图索引数据范围的125%,即对显示范围进行适当扩大。

2.2.2 添加范围指示图(鹰眼指示图)

在整套整批地图的每一幅图中,通常需要在图面下方添加范围指示图,用来指示本幅地图显示范围在整个地图区域的位置,可以起到方位指示的作用。对于此功能的实现,ArcGIS 提供了一种简便的操作方法,在布局视图下插入新的数据框并调整大小和位置。作为范围指示图,可以对内容列表中的各州基础数据进行复制,然后粘贴到新建数据框中,打开新建数据框的“属性”对话框,选择“范围指示器”标签,设置“图层”数据成为显示这些数据框的范围指示器。这种方法简单易行,通过几步设置巧妙地实现了复杂的功能,操作效果如图1 所示。

图1 添加范围指示图

2.2.3 添加动态文本和辅助要素

在“插入”菜单→“动态文本”处或通过数据驱动页面工具的“页面文本”选项,都可以方便地插入各种具体需求的动态文本,比如日期、页码和各种名称等。有些动态文本以函数表达式的形式给出,用户可以根据自身需求修改其中的变量内容来进行特定显示。另外,在ArcMap 中可以直接将图例、指北针等辅助要素插入到地图特定位置并调整大小和位置,并且这些辅助要素有多种格式可选。

2.2.4 特定页面数据显示设置

在地图制作中,每幅地图通常只需显示本幅图索引范围内的数据。比如在本文所举实例中,要求每幅地图只显示本幅图表示州行政区的下辖县数据,把相邻的其他州的下辖县数据进行隐藏。打开美国县级数据的图层属性对话框,选择“定义查询”选项卡[6],再打开下方“页面定义”对话框,勾选“启用”复选框,在“页面名称字段”处选择州名称字段,再勾选“匹配”单选框完成设置后即可实现所需效果。

2.2.5 批量导出地图

在完成页面设置以后,通过“文件”菜单中的“导出地图”对话框,设置地图分辨率、导出格式和页面类型大小等输出参数(此处批量导出功能仅支持pdf 格式),即可选择目标文件夹导出地图。

2.3 ArcPy结合数据驱动模块批量制图

2.3.1 创建脚本工具箱

采用创建脚本工具箱的模式进行ArcPy 批量制图,将可视化的对话框和python 代码相结合,具有设计简洁和操作简便的优点,易学易懂。在ArcCatalog 环境下选定指定文件夹新建tbx 格式“工具箱”,在新建工具箱下添加脚本并输入相关信息。再选择引用编写好的脚本文件,最后进行相关参数设置[7]。在此需要添加一个地图输出路径参数,填写参数的名称并选择数据类型为“工作空间”[8],用于选择存放制图输出的路径。

本示例所引用的脚本文件代码及主要语句的注释如下:

import arcpy

#导入arcpy 模块

outWorkSpace=arcpy.GetParameterAsText(0)

#创建工作空间变量,获取工作空间参数

outpath=outWorkSpace+"\"

#定义参数工作空间,并指定输出地图的存放位置

mxd=arcpy.mapping.MapDocument("CURRENT")

#定义当前mxd 为工作空间

for pageNum in range(1,mxd.dataDrivenPages.pageCount+1):

mxd.dataDrivenPages.currentPageID=pageNum

mapName=mxd.dataDrivenPages.pageRow.

getValue(mxd.dataDrivenPages.pageNameField.name)

fullpath=outpath+mapName+".jpg"

#定义当输出路径

arcpy.mapping.ExportToJPEG(mxd,fullpath,resolution=100)

arcpy.AddMessage("正在批量输出第"+str(pageNum)+"张图")

#利用for 循环遍历驱动页面,在进行相关设置后批量输出地图

arcpy.AddMessage("出图完成!,共输出"+str(pageNum)+"张图")

#输出地图完成后,弹出对话框提示信息

del mxd

#删除定义的工作空间

2.3.2 批量输出地图

利用创建的脚本工具箱,选择指定输出路径进行批量地图文件输出如图2 所示。脚本程序执行的过程如图3 所示,地图输出一边执行一边打印提示语,当所有地图输出完成之后统计并打印地图数量。批量出图过程实现了人机交互功能,操作简单并且效率很高。图4 展示了部分输出地图的叠放效果,从成果图可以看出,图面整饰部分统一规范、整体整洁美观,达到了预期目的,取得了良好的效果。

图2 脚本工具的文件输出设置界面

图3 脚本工具运行过程的提示

图4 批量输出的部分地图文件

对于“特定页面数据显示设置”的需求,上文的方法是在图层属性对话框中通过设置“定义查询”选项卡的属性参数来隐藏其他州的下辖县数据。也可以利用Layer.definitionQuery 方法定义查询输出图形,在创建脚本工具箱时需再添加一个显示图层参数,选择数据类型为“图层”。在原批量输出图形的脚本代码中加入定义查询出图的完整修改代码及主要注释如下:

import arcpy

#导入arcpy 模块

indexLayer=arcpy.GetParameterAsText(0)

#创建索引图层变量,获取索引图层参数

outWorkSpace=arcpy.GetParameterAsText(1)

#创建工作空间变量,获取工作空间参数

lyr=arcpy.mapping.Layer(indexLayer)

#对Layer 图层进行实例化

outpath=outWorkSpace+"\"

mxd=arcpy.mapping.MapDocument("CURRENT")

for pageNum in range(1,mxd.dataDrivenPages.pageCount+1):

mxd.dataDrivenPages.currentPageID=pageNum

mapName=mxd.dataDrivenPages.pageRow.getValue(mxd.dataDrivenPages.pageNameField.name)

fullpath=outpath+mapName+".jpg"

query="NAME=′"+mapName+"′"

#创建查询语句文本

lyr.definitionQuery=query

#用lyr.definitionQuery 方法调用查询语句,进行设置

arcpy.mapping.ExportToJPEG(mxd,fullpath,resolution=100)

arcpy.AddMessage("正在批量输出第"+str(pageNum)+"张图")

#利用for 循环遍历驱动页面,在进行相关设置后批量输出地图

arcpy.AddMessage("出图完成!,共输出"+str(pageNum)+"张图")

#输出地图完成后,弹出对话框提示信息

lyr.definitionQuery=""

#最后为lyr.definitionQuery 赋空值,释放内存空间

del mxd

#删除定义的工作空间

3 结语

本文在ArcGIS 软件平台下对两种批量生产地图的方法进行研究,并利用实例详细论述了具体应用流程,为在生产工作中批量制作和输出地图提供了完整有效的解决方案。ArcGIS 批量制图大大地减轻了制图技术人员的工作强度,避免了误操作和烦琐的重复劳动,不仅提高了图件成果的准确性,还提升了工作效率和经济效益。

完全基于数据驱动制图模块进行地图制作操作较简单,不需要借助编程即可实现批量化操作。这种方法在批量输出地图时只能以pdf 格式保存,再转换成为其他栅格文件格式时容易出现丢失点状符号等问题。以ArcPy 结合数据驱动制图模块进行批量制图的方法能够利用函数进行需要的格式输出和多种设置,比如可以直接批量生成常用的JPG 格式,应用起来更加灵活。ArcPy 语言设计精简实用,语法接近于自然语言,常常只用十几行左右代码即可解决比较复杂的数据处理问题。由于Python 语言比较符合人的习惯性思维模式,对于编程经验不足的人来说容易上手。

本文实例中的索引数据利用了已有行政区域界线数据,如果要生产方格网分幅图可以先创建分幅格网作为索引数据。同时,软件还支持创建带状索引分幅,满足了多种工程类的制图需求。

文中制图案例以行政区域数据作为索引图层,在设置地图范围时选定了统一的百分比125%,值得注意的是,统一的比例数值并不适用于每张地图。这样生产出的有些图幅整体并不十分完美,存在索引数据图层在整个图面中的比例不协调的情况,这就需要根据索引数据的“形状指数”来动态修改地图比例尺。

“形状指数”又被称为“景观形状指数”,是指格局中斑块的形状指数,一般通过计算区域内某斑块形状与相同面积的圆或正方形之间的偏离程度来测量形状的复杂程度。如果要使批量输出的每张地图比例协调美观,可以在索引图层中增加形状指数字段来计算每行图形数据的形状指数,再增加比例尺字段,根据图形形状指数计算出适宜的比例尺。最后再利用Python 代码程序以每张地图索引数据适宜的比例尺进行显示输出。

猜你喜欢
批量图层制图
批量提交在配置分发中的应用
无声手枪如何消音?
巧用混合图层 制作抽象动感森林
二向反射模型在土地覆被制图中的应用
图层法在地理区域图读图中的应用
跟我学添加真实的光照效果
浅议高校网银批量代发
工程制图课程教学改革探析
浅析“递层优化法”在矿井制图中的应用
基于AUTOIT3和VBA的POWERPOINT操作题自动批量批改