Python读取栅格图像并对像元数据处理后导出到表格文件中
本文介绍基于Python语言中的gdal模块,读取一景.tif格式的栅格遥感影像文件,提取其中每一个像元的像素数值,对像素值加以计算(辐射定标)后,再以一列数据的形式将计算后的各像元像素数据保存在一个.csv格式文件中的方法。
首先,我们明确一下本文的需求。现在有一个栅格遥感影像文件,其为.tiff格式的文件(但其实和.tif格式文件的操作方法是一样的),且像元的数值都是真实数值乘上10000之后的。这一遥感影像如下图所示,可以看到其各个波段的像元像素数据都是几百、几千的范围。

我们现在希望,对于这一景遥感影像的第一个波段(如果大家需要对多个波段加以这一操作,那么就在本文的代码中加以循环,分别对多个波段依次加以同样的处理就好),提取出其中每一个像元的数值;随后对提取出来的数据加以辐射定标,即除以10000,并将结果保存在一个.csv格式文件中,且以一列的形式来保存。这里本文之所以需要用多行一列而非多行多列的矩阵格式来存放数据,是因为后面需要将这些像素数据当作神经网络的预测样本,即一行表示一个样本,所以就需要保存为多行一列;如果大家需要保存为多行多列的矩阵格式,那代码的思路还是一致的,就是在导出数据之前将其保存为二维矩阵格式的变量就好。
知道了需求,我们就可以开始代码的撰写;具体代码如下。
# -*- coding: utf-8 -*-
"""
Created on Wed Nov 29 01:32:28 2023
@author: fkxxgis
"""
import csv
from osgeo import gdal
file_path = "E:/04_Reconstruction/05_Image_Test/GF1WFV4.16m.2021252035621.48STB.000000_SR.tiff"
dataset = gdal.Open(file_path, gdal.GA_ReadOnly)
band = dataset.GetRasterBand(1)
data = band.ReadAsArray()
dataset = None
data = data * 0.0001
data_one_column = data.flatten()
csv_file = "E:/04_Reconstruction/05_Image_Test/column_1.csv"
with open(csv_file, 'w', newline='') as file:
writer = csv.writer(file)
writer.writerow(["Value"])
writer.writerows([[value] for value in data_one_column])
其中,我们首先导入所需的库。在这里,csv库用于处理.csv格式文件,gdal库(从osgeo模块中导入)则用于读取和处理遥感影像文件;随后,定义遥感影像文件路径——file_path用来指定要读取的遥感影像文件的路径。
接下来,我们打开遥感影像文件。dataset = gdal.Open(file_path, gdal.GA_ReadOnly)意味着我们以只读方式打开遥感影像文件,并将返回的Dataset对象赋值给变量dataset;随后,获取第一个波段的像元值,这可以通过band = dataset.GetRasterBand(1)来完成(需要注意,这里波段编号的索引是从1开始的);随后,data = band.ReadAsArray()意思是将波段的像元值读取为一个二维数组,并将结果赋值给变量data。随后,我们需要关闭遥感影像文件,通过将dataset变量设为None,释放对遥感影像文件的引用,从而关闭文件。
其次,我们对像元值进行处理。首先,完成辐射定标,也就是通过data = data * 0.0001将像元值乘以0.0001;随后,将处理后的像元值按列展平——在这里,data_one_column = data.flatten()表示我们使用flatten()方法将二维数组展平为一维数组,并将结果赋值给变量data_one_column。
最后,将上述处理好的数据写入.csv格式文件。其中,csv_file指定要写入的.csv格式文件的路径;with open(csv_file, 'w', newline='') as file表示我们使用open()函数打开.csv格式文件,并创建一个csv.writer对象,同时指定文件的写入模式为覆盖写入'w';writer.writerow(["Value"])意味着我们写入.csv格式文件的第一行,即表头,这里是一个标题为Value的列;最后,writer.writerows([[value] for value in data_one_column])通过迭代data_one_column中的每个值,并将其作为单独的列表传递给writer.writerows()方法,从而将每个值写入.csv格式文件的一行中。
运行上述代码,即可得到如下图所示的结果.csv格式文件。

其中,第一行就是我们的列名;后面几行数据都是0,这是由于原本的遥感影像在左上角区域是NoData值(大家看我们本文的第一张图就能看到)导致的。如果往下继续拖动这个.csv格式文件,就会看到处理后的非0数据了。
至此,大功告成。
Python读取栅格图像并对像元数据处理后导出到表格文件中的更多相关文章
- IO流的练习5 —— 读取文件中的字符串,排序后写入另一文件中
需求:已知s.txt文件中有这样的一个字符串:“hcexfgijkamdnoqrzstuvwybpl” 请编写程序读取数据内容,把数据排序后写入ss.txt中. 分析: A:读取文件中的数据 B:把数 ...
- python 网络爬虫(二) BFS不断抓URL并放到文件中
上一篇的python 网络爬虫(一) 简单demo 还不能叫爬虫,只能说基础吧,因为它没有自动化抓链接的功能. 本篇追加如下功能: [1]广度优先搜索不断抓URL,直到队列为空 [2]把所有的URL写 ...
- python 批量修改预定字符串并将修改后的字符串插入文件指定位置
下面的例子是在文件的指定位置增加指定字符串的例子 修改配置文件: def add_str(pre_str): lines = [] flag = True f = open("z.txt&q ...
- 从二进制数据流中构造GDAL可以读取的图像数据
在很多时候,我们的图像数据往往都不是文件方式存储在磁盘上,而是可能从网络或者数据库中获取的是二进制的图像数据流.最简单的方式和最容易想到的方式就是将这个文件流保存到磁盘上形成一个文件,然后再使用GDA ...
- Python自动化测试框架——数据驱动(从文件中读取)
学过编程的伙伴们都知道,数据不仅可以从代码中读取,还可以从文件中读取. 今天小编就简要的介绍一下从文件中读取数据,并应用到自动化测试中方法. 先来展示下接下来将要用到的文件在项目中的结构 从txt文件 ...
- 归纳从文件中读取数据的六种方法-JAVA IO基础总结第2篇
在上一篇文章中,我为大家介绍了<5种创建文件并写入文件数据的方法>,本节我们为大家来介绍6种从文件中读取数据的方法. 另外为了方便大家理解,我为这一篇文章录制了对应的视频:总结java从文 ...
- Jmeter实现从csv文件中随机读取数据
一.需求 参数放在csv文件中,文件格式如下,需求每次从文件中随机读取一行数据. 二.步骤 1.在csv文件中新增加一列,pl 2.新增一个配置原件-随机数,设置如下: 50是文件数据的行数 3.新增 ...
- python将字典列表导出为Excel文件的方法
将如下的字典列表内容导出为Excel表格文件形式: 关于上图字典列表的写入,请参考文章:https://blog.csdn.net/weixin_39082390/article/details/ ...
- Python ArcPy批量拼接长时间序列栅格图像
本文介绍基于Python中ArcPy模块,对大量不同时相的栅格遥感影像按照其成像时间依次执行批量拼接的方法. 在前期的文章Python arcpy创建栅格.批量拼接栅格中,我们介绍了利用Pyt ...
- json数据处理:读取文件中的json字符串,转为python字典
方法1: 读取文件中的json字符串, 再用json.loads转为python字典 import json str_file = './960x540/config.json' with open( ...
随机推荐
- linux运维巡检脚本
#!/bin/bash#author by acrossyao#date: 2021-02-08#张波勇巡检脚本echo "--------------------------------- ...
- Games 101 作业1
1 坐标系 关于坐标系,坐标系其实就是空间信息.有了坐标系我们可以非常详细的描述这个世界,为了方便一般为一个观测者生成一个坐标系. 坐标系以观测者所在的位置为原点.就像我们常说的前面三米,我们对世界的 ...
- Java遇到PKIX path building failed错误的解决办法
Java调用HTTPS可能出现如下错误: PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilderExc ...
- vue3 js 学习笔记
Vue3-js 学习笔记 目录 Vue3-js 学习笔记 目录 前言 reactive 数据绑定 事件绑定 生命函数周期 计算属性-computed props emit-自定义事件 ref-获取元素 ...
- Nuxt.js 应用中的 nitro:config 事件钩子详解
title: Nuxt.js 应用中的 nitro:config 事件钩子详解 date: 2024/11/2 updated: 2024/11/2 author: cmdragon excerpt: ...
- (系列十一)Vue3框架中路由守卫及请求拦截(实现前后端交互)
说明 该文章是属于OverallAuth2.0系列文章,每周更新一篇该系列文章(从0到1完成系统开发). 该系统文章,我会尽量说的非常详细,做到不管新手.老手都能看懂. 说明:OverallAuth2 ...
- bootstrap模态框modal和select2合用时input无法获取焦点
场景:bootstrap模态框modal和select2合用时input无法获取焦点,导致输入法一直闪动,不能输入中文 解决办法: 1.把页面中的 tabindex="-1" 删掉 ...
- (Redis基础教程之八) 如何在Redis中管理Sets
如何在ubuntu18.04上安装和保护redis 如何连接到Redis数据库 如何管理Redis数据库和Keys 如何在Redis中管理副本和客户端 如何在Redis中管理字符串 如何在Redis中 ...
- mvn eclipse:eclipse -Dwtpversion=2.0 -DdownloadSources=true -DdownloadJavadocs=true -DjdkLevel=1.6
mvn eclipse:eclipse -Dwtpversion=2.0 -DdownloadSources=true -DdownloadJavadocs=true -DjdkLevel=1.6
- 深度探讨Java字节代码的操纵方法
本文为IBM工程师成富编写的<Java深度历险>的第一部分Java字节代码的操纵,像这样Java语言的深度理解和运用还没有很多文章,我们把他奉献给读者,希望读者们喜欢. AD:2013云计 ...