ArcGIS添加工具

在规划类工程项目中,经常要输出县级或者各个乡镇的各种规划图。以前的做法是一副一副打开后单个输出,费时费力,而且输出速度较慢。学习了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脚本工具中设置密码的步骤。对于其中一些关键的或者我出错的步骤做了一个说明,权当学习笔记了。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 212,332评论 6 493
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,508评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 157,812评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,607评论 1 284
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,728评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,919评论 1 290
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,071评论 3 410
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,802评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,256评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,576评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,712评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,389评论 4 332
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,032评论 3 316
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,798评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,026评论 1 266
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,473评论 2 360
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,606评论 2 350

推荐阅读更多精彩内容