Python读取多个栅格文件并提取像元的各波段时间序列数据与变化值

news2024/9/22 5:26:28

  本文介绍基于Python语言,读取文件夹下大量栅格遥感影像文件,并基于给定的一个像元,提取该像元对应的全部遥感影像文件中,指定多个波段的数值;修改其中不在给定范围内的异常值,并计算像元数值在每一景遥感影像中变化的差值;最终将这些数据保存为一个新的Excel表格文件的方法。

  首先,我们来看一下本文需要具体实现的需求。现在有一个文件夹,如下图所示;其中,存放了大量的遥感影像文件,且每一景遥感影像都是同一个空间位置、不同成像时间对应的遥感影像,因此其空间参考信息、栅格的行数与列数等都是一致的。此外,每一景遥感影像都具有5个不同的波段。

  我们现在希望,给定一个像元(也就是给定了这个像元在遥感影像中的行号与列号),提取出在指定的波段中(我们这里就提取全部的5个波段),该像元对应的每一景遥感影像的数值(也就是提取了该像元在每一景遥感影像、每一个波段的数值);随后,将提取到的大于1的数值修改为1,并计算像素值在每一景遥感影像中数值的差值;最后,将提取到的数据保存为一个Excel表格文件。

  明确了需求,我们就可以撰写代码;具体如下。

# -*- coding: utf-8 -*-
"""
Created on Thu Jul 27 11:25:55 2023

@author: fkxxgis
"""

import os
import pandas as pd
from osgeo import gdal

def extract_pixel_time_series(input_folder, output_csv):
    tif_files = [file for file in os.listdir(input_folder) if file.endswith('.tif')]
    
    target_row = 495
    target_col = 60
    time_series_df = pd.DataFrame()
    
    for tif_file in tif_files:
        file_path = os.path.join(input_folder, tif_file)
        dataset = gdal.Open(file_path)
        
        for band in range(dataset.RasterCount):
            band_data = dataset.GetRasterBand(band + 1).ReadAsArray()
            pixel_value = band_data[target_row, target_col]
            date = tif_file[10: 24]
            time_series_df.at[date, f'Band_{band + 1}'] = pixel_value
        
        dataset = None
    
    for index in range(len(time_series_df.columns)):
        time_series_df = time_series_df.apply(lambda x: x.clip(upper = 1))
        new_col_name = time_series_df.columns[index] + "_diff"
        time_series_df[new_col_name] = time_series_df.iloc[:, index].diff()
    time_series_df.to_csv(output_csv)

# 示例用法
input_folder = r"E:\01_Reflectivity\FiveBands"
output_csv = r"E:\01_Reflectivity\Data.csv"
extract_pixel_time_series(input_folder, output_csv)

  首先,我们需要导入必要的模块和库。其中os用于操作文件和文件夹,pandas用于处理数据和创建DataFrame格式数据,而gdal则用于读取栅格数据;关于gdal库的配置方法,大家可以参考文章Anaconda环境GDAL库基于whl文件的配置方法(https://blog.csdn.net/zhebushibiaoshifu/article/details/128320388)。

  随后,我们对extract_pixel_time_series这个函数加以定义。这个函数接收两个参数input_folderoutput_csv,分别表示存储栅格数据的文件夹路径和输出的Excel文件的路径。随后,列出input_folder文件夹下所有以.tif结尾的文件,并存储在列表中。其次,循环遍历每个栅格文件,构建完整的文件路径,用于后面的数据读取,并使用gdal.Open()打开栅格文件,获取数据集对象。

  接下来,通过循环遍历每个波段。读取当前波段的数据,并存储在band_data变量中。随后基于我们给定的像元位置,提取目标像元的数值(位置就是这个[target_row, target_col])。此外,为了使得我们保存结果时可以记录每一个数值对应的成像日期,因此需要从文件名中提取日期,并存储在date变量中。

  接下来,通过time_series_df.at[date, f'Band_{band + 1}'],将像元值存储在DataFrame中,行索引为日期,列名为Band_1Band_2等;随后,将数据集对象dataset设为None,释放内存资源。

  接下来,我们将大于1的数值加以处理,并计算每个波段随时间变化的数值之差。遍历time_series_df的每一列,并对于每一列使用clip(upper=1)将超过1的值截断为1;随后,为每一列创建新列,列名为原列名加上_diff,存储该列差值。

  最后,我们将处理后的时间序列数据保存为Excel表格文件即可。

  运行上述代码,我们即可获得多个遥感影像文件中,给定像元位置处,像元数值的时间变化序列,并可以获得其变化值。

  至此,大功告成。

欢迎关注:疯狂学习GIS

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

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

相关文章

【C++】-动态内存管理

作者:小树苗渴望变成参天大树 作者宣言:认真写好每一篇博客 作者gitee:gitee 如 果 你 喜 欢 作 者 的 文 章 ,就 给 作 者 点 点 关 注 吧! 文章目录 前言一、C内存管理方式1.1 new/delete操作内置类型 总结 前言 今天再讲一个…

【禁用外键】为什么互联网大厂禁用外键约束?详谈外键的优缺点和使用场景

导航: 【Java笔记踩坑汇总】Java基础进阶JavaWebSSMSpringBoot瑞吉外卖SpringCloud黑马旅游谷粒商城学成在线MySQL高级篇设计模式常见面试题源码 目录 一、外键介绍 1.1 概述 1.2 练习 1.2.1 数据准备 1.2.2 验证有外键时,删除记录要维护外键 1.2…

Python批量下载主播照片,实现人脸识别, 进行颜值评分,制作颜值排行榜

昨晚一回家,表弟就神神秘秘的跟我说,发现一个高颜值网站,非要拉着我研究一下她们的颜值高低。 我心想,这还得要我一个个慢慢看,太麻烦了~ 于是反手用Python给他写了一个人脸识别代码,把她们的照片全部爬下…

06-行向量列向量_向量的运算 加法,数乘,减法,转置

行向量和列向量 行向量是按行把向量排开(横着来写), 列向量是按列把向量排开(竖着来写) 在数学中我们更多的把数据写成列向量,在编程语言中更多的把数据存成行向量! 如果想在编程语言中把行向量转化成列…

人力资源管理系统servlet jsp人资企业办公java源代码mysql

本项目为前几天收费帮学妹做的一个项目,Java EE JSP项目,在工作环境中基本使用不到,但是很多学校把这个当作编程入门的项目来做,故分享出本项目供初学者参考。 一、项目描述 人力资源管理系统ervlet jsp 系统有1权限&#xff1a…

【计算机网络】408统考2014年题36

题目描述 【2014年题36】主机甲与主机乙之间使用后退N帧(GBN)协议传输数据,甲的发送窗口尺寸为1000,数据帧长为1000字节,信道带宽为100Mbps,乙每收到一个数据帧就立即利用一个短帧(忽略其传输延迟)进行确认…

动态sql以及常用的标签

什么是动态sql: 指根据不同的条件生成不同的sql 搭建环境: 建表: create table blog( id varchar(50) not null comment 博客id, title varchar(100) not null comment 博客标题, author varchar(30) not null comment 博客作者, create_ti…

基于springboot+mybatis+mysql+vue+html民宿管理平台

基于springbootmybatismysqlvuehtml民宿管理平台 一、系统介绍二、功能展示1.首页2.个人中心3.民宿信息浏览(用户)4房间信息浏览(用户)5.房间预订(用户)6.房间退订(用户)7.投诉反馈(用户&#x…

如何配置保存cpolar所建立的隧道参数?

文章目录 可以利用cpolar建立一个能发布到公共互联网的网页,这是基于我们直接对cpolar进行即时设置,获得了能在公共互联网上访问本地数据的二级子域名。但如果电脑关闭重启后,如何让电脑自动启动cpolar,并记住设置好的域名参数文件…

一文搞懂自动驾驶芯片TDA4 启动流程

文章目录 TDA4架构简介TDA4启动流程DMSC ROM阶段MCU域R5 ROM阶段SBL阶段 TDA4架构简介 TDA4是德州仪器推出的一款高性能、超异构的多核SoC,拥有ARM Cortex-R5F、ARM Cortex-A72、C66以及C71内核,可以部署AUTOSAR CP系统、HLOS(Linux或QNX)、图像处理以及…

tinkerCAD案例:23.Tinkercad 中的自定义字体

tinkerCAD案例:23.Tinkercad 中的自定义字体 原文 Tinkercad Projects Tinkercad has a fun shape in the Shape Generators section that allows you to upload your own font in SVG format and use it in your designs. I’ve used it for a variety of desi…

Python实现GA遗传算法优化循环神经网络分类模型(LSTM分类算法)项目实战

说明:这是一个机器学习实战项目(附带数据代码文档视频讲解),如需数据代码文档视频讲解可以直接到文章最后获取。 1.项目背景 遗传算法(Genetic Algorithm,GA)最早是由美国的 John holland于20世…

(文章复现)梯级水光互补系统最大化可消纳电量期望短期优化调度模型matlab代码

参考文献: [1]罗彬,陈永灿,刘昭伟等.梯级水光互补系统最大化可消纳电量期望短期优化调度模型[J].电力系统自动化,2023,47(10):66-75. 1.基本原理 1.1 目标函数 考虑光伏出力的不确定性,以梯级水光互补系统的可消纳电量期望最大为目标,函数…

递归求解汉诺塔问题(超详解)

问题提出 这个问题是关于三根柱子和一些圆盘的游戏。 初始时,所有的圆盘按照从大到小的顺序叠放在一根柱子上,目标是将所有圆盘从起始柱子移动到目标柱子上,在移动过程中,要满足以下规则喵: 每次只能移动一个圆盘。大圆…

混动才是未来?福特电车亏损数十亿美元,聚焦混动展望未来

福特汽车公司决定聚焦混合动力汽车,以弥补电动汽车市场亏损数十亿美元。吉姆法利首席执行官表示,在最新财报发布会上透露,未来将推出更多种类的混合动力车型。 福特最近公布了Q2盈亏情况,显示电动汽车部门的亏损有所增加。不过&am…

从源码角度配合网络编程函数accept() connect()等实现的客户端服务器通信 分析下 三握手四挥手都做了什么

首先我们先说下网络编程API: 数据在网络上通信,通信的双方一个是 客户端, 一个是 服务器 更具体来说,不是 客户端和服务器这两个机器在 经由互联网 进行通信, 而是 客户端上的某一进程 与 服务器端的某一进程 进…

vue3+ts未使用变量报错的解决

实例 问题原因 tsconfig.json文件中开启了ts语法检查 "strict": true, // 开启严格模式,检查类型声明和赋值...是否合法 "noUnusedLocals": true, // 检查是否存在未使用的变量 "noUnusedParameters": true, // 检查是否存在会使…

app性能测试怎么做?内容全在这里了

1 app性能测试 提到APP的性能测试这个概念比较笼统,因为APP的性能测试分为服务端的性能和手机端的性能测试 1.1 app服务端性能测试 app服务端的性能测试,利用jmeter等工具模拟并发,压测服务器系统,服务端性能测试,一…

Anaconda安装-超详细版(2023)

Anaconda安装 - 超详细版(2023) 前言:彻底卸载pythonAnaconda下载地址安装详细步骤配置环境变量检验安装是否成功更改conda源(后续安装第三方库可以加快速度)超详细彻底卸载Anaconda教程Tensorflow-gpu 安装 前言&…

2023.07.29 驱动开发DAY6

通过epoll实现一个并发服务器 服务器 #include <stdio.h> #include <string.h> #include <unistd.h> #include <sys/types.h> #include <sys/socket.h> #include <netinet/in.h> #include <arpa/inet.h> #include <sys/epoll.h…