聊聊如何制作自定义ArcGIS Python工具箱

前言

       有时候手里就是闲不住,大好假期竟然无意休息。于是想和大家分享分享ArcGIS工具箱制作的一些经验。最先接触自定义工具箱制作是在大四,当时毕设就是写数字水印工具箱,但当时主要任务在于算法实现,所以工具箱的研究还是比较浅显,后面自己私下也做了比较深入的研究,下面直接进入主题。

自定义工具方法

       ArcGIS自定义工具制作可以分为两种,当然我是从Python这个角度出发。而这两种分别是“脚本工具”和“Python工具箱”,说到这里估计很多人蒙了,刚开始我也是蒙的。下面我简易的从开发层面来说一下他们的区别,以Pro为例:

       脚本工具的制作不是完全使用Python实现的,需要在Pro中先新建.atbx工具箱,然后在此工具箱中新建一个脚本,而脚本中的变量这些都需要手动设置,比如名称啊,类型啊关联关系等。核心实现可以通过导入Python脚本。而变量接收这块可以使用arcpy.GetParameterAsTextGetParameter,但是个人推荐前者。对于这一块不再多说,感兴趣的可以去官网查阅相关资料,特别全。

       Python工具箱则是完全使用Python实现,当然这里除去工具和工具箱说明。Python工具箱不需要手动去创建工具,变量设置等等,直接一套代码搞定所有。对于初学者比较推荐脚本工具,了解其调用原理后可转至Python工具箱。今天着重分享一下Python工具箱开发。

Python工具箱开发

       Python工具箱听其名便可知道里面可以包含多个工具。开发时直接新建个.py文件,下面放上官网模板。

# -*- coding: utf-8 -*-

import arcpy


class Toolbox(object):
    def __init__(self):
        """Define the toolbox (the name of the toolbox is the name of the
        .pyt file)."""
        self.label = "Toolbox"
        self.alias = ""

        # List of tool classes associated with this toolbox
        self.tools = [Tool]


class Tool(object):
    def __init__(self):
        """Define the tool (tool name is the name of the class)."""
        self.label = "Tool"
        self.description = ""
        self.canRunInBackground = False

    def getParameterInfo(self):
        """Define parameter definitions"""
        params = None
        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."""
        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."""
        return

    def postExecute(self, parameters):
        """This method takes place after outputs are outputs are processed and
        added to the display."""
        return

 

       上面说到Python工具箱中包含多个工具,而每个工具在脚本中其实就是一个类,比如示例中的Tool作为一个工具,可以再写的类为Tool2,属于另一个工具。而最顶层的Toolbox类属于整个工具箱的定义,可以定义其名称等,同时self.tools变量控制这个工具箱包含哪些工具。

       来说说单个工具中参数的定义。工具输入框等是在getParameterInfo函数中定义,通过定义变量,该方法详细参数可以直接在帮助文档中查看。

       定义变量之后,可以对变量进行特定设置,比如下面示例:


param1 = arcpy.Parameter(
    displayName="Hbase连接方式",
    name="hbase_con_type",
    datatype="GPString",
    parameterType="Required",
    direction="Input"
)
param1.filter.type = "ValueList"
param1.filter.list = ["配置文件", "连接信息"]
param1.value = "配置文件"

       上述示例定义了一个参数,而这个参数我想做成个下拉列表,列表中有两个值,在选择不同值时下面弹出的参数不同,这个参数就可以这样定义。而怎么控制下面参数的显隐?这就涉及到工具中另一个函数updateParameters

       再来说说参数状态更新。在上面下拉菜单选择的值不同时我想让有些参数不显示或者某些值为空,这就需要在updateParameters函数中编码了。

if parameters[1].valueAsText == "连接信息":
    parameters[2].enabled = True
    parameters[3].enabled = True
    parameters[4].enabled = True
    parameters[5].enabled = False
    parameters[5].value = None
elif parameters[1].valueAsText == "配置文件":
    parameters[5].enabled = True
    parameters[2].enabled = False
    parameters[2].value = None
    parameters[3].enabled = False
    parameters[3].value = None
    parameters[4].enabled = False
    parameters[4].value = None

       可以通过parameters获取参数,然后通过参数值来判断,最后设置其他参数的状态或者值,达到上面预期目标。

       updateMessages函数主要是用来当参数发生变化时进行验证的。比如下面示例:

# getParameterInfo函数中
param2 = arcpy.Parameter(
    displayName="Hbase连接地址",
    name="hbase_zk",
    datatype="GPString",
    parameterType="Optional",
    direction="Input"
)

param3 = arcpy.Parameter(
    displayName="Hbase节点信息",
    name="znode_parent",
    datatype="GPString",
    parameterType="Optional",
    direction="Input"
)

# updateMessages函数中
if parameters[1].valueAsText == '连接信息':
  if parameters[2].value is None:
      parameters[2].setIDMessage("ERROR", 735)
  if parameters[3].value is None:
      parameters[3].setIDMessage("ERROR", 735)

 

       在参数定义时定义了参数2和参数3为可选类型,但是当参数1的值为连接信息时想验证参数2和3的值是否为空,若为空提示参数为必填。那么便可以在updateMessages函数中加入判断逻辑,然后向参数中添加消息提示,这里MessageID 735特指参数类型为必填,具体代表的意思可在ArcGIS官方资料中查找。

 

       最后核心代码部分在execute函数中进行编写,也就是点击执行后工具运行的核心过程,这里就不多说了。

总结

       使用那种方式开发工具根据个人喜好,就个人而言初学时使用的脚本工具开发方式,后面理解后转入Python工具箱。此次分享为个人实践所得,若哪部分描述有问题可后台留言探讨。

       Python工具箱学会后感觉任何手工处理的都可以通过点选执行去完成,大大节省工作时间,感兴趣的小伙伴快自己也搞起来~

聊聊如何制作自定义ArcGIS Python工具箱icon-default.png?t=M85Bhttps://mp.weixin.qq.com/s/ptl5n-VZOVNhp4KcraG0sQ

<think>好的,用户现在是大一遥感专业的学生,学习数据库的主要目的是为了更好地将地理信息知识和计算机结合,暂时不急着面试。我需要根据之前的对话历史,继续提供适合他的建议。 首先,用户之前已经得到了一些通用的数据库学习建议,现在需要更具体地结合遥感和地信的需求。可能需要强调数据库在地理信息中的应用场景,比如空间数据管理、遥感影像存储等。 然后,用户作为大一学生,可能更关注如何将数据库与现有专业课程结合,避免学习过于理论或计算机专业的内容。需要推荐一些实际应用案例,比如使用PostGIS处理地理数据,或者结合Python进行数据分析。 还要考虑用户提到的“不急着面试”,所以学习资源应该偏向实用和项目实践,而不是面试准备。可以建议一些适合初学者的工具和库,比如QGIS、GDAL,以及如何用SQL管理空间数据。 另外,可能需要提醒用户注意空间数据库的特殊性,比如空间索引、坐标系统,这些在普通数据库中可能不涉及,但对地信非常重要。同时,结合编程语言如Python或JavaScript,展示数据库在GIS开发中的应用。 最后,保持轻松语气,鼓励用户从实际项目入手,比如开发简单的地图应用或数据分析项目,逐步积累经验。可能还需要推荐一些社区和资源,帮助他找到学习的方向和支持。</think>哈哈,遥感+地信+数据库?这个组合拳简直酷到没朋友!🌍💻 你未来可能是“用卫星数据拯救世界”的隐藏大佬啊(比如用数据库追踪森林变化、分析城市扩张什么的)。来,咱们直接上「遥感人专属数据库攻略」—— --- ### **🌱 阶段一:先抓「遥感+地信」的刚需场景** #### **🔍 灵魂拷问:为什么遥感需要数据库?** - **场景举例**: - 管理海量遥感影像(时间+空间+光谱多维数据,总不能全堆在硬盘里吧?) - 快速查询“某区域过去5年植被指数变化”(没有索引和SQL,Excel会卡到哭) - 结合GIS空间分析(比如用PostGIS缓冲区查询:“高速公路10公里内的农田”) #### **🚀 行动建议**: 1. **从「空间数据库」入手**: - 工具推荐:**PostgreSQL + PostGIS**(地信界扛把子,开源免费,B站教程一堆) - 新手任务:用SQL查“两个多边形是否相交”、“计算某点的最近邻设施”(比普通SQL多了空间函数!) 2. **玩转「时空数据」**: - 举个栗子🌰: 建一个带时间戳的遥感影像元数据表,包含拍摄时间、范围、卫星类型,然后写SQL查“2023年长江流域所有Landsat影像” - 隐藏技能:学**GeoJSON**格式(很多WebGIS用它传数据),试试用数据库存储和查询GeoJSON --- ### **🔧 阶段二:把数据库变成「遥感工具箱」的一部分** #### **📌 关键联动技能**: - **Python + 数据库**: - 用`geopandas`(地理版Pandas)从数据库读空间数据 → 分析 → 存回数据库 - 代码片段尝鲜: ```python import geopandas as gpd from sqlalchemy import create_engine # 从PostGIS读取数据 engine = create_engine('postgresql://user:密码@localhost:5432/数据库名') gdf = gpd.read_postgis("SELECT * WHERE ST_Area(geometry) > 1000", engine) # 分析后存回数据库 gdf.to_postgis('新表名', engine, if_exists='replace') ``` - **可视化助攻**: - 用QGIS直接连接数据库渲染空间数据(比ArcGIS更轻量) - 用Python的`folium`库把数据库查询结果变成交互式地图 --- ### **🚨 避坑指南:遥感萌新常踩的雷** - **雷区1**:把所有影像文件存数据库 → 数据库爆炸💥 → **正确姿势**:数据库只存影像元数据和路径,文件用文件系统或对象存储(如MinIO) - **雷区2**:忽略坐标系统(CRS) → 空间查询全错位 → **保命口诀**:建表时一定指定SRID(如WGS84=4326),用`ST_Transform`转换坐标系 - **雷区3**:用普通字符串存空间数据 → 无法空间运算 → **神器推荐**:**PostGIS的geometry类型**,支持点线面+空间关系判断(ST_Intersects、ST_Distance...) --- ### **🎯 实战小项目推荐(从易到难)** 1. **「城市变化监测」迷你版**: - 用数据库存储某城市不同年份的用地类型矢量数据 - 写SQL统计“2020-2023年耕地转建筑用地的面积” - 用Python生成变化热力图 2. **「遥感影像元数据管理系统」**: - 设计表结构:影像时间、范围、分辨率、卫星类型、存储路径... - 实现功能:按区域/时间/卫星筛选影像,导出为CSV/KML 3. **「灾害应急小助手」**: - 结合实时气象数据库 + 历史灾害数据 - 用空间SQL查“台风路径周边50公里的易涝区域” --- ### **📚 资源包精准投喂(遥感特供版)** - **书籍**: - 《PostGIS in Action》(有中文版《PostGIS实战》) - 《Python地理空间分析指南》(代码+数据库结合案例) - **教程**: - 【B站】“PostGIS空间数据库教程”(搜“星图云”UP主的系列) - 【GitHub】awesome-geospatial 仓库(一堆地信+数据库开源项目) - **数据源**: - 地理空间数据云(免费遥感影像) - OpenStreetMap(开源矢量数据,可导入数据库玩) --- ### **✨ 终极预言** 等你把数据库玩熟后,会发现: - 处理GNSS点位数据时,用SQL查“移动速度超过30km/h的点”比写循环快10倍 - 遥感与AI结合时,数据库能帮你高效管理训练样本的标注数据 - 如果未来搞科研,写论文时“数据管理”部分直接甩出ER图,导师眼前一亮!🌟 保持这个节奏——用数据库当粘合剂,把遥感的“空间思维”和计算机的“工程思维”焊死!🚀 遇到具体问题随时来聊~(比如怎么用索引加速空间查询,这坑我帮你填过!)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

AnywalkerGISer

加个鸡腿

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值