ArcGIS10.x系列 Python工具箱教程

news2025/2/21 22:37:16

ArcGIS10.x系列 Python工具箱教程

目录

1.前提

2.需要了解的资料

3.Python工具箱制作教程

4. Python工具箱具体样例代码(DEM流域分析-河网等级矢量化)


1.前提

        如果你想自己写Python工具箱,那么假定你已经会ArcPy,如果只是自己用,完全没有必要,直接脚本运行。如果是给其他人用,为了简洁明了,适用这里。Python工具箱10.2无法加密,但是工具箱+Script脚本是可以加密的。10.5以上Python工具箱可加密。

        本文只介绍Python工具箱,对于工具箱+Script脚本不是特别推荐!

2.需要了解的资料

        Python工具箱需要知道哪些内容?

        [1]Python工具箱 代码模板 (可自己新建Python工具箱 编辑查看代码)

        [2]Arcpy.Parameter (重要*****)

        [3]Python工具箱 输入参数类型(data_type) (重要*****)

        [4]在 Python 工具箱中定义工具

        [5]定义 Python 工具箱中的参数 (重要*****)

3.Python工具箱制作教程

        [1]新建python工具箱

        

        [2]右击 新建的Python工具箱 编辑

        

        [3] 随后txt打开了代码,复制所有代码到py文件中,我这里用的vscode连接arcgis python2.7        

        如上图所示,Python工具箱模板。需要关注的有上述箭头部分。

        [4]待代码写完后,将代码复制到 “编辑” 的Python工具箱,然后另存为,选择编码格式“ANSI”,替换!

        ----------------------------------------------------------------------------------------------------------

小细节:

        ①Python工具箱不好调试,print无法输出信息,一般采用arcpy.AddMessage、arcpy.AddError输出信息;

        ②然后parameters[0].value  .valueAsText这些都是arcpy.parameter的属性,查看我提供的Parameter官网介绍即可。

        ③注意中文格式,设置utf-8,另存ANSI格式。

        ④着重看给的 资料链接 [2]、[3]、[5] 官网说的很明白(中英文可切换),再结合我的样例代码,就很快理解了!

        ----------------------------------------------------------------------------------------------------------

4. Python工具箱具体样例代码(DEM流域分析-河网等级矢量化)

# 设置中文环境 对于中文字符串 前面加u  打印时 需要在字符串后加 .decode('utf-8')
import sys
defalutencoding = 'utf-8'
if sys.getdefaultencoding() != defalutencoding:
    reload(sys)
    sys.setdefaultencoding(defalutencoding)

import os
import arcpy
from arcpy import env
from arcpy.sa import *  #arcpy栅格计算的基本计算器,高级复杂的在arcpy.gp中

# 定义函数
def check_exists_and_delete(dataset_name):
    # 前提已经设置了env.workspace, 检测存在即删除
    if arcpy.Exists(dataset_name):
        arcpy.Delete_management(dataset_name)
        print(u'已删除:'+str(dataset_name))
        return
    return

class Toolbox(object):
    def __init__(self):
        """Define the toolbox (the name of the toolbox is the name of the
        .pyt file)."""
        self.label = "Python工具箱-流域分析"
        self.alias = "Python工具箱-流域分析"
        # 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 = "流域分析"
        self.description = "流域分析要求数据在gdb中操作!只需导入DEM,即可完成填洼-流向-流量-河网-河网分级-分级矢量化。依次生成的结果名称为输入DEM名称+_填洼"
        self.canRunInBackground = False

    def getParameterInfo(self):
        """Define parameter definitions"""
        param_gdb = arcpy.Parameter(
            displayName = "请输入工作空间(GDB):",
            name = "in_workspace",
            datatype = "DEWorkspace",
            parameterType = "Required",
            direction="Input"
        )
        param_gdb.value = env.workspace

        param_dem = arcpy.Parameter(
            displayName="请输入或选择DEM图层:",
            name="in_dem",
            datatype="GPRasterLayer", # , "DERasterDataset", "GPRasterDataLayer"
            parameterType="Required",
            direction="Input",
        )
        
        param_threshold = arcpy.Parameter(
            displayName="请输入河网分级整型阈值(大于):",
            name="in_threshold",
            datatype="GPLong",
            parameterType="Required",
            direction="Input",
        )
        param_threshold.value = 1000

        params = [param_gdb, param_dem, param_threshold]
        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):
        arcpy.CheckOutExtension("Spatial")  # 必须执行,否则默认不打开??
        env.workspace = parameters[0].valueAsText
        # 相关操作在 系统工具箱->Spatial Analyst Tools->水文分析or地图代数
        # 2.DEM填洼
        DEM_Name = os.path.basename(parameters[1].valueAsText)            # 3-需要修改成自己的DEM名称
        arcpy.AddMessage(u"正在处理DEM图层:" + DEM_Name)
        DEM_TianWa_Name = DEM_Name + u"_填洼"                             # 注意 不能有- 可以是_
        outFill = Fill(DEM_Name)
        check_exists_and_delete(DEM_TianWa_Name)
        outFill.save(DEM_TianWa_Name)
        print(u"完成填洼".decode('utf-8'))
        arcpy.AddMessage(u"完成填洼")

        # 3.DEM流向  根据填洼结果 来计算
        DEM_LiuXiang_Name = DEM_Name + u"_流向"
        outFlowDirection = FlowDirection(DEM_TianWa_Name)
        check_exists_and_delete(DEM_LiuXiang_Name)
        outFlowDirection.save(DEM_LiuXiang_Name)
        print(u"完成流向".decode('utf-8'))
        arcpy.AddMessage(u"完成流向")

        # 4.DEM流量 根据流向结果 来计算
        DEM_LiuLiang_Name = DEM_Name + u"_流量"
        outFlowAccumulation = FlowAccumulation(DEM_LiuXiang_Name)
        check_exists_and_delete(DEM_LiuLiang_Name)
        outFlowAccumulation.save(DEM_LiuLiang_Name)
        print(u"完成流量".decode('utf-8'))
        arcpy.AddMessage(u"完成流量")

        # 5.DEM河网 根据流量 来计算  (arcpy脚本不允许使用RasterCalculator)
        DEM_HeWang_Name = DEM_Name + u"_河网"
        threshold = parameters[2].value                                                  # 4-需要修改成自己的流量阈值
        raster = DEM_LiuLiang_Name
        out_A_Calculator = Con(Raster(raster) > threshold, 1)
        check_exists_and_delete(DEM_HeWang_Name)
        out_A_Calculator.save(DEM_HeWang_Name)
        print(u"完成河网".decode('utf-8'))
        arcpy.AddMessage(u"完成河网")

        # 6.DEM河网分级 根据河网 流向结果 来计算
        DEM_HeWang_FenJi_Name = DEM_Name + u"_河网分级"
        outStreamOrder = StreamOrder(DEM_HeWang_Name, DEM_LiuXiang_Name, "STRAHLER") # STRAHLER分级方法 更合适
        check_exists_and_delete(DEM_HeWang_FenJi_Name)
        outStreamOrder.save(DEM_HeWang_FenJi_Name)
        print(u"完成河网分级".decode('utf-8'))
        arcpy.AddMessage(u"完成河网分级")

        # 6.1 DEM河网分级后栅格结果  矢量化 
        DEM_HeWang_FenJi_SHP_Name = DEM_Name + u"_河网分级矢量"
        check_exists_and_delete(DEM_HeWang_FenJi_SHP_Name)
        StreamToFeature(DEM_HeWang_FenJi_Name, DEM_LiuXiang_Name, DEM_HeWang_FenJi_SHP_Name, "NO_SIMPLIFY")
        print(u"完成河网分级矢量化".decode('utf-8'))
        arcpy.AddMessage(u"完成河网分级矢量化")

        return

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

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

相关文章

在PostGIS中进行点数据的等值线提取

说明 介绍在PostGIS中从点数据提取等值线。 关键字: raster、point、PostGIS、等值线 环境准备 Postgresql版本:PostgreSQL 14.0, 64-bitPostGIS版本:POSTGIS"3.3.2"QGIS版本:3.28.3-Firenze(验证用&…

01.vue3大事件——项目初始化、技术介绍

后台数据管理系统 - 项目架构设计 在线演示:https://fe-bigevent-web.itheima.net/login 接口文档: https://apifox.com/apidoc/shared-26c67aee-0233-4d23-aab7-08448fdf95ff/api-93850835 接口根路径: http://big-event-vue-api-t.itheima.net 本项…

PubMedBERT:生物医学自然语言处理领域的特定预训练模型

今年大语言模型的快速发展导致像BERT这样的模型都可以称作“小”模型了。Kaggle LLM比赛LLM Science Exam 的第四名就只用了deberta,这可以说是一个非常好的成绩了。所以说在特定的领域或者需求中,大语言模型并不一定就是最优的解决方案,“小…

PyEcharts-Faker的介绍

1 PyEcharts-Faker from pyecharts.faker import Faker方法属性说明对应内容Faker.clothes[“衬衫”, “毛衣”, “领带”, “裤子”, “风衣”, “高跟鞋”, “袜子”]Faker.values()[106, 111, 145, 33, 20, 138, 141]Faker.drinks[“可乐”, “雪碧”, “橙汁”, “绿茶”,…

vue随意置换页面元素位置

写在前面,博主是个在北京打拼的码农,从事前端工作5年了,做过十多个大大小小不同类型的项目,最近心血来潮在这儿写点东西,欢迎大家多多指教。 对于文章中出现的任何错误请大家批评指出,一定及时修改。有任何…

特殊作业安全管理系统——实现特殊作业全过程有效监控管理

特殊作业安全管理系统是一套专门针对特殊作业环节进行全面管理的系统。它旨在确保在特殊作业过程中,从计划、审批到执行、监控等各个环节都能得到有效的管理和控制。 一、系统概述 特殊作业管理系统基于互联网技术构建,实现作业票电子化,它集…

part_three:多媒体信息管理技术和软通信与网络技术

文章目录 一、超媒体与web系统背景(为什么引入超媒体)概念与传统文本的不同分布式超媒体系统WWW(world wide web)SGML (Standard General Markup Language)HTML (HyperText Markup Language)XML (eXtensible Markup Language)HTTP…

设计并实现一个小型银行系统,使用Java面向对象编程技术

在某个社交平台上刷到了,大学生的一个小练习,关于编写一个小的银行案例,下面具体分享一下代码,希望大佬多来指正,我们互相学习。 基本要求:类设计:Account类: 包含账户ID、余额、账户类型等属性,以及存款、…

【开源】基于JAVA的天然气工程业务管理系统

项目编号: S 021 ,文末获取源码。 \color{red}{项目编号:S021,文末获取源码。} 项目编号:S021,文末获取源码。 目录 一、摘要1.1 项目介绍1.2 项目录屏 二、功能模块三、使用角色3.1 施工人员3.2 管理员 四…

超声波清洗机可以干嘛、比较推荐的超声波清洗机

超声波清洗机是一种神奇的家用电器,它可以通过高频振动将物体表面的污渍和细菌清洗干净。可以把眼镜放在超声波清洗机里,只需几分钟,就可以将眼镜上的污渍和细菌清洗得干干净净,不单可以清洗眼镜,像生活中的一些小物件…

安全风险综合监测预警平台建设指南(2023 版)》正式发布,汉威科技方案领跑行业

11月24日,国务院安委会办公室印发《城市安全风险综合监测预警平台建设指南(2023版)》(以下简称“指南”),引发行业密切关注。 据悉,“指南”在总结前期18 个试点城市(区)…

idea 快速选择类文件内的方法名或全局变量

IDEA快速生成lambda表达式的方法-CSDN博客 上面这个链接的标题可能不对

Spring框架体系及Spring IOC思想

目录 Spring简介Spring体系结构SpringIOC控制反转思想自定义对象容器Spring实现IOCSpring容器类型容器接口容器实现类对象的创建方式使用构造方法使用工厂类的方法使用工厂类的静态方法对象的创建策略对象的销毁时机生命周期方法获取Bean对象的方式通过id/name获取通过类型获取…

activiti工作流 定义 TaskListener 无效

使用activiti 5.22 想全局定义任务监听器,结果试了多次发现没有效果。 最后看了看activiti的相关源码发现,流程定义里边没有处理 TaskListener 相关的操作,发现TaskListener 处理是在Task里边处理的,所以把TaskListener 定义在Ta…

vue.js如何根据后台返回来的图片url进行图片下载

原创/朱季谦 最近在做一个前端vue.js对接的功能模块时,需要实现一个下载图片的功能,后台返回来的是一串图片url,试了很多种方法,发现点击下载时出来的效果,都是跳到一个新的图片网页,后来经过一番琢磨&…

在vue页面中添加组件到底有多方便

修改vue写的前端页面到底有多方便?如果熟练的话,出乎你想象的快。 原来的页面:/admin/stock 原来的文件地址:src\views\admin\stock\Stock.vue 另一个页面有个入库功能,需要转移到上面的页面中: 路径&…

01-AI大模型智能客服 V0.1「上」

你好,我是悦创。 首发:https://mp.weixin.qq.com/s/6MTkpWZCEbFWOcUn0Vexvw V0.1 版本我将分为上中下三篇进行书写和发布,欢迎分享和我微信进讨论群:Jiabcdefh。 计划: 会迭代好几个版本,看阅读量和点赞…

A100 A800 H100 H800 模块

老美对A100、A800、H100和H800在内的多款AI芯片实施了出口限制, 目前,具体限制的时长并没有明确的公开信息。 科研人员在面对此类限制 ,可能需要寻找替代的供应渠道,加强国内外合作, 或者加大在本土技术研发的投入&a…

数据结构 | 堆排序

数据结构 | 堆排序 文章目录 数据结构 | 堆排序建立大堆排序结果以及全部代码 如果没有看过堆的实现的话可以先看前面的一章堆的实现,然后再来看这个堆排序,都是比较简单的~~ 这里堆排序首先建堆,建堆是要建小堆还是大堆呢? 在堆排…

cpp中虚实继承问题

1.一个基类base,被类a虚继承,类a被其他的类继续继承,那么base中的初始化必须由派生类的最后一个完成,其中任意一个都不能代替完成基类,如果在最后一个派生类里不进行这个base的初始化,那么就会调用相应的无…