当前位置: 首页 > 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…...

19c补丁后oracle属主变化,导致不能识别磁盘组

补丁后服务器重启,数据库再次无法启动 ORA01017: invalid username/password; logon denied Oracle 19c 在打上 19.23 或以上补丁版本后,存在与用户组权限相关的问题。具体表现为,Oracle 实例的运行用户(oracle)和集…...

k8s从入门到放弃之Ingress七层负载

k8s从入门到放弃之Ingress七层负载 在Kubernetes(简称K8s)中,Ingress是一个API对象,它允许你定义如何从集群外部访问集群内部的服务。Ingress可以提供负载均衡、SSL终结和基于名称的虚拟主机等功能。通过Ingress,你可…...

【网络安全产品大调研系列】2. 体验漏洞扫描

前言 2023 年漏洞扫描服务市场规模预计为 3.06(十亿美元)。漏洞扫描服务市场行业预计将从 2024 年的 3.48(十亿美元)增长到 2032 年的 9.54(十亿美元)。预测期内漏洞扫描服务市场 CAGR(增长率&…...

React19源码系列之 事件插件系统

事件类别 事件类型 定义 文档 Event Event 接口表示在 EventTarget 上出现的事件。 Event - Web API | MDN UIEvent UIEvent 接口表示简单的用户界面事件。 UIEvent - Web API | MDN KeyboardEvent KeyboardEvent 对象描述了用户与键盘的交互。 KeyboardEvent - Web…...

新能源汽车智慧充电桩管理方案:新能源充电桩散热问题及消防安全监管方案

随着新能源汽车的快速普及,充电桩作为核心配套设施,其安全性与可靠性备受关注。然而,在高温、高负荷运行环境下,充电桩的散热问题与消防安全隐患日益凸显,成为制约行业发展的关键瓶颈。 如何通过智慧化管理手段优化散…...

【python异步多线程】异步多线程爬虫代码示例

claude生成的python多线程、异步代码示例,模拟20个网页的爬取,每个网页假设要0.5-2秒完成。 代码 Python多线程爬虫教程 核心概念 多线程:允许程序同时执行多个任务,提高IO密集型任务(如网络请求)的效率…...

OpenPrompt 和直接对提示词的嵌入向量进行训练有什么区别

OpenPrompt 和直接对提示词的嵌入向量进行训练有什么区别 直接训练提示词嵌入向量的核心区别 您提到的代码: prompt_embedding = initial_embedding.clone().requires_grad_(True) optimizer = torch.optim.Adam([prompt_embedding...

均衡后的SNRSINR

本文主要摘自参考文献中的前两篇,相关文献中经常会出现MIMO检测后的SINR不过一直没有找到相关数学推到过程,其中文献[1]中给出了相关原理在此仅做记录。 1. 系统模型 复信道模型 n t n_t nt​ 根发送天线, n r n_r nr​ 根接收天线的 MIMO 系…...

使用Matplotlib创建炫酷的3D散点图:数据可视化的新维度

文章目录 基础实现代码代码解析进阶技巧1. 自定义点的大小和颜色2. 添加图例和样式美化3. 真实数据应用示例实用技巧与注意事项完整示例(带样式)应用场景在数据科学和可视化领域,三维图形能为我们提供更丰富的数据洞察。本文将手把手教你如何使用Python的Matplotlib库创建引…...

短视频矩阵系统文案创作功能开发实践,定制化开发

在短视频行业迅猛发展的当下,企业和个人创作者为了扩大影响力、提升传播效果,纷纷采用短视频矩阵运营策略,同时管理多个平台、多个账号的内容发布。然而,频繁的文案创作需求让运营者疲于应对,如何高效产出高质量文案成…...