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

利用 Python 处理遥感影像数据:计算年度平均影像

在地球科学、气象学以及环境监测等领域,遥感影像数据是一种重要的信息源,它们可以提供地表的地形、植被覆盖、气候变化等丰富信息。然而,随着观测技术的进步,我们通常会获得大量的遥感影像数据,如何高效地处理和分析这些数据成为了一项挑战。本文将介绍如何利用 Python 中的 GDAL 库处理遥感影像数据,并通过计算年度平均影像来提取更有意义的信息。

1. 环境准备

在开始之前,确保你已经安装了 Python 和 GDAL 库。如果还没有安装,你可以通过 pip 进行安装:

pip install gdal

2. 处理单个 TIFF 文件

我们首先定义了一个函数 process_tiff_folder,它用于处理一个包含多个 TIFF 文件的文件夹。在这个函数中,我们遍历文件夹中的每个 TIFF 文件,读取其数据并提取地理信息。然后,我们将每个像素的经纬度与高程值一起保存在一个二维数组中,以便后续处理使用。

3. 计算年度平均影像

接下来,我们定义了一个名为 calculate_yearly_mean 的函数,它用于计算给定文件夹中所有影像文件的年度平均影像。在这个函数中,我们首先读取输入文件夹中的所有影像文件,并创建一个字典来存储每年的影像数据。然后,我们遍历每个影像文件,累加每年的像素值和像素计数。最后,我们计算每年的平均影像,并将结果保存为新的 TIFF 文件。

4. 示例代码

下面是一个示例代码,演示了如何使用上述函数处理遥感影像数据:

# 输入文件夹和输出文件夹
input_folder = "path/to/input/folder"
output_folder = "path/to/output/folder"# 获取栅格数据
cols = process_tiff_folder(input_folder, output_folder)# 计算年度平均影像
calculate_yearly_mean(input_folder, output_folder)

5. 完整代码

import os
import numpy as np
from osgeo import gdaldef process_tiff_folder(folder_path, output_folder):for root, dirs, files in os.walk(folder_path):for file in files:if file.endswith(".tif"):tif_path = os.path.join(root, file)folder_name = os.path.basename(root)  # 获取文件夹名称dataset = gdal.Open(tif_path)  # 打开tif# 获取行数列数和地理信息geo_information = dataset.GetGeoTransform()col = dataset.RasterXSizerow = dataset.RasterYSizedem = dataset.GetRasterBand(1).ReadAsArray()# 获取行列数,对应其经纬度,j对于x坐标cols = []for y in range(row):rows = []for x in range(col):# 有效高程if dem[y][x] != dataset.GetRasterBand(1).GetNoDataValue():# 输出经纬度lon = geo_information[0] + x * geo_information[1] + y * geo_information[2]lat = geo_information[3] + x * geo_information[4] + y * geo_information[5]child = [lon, lat, dem[y][x], y, x]rows.append(child)cols.append(rows)return colsdef calculate_yearly_mean(input_folder, output_folder):# 获取输入文件夹中的所有影像文件路径input_files = [os.path.join(input_folder, f) for f in os.listdir(input_folder) if f.endswith('.tif')]# 创建输出文件夹if not os.path.exists(output_folder):os.makedirs(output_folder)# 初始化年度影像字典yearly_images = {}# 遍历所有输入影像文件for file_path in input_files:# 从文件名中提取年份和月份year = int(file_path.split('_')[1])month = int(file_path.split('_')[2].split('.')[0])# 读取影像数据dataset = gdal.Open(file_path)image = dataset.GetRasterBand(1).ReadAsArray()# 处理无效值invalid_value = dataset.GetRasterBand(1).GetNoDataValue()image[image == invalid_value] = np.nan# 初始化年份数据字典if year not in yearly_images:yearly_images[year] = {'sum': np.zeros(image.shape), 'count': np.zeros(image.shape)}# 累加每年的像素值和计数yearly_images[year]['sum'] += np.where(np.isnan(image), 0, image)yearly_images[year]['count'] += np.where(np.isnan(image), 0, 1)# 遍历年度影像字典,计算每年的平均影像并保存for year, data in yearly_images.items():# 计算每年的平均影像yearly_mean = np.divide(data['sum'], data['count'], out=np.zeros_like(data['sum']), where=data['count'] != 0)# 获取输入影像的地理转换信息dataset = gdal.Open(input_files[0])geotransform = dataset.GetGeoTransform()projection = dataset.GetProjection()# 创建输出影像driver = gdal.GetDriverByName('GTiff')output_path = os.path.join(output_folder, f'{year}_mean.tif')output_dataset = driver.Create(output_path, yearly_mean.shape[1], yearly_mean.shape[0], 1, gdal.GDT_Float32)output_dataset.SetGeoTransform(geotransform)output_dataset.SetProjection(projection)output_dataset.GetRasterBand(1).WriteArray(yearly_mean)# 关闭输出数据集output_dataset = Noneprint("年度平均影像计算完成!")# 输入文件夹和输出文件夹
input_folder = r"D:\lky\person\month"
output_folder = r"D:\lky\person\month_year"# 获取栅格数据
cols = process_tiff_folder(input_folder, output_folder)# 计算年度平均影像
calculate_yearly_mean(input_folder, output_folder)

6. 结论

通过本文介绍的方法,我们可以轻松地处理遥感影像数据,并从中提取出更有意义的信息,如年度平均影像。这些信息对于地球科学研究、自然资源管理以及环境监测等领域具有重要意义,帮助我们更好地理解和应对地球上的变化。

通过利用 Python 编程和相关库,我们可以实现对遥感影像数据的高效处理和分析,为科学研究和实际应用提供强大的工具支持。

相关文章:

利用 Python 处理遥感影像数据:计算年度平均影像

在地球科学、气象学以及环境监测等领域,遥感影像数据是一种重要的信息源,它们可以提供地表的地形、植被覆盖、气候变化等丰富信息。然而,随着观测技术的进步,我们通常会获得大量的遥感影像数据,如何高效地处理和分析这…...

【Leetcode-73.矩阵置零】

题目: 给定一个 m x n 的矩阵,如果一个元素为 0 ,则将其所在行和列的所有元素都设为 0 。请使用 原地 算法。 示例 1: 输入:matrix [[1,1,1],[1,0,1],[1,1,1]] 输出:[[1,0,1],[0,0,0],[1,0,1]]示例 2&…...

redis 常见的异常

目录 一、缓存穿透 1、概念 解决方案 (1)布隆过滤器 (2)、缓存空对象 二、缓存雪崩 1、概念 解决方案 (1)redis高可用 (2)限流降级 (3)数据预热 一、缓存穿透 1、概念 缓…...

npm包、全局数据共享、分包

使用 npm 包 小程序对 npm 的支持与限制 目前,小程序中已经支持使用 npm 安装第三方包,从而来提高小程序的开发效率。但是,在小程序中使用npm 包有如下 3 个限制: ① 不支持依赖于 Node.js 内置库的包 ② 不支持依赖于浏览器内置…...

UnityShader:IBL

效果: 实现: Shader "MyShader/IBL" {Properties{_CubeMap ("环境贴图", Cube) "white" {}_Exposure("曝光",float)1.0_Color("颜色",color)(1,1,1,1)_NormalMap("法线贴图",2d)"bu…...

每日五道java面试题之mybatis篇(三)

目录: 第一题. MyBatis的框架架构设计是怎么样的?第二题. 为什么需要预编译?第三题. Mybatis都有哪些Executor执行器?它们之间的区别是什么?第四题. Mybatis中如何指定使用哪一种Executor执行器?第五题. Mybatis是否支持延迟加载…...

C#开发五子棋游戏:从新手到高手的编程之旅

C#开发五子棋游戏:从新手到高手的编程之旅 目录 一、引言 二、项目规划与设计思路 三、棋盘与棋子的数据模型构建 四、交互式用户界面设计 五、核心游戏逻辑实现 一、引言 五子棋,作为一种古老的策略型棋类游戏,在全球拥有广泛的爱好者…...

ELK日志管理实现的3种常见方法

ELK日志管理实现的3种常见方法 1. 日志收集方法 1.1 使用DaemonSet方式日志收集 通过将node节点的/var/log/pods目录挂载给以DaemonSet方式部署的logstash来读取容器日志,并将日志吐给kafka并分布写入Zookeeper数据库.再使用logstash将Zookeeper中的数据写入ES,并通过kibana…...

深度强化学习01

Random variable Probability Density Function 期望 Random Sampling 学习视频 这绝对是我看过最好的深度强化学习!从入门到实战,7小时内干货不断!_哔哩哔哩_bilibili...

C++ 智能指针的使用

智能指针类型 在C程序中,普通变量使用栈内存,为函数运行时专用,结束后会自动释放,无须考虑内存释放问题。 但堆内存是共用的,其使用是通过指针变量的new来分配,使用delete来释放,因指针使用方便…...

Flutter 核心原理 - UI 框架(UI Framework)

Flutter 既能保证很高的开发效率,又能获得很好的性能。 这两年 Flutter 技术热度持续提高,整个 Flutter 生态和社区也发生了翻天覆地的变化。目前Flutter 稳定版发布到了3.0,现在已经支持移动端、Web端和PC端,通过Flutter 开发的…...

Hive优化

工作中涉及到优化部分不多,下面的一些方案可能会缺少实际项目支撑,这里主要是为了完备一下知识体系。 参考的hive参数管理文档地址:https://cwiki.apache.org/confluence/display/Hive/ConfigurationProperties 对于Hive优化,可以…...

React 的 diff 算法

React 的 diff 算法的演进。 在 React 16 之前,React 使用的是称为 Reconciliation 的 diff 算法。Reconciliation 算法通过递归地比较新旧虚拟 DOM 树的每个节点,找出节点的差异,并将这些差异应用到实际的 DOM 上。整个过程是递归的&#x…...

综合知识篇07-软件架构设计考点(2024年软考高级系统架构设计师冲刺知识点总结系列文章)

专栏系列文章: 2024高级系统架构设计师备考资料(高频考点&真题&经验)https://blog.csdn.net/seeker1994/category_12593400.html案例分析篇00-【历年案例分析真题考点汇总】与【专栏文章案例分析高频考点目录】(2024年软考高级系统架构设计师冲刺知识点总结-案例…...

【GPT-SOVITS-05】SOVITS 模块-残差量化解析

说明:该系列文章从本人知乎账号迁入,主要原因是知乎图片附件过于模糊。 知乎专栏地址: 语音生成专栏 系列文章地址: 【GPT-SOVITS-01】源码梳理 【GPT-SOVITS-02】GPT模块解析 【GPT-SOVITS-03】SOVITS 模块-生成模型解析 【G…...

Flutter第四弹:Flutter图形渲染性能

目标: 1)Flutter图形渲染性能能够媲美原生? 2)Flutter性能优于React Native? 一、Flutter图形渲染原理 1.1 Flutter图形渲染原理 Flutter直接调用Skia。 Flutter不使用WebView,也不使用操作系统的原生控件,而是…...

[氮化镓]GaN中质子反冲离子的LET和射程特性

这篇文件是一篇关于氮化镓(GaN)中质子反冲离子的线性能量转移(LET)和射程特性的研究论文,发表在《IEEE Transactions on Nuclear Science》2021年5月的期刊上。论文的主要内容包括: 研究背景:氮…...

【项目】C++ 基于多设计模式下的同步异步日志系统

前言 一般而言,业务的服务都是周而复始的运行,当程序出现某些问题时,程序员要能够进行快速的修复,而修复的前提是要能够先定位问题。 因此为了能够更快的定位问题,我们可以在程序运行过程中记录一些日志,通…...

安卓国产百度网盘与国外云盘软件onedrive对比

我更愿意使用国外软件公司的产品,而不是使用国内百度等制作的流氓软件。使用这些国产软件让我不放心,他们占用我的设备大量空间,在我的设备上推送运行各种无用的垃圾功能。瞒着我,做一些我不知道的事情。 百度网盘安装包大小&…...

健身·健康行业Web3新尝试:MATCHI

随着区块链技术进入主流,web3 运动已经开始彻底改变互联网,改写从游戏到金融再到艺术的行业规则。现在,MATCHI的使命是颠覆健身行业。 MATCHI是全球首个基于Web3的在线舞蹈健身游戏和全球首个Web3舞蹈游戏的发起者,注册于新加坡&a…...

Docker 离线安装指南

参考文章 1、确认操作系统类型及内核版本 Docker依赖于Linux内核的一些特性,不同版本的Docker对内核版本有不同要求。例如,Docker 17.06及之后的版本通常需要Linux内核3.10及以上版本,Docker17.09及更高版本对应Linux内核4.9.x及更高版本。…...

手游刚开服就被攻击怎么办?如何防御DDoS?

开服初期是手游最脆弱的阶段,极易成为DDoS攻击的目标。一旦遭遇攻击,可能导致服务器瘫痪、玩家流失,甚至造成巨大经济损失。本文为开发者提供一套简洁有效的应急与防御方案,帮助快速应对并构建长期防护体系。 一、遭遇攻击的紧急应…...

应用升级/灾备测试时使用guarantee 闪回点迅速回退

1.场景 应用要升级,当升级失败时,数据库回退到升级前. 要测试系统,测试完成后,数据库要回退到测试前。 相对于RMAN恢复需要很长时间, 数据库闪回只需要几分钟。 2.技术实现 数据库设置 2个db_recovery参数 创建guarantee闪回点,不需要开启数据库闪回。…...

线程同步:确保多线程程序的安全与高效!

全文目录: 开篇语前序前言第一部分:线程同步的概念与问题1.1 线程同步的概念1.2 线程同步的问题1.3 线程同步的解决方案 第二部分:synchronized关键字的使用2.1 使用 synchronized修饰方法2.2 使用 synchronized修饰代码块 第三部分&#xff…...

java调用dll出现unsatisfiedLinkError以及JNA和JNI的区别

UnsatisfiedLinkError 在对接硬件设备中,我们会遇到使用 java 调用 dll文件 的情况,此时大概率出现UnsatisfiedLinkError链接错误,原因可能有如下几种 类名错误包名错误方法名参数错误使用 JNI 协议调用,结果 dll 未实现 JNI 协…...

大数据零基础学习day1之环境准备和大数据初步理解

学习大数据会使用到多台Linux服务器。 一、环境准备 1、VMware 基于VMware构建Linux虚拟机 是大数据从业者或者IT从业者的必备技能之一也是成本低廉的方案 所以VMware虚拟机方案是必须要学习的。 (1)设置网关 打开VMware虚拟机,点击编辑…...

HTML前端开发:JavaScript 常用事件详解

作为前端开发的核心,JavaScript 事件是用户与网页交互的基础。以下是常见事件的详细说明和用法示例: 1. onclick - 点击事件 当元素被单击时触发(左键点击) button.onclick function() {alert("按钮被点击了!&…...

html-<abbr> 缩写或首字母缩略词

定义与作用 <abbr> 标签用于表示缩写或首字母缩略词&#xff0c;它可以帮助用户更好地理解缩写的含义&#xff0c;尤其是对于那些不熟悉该缩写的用户。 title 属性的内容提供了缩写的详细说明。当用户将鼠标悬停在缩写上时&#xff0c;会显示一个提示框。 示例&#x…...

【数据分析】R版IntelliGenes用于生物标志物发现的可解释机器学习

禁止商业或二改转载&#xff0c;仅供自学使用&#xff0c;侵权必究&#xff0c;如需截取部分内容请后台联系作者! 文章目录 介绍流程步骤1. 输入数据2. 特征选择3. 模型训练4. I-Genes 评分计算5. 输出结果 IntelliGenesR 安装包1. 特征选择2. 模型训练和评估3. I-Genes 评分计…...

深入浅出深度学习基础:从感知机到全连接神经网络的核心原理与应用

文章目录 前言一、感知机 (Perceptron)1.1 基础介绍1.1.1 感知机是什么&#xff1f;1.1.2 感知机的工作原理 1.2 感知机的简单应用&#xff1a;基本逻辑门1.2.1 逻辑与 (Logic AND)1.2.2 逻辑或 (Logic OR)1.2.3 逻辑与非 (Logic NAND) 1.3 感知机的实现1.3.1 简单实现 (基于阈…...