当前位置: 首页 > news >正文

让ArcMap变得更加强大,用python执行地理处理以及编写自定义脚本工具箱

文章目录

  • 一、用python执行地理处理工具
    • 1.1 例:乘以0.0001
    • 1.2 例:裁剪栅格
    • 1.3 哪里查看调用某工具的代码?
  • 二、用python批量执行地理处理工具
    • 2.1 必需的python语法知识
      • for循环语句
      • 缩进的使用
      • 注释的使用
    • 2.2 一个批处理栅格的代码模板
  • 三、创建自定义脚本工具箱
    • 3.1 自定义工具箱添加脚本工具
    • 3.2 python工具箱的创建
    • 3.3 中文乱码问题、pycharm调用arcpy
  • 推荐阅读

一、用python执行地理处理工具

ArcMap内置了python2的环境,我们可以在ArcMap中通过python脚本来运行地理处理工具
在这里插入图片描述

1.1 例:乘以0.0001

请添加图片描述

import arcpy
arcpy.gp.Times_sa(r"xxx.tif", 0.0001, r"xxx.tif")
inraster = r"S:\tut\0206\data\2010M1NDVI_int16.tif"
factor = 0.0001
outraster = r"S:\tut\0206\data\2010M1_NDVI_v2.tif"
arcpy.gp.Times_sa(inraster, factor, outraster)

1.2 例:裁剪栅格

请添加图片描述

import arcpy
inraster = r"S:\tut\0203\year NDVI\2010.tif"
mask = r"S:\tut\0204\subzone.shp"
outraster = r"S:\tut\0203\year NDVI\clip_2010.tif"
arcpy.Clip_management(inraster, "#", outraster, mask, "#", "ClippingGeometry")

1.3 哪里查看调用某工具的代码?

  • 右键某工具查看帮助文档
    在这里插入图片描述
  • 模型构筑器中导出代码(*推荐)
    将待执行的地理处理工具拖入模型构筑器中,设置好地理处理工具的相关参数后,在模型菜单后导出至python脚本,如下图所示
    在这里插入图片描述

二、用python批量执行地理处理工具

python基本语法 + arcpy调用地理处理工具 = 批处理代码

2.1 必需的python语法知识

for循环语句

  • 依次打印数字1-5
nums = [1,2,3,4,5] # nums = list(range(1,6)
for num in nums:print(num)
  • 打印当前文件夹中所有扩展名为.tif的文件名
import os  # 导入os库
in_folder = r"xxx" # 输入:文件夹的路径
for i in os.listdir(in_folder): # 遍历文件夹中的所有文件名if i.endswith(".tif"):     # 如果文件名以tif结尾print(i)                # 打印
  • 打印当前文件夹中所有扩展名为.tif的绝对路径
import os  # 导入os库
in_folder = r"xxx" # 输入:文件夹的路径for filename in os.listdir(in_folder):if filename.endswith(".tif"):print(os.path.join(in_folder, filename))

缩进的使用

与其他编程语言不同(代码缩进仅出于可读性的考虑),python中的缩进十分重要,若缩进使用错误,会报语法错误。

  • 例:判断整型变量num和20的大小关系
num = 25
if num >= 20:print('这个数字大于等于'+ str(num)+'.')
else num < 20:print('这个数字小于' + str(num) + '.')

注释的使用

C是用 //,而python中用 # 进行单行注释,如

in_folder = r"xxx" # 输入:待处理栅格文件所在的文件夹路径

在ArcMap调用python代码的过程,建议尽量避免在代码中出现中文字符(即使是注释部分)。


2.2 一个批处理栅格的代码模板

# params
in_path = r"xxx" # str
out_path = r"xxx" # str
prefix = "xx" # strrasters = [os.path.join(in_path,i) for i in os.listdir(in_path) if i.endswith(".tif")]
nums = len(rasters)
num = 1
for raster in rasters:raster_name = os.path.split(raster)[1]out_raster = os.path.join(out_path, prefix + raster_name)if not os.path.exists(out_raster):try:# 这里插入要批量执行的地理处理相关的代码arcpy.AddMessage("%d/%d | %s completed" % (num, nums, out_raster))except Exception as err:arcpy.AddMessage("%d/%d | %s errored, %s" % (num, nums, out_raster, err))else:arcpy.AddMessage("%d/%d | %s already exists" % (num, nums, out_raster))num = num + 1

练习:根据通用模板,实现批量乘功能

需要对某个文件夹中的所有栅格执行某个工具,共三步:

  • 复制模板

  • 修改 输入文件夹、输出文件夹、文件名前缀这三个变量

    ```python
    # params
    in_path = r"xxx" # str
    out_path = r"xxx" # str
    prefix = "xx" # str
    
  • 添加核心语句(python 调用某个地理处理工具的语句)

    # 例如
    arcpy.gp.Times_sa(raster, 0.0001, out_raster)
    

三、创建自定义脚本工具箱

该部分建议配合视频讲解一起看,让ArcMap变得更加强大,用Python编写自定义脚本工具箱

除了上述利用python脚本使用任何可用的工具以外,我们也可以创建自己的自定义工具。这些自定义工具可以用于执行特定的地理处理任务,并且更容易共享(有界面)。
请添加图片描述
ArcMap中创建工具箱有两种方法,分别为

  • 自定义工具箱(.tbx)
  • python工具箱(.pyt)

3.1 自定义工具箱添加脚本工具

可以在ArcToolbox的 自定义工具箱(.tbx) 中创建自定义的地理处理脚本工具,步骤主要有:

  1. 创建自定义工具箱(.tbx)

  2. 创建python脚本文件(.py)

核心:使用arcpy中的GetParameterAsText()函数来接受用户的动态输入

#!/usr/bin/python
# -*- coding: UTF-8 -*-import arcpy
from arcpy import env
import os
import time
import sys
reload(sys)
sys.setdefaultencoding('utf8')tifs = arcpy.GetParameterAsText(0)
masks = arcpy.GetParameterAsText(1)
out_dir = arcpy.GetParameterAsText(2)
tifs = tifs.split(";")
masks = masks.split(";")
names = [os.path.splitext(os.path.basename(mask))[0] for mask in masks]size = len(tifs) * len(masks)
num = 1
for i, mask in enumerate(masks):# create a new folder named by mask's namenew_folder = out_dir + os.sep + names[i]if not os.path.exists(new_folder):os.mkdir(new_folder)else:arcpy.AddMessage("Folder {0} already exists. Please check it.".format(new_folder))for tif in tifs:s = time.time()cliped_tif = os.path.join(new_folder, "{0}_{1}".format(names[i],os.path.split(tif)[1]))if not os.path.exists(cliped_tif):arcpy.Clip_management(tif, "#", cliped_tif, mask, "#", "ClippingGeometry")e = time.time()arcpy.AddMessage("{0}/{1} | {2} Completed, time used {3}s".format(num, size, cliped_tif, e - s))else:e = time.time()arcpy.AddMessage("{0}/{1} | {2} already exists.".format(num, size, cliped_tif))num += 1
  1. 设置工具参数
    请添加图片描述
  2. 创建工具描述和帮助文档
    请添加图片描述
  3. 导入脚本和保存工具箱

3.2 python工具箱的创建

python工具箱(.pyt)与ArcToolbox中的工具箱(.tbx)类似,但它完全是用python创建的,下面展示了pyt文件的代码模板

import arcpyclass 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 toolboxself.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 = Falsedef getParameterInfo(self):"""Define parameter definitions"""params = Nonereturn paramsdef isLicensed(self):"""Set whether tool is licensed to execute."""return Truedef updateParameters(self, parameters):"""Modify the values and properties of parameters before internalvalidation is performed.  This method is called whenever a parameterhas been changed."""returndef updateMessages(self, parameters):"""Modify the messages created by internal validation for each toolparameter.  This method is called after internal validation."""returndef execute(self, parameters, messages):"""The source code of the tool."""returndef postExecute(self, parameters):"""This method takes place after outputs are outputs are processed andadded to the display."""return

python脚本工具箱 (.pyt) 将参数、验证代码以及源代码封装在一起,在代码管理和版本控制方面更友好。

3.3 中文乱码问题、pycharm调用arcpy

请添加图片描述
解决ArcPy脚本工具中文乱码问题

如果想在pycharm中调用arcpy中的函数,添加下列代码:

import sys
arcpy_path = [r'C:\Program Files (x86)\ArcGIS\Desktop10.2\arcpy',r'C:\Program Files (x86)\ArcGIS\Desktop10.2\bin',r'C:\Program Files (x86)\ArcGIS\Desktop10.2\ArcToolbox\Scripts']#修改成Arcgis安装对应路径
sys.path.extend(arcpy_path)

推荐阅读

  • python 入门
    请添加图片描述
  • 面向ArcGIS的Python脚本编程【入门】
    请添加图片描述
  • 基于ArcGIS的Python编程秘笈(第2版)【进阶】
    请添加图片描述
  • Python 与开源GIS ——数据处理、空间分析与地图制图
    Python与开源GIS:数据处理、空间分析与地图制图 — 首页
    请添加图片描述

相关文章:

让ArcMap变得更加强大,用python执行地理处理以及编写自定义脚本工具箱

文章目录一、用python执行地理处理工具1.1 例&#xff1a;乘以0.00011.2 例&#xff1a;裁剪栅格1.3 哪里查看调用某工具的代码&#xff1f;二、用python批量执行地理处理工具2.1 必需的python语法知识for循环语句缩进的使用注释的使用2.2 一个批处理栅格的代码模板三、创建自定…...

SAP 项目实施阶段全过程

在sap实施项目的周期和步骤上&#xff0c;根据各公司对业务的理解不同&#xff0c;也被划分为各个阶段&#xff0c;但其中由普华永道提出的分七步走&#xff0c;个人觉得对刚进入这一行业的人很有帮助&#xff0c;接下来一起分享和讨论下&#xff1a; sap实施项目生命周期&…...

idea中的Maven导包失败问题解决总结

idea中的Maven导包失败问题解决总结 先确定idea和Maven 的配置文件settings 没有问题 找到我们本地的maven仓库&#xff0c;默认的maven仓库路径是在\C:\Users\用户名.m2下 有两个文件夹&#xff0c;repositotry是放具体jar包的&#xff0c;根据报错包的名&#xff0c;找对应文…...

REDIS中的缓存穿透,缓存击穿,缓存雪崩原因以及解决方案

需求引入一般在项目的开发中,都是使用关系型数据库来进行数据的存储&#xff0c;通常不会存在什么高并发的情况&#xff0c;可是一旦涉及大数据量的需求&#xff0c;比如商品抢购&#xff0c;网页活动导致的主页访问量瞬间增大&#xff0c;单一使用关系型数据库来保存数据的系统…...

数据库及缓存之MySQL(一)

思维导图 常见知识点 1.mysql存储引擎&#xff1a; 2.innodb与myisam区别&#xff1a; 3.表设计字段选择&#xff1a; 4.mysql的varchar(M)最多存储数据&#xff1a; 5.事务基本特性&#xff1a; 6.事务并发引发问题&#xff1a; 7.mysql索引&#xff1a; 8.三星索引&#xf…...

项目管理中,项目经理需要具备哪些能力?

项目经理是团队的领导者&#xff0c;是带领项目团队对项目进行策划、执行&#xff0c;完成项目目标&#xff0c;对于项目经理来说&#xff0c;想要有序推进项目&#xff0c;使项目更成功&#xff0c;光有理论知识是不够的&#xff0c;也要具备这些能力&#xff1a; 1、分清主…...

itk中的一些图像处理

文章目录1.BinomialBlurImageFilter计算每个维度上的最近邻居平均值2.高斯平滑3.图像的高阶导数 RecursiveGaussianImageFilter4.均值滤波5.中值滤波6.离散高斯平滑7.曲率驱动流去噪图像 CurvatureFlowImageFilter8.由参数alpha和beta控制的幂律自适应直方图均衡化9.Canny 边缘…...

Endless lseek导致的SQL异常

最近碰到同事咨询的一个问题&#xff0c;在执行一个函数时&#xff0c;发现会一直卡在那里。 strace抓了下发现会话一直在执行lseek&#xff0c;大致情况如下&#xff1a; 16:13:55.451832 lseek(33, 0, SEEK_END) 1368064 <0.000037> 16:13:55.477216 lseek(33, 0, SE…...

JUC-day01

JUC-day01 什么是JUC线程的状态: wait sleep关键字:同步锁 原理(重点)Lock接口: ReentrantLock(可重入锁)—>AQS CAS线程之间的通讯 1 什么是JUC 1.1 JUC简介 在Java中&#xff0c;线程部分是一个重点&#xff0c;本篇文章说的JUC也是关于线程的。JUC就是java.util .con…...

Mind+Python+Mediapipe项目——AI健身之跳绳

原文&#xff1a;MindPythonMediapipe项目——AI健身之跳绳 - DF创客社区 - 分享创造的喜悦 【项目背景】跳绳是一个很好的健身项目&#xff0c;为了获知所跳个数&#xff0c;有的跳绳上会有计数器。但这也只能跳完这后看到&#xff0c;能不能在跳的过程中就能看到&#xff0c;…...

数据库概述

20世纪60年代后期&#xff0c;就出现了数据库技术。取得成就如下&#xff1a;造就了四位图灵奖得主发展成为以数据建模和DBMS核心技术为主&#xff0c;内容丰富的一门学科。带动了一个巨大的软件产业-DBMS产品及其相关工具和解决方案。四个基本概念数据数据是数据库中存储的基本…...

【已解决】解决IDEA的maven刷新依赖时出现Connot reconnect错误

前言 小编我将用CSDN记录软件开发求学之路上亲身所得与所学的心得与知识&#xff0c;有兴趣的小伙伴可以关注一下&#xff01;也许一个人独行&#xff0c;可以走的很快&#xff0c;但是一群人结伴而行&#xff0c;才能走的更远&#xff01;让我们在成长的道路上互相学习&#…...

动态链接库(.so)文件的变编译和引用、执行

动态链接库(.so)文件的变编译和引用 动态链接库&#xff1a;SO&#xff08;Shared Object&#xff09;是一种动态链接库&#xff0c;也被称为共享库。它是一种可被多个程序共享使用的二进制代码库&#xff0c;其中包含已编译的函数和代码。与静态链接库不同&#xff0c;动态链接…...

linux(centos8)文件解压命令

linux解压命令tar 解压命令常用解压命令1 [.tar] 文件 解压到当前文件夹2 [.tar.gz] 文件 解压到当前文件夹3 [.tar] 解压到指定文件夹 -C 必须是大写unzip 解压命令常用解压命令1 [.zip]解压到当前文件夹2 [.zip] 解压到指定文件夹2 [.zip] 解压到指定文件夹&#xff08;强行覆…...

阅读笔记6——通道混洗

一、逐点卷积 当前先进的轻量化网络大都使用深度可分离卷积或组卷积&#xff0c;以降低网络的计算量&#xff0c;但这两种操作都无法改变特征图的通道数&#xff0c;因此需要使用11的卷积。总体来说&#xff0c;逐点的11卷积有如下两点特性&#xff1a; 可以促进通道之间的信息…...

上海亚商投顾:沪指失守3300点 卫星导航概念全天强势

上海亚商投顾前言&#xff1a;无惧大盘涨跌&#xff0c;解密龙虎榜资金&#xff0c;跟踪一线游资和机构资金动向&#xff0c;识别短期热点和强势个股。市场情绪指数早间低开后震荡回升&#xff0c;沪指盘中一度翻红&#xff0c;随后又再度走低&#xff0c;创业板指午后跌近1%。…...

疯狂的SOVA:Android银行木马“新标杆”

2021年8月初&#xff0c;一款针对Android银行APP的恶意软件出现在人们的视野中&#xff0c;ThreatFabric 安全研究人员首次发现了这一木马&#xff0c;在其C2服务器的登录面板&#xff0c;研究人员发现&#xff0c;攻击者将其称之为SOVA。 ** SO** ** V** ** A简介** 在俄语中…...

汽车零部件企业数字工厂管理系统建设方案

在汽车零部件制造领域&#xff0c;伴随工业信息化与机器人化&#xff0c;制造模式逐渐从 CAD/CAE/CAM 数字化设计及加工走向全产品周期虚拟现实的数字化工厂管理系统平台&#xff0c;实现虚拟现实设计制造&#xff0c;防范产品缺陷并预防设备故障&#xff0c;大幅提高生产效率。…...

【线程同步工具】Semaphore源码解析

控制对资源的一个或多个副本的并发访问 Java API 提供了一种信号量机制 Semaphore。 一个信号量就是一个计数器&#xff0c; 可用于保护对一个或多个共享资源的访问。 当一个线程要访问多个共享资源中的一个时&#xff0c;它首先需要获得一个信号量。如果信号量内部的计数器的…...

获取实时天气

一、用天气API&#xff08;需要付费&#xff09; 网址&#xff1a;https://www.tianqiapi.com/请求方式及url&#xff1a;请求方式&#xff1a;GET接口地址&#xff1a;https://tianqiapi.com/free/day请求示例https://www.tianqiapi.com/free/day?appid_____&appsecret__…...

2025年能源电力系统与流体力学国际会议 (EPSFD 2025)

2025年能源电力系统与流体力学国际会议&#xff08;EPSFD 2025&#xff09;将于本年度在美丽的杭州盛大召开。作为全球能源、电力系统以及流体力学领域的顶级盛会&#xff0c;EPSFD 2025旨在为来自世界各地的科学家、工程师和研究人员提供一个展示最新研究成果、分享实践经验及…...

五年级数学知识边界总结思考-下册

目录 一、背景二、过程1.观察物体小学五年级下册“观察物体”知识点详解&#xff1a;由来、作用与意义**一、知识点核心内容****二、知识点的由来&#xff1a;从生活实践到数学抽象****三、知识的作用&#xff1a;解决实际问题的工具****四、学习的意义&#xff1a;培养核心素养…...

OPenCV CUDA模块图像处理-----对图像执行 均值漂移滤波(Mean Shift Filtering)函数meanShiftFiltering()

操作系统&#xff1a;ubuntu22.04 OpenCV版本&#xff1a;OpenCV4.9 IDE:Visual Studio Code 编程语言&#xff1a;C11 算法描述 在 GPU 上对图像执行 均值漂移滤波&#xff08;Mean Shift Filtering&#xff09;&#xff0c;用于图像分割或平滑处理。 该函数将输入图像中的…...

深度学习习题2

1.如果增加神经网络的宽度&#xff0c;精确度会增加到一个特定阈值后&#xff0c;便开始降低。造成这一现象的可能原因是什么&#xff1f; A、即使增加卷积核的数量&#xff0c;只有少部分的核会被用作预测 B、当卷积核数量增加时&#xff0c;神经网络的预测能力会降低 C、当卷…...

并发编程 - go版

1.并发编程基础概念 进程和线程 A. 进程是程序在操作系统中的一次执行过程&#xff0c;系统进行资源分配和调度的一个独立单位。B. 线程是进程的一个执行实体,是CPU调度和分派的基本单位,它是比进程更小的能独立运行的基本单位。C.一个进程可以创建和撤销多个线程;同一个进程中…...

在 Spring Boot 项目里,MYSQL中json类型字段使用

前言&#xff1a; 因为程序特殊需求导致&#xff0c;需要mysql数据库存储json类型数据&#xff0c;因此记录一下使用流程 1.java实体中新增字段 private List<User> users 2.增加mybatis-plus注解 TableField(typeHandler FastjsonTypeHandler.class) private Lis…...

AI语音助手的Python实现

引言 语音助手(如小爱同学、Siri)通过语音识别、自然语言处理(NLP)和语音合成技术,为用户提供直观、高效的交互体验。随着人工智能的普及,Python开发者可以利用开源库和AI模型,快速构建自定义语音助手。本文由浅入深,详细介绍如何使用Python开发AI语音助手,涵盖基础功…...

WPF八大法则:告别模态窗口卡顿

⚙️ 核心问题&#xff1a;阻塞式模态窗口的缺陷 原始代码中ShowDialog()会阻塞UI线程&#xff0c;导致后续逻辑无法执行&#xff1a; var result modalWindow.ShowDialog(); // 线程阻塞 ProcessResult(result); // 必须等待窗口关闭根本问题&#xff1a…...

DAY 26 函数专题1

函数定义与参数知识点回顾&#xff1a;1. 函数的定义2. 变量作用域&#xff1a;局部变量和全局变量3. 函数的参数类型&#xff1a;位置参数、默认参数、不定参数4. 传递参数的手段&#xff1a;关键词参数5 题目1&#xff1a;计算圆的面积 任务&#xff1a; 编写一…...

篇章二 论坛系统——系统设计

目录 2.系统设计 2.1 技术选型 2.2 设计数据库结构 2.2.1 数据库实体 1. 数据库设计 1.1 数据库名: forum db 1.2 表的设计 1.3 编写SQL 2.系统设计 2.1 技术选型 2.2 设计数据库结构 2.2.1 数据库实体 通过需求分析获得概念类并结合业务实现过程中的技术需要&#x…...