在规划类工程项目中,经常要输出县级或者各个乡镇的各种规划图。以前的做法是一副一副打开后单个输出,费时费力,而且输出速度较慢。学习了Python之后,一直想为还奋战在规划一线的硕士办公室的学弟学妹们写一个批量输出JEPG的程序,节省精力和体力。可总是各种拖延,没有付诸行动。今早刷朋友圈,看到一个师妹的状态说昨晚又在熬夜出项目图,那种辛苦我感同身受。作为大师兄的我,责任感爆棚,打败拖延症,写出人生第一个集成在ArcGIS中的TOOL。
Python 核心程序
该工具利用ARCPY站点包写成,核心函数是arcpy.mapping.ExportToJPEG,arcpy.mapping 提供了许多与自动化地图生产相关的功能,输出JPEG是提供的导出图片功能之一。
另外一个函数是,arcpy.GetParameterAsText()。arcpy.GetParameterAsText()函数并非获取信息传递给脚本的唯一方式。当你从命令行调用Python脚本,你可以传递一组参数(argument)。当向脚本传递参数时,每个参数必须使用空格隔开。这些参数保存在一个基于sys.argv的列表对象中。使用sys.argv引用索引值0来引用列表中的第一个元素,该元素用于保存脚本名称。每一个后续的参数索引值依次递增加1。因此,第一个参数保存在sys.argv[1]中,第二个参数保存在sys.argv[2]。这些参数可以通过脚本来获取。
建议大家使用GetParameterAsText()函数,这是因为前者没有字符数量的限制而后者则要求每个参数要小于1024个字符。不管使用哪种方式,参数读入后,脚本会作为输入值继续执行。
完整代码如为:
# -*- coding: utf-8 -*-
import arcpy
import sys
#reload(sys)
import os
#sys.setdefaultencoding( "utf-8" )
# infiles = arcpy.GetParameterAsText(0)
infiles = arcpy.GetParameterAsText(0).split(';')
#print infiles
# xx = raw_input("xx")
outdir = arcpy.GetParameterAsText(1)
resolutionValue = arcpy.GetParameterAsText(2)
#print infiles
#outdir11 = outdir.split("\")
#outdir = os.path.join(outdir11)
try:
for infile in infiles:
#infile = os.path.join(infile.split("\"))
mxd = arcpy.mapping.MapDocument(infile)
name = os.path.split(infile)[1].split(".")[0]+".jpg"
outfile = os.path.join(outdir,name)
# df = arcpy.mapping.ListDataFrames(mxd, "Transportation")[0]
arcpy.mapping.ExportToJPEG(mxd, outfile, resolution = resolutionValue)
del mxd
except arcpy.ExecuteError:
print arcpy.GetMessages()
# xx = raw_input("xx")
#E:\Landsat\Processing\MXDExportToJEPG.py "E:\\Landsat\\Processing\\Analysis\\comt.mxd" "E:\\Landsat\\Processing\\Analysis" "300"
创建自定义ARCTOOLS
自定义arctoolbox的过程可以参考
1.右键单击ArcToolbox内的任何空白位置,选择添加工具箱(Add Toolbox)。在Add Toolbox对话框中,点击New Toolbox按钮。系统会创建一个Toolbox.tbx
的工具箱,在下一步中你可以重命名该工具箱:
2.转到C:\ArcpyBook\Ch7
文件夹,在该文件夹下创建一个Wildfire Tools
的工具箱:
3.选中Wildfire Tools.tbx
文件然后点击打开(Open)按钮。如下图所示,该工具箱就出现在ArcToolbox窗口中了:
4.每一个工具箱都需要给定一个名称和别名。别名可以用于唯一识别你的自定义工具。别名应该尽量简短且不包含特殊字符。右键单击新添加的工具箱选择属性(Properties)。如下图所示添加一个wildfire
的别名:
此外,还可以右键单击工具箱选择新建|工具集(New|Toolset)在工具箱中创建一个新的工具集。工具集可以按照功能来对脚本进行分组。在本案例中,你不需要这么做,不过如果在以后需要对脚本进行分组管理时,你就可以通过创建工具集来完成。
接下来,我们将脚本添加到刚刚创建的Wildfire Tools工具箱中。
5.在ArcToolbox中,右键单击之前创建的Wildfire Tools工具箱,选择添加|脚本(Add|Script)。如下图所示弹出添加脚本(Add Script)对话框。填写脚本名称,标签以及描述信息。名称(Name)中不能包含空格以及特殊字符。标签(Label)信息为脚本工具的显示名称。本案例中,标签设置为MXDExportToJPEG
文本。最后,添加一些描述信息来说明脚本执行的细节等。
6.名称,标签和描述的细节信息如下图所示:
特别注意:要勾选store relative path names,否则不能移到其它机器
7.点击下一步(Next)按钮显示添加脚本的下一个对话框。
8.在该对话框中,你需要制定需要添加到工具中的脚本文件。选择MXDExportToJPEG.py
脚本文件。
9.还需要勾选在进程中运行Python脚本(Run Python Script in process)。在进程中运行脚本会提高脚本执行的速度。
进程外运行Python脚本需要ArcGIS创建一个单独的进程来执行脚本。开启进程和执行脚本的时间会导致脚本运行性能的问题。通常都选择在进程中运行Python脚本。在进程中运行脚本意味着ArcGIS不需要开启第二个进程来运行脚本,脚本与ArcGIS运行在同一个进程中。
10.点击下一步(Next)显示参数窗口,如下图所示:
你在该对话框中输入的每一个参数都要与一个单独的GetParameterAsText()
函数调用相关联。在前面,我们已经修改过脚本使其接受通过GetParameterAsText()
函数获取的动态参数。该对话框中参数的输入的顺序应该与脚本中指定接受的顺序一致。比如,你在脚本中插入了下面的代码:
infiles = arcpy.GetParameterAsText(0)
那么你在参数对话框中添加的第一个参数就需要与该行代码关联。在脚本中,outputFC
参数代表运行脚本后创建的要素类。你通过点击显示名称(Display Name)下的第一行来添加参数。你可以在该位置输入任意文本,该文本会显示给用户。你还需要选择与该参数相关联的数据类型。在本案例中,数据类型(Data Type)应该选择要素类(Feature Class)。每一个参数都有一些属性可以设置。其中比较重要的属性包括类型(Type),方向(Direction)以及默认值(Default)。
特别注意:对话框中的MultiValue 为多值选项,如选择,则可以添加多个属性值,如本例中的添加多个MXD工程文档。但在程序中,接受该属性的类型为一个字符串,也就是以“;”分割的一个字符串,而不是List,从而不能对其直接操作。要用infiles = arcpy.GetParameterAsText(0).split(';')方法将每个文件分割开,才能进行下一步的操作。记住,这可能是个大坑!!
设置密码,发布工具
怎样将工具发布给他人使用,又不能看到脚本代码?如果编辑调试完成了,在脚本工具右键可导入脚本。
设置密码后,即可。
但必须注意的是:整个代码中不能有中文字符,否则,不能正常导入脚本,发布出去的脚本工具就有问题。
然后将上文在工具箱中新建的.tlbx文件复制给他人就可以使用了。
结语:
懒得写添加的具体步骤和截图,所以引用了ArcGIS Python编程案例中的创建TOOls的步骤和ArcGIS使用Python脚本工具中设置密码的步骤。对于其中一些关键的或者我出错的步骤做了一个说明,权当学习笔记了。