Python地理数据处理 22:基于arcpy批量操作(四)

news2025/1/18 3:28:36

批量裁剪

    • 1. 批量裁剪进阶
    • 2. 统计运算
    • 3. 栅格批量缩小n倍
    • 4. 建立属性表(简化、普适)
    • 5. 计算土地利用未变化区域(LUCC)

1. 批量裁剪进阶

代码描述:遍历a文件夹下的所有tif影像,并使用每个a文件夹中的tif影像对b文件夹下的所有tif影像进行裁剪。裁剪后的栅格将以两个tif文件进行组合命名,并保存到另一个文件夹中。

# -*- coding: cp936 -*-
import arcpy
import os
import time

start = time.clock()
arcpy.CheckOutExtension("spatial")

arcpy.CheckOutExtension("spatial")
a_folder = r"D:\dataset\a"
b_folder = r"D:\dataset\b"
output_folder = r"D:\dataset\output_tif"

# 设置工作环境
arcpy.env.workspace = a_folder

# 获取a文件夹下的所有tif影像
a_rasters = arcpy.ListRasters("*", "TIF")

# 创建输出文件夹
if not os.path.exists(output_folder):
    os.makedirs(output_folder)

# 遍历a文件夹下的每个tif影像
for indexa, a_raster in enumerate(a_rasters):
    # 构建输出文件名前缀
    a_name = os.path.splitext(a_raster)[0]

    a_raster = a_folder + "\\" + a_name + ".tif"
    
    # 设置工作环境为b文件夹
    arcpy.env.workspace = b_folder
    
    # 获取b文件夹下的所有tif影像
    b_rasters = arcpy.ListRasters("*", "TIF")
    
    # 遍历b文件夹下的每个tif影像
    for indexb, b_raster in enumerate(b_rasters):
        # 构建输出文件名
        output_name = a_name + "_" + os.path.splitext(b_raster)[0] + ".tif"
        
        # 构建输出路径
        output_path = os.path.join(output_folder, output_name)
        
        # 设置工作环境为a文件夹
        arcpy.env.workspace = a_folder

        b_raster = b_folder + "\\"  + b_raster
        
        # 裁剪b影像到输出路径
        arcpy.gp.ExtractByMask_sa(b_raster, a_raster, output_path)
        
        index = indexa + indexb + 1
        print "{} have been completed and the current file is ".format(index) + output_name

end = time.clock()  
print "All finish!!!"

2. 统计运算

获取栅格数据的平均值,并输出程序运行进度:

# -*- coding: utf-8 -*-
import arcpy
import os
import glob
from arcpy.sa import *

arcpy.CheckOutExtension("ImageAnalyst")
arcpy.CheckOutExtension("spatial")

input_folder = r"D:\dataset"
output_file = r'D:\dataset\Meandata.csv'

rasters = glob.glob(os.path.join(input_folder, "*.tif"))
where_clause = "VALUE = -32556"

total_rasters = len(rasters)
processed_rasters = 0

with open(output_file, 'w') as output:
    for raster in rasters:
        outSetNull = SetNull(raster, raster, where_clause)
        meanValueInfo = arcpy.GetRasterProperties_management(outSetNull, 'MEAN')
        meanValue = meanValueInfo.getOutput(0)
        output.write(os.path.basename(raster).split('.')[0] + ',' + str(meanValue) + '\n')
        
        processed_rasters += 1
        progress = float(processed_rasters) / total_rasters * 100
        print("Processed {} out of {} rasters. Progress: {:.2f}%".format(processed_rasters, total_rasters, progress))

print("All processing is done!")

程序运行进度:

3. 栅格批量缩小n倍

某文件夹中包含多个子文件夹,如:“2003clip”, “2004clip”, “2005clip”, “2006clip”, “2007clip”, “2008clip”, “2009clip”, 每个子文件夹中包含多个tif图像,现在需要对这些图像乘以缩放因子,如0.0001

# -*- coding: cp936 -*-
import arcpy
import os
arcpy.CheckOutExtension('Spatial')

# 输入文件夹和输出文件夹路径
input_folder = r"D:\Datasets"
output_folder = r"D:\Datasets\缩小10000倍"

# 遍历输入文件夹中的所有子文件夹
for folder_name in ["2003clip", "2004clip", "2005clip", "2006clip", "2007clip", "2008clip", "2009clip"]:
    print folder_name
    # 子文件夹路径
    folder_path = os.path.join(input_folder, folder_name)
    
    # 获取子文件夹中的所有tif文件
    tif_files = [file for file in os.listdir(folder_path) if file.endswith(".tif")]
    
    # 遍历每个tif文件
    for tif_file in tif_files:
        # 输入tif文件路径
        input_tif = os.path.join(folder_path, tif_file)
        
        # 输出tif文件路径
        output_tif = os.path.join(output_folder, tif_file)
        
        # 打开Raster对象
        raster = arcpy.Raster(input_tif)
        
        # 过滤像元值大于10000和小于0的像元
        filtered_raster = arcpy.sa.Con((raster >= 0) & (raster <= 10000), raster)
        
        # 对过滤后的像元乘以0.0001
        scaled_raster = filtered_raster * 0.0001
        
        # 保存输出tif文件
        scaled_raster.save(output_tif)
        print folder_name + "OK!!!"
        
print "Finish!!!"

4. 建立属性表(简化、普适)

之前已经写过如何建立栅格属性表:Python地理数据处理 十九:arcpy批量处理数据之为栅格数据建立属性表并导出
现在,结合之前的,写一个更加简单普适的代码,方便今后使用:

# -*- coding: utf-8 -*-
import arcpy
import os
arcpy.CheckOutExtension("Spatial")

# 设置工作空间
arcpy.env.workspace = r"D:\dataset"

# 获取文件夹中的所有栅格数据
raster_list = arcpy.ListRasters()

# 检查是否有至少一个栅格数据
if len(raster_list) < 1:
    print("文件夹中至少需要有一个栅格数据才能建立属性表。")
    exit()

# 循环处理每个栅格数据
for raster in raster_list:
    raster_path = os.path.join(arcpy.env.workspace, raster)

    # 建立属性表
    arcpy.BuildRasterAttributeTable_management(raster_path)
    print "属性表已建立完成: {}。".format(raster)

print("属性表已建立完成。")

5. 计算土地利用未变化区域(LUCC)

土地利用数据每年都在变化,如何判断20年的土地利用变化数据中,哪些地方是未变化的?这是需要解决的一个问题,该代码实现以上内容,将变化的数据设置为100。
数据来源:GEE11:2个土地覆盖数据(LUCC)分享和下载

# -*- coding: utf-8 -*-
import arcpy
import os
arcpy.CheckOutExtension("Spatial")

# 设置工作空间
arcpy.env.workspace = r"D:\dataset"

# 获取文件夹中的所有tif影像
tif_list = arcpy.ListRasters("*.tif")

# 检查是否有至少2个tif影像
if len(tif_list) < 2:
    print("文件夹中至少需要有2个tif影像才能进行计算。")
    exit()

# 选择第一个tif影像作为基准影像
base_tif = tif_list[0]
base_tif_path = os.path.join(arcpy.env.workspace, base_tif)

# 读取基准影像的像素数组
base_raster = arcpy.Raster(base_tif_path)
base_array = arcpy.RasterToNumPyArray(base_raster)

# 循环处理每个tif影像
for tif in tif_list[1:]:
    tif_path = os.path.join(arcpy.env.workspace, tif)

    # 读取当前影像的像素数组
    current_raster = arcpy.Raster(tif_path)
    current_array = arcpy.RasterToNumPyArray(current_raster)

    # 对比基准数组和当前数组的像素值
    comparison_array = (base_array == current_array)

    # 将不相等的像素值置为100
    result_array = current_array.copy()
    result_array[~comparison_array] = 100

    # 更新基准数组为结果数组
    base_array = result_array

    print ("正常处理{}".format(tif))

# 创建输出栅格
output_raster = arcpy.NumPyArrayToRaster(result_array, arcpy.Point(base_raster.extent.XMin, base_raster.extent.YMin),
                                         base_raster.meanCellWidth, base_raster.meanCellHeight)

# 设置输出路径和名称
output_path = os.path.join(arcpy.env.workspace, "unchanged_landuse.tif")

# 保存输出栅格
output_raster.save(output_path)

print("未发生变化的土地利用栅格数据图像已生成")

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

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

相关文章

MobileOne(CVPR 2023)原理与代码解析

paper&#xff1a;MobileOne: An Improved One millisecond Mobile Backbone official implementation&#xff1a;https://github.com/apple/ml-mobileone third-party implementation&#xff1a;mmpretrain/mobileone.py at main open-mmlab/mmpretrain GitHub 前言 …

在Ubuntu Kylin系统中安装并使用minicom

1、minicom的安装 首先在命令窗口中输入:minicom -s 如果显示的是:程序“minicom”尚未安装,您可以使用一下命令安装:sudo apt install minicom 这时需要minicom安装包 sudo apt-get install minicom 2、minicom的配置 sudo minicom -s # 打开minicom配置界面 3、配置…

(第44册)Java程序设计应用开发

书名&#xff1a;Java程序设计应用开发 书号&#xff1a;978-7-113-29847-0 作者&#xff1a;张西广,夏敏捷,罗菁 编著 出版日期&#xff1a;2023年1月 目前学习和关注 Java 语言的人越来越多&#xff0c;Java 语言已是目前世界上最为流行的程序开发语言之一。由于具有功能…

用于半监督体积医学图像分割的动量对比体素表示学习

文章目录 Momentum Contrastive Voxel-Wise Representation Learning for Semi-supervised Volumetric Medical Image Segmentation摘要本文方法Voxel-Wise Contrastive ObjectiveDimensional Contrastive ObjectiveConsistency Loss总损失 实验结果 Momentum Contrastive Voxe…

可以白嫖的语音识别开源项目whisper的搭建详细过程 | 如何在Linux中搭建OpenAI开源的语音识别项目Whisper

原文来自我个人的博客。 1、前提条件 服务器为GPU服务器。点击这里跳转到我使用的GPU服务器。我搭建 whisper 选用的是 NVIDIA A 100显卡&#xff0c;4GB显存。 Python版本要在3.8~3.11之间。 输入下面命令查看使用的Python版本。 python3 -V2、安装Anaconda 为啥要安装A…

ORACLE数据库长连接客户端持久的CLOSE_WAIT

前言 根据以往的项目构造&#xff0c;业务层数据库基本使用长连接形式进行批量操作。大部分周期有执行的链接基本正常。再长期的内测中也没有发生CLOSE_WAIT的现象。 上线后采用的数据库使用了新的版本&#xff0c;发现产生CLOSE_WAIY。根据开发经验和网上搜索&#xff0c;发…

『手撕 Mybatis 源码』01 - 基本原理与搭建

MyBatis的架构设计 Api接口层&#xff1a;提供API 增加、删除、修改、查询等接口&#xff0c;通过API接口对数据库进行操作 例如下面这些操作 sqlSession.selectOne(statementId, param); mapperProxy.findByCondition(param);数据处理层&#xff1a;解析sql根据调用请求完成…

机器学习模型的评估

&#xff08;1&#xff09;数据划分 将可用数据划分为三部分&#xff1a;训练集、验证集和测试集。在训练数据上训练模型。在验证数据上评估模型。模型准备上线之前&#xff0c;在测试数据上最后测试一次 不将数据划分为两部分&#xff0c;即训练集和测试集&#xff1f;在训练…

Java基础(二十三):反射机制

Java基础系列文章 Java基础(一)&#xff1a;语言概述 Java基础(二)&#xff1a;原码、反码、补码及进制之间的运算 Java基础(三)&#xff1a;数据类型与进制 Java基础(四)&#xff1a;逻辑运算符和位运算符 Java基础(五)&#xff1a;流程控制语句 Java基础(六)&#xff1…

Linux内存管理 (1):内核镜像线性映射的建立

文章目录 1. 前言2. 分析背景3. 内核镜像线性映射的建立过程3.1 预备工作&#xff1a;内核解压缩3.2 建立内核镜像区域的线性映射3.2.1 定位内核入口3.2.2 建立内核线性映射前的其它启动工作3.2.2.1 将 CPU 设为 SVC 模式&#xff0c;且禁用 IRQ FIQ 中断3.2.2.2 获取处理器类…

【C++】实现 priority_queue --- 反函数

priority_queue 实际上是以 堆 的规则组织起来的数组&#xff0c;是一颗完全二叉树 **反函数 !!! 堆的向上向下调整 #pragma oncenamespace xiong {//反函数template<class T>struct less{bool operator()(const T& x, const T& y){return x < y;}};templat…

python列表逆序排列的方法

python中的列表是可以直接进行逆序排列的&#xff0c;但是在 python中&#xff0c;逆序排列也是有一定规则的&#xff0c;一般是按升序排序&#xff0c;也就是从左到右。比如 list[1,2,3,4]&#xff1b; 注意&#xff1a;顺序相同的元素可以放在同一行&#xff1b; 在 python中…

嵌入式电路基础

电路基础 器件基础基本电路术语与符号 信号浮动三态门&#xff08;三态缓冲器&#xff09;上下拉电阻基本元件与逻辑OC/OD门&#xff08;掌握原理&#xff0c;用途&#xff09;开放收集器&#xff08;OC门&#xff0c;NPN型三极管&#xff09;掌握原理、用途漏极开路&#xff0…

C++ STL—vector,map,set,list,deque等

STL是什么 STL是标准模板库&#xff0c;包括算法、容器和迭代器。 算法&#xff1a;包括排序、复制等常用算法容器&#xff1a;数据存放形式&#xff0c;包括序列式容器和关联式容器&#xff0c;序列式容器就是list,vector&#xff0c;关联式容器就是set,map等迭代器是在不暴…

考研复试刷题第八天:日期累加 【日期问题】

本来以为和上次那个简单题一样的&#xff0c;没啥难度&#xff0c;就是循环就完事了&#xff0c;结果超时了 超时代码: #include <iostream> using namespace std;//平年各个月份都多少天&#xff1f; int mouths [13] {0,31,28,31,30,31,30,31,31,30,31,30,31 };//判…

Spring事务深度学习

jdbcTemp Spring 框架对 JDBC 进行封装&#xff0c;使用 JdbcTemplate 方便实现对数据库操作。 JdbcTemp的使用 对应依赖 <!-- MySQL驱动 --><dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId><ve…

已知相机内外参通过COLMAP进行稀疏/稠密模型重建操作过程

在https://colmap.github.io/faq.html#reconstruct-sparse-dense-model-from-known-camera-poses 中介绍了已知相机内外参如何通过COLMAP进行稀疏和稠密模型重建的过程&#xff0c;这里按照说明操作一遍&#xff1a; 在instant-ngp中&#xff0c;执行scripts/colmap2nerf.py时…

request页面代码逻辑

一. 封装请求基地址 在src目录下面建一个api文件夹 然后在文件夹里面新建一个专门放用户请求的use.js 用axios发送请求 在use.js文件夹里导入request 在src目录新建发送请求的页面并导入封装好的请求 然后把这个请求封装成一个函数&#xff0c;这个函数里需要传入两个参数。 …

Xavier或TX2配置ipv4地址

输入ifconfig查看本地ipv4地址&#xff0c;发现并没有设置&#xff0c;无法通过以太网与其他主机通信。下面来配置系统的以太网地址。 1、编辑文件/etc/network/interfaces: sudo gedit /etc/network/interfaces2、用下面的内容来替换有关eth0的行&#xff0c;并且将ip地址等信…

Java中抽象类和接口的区别,一文弄懂,图文并茂

目录 前言 1. 抽象类 1.1 定义 1.2 示例 1.3 使用 1.3.1代码-抽象类 1.3.2代码-抽象类继承类使用 1.3.3输出结果为&#xff1a; 1.4UML类图展示类间的关系 2. 接口 2.1 定义 2.2 示例 2.2.1代码-接口 2.3 使用 2.3.1代码-接口实现 2.3.2代码-接口实现类使用 2…