摘要:在现代林业项目中,内业制图是必不可少的一个环节,目前行业普遍采用ArcGIS软件进行林业制图。但由于ArcGIS软件自身缺陷,软件打开、运行速度较慢,在制图项目较多的情况下,出图及打印相当费时。本文探讨运用Python脚本语言实现批量出图,满足现代大型林业项目快速、高效的要求。
关键词:Python;制图;批量;ArcGIS
内业制图是现代林业项目中必不可少的步骤,目前通过ArcGIS软件完成的制图技术已得到了普遍应用,提高了工作效率。但随着行业发展,林业项目制图类别日渐增多。一个项目中十几张乃至几十张附图的情况时有发生,因软件自身缺陷,ArcGIS打开时速度较慢,且在一个工程文件中布局过多的图会严重影响效率,因此现有制图过程一般是一个工程文件中布局一张图纸,最终出图时需要逐个打开工程文件发送至打印机,在面对大型林业项目时,此种方法效率较低。
Python 是一种不受局限、跨平台的开源编程语言,最初出现在ArcGIS 9.0版本中。此后,Python 被视为可供地理处理用户选择的脚本语言并得以不断发展。每个版本都进一步增强了 Python 体验,Python现 已完全纳入 ArcGIS 中,通过Arcpy站点包对ArcGIS软件进行支持。笔者通过查阅帮助文档,Arcpy制图模块中的ExportToJPEG函数可将工程文件中的布局导出为JPEG格式图片,导出图片后可将图片合并为一个PDF文件批量打印,为林业项目批量出图提供了思路。
ExportToJPEG函数的完整定义如下:ExportToJPEG(map_document,out_jpeg,{data_frame},{df_export_width},{df_export_height},{resolution},{world_file},{color_mode},{jpeg_quality},{progressive})。map_document必选参数为待导出的工程文件,数据类型为MapDocument对象;out_jpeg必选参数为输出的文件目录,数据类型为字符串;{data_frame}可选参数代表待导出的数据框对象,一般为默认值;{df_export_width}和{df_export_height}可选参数为数据框宽、高,在导出布局视图时程序会自动替换为布局宽、高,无需设置;{resolution}可选参数为导出分辨率;其他参数保持默认即可。
笔者选取了某森林公园总体规划项目中的附图进行测试,该项目共18张附图,幅面均为A3,数据框均为2个,底图均为纸质扫描配准地形图,添加标题、指北针、比例尺、图例、标注等要素。测试硬件环境为:联想4650台式机(处理器:Intel Core i7-6700;内存:8GB;硬盘:1TB机械硬盘);软件环境为:Windows7操作系统,ArcGIS10.2软件,Python2.7。具体操作步骤如下:
1 创建ArcGIS工具箱
打开ArcToolBox,点击右键,选择“添加工具箱”,在打开的窗口中创建一个工具箱,名称随意,完成后点击“打开”。创建的工具箱被添加到ArcToolBox。
2 创建脚本工具
在创建的工具箱上点击右键,选择“添加”-“脚本”,在打开脚本创建窗口输入脚本名称,点击“下一步”,在计算机任意位置创建PrintMap.py文件,在脚本创建窗口中选择此文件,点击“下一步”,设置工具参数,参数1命名为“工程文件”,数据类型为“文件”,多值设置为“Yes”,过滤器设置为“mxd”文件;参数2命名为“输出目录”,数据类型为“文件夹”,其他的函数所需参数保持默认即可,无需设置。设置完成后点击“完成”,脚本工具创建完成。
3 编写Python脚本代码
在创建好的工具上点击右键,选择“编辑”,打开代码编辑窗口,首先导入Arcpy及os模块,并设置中文支持:
import arcpy
import sys,os
reload(sys)
sys.setdefaultencoding('utf-8')
设置脚本参数输入,以匹配工具参数:
infile=arcpy.GetParameterAsText(0)
outpath=arcpy.GetParameterAsText(1)
其中infile即上文设置的“工程文件”参数,outpath即“输出目录”参数。由于infile已设置为多值以支持多个工程文件,实际传入的参数是以分号隔开的工程文件路径字符串,且字符串两端有引号,Arcpy制图模块ExportToJPEG函数无法直接识别。为了程序处理方便,作者首先将此字符串用分号拆分为字符串列表,再对此列表应用for循环,在循环体中将每一个字符串处理为Arcpy制图模块ExportToJPEG函数能够直接识别的参数:
mxdlist=infile.split(";")
for m in mxdlist:
strlist=m.split('\\')
d=""
for x in strlist:
d+=x+r'\\'
d=d.rstrip('\\')
d=d.lstrip("'")
d=d.rstrip("'")
ExportToJPEG函数的map_document参数需要MapDocument对象,因此在循环体中应用MapDocument函数将每个工程文件路径处理为MapDocument对象:
mxd=arcpy.mapping.MapDocument(d.decode('utf-8'))
最终应用 ExportToJPEG函数在循环体中输出图片,并将图片命名为跟工程文件同样的名称:
out=mxd.filePath.split("\\")[-1]
arcpy.mapping.ExportToJPEG(mxd,outpath+r"\\"+out.split('.')[0]+".jpg",resolution=300)
4 程序运行测试
打开工具,填入相关参数,点击“确定”等待程序运行完成。
经测试,18副中等复杂程度的图件应用此工具导出约需4min。
作者进一步测试了手动导出(或打印)单张图所需时间,从双击打开某工程文件开始计时,到图片被完整导出(或打印)并关闭工程文件后再双击打开下一个工程文件时停止计时,时间约为70s,18个工程文件共需要约18×70s=1260s(21min),计算可得程序自动导出效率提高了约21min÷4min=5.25倍。考虑到手动导出过程中人无法像程序一样不被任何事项耽误,因此实际使用过程中效率提高倍数会更高。(注:具体的时间依机器配置、软件环境、操作人不同而不同,本文仅探讨在同样的测试环境下效率提高的倍数)。
此工具还可进一步设置导出格式、导出分辨率、导出数据视图或布局视图等参数以满足不同的项目要求。综上所述,在林业项目制图工作中合理运用Python脚本语言,可以提高工作效率,减轻劳动强度,为快速、高效完成现代林业项目提供了保障。
5 参考文献
[1]ArcGIS 10.2 帮助文档.
论文作者:刘露
论文发表刊物:《基层建设》2019年第1期
论文发表时间:2019/4/2
标签:文件论文; 参数论文; 工程论文; 林业论文; 项目论文; 脚本论文; 函数论文; 《基层建设》2019年第1期论文;