ArcGIS-自定义脚本工具的创建、配置及使用(创建脚本工具,脚本参数设置、传递。锁定参数、灰色参数、下拉选择、滚动条)

本文详细介绍了如何在ArcGIS中创建自定义脚本工具,包括Python代码的导入,脚本参数的配置、验证,以及脚本描述的编写,重点讲解了参数的设置、数据类型和验证规则。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

前  言

        虽然在ArcGIS的python窗口内或IDE环境下,也可运行代码,但如果有频繁使用或需要提供给他人的情况,那么将代码封装为一个自定义脚本工具,则可提高使用效率,避免频繁修改变量定义,提供给他人时也可避免过多的沟通说明。

        本文章主要介绍自定义脚本工具的创建、代码的导入、脚本参数的配置、参数的验证、以及脚本描述的编写。

        环境:ArcGIS10.4(ArcGIS Pro也基本相同)


​​​目  录

一、创建一个的自定义脚本工具

二、Python代码的导入以及参数的传递

三、脚本参数的配置

3.1.示例代码的参数设置

3.2.其他“数据类型”的介绍

        3.2.1.滚筒条的设置

        3.2.2.下拉值列表选择的方法配置

3.3.“参数属性”的功能介绍

四、参数的验证

4.1.锁定参数(灰色无法填写的)

4.2.参数的过滤与自定义消息

4.3.参数分组、折叠

五、脚本描述的编辑


一、创建一个的自定义脚本工具

        第一步:在目录处右键 --> 新建 --> 工具箱(不是Python工具箱!!)

        

        第二步:右键创建好的工具箱 --> 添加 --> 脚本

        

        第三步:填入脚本的名称与标签

        (说明:若创建的脚本内存在其他脚本工具需要导入的函数,名称建议以纯英文命名,不包含中文以及任何特殊符号)

        

        脚本文件和参数设置暂时不写,一直下一步,完成。至此,自定义脚本工具就创建好了。


二、Python代码的导入以及参数的传递

        此时,我们写好的代码还未导入到脚本工具中。在导入前,我们需要从脚本参数内获取值。

        本次创建脚本工具的示意代码如下:这个串代码的作用是对设置好数据驱动的工程进行地图的批量导出(详见作者的另一篇文章:arcgis-批量出图

# coding=utf-8
import arcpy, os, sys
reload(sys)
sys.setdefaultencoding('utf-8')

def pic(mxd_path, fc_path, fc2_name, ddp_FieldName, Export_NameField, output, rtion):
    if Export_NameField in ['', ' ', None]:
        Export_NameField = ddp_FieldName
    
    x = {}
    cursor = arcpy.SearchCursor(fc_path)                                    # 遍历 数据驱动要素的 驱动字段 和 文件命名字段组成 字典“x”
    for row in cursor:                                                      #
        x[row.getValue(ddp_FieldName)] = row.getValue(Export_NameField)     #
    pp = 0
    
    for pageName in x.keys():                                       # 循环 “x”
        mxd = arcpy.mapping.MapDocument(mxd_path)  # 调用gis工程
        df = arcpy.mapping.ListDataFrames(mxd)[0]       # 获取布局
        for lyr in arcpy.mapping.ListLayers(mxd, "", df):      # 获取要素图层
            if lyr.name == fc2_name:
                lyr.definitionQuery = u"{1} LIKE \'%{0}%\'".format(pageName, ddp_FieldName)    # 修改定义查询
        mxd.save()
    
        pageID = mxd.dataDrivenPages.getPageIDFromName(pageName)    # 以驱动字段 获取 pageID (驱动索引)
        mxd.dataDrivenPages.currentPageID = pageID                  # 数据驱动(跳转到 上述索引位置)
        arcpy.mapping.ExportToPNG(mxd, os.path.join(output, '{}.png'.format(x[pageName])), resolution=rtion)    # 导出 png
        pp += 1
    del mxd
    
if __name__ == '__main__':
    mxd_path = u"D:\\test\\csdn.mxd"  # 工程路径
    fc_path = u'E:\\test\\csdn_1.gdb\\分区'  # 驱动要素路径
    fc2_name = u'像控点_SpatialJoin'  # 像控点图层名称(在图层内显示的名称,不是要素名)
    ddp_FieldName = u'分区号'  # 数据驱动名称字段
    Export_NameField = u'分区号'  # 文件命名字段   # 可自定义,可与 数据驱动名称字段 保持一致,但本字段要素内必须有
    output = u'E:\\test\\图'  # 输出位置
    rtion = 100  # 输出像素

    pic(mxd_path, fc_path, fc2_name, ddp_FieldName, Export_NameField, output, rtion)

        这串代码内有 7 个变量需要获取对应的脚本参数:

mxd_path = u'D:\\test\\csdn.mxd'       # arcmap出图工程路径
fc_path = u'E:\\test\\csdn_1.gdb\\分区'        # 驱动要素路径
fc2_name = u'像控点_SpatialJoin'          # 像控点图层名称(在图层内显示的名称,不是要素名)
ddp_FieldName = u'分区号'                     # 数据驱动名称字段
Export_NameField = u'分区号'                # 输出文件命名字段   # 可自定义,可与 数据驱动名称字段 保持一致,但本字段要素内必须有
output = u'E:\\test\\图'                        # 输出位置
rtion = 100                        # 输出像素

        那么,就需要用到arcpy内获取脚本参数的函数了。修改后的变量赋值如下:

mxd_path = arcpy.GetParameterAsText(0)      # 工程路径
fc_path = arcpy.GetParameterAsText(1)       # 驱动要素路径
fc2_name = arcpy.GetParameterAsText(2)      # 像控点图层名称(在图层内显示的名称,不是要素名)
ddp_FieldName = arcpy.GetParameterAsText(3) # 数据驱动名称字段
Export_NameField = arcpy.GetParameterAsText(4)  # 文件命名字段   # 可自定义,可与 数据驱动名称字段 保持一致,但本字段要素内必须有
output = arcpy.GetParameterAsText(5)        # 输出位置
rtion = int(arcpy.GetParameterAsText(6))    # 输出像素

        这个地方我们用到的是(GetParameterAsText)函数来获取参数。它是用来获取文本格式参数的。若参数为勾选项(输入为布尔型的情况下),则使用(GetParameter)来获取。它用于获取布尔值。

       函数参数内的数值表示获取第几个参数。(脚本参数是以列表的格式返回,函数参数数值表示获取脚本参数列表的第几个)

        仅用这两个函数可以满足大部分简单工具需要。其他情况可查阅帮助文档。


        完成参数的输入后,下面就可以将python文件(.py格式文件)导入到脚本工具内了,注意python文件编码格式必须是ANSI,若在IDE内编写的代码建议将其复制到 txt 文件中,并另存为ANSI的编码格式的 .py 文件。如下图:

        


        下一步导入py文件:脚本处右键 --> 属性  --> 源 --> 选择 py 文件(可在创建自定义脚本工具时进行导入,文中为了逻辑顺序,将其放在此处)

        

        py文件就导入到脚本工具中了,但此时的 代码 和 工具 处于分别存放的状态,建议此时(右键脚本工具  --> 导入脚本),将代码导入到脚本工具中,此时 修改 py 文件的代码时就不会影像脚本工具了。同时也可以对脚本工具进行加密(加密方式 右键脚本工具  --> 设置密码)仅加密代码不会影响工具的使用。

        


三、脚本参数的配置

3.1.示例代码的参数设置

        在我们的演示代码中,一共有7个参数,分别如下,我们对其进行设置。如下图

mxd_path = arcpy.GetParameterAsText(0)      # 工程路径
fc_path = arcpy.GetParameterAsText(1)       # 驱动要素路径
fc2_name = arcpy.GetParameterAsText(2)      # 像控点图层名称(在图层内显示的名称,不是要素名)
ddp_FieldName = arcpy.GetParameterAsText(3) # 数据驱动名称字段
Export_NameField = arcpy.GetParameterAsText(4)  # 文件命名字段   # 可自定义,可与 数据驱动名称字段 保持一致,但本字段要素内必须有
output = arcpy.GetParameterAsText(5)        # 输出位置
rtion = int(arcpy.GetParameterAsText(6))    # 输出像素

       

        参数设置的说明

        (0)工程文件的路径:也就是arcmap文档 (.mxd 文件)。我们对其参数进行命名和数据类型的选择。

        (1)数据驱动要素:类型选择“要素图层”,因为设置成“要素图层”,可直接从内容列表内拖拽图层至脚本参数内,或从已有的图层内选择,若设置为“要素类”,则仅可从目录内选择,不够便捷。但“要素图层”也存在缺陷,会有少量工具的参数仅可为“要素类”,那么就应当对应的修改,游标的变量可为“要素图层”。

        (2)像控点图层名称:这个地方是输入一个图层的名称,为字符串,为在代码内修改定义查询,不是选择一个图层。

        (3)数据驱动名称字段:在数据驱动内设置为名称的字段,此参数为选择一个字段,那么我们就可以额外给他一个来源,从数据驱动要素内获取,如下:

        

        (4)略

        (5)输出文件的位置:就是导出的图片存放的位置。此处应选择一个文件夹(可设置为工作空间,工作空间包含文件夹、文件地理数据库、个人地理数据库等)

        (6)导出图片的像素大小:此处应输入一个整数,作为导出png函数的参数,数据类型可选择为“长整型”“字符串”,但仍需在代码内使用 int() 进行类型转换。

        “字符串”类型比较容易找到(对于作者来说),使用“长整型”的话,可将值域限制为数值,且可将参数设置成滚动条。

        


       

        BUG说明:ArcGIS 10.4版本(未测试其他版本)的脚本工具,在定义、修改参数后运行可能会存在下拉选择箭头丢失的情况。若出现此情况,保存完工具后重新启动 ArcGIS可解决。

        至此,示例代码及自定义脚本工具就配置好了,以下是其他的数据类型以及参数属性、参数验证的内容。


3.2.其他“数据类型”的介绍

        本节主要介绍常用的数据类型;

(1)文件or要素

  1. ArcMap文档:在目录中选择一个(.mxd)格式的工程文件;
  2. 工作空间:在目录中一个工作空间(文件/个人地理数据库,shp文件、cad文件、文件夹)。若需要选择要素数据集可使用“工作空间or要素数据集”;
  3. 要素图层:在目录中选择一个(要素类)或下拉选择一个图层内已加载的(要素图层)或拖拽入一个(要素图层);
  4. 要素类:在目录中选择一个(要素类);(shp文件拥有单独的“数据类型”Shapefile);
  5. 表:主要用于输入(文件/个人地理数据库内表)和(Excel内Sheet表),也可读取(.shp与要素类的属性表);
  6. 文件:在文件管理中选择一个任意格式的文件。可通过“过滤器”限制文件格式,如需要读取个excel表,则可在“过滤器”处 --> 下拉选择“文件”  --> 单击右侧出现的“...” --> 填入(xls)并确认。如果需要可选多个格式可使用英文的“;”进行分隔,如(xls;xlsx)。(gdb不适用文件的过滤器,请使用工作空间);
  7. 文件夹:在目录内选择一个文件夹;
  8. 栅格图层:与“2.要素图层”一致。

(2)字符

  1. 字符串:输入一串字符
  2. 双精度:输入带有小数位的数值(不可设置滚动条)
  3. 长整型:输入整数(可设置为滚动条)
  4. 日期:手动输入或选择一个日期
  5. 布尔型:输入一个布尔值(True(勾选)、False(未勾选)),选择此数据类型后参数自动变为勾选项,在代码内使用GetParameter获取值。

(3)其他

  1. 坐标系:选择一个坐标系(地理、投影、自定义)
  2. SQL表达式:字面意思,但必须选择“获取自”另一要素参数;
  3. 计算器表达式:字面意思,但必须选择“获取自”另一要素参数;

        3.2.1.滚筒条的设置

        注意:数据类型必须为“长整型”、双精度不可使用滚动条。

        

        3.2.2.下拉值列表选择的方法配置

        数据类型为“要素图层”、“字段”等均默认可下拉选择,数值、文本的数据类型可使用值列表的方式进行下拉选择。

        


3.3.“参数属性”的功能介绍

  1. 类型:分别为 必选(Required)、可选(Optional)、派生(Derived);前两个依据字面意思理解,表示该项参数为必须填写以及可以填写,派生一般用做输出参数;
  2. 方向:分别为 输入(Input)、输出(Output);大部分情况参数都作为输入参数,若作为输出,运行完成后该项可在运行结果窗口内查看;
  3. 多值:Yes(可在该参数内输入一组值)No(略);
  4. 默认:用于给该参数设置一个默认值,多值为Yes,默认值可通过“;”进行分隔;
  5. 环境:可以将参数的默认值设置为环境设置的值;
  6. 过滤器:可用于过滤文件格式、输入值的范围、值列表(参数下拉选择值)多过滤可用“;”进行分隔;
  7. 获取自:本项参数从其他参数内获取的可选值;
  8. 符号系统:作者不常用,略。

四、参数的验证

        参数验证可用于,对参数进行细致过滤检测、折叠参数(使用目录折叠或展开参数)、锁定参数(灰色无法填写的)、自定义消息(给出错误参数提示)。下面我们来逐个讲解:

4.1.锁定参数(灰色无法填写的)

        下面,我们有一个用于测试的脚本,有两个参数,需要做到参数1勾选的情况下,参数2可修改,参数1不勾选的情况下,参数2不可使用;

        

        需要通过编辑“验证”代码的updateParameters方法内编写锁定规则,如下:

    def updateParameters(self):
        # 判断参数0的值
        if self.params[0].value:
            # 如果为 Ture 则将参数1设置为可写
            self.params[1].enabled = True
        else:
            # 否则锁定参数1
            self.params[1].enabled = False
        return


        如此,我们就依据规则,将滚动条改为锁定的了,但会发现,在勾选 0 的情况下,修改了 参数 1 再取消勾选 0 ,会发现我们修改的参数被锁定了,但不为默认值(如下图)。那么如何修改锁定情况下使用默认值呢?

        

        代码如下:只需要在条件判断处添加赋值语句即可(若写入__init__内,则可作为设置默认值),此时,我们修改参数 1 再取消勾选后,会发现参数 1 又改回了默认值 10。

    def updateParameters(self):
        # 判断参数0的值
        if self.params[0].value:
            # 如果为 Ture 则将参数1设置为可写
            self.params[1].enabled = True
        else:
            # 修改参数1的值
            self.params[1].value = 10
            # 锁定参数
            self.params[1].enabled = False

4.2.参数的过滤与自定义消息

        例如下图自定义脚本,需要输入一个“点”类型的要素,但通过“数据类型”无法控制输入的要素类型。

        

        此时,我们就可通过arcpy的Describe获取要素的类型,并在验证的updateMessages方法内进行判断,若不为点要素则输出错误消息(鼠标移动到错误提示符号上查看)。代码与结果如下

    def updateMessages(self):
        # 获取参数0的shapeType
        fc_type = arcpy.Describe(self.params[0].value).shapeType
        # 判断
        if fc_type != 'Point':
            # 返回消息
            self.params[0].setErrorMessage("The parameter must be a point feature class.")
        return

        

        


4.3.参数分组、折叠

        例如,有4个参数,需要将0,1放在一个组里;2,3放在另一个组里边,并且可以折叠显示。我们可以在initializeParameters方法内对参数的类别进行定义,代码如下:

    def initializeParameters(self):
        self.params[0].category = 'list1'
        self.params[1].category = 'list1'
        self.params[2].category = 'list2'
        self.params[3].category = 'list2'
        return

        

        


五、脚本描述的编辑

        在目录窗口内右键脚本工具 --> 点击项目描述 --> 点击编辑(左上角)

        标题:显示在脚本工具窗口,“帮助”的最上方;

        摘要:显示在脚本工具窗口,“帮助”页内;

        参数(对话框说明):在脚本工具窗口,点击该参数时“帮助”页内显示。

        

        谢谢观看!!

评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值