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

news2024/11/29 22:35:34

文章目录

  • 一、用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" # str

rasters = [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 name
    new_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 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脚本工具箱 (.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:数据处理、空间分析与地图制图 — 首页
    请添加图片描述

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

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

相关文章

数组中的各种迭代API方法手写

js的数组上有很多实用的方法&#xff0c;不论是在遍历数组上&#xff0c;还是在操作数组内元素上&#xff0c;它有许多不同的遍历数组的方法&#xff0c;同时它还有着可以直接操作数组中间元素的方法。 接下来&#xff0c;我来带大家手写数组里的 遍历方法 。 Array.forEach(…

Elasticsearch在Linux中的单节点部署和集群部署

目录一、Elasticsearch简介二、Linux单节点部署1、软件下载解压2、创建用户3、修改配置文件4、切换到刚刚创建的用户启动软件5、测试三、Linux集群配置1、拷贝文件2、修改配置文件3、分别修改文件所有者4、启动三个软件5、测试四、问题总结1、在elasticsearch启动时如果报错内存…

【黑盒模糊测试】路由器固件漏洞挖掘实战--AFL++ qemu_mode

前言 很久之前就想写AFL++的qemu_mode了,只是模糊测试专题的文章有些过于耗费时间,加上工作原因导致一直搁置。最近需要出差会用到黑盒模糊测试,所以就当做复习一遍,我记得Fuzzing 101也有一个qemu_mode的练习,有空的话下一篇文章更新吧~ 编写不易,如果能够帮助到你,希望…

金三银四软件测试面试如何拿捏面试官?【接口测试篇】

九、接口测试 9.1 接口测试怎么测 &#xff08;jmeter版本&#xff09; 首先开发会给我们一个接口文档&#xff0c;我们根据开发给的接口文档&#xff0c;进行测试点的分析&#xff0c;主要是考虑正常场景与异常场景&#xff0c;正常场景&#xff0c;条件的组合&#xff0c;…

前端vue实现获取七天时间和星期几功能

前端vue实现获取七天时间和星期几功能 功能展示代码 <div v-for"(item,index) in same_week" :class"[same_dayitem.date? activ :,dis]" click"select(item)" :keyindex><span>{{item.name}}</span><span>{{item.…

[技术经理]01 程序员最优的成长之路是什么?

00前言 谈起程序员的职业规划&#xff0c;针对大部分的职场人士&#xff0c;最优的成长之路应该是走技术管理路线&#xff0c;而不是走技术专家路线。 01关键的一步 中国自古就有“学而优则仕”的传统&#xff0c;发展到今天&#xff0c;在我们的现代企业里面&#xff0c;尤…

【JavaEE初阶】第一节.多线程(进阶篇 ) 常见的锁策略、CAS及它的ABA问题

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 前言一、常见的锁策略 1.1 乐观锁 vs 悲观锁 1.2 普通的互斥锁 vs 读写锁 1.3 重量级锁 vs 轻量级锁 1.4 自旋锁 vs 挂起等待锁 1.5 公平…

Mac - Spotlight(聚焦)

文章目录一、Mac 中 Spotlight 的使用1、调用/打开 Spotlight2、执行搜索3、Spotlight 设置二、Mac 上的 Spotlight 开发1、关于 Spotlight2、使用 NSMetadataQuery 搜索示例三、mds 和 fsevents四、命令行访问 Spotlight五、Core Spotlight Framework六、Spotlight 插件相关资…

拼多多订单查询

下载地址webcrawl最新版本下载、安装、运行教程使用场景场景一我有很多个拼多多的买家号&#xff0c;想通过一个订单编号&#xff0c;查询该订单的各种信息&#xff0c;如订单状态&#xff0c;收件信息&#xff0c;物流信息&#xff0c;售后信息&#xff0c;联系商家场景二有很…

unix高级编程-fork和execve

fork和vfork vfork是老的实现方法又很多问题 vfork #include <sys/types.h> #include <unistd.h> #include <stdlib.h> #include <stdio.h> #include <string.h> #include <signal.h> #include <errno.h> #include <sys/stat.…

AQS-ReentrantLock

一、AQS 在 Lock 中&#xff0c;用到了一个同步队列 AQS&#xff0c;全称 AbstractQueuedSynchronizer&#xff0c;它是一个同步工具&#xff0c;也是 Lock 用来实现线程同步的核心组件。 1.AQS 的两种功能 独占和共享。 独占锁&#xff1a;每次只能有一个线程持有锁&#x…

Git 分支操作

1&#xff1a;什么是分支几乎所有的版本控制系统都以某种形式支持分支。 使用分支意味着你可以把你的工作从开发主线上分离 开来进行重大的Bug修改、开发新的功能&#xff0c;以免影响开发主线。 几乎所有的版本控制系统都以某种形式支持分支。 使用分支意味着你可以把你的工作…

2023“Java基础-中级-高级”面试集结,已奉上我的膝盖

Java基础&#xff08;对象线程字符接口变量异常方法&#xff09; 面向对象和面向过程的区别&#xff1f; Java 语言有哪些特点&#xff1f; 关于 JVM JDK 和 JRE 最详细通俗的解答 Oracle JDK 和 OpenJDK 的对比 Java 和 C的区别&#xff1f; 什么是 Java 程序的主类&…

GLOG如何控制输出的小数点位数

1 问题 在小白的蹩脚翻译演绎型博文《GLOG从入门到入门》中&#xff0c;有位热心读者提问说&#xff1a;在保存日志时&#xff0c;浮点型变量的小数位数如何设置&#xff1f; 首先感谢这位“嘻嘻哈哈的地球人”赏光阅读了小白这不太通顺的博客文章&#xff0c;并提出了一个很…

红旗语音助手HMI设计流程之调研篇

红旗智能语音助手是基于红旗4.0智能化平台打造的场景设计研究成果。本篇文章&#xff0c;将会以红旗语音助手为例&#xff0c;带领小伙伴们了解一下HMI设计中的调研工作。在项目中&#xff0c;我们需要要通过多模态的调研手段&#xff0c;去分辨用户的哪些需求是真需求&#xf…

【C++】string类的基本使用

层楼终究误少年&#xff0c;自由早晚乱余生。你我山前没相见&#xff0c;山后别相逢… 文章目录一、编码&#xff08;ascll、unicode字符集、常用的utf-8编码规则、GBK&#xff09;1.详谈各种编码规则2.汉字在不同的编码规则中所占字节数二、string类的基本使用1.string类的本质…

Hive---Hive语法(一)

Hive语法&#xff08;一&#xff09; 文章目录Hive语法&#xff08;一&#xff09;Hive数据类型基本数据类型&#xff08;与SQL类似&#xff09;集合数据类型Hive数据结构数据库操作创建库使用库删除库表操作创建表指定分隔符默认分隔符&#xff08;可省略 row format&#xff…

逆向工具之 unidbg 执行 so

1、unidbg 入门 unidbg 是一款基于 unicorn 和 dynarmic 的逆向工具&#xff0c; 可以直接调用 Android 和 IOS 的 so 文件&#xff0c;无论是黑盒调用 so 层算法&#xff0c;还是白盒 trace 输出 so 层寄存器值变化都是一把利器&#xff5e; 尤其是动态 trace 方面堪比 ida tr…

零基础机器学习做游戏辅助第十四课--原神自动钓鱼(四)yolov5目标检测

一、yolo介绍 目标检测有两种实现,一种是one-stage,另一种是two-stage,它们的区别如名称所体现的,two-stage有一个region proposal过程,可以理解为网络会先生成目标候选区域,然后把所有的区域放进分类器分类,而one-stage会先把图片分割成一个个的image patch,然后每个im…

关于SqlServer高并发死锁现象的分析排查

问题描述 通过定期对生产环境SqlServer日志的梳理&#xff0c;发现经常会出现类似事务与另一个进程被死锁在资源上&#xff0c;并且已被选作死锁牺牲品&#xff0c;请重新运行该事务的异常&#xff0c;简单分析一下原因&#xff1a;在高并发场境下&#xff0c;多个事务同时对某…