Python中GDAL批量绘制多时相栅格遥感影像的像元时间序列曲线图

news2024/9/28 5:30:24

  本文介绍基于Pythongdal模块,对大量多时相栅格图像,批量绘制像元时间序列折线图的方法。

  首先,明确一下本文需要实现的需求:现有三个文件夹,其中第一个文件夹存放了某一研究区域原始的多时相栅格遥感影像数据(每一景遥感影像对应一个时相,文件夹中有多景遥感影像),每一景遥感影像都是.tif格式;第二个文件夹第三个文件夹则分别存放了前述第一个文件夹中原始遥感影像基于2种不同滤波方法处理后的遥感影像(同样是每一景遥感影像对应一个时相,文件夹中有多景遥感影像),每一景遥感影像同样也都是.tif格式。我们希望分别针对这三个文件夹中的多张遥感影像数据,随机绘制部分像元对应的时间序列曲线图(每一个像元对应一张曲线图,一张曲线图中有三条曲线);每一张曲线图的最终结果都是如下所示的类似的样式,X轴表示时间节点,Y轴就是具体的像素值。

在这里插入图片描述

  知道了需求,我们便开始代码的书写。具体代码如下:

# -*- coding: utf-8 -*-
"""
Created on Wed Dec 14 00:48:48 2022

@author: fkxxgis
"""

import os
import numpy as np
import matplotlib.pyplot as plt
from osgeo import gdal

original_file_path = r"E:\AllYear\Original"
hants_file_path = r"E:\AllYear\Reconstruction"
sg_file_path = r"E:\AllYear\SG"
pic_file_path = r"E:\AllYear\Pic"
pic_num = 50
np.random.seed(6)

original_file_list = os.listdir(original_file_path)
tem_raster = gdal.Open(os.path.join(original_file_path, original_file_list[0]))
col_num = tem_raster.RasterXSize
row_num = tem_raster.RasterYSize
col_point_array = np.random.randint(0, col_num, pic_num)
row_point_array = np.random.randint(0, row_num, pic_num)
del tem_raster

hants_file_list = os.listdir(hants_file_path)
start_day = hants_file_list[0][12:15]
end_day = hants_file_list[-1][12:15]
day_list = [x for x in range(int(start_day), int(end_day) + 20, 10)]

for i in range(pic_num):
    original_pixel_list, hants_pixel_list, sg_pixel_list = [[] for x in range(3)]
    
    for tif in original_file_list:
        original_raster = gdal.Open(os.path.join(original_file_path, tif))
        original_array = original_raster.ReadAsArray()
        original_pixel_list.append(original_array[row_point_array[i],col_point_array[i]])
        
    for tif in hants_file_list:
        hants_raster = gdal.Open(os.path.join(hants_file_path, tif))
        hants_array = hants_raster.ReadAsArray()
        hants_pixel_list.append(hants_array[1, row_point_array[i],col_point_array[i]])
        
    sg_file_list = os.listdir(sg_file_path)
    for tif in sg_file_list:
        sg_raster = gdal.Open(os.path.join(sg_file_path, tif))
        sg_array = sg_raster.ReadAsArray()
        sg_pixel_list.append(sg_array[1, row_point_array[i],col_point_array[i]])
    
    pic_file_name = str(col_point_array[i]) + "_" + str(row_point_array[i]) + ".png"
    plt.figure(dpi = 300)
    plt.plot(original_pixel_list,color = "red", label = "Original")
    plt.plot(hants_pixel_list,color = "green", label = "HANTS")
    plt.plot(sg_pixel_list,color = "blue", label = "SG")
    plt.legend()
    plt.xticks(range(len(day_list)), day_list, fontsize = 11)
    plt.xticks(rotation = 45)
    plt.title(str(col_point_array[i]) + "_" + str(row_point_array[i]), fontweight = "bold")
    plt.savefig(os.path.join(pic_file_path, pic_file_name))
    plt.show()
    plt.clf()
    
    del original_raster
    del hants_raster
    del sg_raster

  其中,E:\AllYear\Original为原始多时相遥感影像数据存放路径,也就是前述的第一个文件夹的路径;而E:\AllYear\RE:\AllYear\S则是前述第二个文件夹第三个文件夹对应的路径;E:\AllYear\Pic则是批量绘图后,图片保存的路径。这里请注意,在运行代码前我们需要在资源管理器中,将上述三个路径下的各文件以“名称”排序的方式进行排序(每一景遥感影像都是按照成像时间命名的)。此外,pic_num则是需要加以绘图的像元个数,也就表明后期我们所生成的曲线图的张数为50

  代码的整体思路也非常简单。首先,我们借助os.listdir()函数获取original_file_path路径下的所有栅格遥感影像文件,在基于gdal.Open()函数将这一文件下的第一景遥感影像打开后,获取其行数与列数;随后,通过np.random.randint()函数生成两个随机数数组,分别对应着后期我们绘图的像元的行号列号

  在代码的下一部分(就是hants_file_list开头的这一部分),我们是通过截取文件夹中图像的名称,来确定后期我们生成的时间序列曲线图中X轴的标签(也就是每一个x对应的时间节点是什么)——其中,这里的[12:15]就表示对于我的栅格图像而言,其文件名的第1315个字符表示了遥感影像的成像时间;大家在使用代码时依据自己的实际情况加以修改即可。在这里,我们得到的day_list,就是后期曲线图中X轴各个标签的内容。

  随后,代码中最外层的for循环部分,即为批量绘图工作的开始。我们前面选择好了50个随机位置的像元,此时就可以遍历这些像元,对每一个像元在不同时相中的数值加以读取——通过.ReadAsArray()函数将栅格图像各波段的信息读取为Array格式,并通过对应的行号列号加以像素值的获取;随后,将获取得到的像元在不同时相的数值通过.append()函数依次放入前面新生成的列表中。

  在接下来,即可开始绘图的工作。其中,pic_file_name表示每一张曲线图的文件名称,这是通过当前像元对应的行号列号来命名的;plt.figure(dpi = 300)表示设置绘图的DPI300。随后,再对每一张曲线图的图名、图例与坐标轴标签等加以配置,并通过plt.savefig()函数将生成的图片保存在指定路径下。

  最终,我们得到的多张曲线图结果如下图所示,其文件名通过列号行号分别表示了当前这张图是基于哪一个像元绘制得到的;其中,每一张图的具体样式就是本文开头所展示的那一张图片的样子。

在这里插入图片描述

  至此,大功告成。

欢迎关注:疯狂学习GIS

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

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

相关文章

C/C++socket网络编程

目录tcp和udp通信流程图socket函数bind函数listen函数accept函数connect函数recv、recvfrom、read函数send、write、sendto、sendmsg函数close、shutdown函数htonl、ntohl、htons、ntohs本地主机和网络字节序转换inet_addr、inet_aton、inet_ntop,IP地址转换函数set…

Spark-概述+快速上手+运行环境

文章目录概述Spark and HadoopSpark or Hadoop核心模块快速上手Spark运行环境Local(本地)Standalone模式搭建和使用提交参数说明配置历史服务配置高可用(HA)Yarn模式K8S & Mesos 模式部署模式对比端口号概述 Spark 是一种基于内存的快速、通用、可扩…

红米Note7pro安装TWRP及安装PixelExperience系统

参考:https://www.youtube.com/watch?vjB9ksQrxr20&ab_channelTechnologyVikram 所需文件: 一. youtube:Vikram--OTG优盘 (https://www.youtube.com/watch?vjB9ksQrxr20&ab_channelTechnologyVikram) 1.刷入TWRP a. 准备工作:打开…

MR案例:学生排序

排序一、提出任务二、完成任务(一)准备数据1、在虚拟机上创建文本文件2、上传文件到HDFS指定目录(二)实现步骤1、创建学生实体类2、创建学生映射器类3、创建学生归并器类4、创建学生驱动器类5、启动学生驱动器类,查看结…

JVM虚拟机简介

、 什么是JVM? JVM是Java Virtual Machine(Java虚拟机)的缩写,JVM是一种用于计算设备的规范,它是一个虚构出来的计算机,是通过在实际的计算机上仿真模拟各种计算机功能来实现的。Java虚拟机包括一套字节码指…

IDEA maven 向项目添加模块时出错创建项目失败

原因一:Maven 版本太新 || Java 版本选择了 JAVA 18 选择 java 版本为1.8构建 即可成功,第一次maven项目建立的时候下图红框内容如图即可 原因二:IDEA 的 maven插件 没有加载完成 通常发生在重设 maven 路径|仓库之后 原因三:mav…

RK3588平台开发系列讲解(RKNN篇)RKNN Android平台开发说明

平台内核版本安卓版本RK3588Linux 5.10Android12🚀返回专栏总目录 文章目录 一、 Android 平台 RKNN API 库二、EXAMPLE 使用说明沉淀、分享、成长,让自己和他人都能有所收获!😄 📢RKNN SDK 为带有 RKNPU 的芯片平台提供编程接口,能够帮助用户部署使用 RKNN-Toolkit2导…

uni-app卖座电影多端开发纪实(六):多端打包

@打包为H5站点 打包站点 HBuilder中菜单中依次点击【发行】-【网站-PC Web或手机H5(仅适用于uni-app)】填写网站标题,点击发行控制台会输出类似如下信息此时站点需要的文件已经被打包到了unpackage/dist/build/h5目录部署站点 复制上一步中生成的h5目录到Nginx的部署目录下…

【QT开发笔记-基础篇】| 第五章 绘图QPainter | 5.5 多段线、多边形

本节对应的视频讲解:B_站_视_频 https://www.bilibili.com/video/BV1ZP4y1S7Ax 本节讲解如何绘制多段线、多边形 1. 相关的 API 直接查看官方的帮助文档,可以看到有多个重载的方法用于绘制多段线、多边形 1.1 多段线 将多个点连接形成多段线 比如&…

Linux基础(4)进程管理

该文章主要为完成实训任务,详细实现过程及结果见【参考文章】 参考文章:https://howard2005.blog.csdn.net/article/details/127066383?spm1001.2014.3001.5502 文章目录一、查看进程1. 进程查看命令 - ps2. Liunx进程状态3. 观察进程变化命令 - top4. …

jsp+ssm计算机毕业设计大学教师年终考核管理信息系统【附源码】

项目运行 环境配置: Jdk1.8 Tomcat7.0 Mysql HBuilderX(Webstorm也行) Eclispe(IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持)。 项目技术: JSPSSM mybatis Maven等等组成,B/S模式 Mave…

浅析nvme原子写的应用场景

1.NVMe原子写简介 NVME协议家族,当前发展的已经非常庞大,来张nvme家族大合影。从最开始的NVME Base Spec,又延伸了更加专业聚焦的模块Command Set Spec、Transport Spec,NVME MI Spec等等。 在Command Set Spec中,我们…

【学习笔记】pytest接口自动化测试框架入门(pytest+yaml)

pytest接口自动化测试框架入门(pytestyaml) 文章目录自动化测试需要包含的内容pytest的安装使用pytest默认的测试用例的规则和基础使用:pytest测试用例的运行方式pytest执行测试用例的顺序分组执行pytest跳过测试用例pytest框架前后置处理解(…

智能指针循环引用——你真的懂了吗?

相信不少同学都在面试中都被问到过c智能指针的问题,接踵而至的必定是循环引用了,而我每次的答案都是一招鲜:因为它们都在互相等待对方先释放,所以造成内存泄漏。面试官很满意,我也很满意。 但是为啥要等到对方先释放&…

STM8开发实例-ADC

ADC 1、ADC介绍 ADC 是任何现代微控制器中非常重要的外设。 它用于读取传感器的模拟输出、检测电压电平等。 例如,我们可以使用 ADC 读取 LM35 温度传感器。 传感器的电压输出与温度成正比,因此我们可以使用电压信息来反算温度。 下图是STM8s的ADC外设框图: 在使用 ADC 之…

猿如意|初识CSDN的开发者工具合集

前言: CSDN网站其实不仅仅有博客,虽然整个网站是基于博客开始的,但无疑博客是整个网站的魂。 那么,现在的CSDN还有第二个和第三个魂,就是云计算服务和猿如意了。 猿如意好像是CSDN5 6月份推出的,具体时间…

CSC7715 同步整流

CSC7715是一款用于开关电源的高效率同步整流控制IC。其具备较高的集成度,在有效的提升开关电源的转换效率的同时,减少了外围元器件的应用。CSC7715可用于DCM/QR开关电源系统。该电路内置45V的功率管,在系统中替代次级肖特基管,并提高整个系统…

Typora+PicGo+阿里云OSS

配置Typora 文章目录配置Typora阿里云1)网页搜索阿里云OSS2)注册账号3)点击立刻开通a) 点击“产品价格”b) 初次付费c) 交钱以免造成后续无法访问d)进入管理控制台e) 创建钥匙PicGo1)下载安装2)设置选择显示…

Pandas1.5.2 学习心得

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 目录 前言 一、pandas是什么? 二、安装 1.pip install pandas 2.Series(系列) 可以通过索引标签获取和设置值 总结 前言 提示:以下是…

深度学习笔记

动手深度学习v2 引言 机器学习中的关键组件 无论什么类型的机器学习,都需要以下组件: 学习的数据转换数据的模型目标函数,量化模型的有效性调整模型参数以优化目标函数的算法 数据 大多时候遵循独立同分布(指随机过程中&…