本文介绍基于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读取栅格图像并对像元数据处理后导出到表格文件中的更多相关文章

  1. IO流的练习5 —— 读取文件中的字符串,排序后写入另一文件中

    需求:已知s.txt文件中有这样的一个字符串:“hcexfgijkamdnoqrzstuvwybpl” 请编写程序读取数据内容,把数据排序后写入ss.txt中. 分析: A:读取文件中的数据 B:把数 ...

  2. python 网络爬虫(二) BFS不断抓URL并放到文件中

    上一篇的python 网络爬虫(一) 简单demo 还不能叫爬虫,只能说基础吧,因为它没有自动化抓链接的功能. 本篇追加如下功能: [1]广度优先搜索不断抓URL,直到队列为空 [2]把所有的URL写 ...

  3. python 批量修改预定字符串并将修改后的字符串插入文件指定位置

    下面的例子是在文件的指定位置增加指定字符串的例子 修改配置文件: def add_str(pre_str): lines = [] flag = True f = open("z.txt&q ...

  4. 从二进制数据流中构造GDAL可以读取的图像数据

    在很多时候,我们的图像数据往往都不是文件方式存储在磁盘上,而是可能从网络或者数据库中获取的是二进制的图像数据流.最简单的方式和最容易想到的方式就是将这个文件流保存到磁盘上形成一个文件,然后再使用GDA ...

  5. Python自动化测试框架——数据驱动(从文件中读取)

    学过编程的伙伴们都知道,数据不仅可以从代码中读取,还可以从文件中读取. 今天小编就简要的介绍一下从文件中读取数据,并应用到自动化测试中方法. 先来展示下接下来将要用到的文件在项目中的结构 从txt文件 ...

  6. 归纳从文件中读取数据的六种方法-JAVA IO基础总结第2篇

    在上一篇文章中,我为大家介绍了<5种创建文件并写入文件数据的方法>,本节我们为大家来介绍6种从文件中读取数据的方法. 另外为了方便大家理解,我为这一篇文章录制了对应的视频:总结java从文 ...

  7. Jmeter实现从csv文件中随机读取数据

    一.需求 参数放在csv文件中,文件格式如下,需求每次从文件中随机读取一行数据. 二.步骤 1.在csv文件中新增加一列,pl 2.新增一个配置原件-随机数,设置如下: 50是文件数据的行数 3.新增 ...

  8. python将字典列表导出为Excel文件的方法

    将如下的字典列表内容导出为Excel表格文件形式: ​ 关于上图字典列表的写入,请参考文章:https://blog.csdn.net/weixin_39082390/article/details/ ...

  9. Python ArcPy批量拼接长时间序列栅格图像

      本文介绍基于Python中ArcPy模块,对大量不同时相的栅格遥感影像按照其成像时间依次执行批量拼接的方法.   在前期的文章Python arcpy创建栅格.批量拼接栅格中,我们介绍了利用Pyt ...

  10. json数据处理:读取文件中的json字符串,转为python字典

    方法1: 读取文件中的json字符串, 再用json.loads转为python字典 import json str_file = './960x540/config.json' with open( ...

随机推荐

  1. GitLab +Jenkins + WebHook配置自动发版

    1.jenkins安装插件 需要安装插件:Gitlab Hook Plugin和Gitlab Plugin 2.Jenkins配置job 复制这里的url,需要在后面gitlab的配置中使用到. 基本 ...

  2. 浅谈 K-D Tree 及其进阶应用

    前言 \(\text{K-D Tree (K-Dimension Tree)}\) 是一种可以有效处理高维信息的数据结构. 在一般信息学竞赛题目中 \(k = 2\),此时它又称 \(\text{2- ...

  3. Java新特性-四大函数式接口

    四大函数式接口指的是Consumer.Function.Predicate.Supplier,位于java.util.function包下: 函数式编程 lamabda表达式 函数式接口:在java中 ...

  4. redis配置启动测试

    解压安装redis tar -xzvf redisxxx.xx生成解压目录 进入解压目录:执行命令 make make install 安装成功: redis默认安装位置/usr/local/bin ...

  5. 关于sizeof、strlen的理解与辨析以及strlen的模拟实现

    关于sizeof.strlen的理解与辨析以及strlen的模拟实现 1. sizeof() sizeof的作用: 计算变量所占内存内存空间大小,单位是字节. 注意事项: ① 首先要明确的一点是:si ...

  6. Greenplum 通过外部表快速导入数据

    通过Greenplum外部表可以快速导入数据 create external table "public"."ext_tablename" ( like &qu ...

  7. 教程:搭建一个我的世界模组服务器(Linux)

    首先给自己的服务器打个广告 服务器版本1.12.2 地址:www.verysucksminecraftserver.top(好像只有一个月) 所需Mod网盘:https://pan.quark.cn/ ...

  8. php如何解决高并发

    PHP交流群  656679284  为PHP广大爱好者提供技术交流,有问必答,相互学习相互进步! 1.应用和静态资源分离 将静态资源(js,css,图片等)放到专门的服务器中. 2.页面缓存 将应用 ...

  9. 一文彻底弄懂Spring Boot的启动过程

    一,Spring Boot启动过程 1. 启动入口 Spring Boot 应用的启动入口通常是一个包含 @SpringBootApplication 注解的主类,并调用 SpringApplicat ...

  10. 一篇讲透:模组典型上网业务的AT上网流程

    ​ 今天我们学习合宙模组典型上网业务的AT上网流程. 文末阅读原文,下载最新教程/固件. 一.简介 本文介绍了合宙4G模组的常用的AT指令和服务器交互的流程. 进一步详细的流程,参见各个模组的AT命令 ...