Arcgis中创建Python脚本工具

news2024/11/16 22:25:22

文章目录

  • 创建工具步骤
    • 第一步:
    • 第二步:
    • 第三步:
  • 定义工具
    • 工具箱Toolbox
    • 工具类
      • 1、__init__
      • 2、getParameterInfo
      • 3、isLicensed
      • 4、updateParameters
      • 5、updateMessage
      • 6、execute
  • 进度条的使用
  • 代码

相比于自定义工具箱的源脚本和参数定义难以集中管理的缺点,在Python工具箱中,参数定义、代码验证和源代码都在同一位置进行处理,因而,Python 工具的创建和维护更加容易。此外,Python 工具箱支持脚本工具不支持的功能,例如值表、复合数据类型和自定义许可检查。Python 工具箱 (.pyt) 只是一个基于 ASCII 的文件,该文件定义了工具箱和一个或多个工具。
环境:ArcGis10.2

创建工具步骤

第一步:

在arcgis中任意选择一个文件夹,右键选择新建——Python Toolbox。
在这里插入图片描述

第二步:

编写工具内容,右键新建工具箱的菜单——Edit。这边打开默认是UTF-8编码的,此时如果里面存在中文可能会乱码,需要把txt另存为ANSI编码。
在这里插入图片描述

第三步:

Python工具箱打开后已经有了一个模板了,接下来只需要在相应的位置写自己的工具实现逻辑就行。写完后的样子,样例代码放在最后了
在这里插入图片描述

定义工具

工具箱Toolbox

__init__方法:定义了工具箱的属性,
self.label定义标签
self.alias定义别名
self.tools定义了包含的所有工具名称列表

工具类

工具类中共有以下六个方法:

1、init

必填信息。定义了工具属性
label:标注是工具的显示名称,如“目录”窗口 中所示
description:工具的描述
canRunInBackground:如果 canRunInBackground 取消设置或设置为 True,此工具将遵循地理处理选项 对话框中的当前后台处理 设置。

2、getParameterInfo

可选。定义了参数,每个参数用Parameter类创建对象。其中参数parameter属性:
displayName:工具对话框中显示的参数名称
name:Python 中的工具语法中显示的参数名称
datatype:每个 Python 工具箱的工具参数都有关联的数据类型。打开脚本工具对话框后,地理处理使用数据类型检查参数值。数据类型也可用于浏览数据 - 只有与参数数据类型匹配的数据才会显示在浏览对话框中。https://desktop.arcgis.com/zh-cn/arcmap/10.6/analyze/creating-tools/defining-parameter-data-types-in-a-python-toolbox.htm
parameterType:提供三种 parameterType 选项:
必选 - 必须提供值才能执行工具。
可选 - 不需要为参数提供值。
派生 - 该参数只适用于输出参数(请参阅下文的方向参数)。派生的输出参数不会显示在工具对话框中。
direction:该属性定义参数是工具的输入参数还是工具的输出参数。如果将 parameterType 设置为“派生”,则应将参数 direction 设置为“输出”。
multiValue:是否为多值参数。
filter:可以限定参数类型。
displayOrder:定义参数在工具框的显示顺序。
parameterDependencies:定义参数依赖性。

3、isLicensed

可选。可以控制许可行为,验证能否执行,检入检出许可。如果isLicensed方法返回False,则工具不能执行。如果该方法返回True或未使用该方法,则工具可以执行。

4、updateParameters

可选。定义了工具内部验证的过程,比如输入数据达到某个条件,则启用或者禁用某个参数,或者为某个参数设置默认值。

5、updateMessage

可选。在从内部验证例程返回后调用。您可以检查在内部验证过程中创建的消息并根据需要进行更改。

6、execute

必填信息,包含了工具执行逻辑,必要方法,只包括该方法也可以运行工具,但是没有参数界面。

进度条的使用

脚本中进度条使用

代码

import arcpy
import socket


class Toolbox(object):
    def __init__(self):
        """Define the toolbox (the name of the toolbox is the name of the
        .pyt file)."""
        self.label = "测试工具箱"
        self.alias = "测试"
        # List of tool classes associated with this toolbox
        self.tools = [Intersect, CalculateField]


class Intersect(object):
    def __init__(self):
        """Define the tool (tool name is the name of the class)."""
        # 初始化工具类
        self.label = "相交"
        self.description = "相交工具描述"
        self.canRunInBackground = False

    def getParameterInfo(self):
        # 定义工具的参数
        """Define parameter definitions"""
        in_features = arcpy.Parameter(displayName="输入要素",
                                      name="in_features",
                                      datatype="GPFeatureLayer",
                                      parameterType="Required",
                                      direction="Input",
                                      multiValue=True)
        in_features.filter.list = ["Polygon"]

        # Derived Output Features parameter
        out_features = arcpy.Parameter(
            displayName="输出要素",
            name="out_features",
            datatype="GPFeatureLayer",
            parameterType="输出",
            direction="Output")
        params = [in_features, out_features]
        return params

    def isLicensed(self):
        """Set whether tool is licensed to execute."""
        # 返回该工具是否获得执行许可。
        return True

    def updateParameters(self, parameters):
        """Modify the values and properties of parameters before internal
        validation is performed.  This method is called whenever a parameter
        has been changed."""
        # 在用户每次在工具对话框中更改参数时调用。从 updateParameters 返回后,地理处理将调用它的内部验证例程。
        return

    def updateMessages(self, parameters):
        """Modify the messages created by internal validation for each tool
        parameter.  This method is called after internal validation."""
        # 在从内部验证例程返回后调用。您可以检查在内部验证过程中创建的消息并根据需要进行更改。
        return

    def execute(self, parameters, messages):
        """The source code of the tool."""
        # 工具的源代码
        in_features = parameters[0].valueAsText
        out_feature = parameters[1].valueAsText
        arcpy.Intersect_analysis(in_features, out_feature)
        return


class CalculateField(object):
    def __init__(self):
        """Define the tool (tool name is the name of the class)."""
        self.label = "计算随机值"
        self.description = "计算随机值描述"
        self.canRunInBackground = False
        self.params = arcpy.GetParameterInfo()

    def getParameterInfo(self):
        """Define parameter definitions"""
        # 定义工具面板上的参数形式
        in_features = arcpy.Parameter(
            displayName="Input Features",
            name="in_features",
            datatype="GPFeatureLayer",
            parameterType="Required",
            direction="Input"
        )

        vt = arcpy.Parameter(
            name='summary_fields',
            displayName='融合字段',
            datatype='Field',
            direction='Input',
            parameterType='Optional',
            multiValue=True
        )
        vt.parameterDependencies = [in_features.name]

        out_features = arcpy.Parameter(
            displayName="输出要素",
            name="out_features",
            datatype="GPFeatureLayer",
            parameterType="输出",
            direction="Output")

        params = [in_features, vt, out_features]
        return params

    def isLicensed(self):
        """Set whether tool is licensed to execute."""
        r = socket.gethostbyname(socket.gethostname())
        if r == '192.168.2.58':
            return True
        return False

    def updateParameters(self, parameters):
        """Modify the values and properties of parameters before internal
        validation is performed.  This method is called whenever a parameter
        has been changed."""
        if parameters[0].altered:
            parameters[2].enabled = True
        else:
            parameters[2].enabled = False
        return

    def updateMessages(self, parameters):
        """Modify the messages created by internal validation for each tool
        parameter.  This method is called after internal validation."""
        try:
            if parameters[0].altered:
                field_names = []
                fields = arcpy.ListFields(parameters[0].valueAsText)
                for field in fields:
                    field_names.append(field.baseName.upper())
                if not ("BSM" in field_names):
                    parameters[0].setErrorMessage("输入要素必须包含 BSM 字段")
        except Exception as e:
            parameters[0].setErrorMessage(e.message)
        return

    def execute(self, parameters, messages):
        """The source code of the tool."""
        in_features = parameters[0].valueAsText
        out_feature = parameters[2].valueAsText
        arcpy.env.overwriteOutput = True
        arcpy.Copy_management(in_features, out_feature)
        arcpy.AddField_management(out_feature, 'RandomNum', 'LONG')
        arcpy.SetProgressor("default", "This is the default progressor")
        record_count = int(arcpy.GetCount_management(out_feature).getOutput(0))
        if record_count == 0:
            raise ValueError("{0} has no records to count".format(out_feature))
        increment = 1
        arcpy.SetProgressor("step", "Step progressor: Counting from 0 to {0}".format(record_count), 0, record_count,
                            increment)  # 方法主要有五个参数,p1-对话框名称类型;p2-消息字符串;p3-进度的最小值默认0,;p4-进度的最大值默认100;p5-步进值 一般情况为1
        with arcpy.da.UpdateCursor(out_feature, ["RandomNum", 'OID@']) as cursor:
            for row in cursor:
                row[0] = rando()
                cursor.updateRow(row)
                arcpy.SetProgressorLabel("Iteration: {0}".format(row[1]))  # 方法是处理进度中设置处理消息的方法
                arcpy.SetProgressorPosition()  # 步进的方法,处理改变进度时调用
        arcpy.SetProgressorPosition(record_count)
        arcpy.ResetProgressor()  # 将进度条重置为初始状态
        return


# 生成随机整数1-5
def rando():
    import random
    rand = int(random.uniform(1, 6))
    return rand

好记心不如烂笔头,写写记记罢了

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/96785.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

中国专利电子申请网站系统环境配置方法

一、在线平台使用环境要求 支持的操作系统、浏览器、office的版本如下,必须匹配对应的版本: 操作系统:WINDOWS XP、WINDOWS 7、WINDOWS 8 浏览器:IE8、IE9、IE10 文档编辑软件:OFFICE2003、OFFICE2007 强烈推荐使用中…

1. Maven基础

1. Maven简介 Maven是专门用于管理和构建Java项目的工具,它的主要功能有: 提供了一套标准化的项目结构 提供了一套标准化的构建流程(编译,测试,打包,发布……) 提供了一套依赖管理机制 1.1…

Allegro快速编辑丝印文字操作指导

Allegro快速编辑丝印文字操作指导 Allegro支持丝印文字的编辑,下面介绍快速编辑丝印文字的两种方法如下 以编辑下方丝印文字为例 方法一: 选择Text edit 命令 点击丝印文字,丝印会被高亮起来 输入需要更改后的文字,如下 右击选择done 文字被更改好了 方法二 选择se…

Function composition

In mathematics, function composition is an operation  ∘  that takes two functions f and g, and produces a function h g  ∘  f such that h(x) g(f(x)). In this operation, the function g is applied to the result of applying the function f to x. That is…

van-uplaoder保存文件到后端,回显后端接口返回的数据

实现功能:在移动端使用van-uploader组件上传图片,然后调用接口保存到后端数据库,提交保存信息成功后,调用另外的接口返回数据用来回显uploaded的文件,(一般正常的返回数据的接口是个图片地址,可…

15 CPP函数重载

函数重载的细节: 1 使用重载函数时,如果数据类型不匹配,C尝试使用类型转换与形参进行匹配,如果转换后有多个函数能匹配上,编译将报错。 2 引用可以作为函数重载的条件,但是调用重载函数的 时候&#xff0…

javaSE - 认识字符串(String class),String类里面方法的使用,下半部分

一、字符, 字节与字符串 1.1、字符与字符串之间进行转换 字符串内部包含一个字符数组,String 可以和 char[] 相互转换 将整个字符数组转换成字符串 public static void main(String[] args) {char[] chars {a,b,c,d,e,f,g};String str new String(chars);Sys…

Sulfo-NHS-SS-biotin,CAS:325143-98-4介绍,生物素双硫键琥珀酰亚胺

英文名称:Sulfo-NHS-SS-biotin 化学式:C19H27N4NaO9S4 分子量:606.7 CAS:325143-98-4 纯度:95% 储存条件:-20C 结构式: 简介:磺基NHS SS生物素是一种可切割试剂,用…

【剧前爆米花--爪哇岛寻宝】抽象类和接口(上)——理论及逻辑理解

作者:困了电视剧 专栏:《JavaSE语法与底层详解》 文章分布:这是一篇关于抽象类和接口的文章,在本篇文章中我会介绍其相关的定义和语法,并且揭示接口和抽象类的运行逻辑,提高对面对象编程的理解。 目录 抽象…

吴恩达week6 ~批量梯度下降 指数加权平均 动量梯度下降 学习率衰减 Adam

文章目录前言一、小批量梯度下降 mini-batch1、batch gradient descent2、stochastic gradient descent3、mini-batch gradient descent二、指数加权平均1.什么是指数加权平均2、理解指数加权平均3、与普通求平均值的区别4、指数加权平均的偏差修正三、gradient descent with m…

Allegro批量替换过孔类型操作指导

Allegro批量替换过孔类型操作指导 Allegro支持批量替换过孔类型,具体操作如下 例如需要把这些VIA10的过孔全部替换成VIA8的过孔 选择菜单上面的Tool-padstack-Group edit 右击选择temp Group 选中需要替换的过孔 选完之后右击选择complete 弹出Padstack Map窗口,modify…

java中多线程、并发、并行、线程与进程、线程调度、创建线程的方式

多线程: 多线程比单线程快,前面简单介绍过:集合如果是不安全的,那么它就是多线程的,了解多线程之前,先了解什么是并发和并行。 并发:指两个或多个事件在同一个时间段内发生。 并行&#xff1…

高通平台开发系列讲解(AtCoP篇)AtCoP架构简介

文章目录 一、ATCoP简介二、ATCoP架构三、流程沉淀、分享、成长,让自己和他人都能有所收获!😄 📢 本篇讲介绍高通ATCoP的架构。 一、ATCoP简介 ATCoP(AT Command Processor)是高通平台对于AT命令处理的模块,通过它,我们可以实现对AT命令的修改和新增。ATCoP接收从串口…

[附源码]Python计算机毕业设计公司办公自动化系统Django(程序+LW)

该项目含有源码、文档、程序、数据库、配套开发软件、软件安装教程 项目运行 环境配置: Pychram社区版 python3.7.7 Mysql5.7 HBuilderXlist pipNavicat11Djangonodejs。 项目技术: django python Vue 等等组成,B/S模式 pychram管理等…

跟大佬展开激励讨论String的不可变性

目录 大佬证明: 我的证明: 后续 什么是不可变? String为什么不可变 为什么要设计成为不可变的呢? 1.首先我们最先可以想到的Java主要做的就是安全 2.其次是字符串常量池的需要 String真的不可变吗? ps&#…

平淡无奇,2022年终总结

1前言 一年又一年,时间过得太快啦! 最近总是想着2022年的点点滴滴,一年时光不得写点什么不一样的,可是思前想后觉得这一年也没什么不一样的啊。所以呢,2022年终总结标题就取名为平淡无奇。 人一生最重要的是什么&#…

Java Servlet + H2数据库之集成环境配置

在 EclipseMavenTomcat 集成开发环境配置 搭建了一个Servlet的开发环境,整合Tomcat 作为Web容器。如何要加入数据库开发要怎么处理呢? 在实际开发中,一般会选择MySQL,Oracle 等数据库, 但是如果只是学习和演示&#x…

DPDK源码分析之网络基础知识

字节对齐 attribute ((aligned (1))); 在设计不同CPU下的通信协议时,或者编写硬件驱动程序时寄存器的结构这两个地方都需要按一字节对齐。即使看起来本来就自然对齐的也要使其对齐,以免不同的编译器生成的代码不一样. 如果跨越了4字节边界存储&#xff…

java之JVM的位置和体系结构

JVM的概念: JVM 即 Java Virtual Machine,中文名为 Java虚拟机,一般情况下,对于C/C 程序,编译成二进制文件后,就可以直接执行了,但Java 需要使用 javac 编译成 .class 文件,还需要使…