Python读取遥感影像并计算NDVI指数

news2024/11/15 17:47:18

Python读取遥感影像并计算NDVI指数

先附上源码
读取的遥感影像数据需要先进行预处理

from osgeo import gdal
import numpy as np
import pandas as pd
import os
np.seterr(divide='ignore', invalid='ignore')

class Grid:
    # =============================================================================
    #     1. 函数1 read_tiff读取影像
    # =============================================================================
    def read_tiff(self, filename):
        # 读取影像,获取影像位置
        dataset = gdal.Open(filename)
        # 获取影像波段数,获取影像长宽
        im_band=dataset.GetRasterBand   #波段数
        im_width = dataset.RasterXSize  # 宽,列数
        im_height = dataset.RasterYSize  # 高,行数
        # 仿射矩阵
        im_GeoTransform = dataset.GetGeoTransform()
        # 地图投影信息
        img_proj = dataset.GetProjection()

        im_data = dataset.ReadAsArray(0, 0, im_width, im_height)
        del dataset
        return img_proj, im_GeoTransform, im_data

    # =============================================================================
    #     函数2 write_tiff,存储为GTIFF
    # =============================================================================
    def write_tiff(self, filename, im_proj, im_GeoTransform, im_data):
        # 判断栅格数据类型
        if 'int8' in im_data.dtype.name:  # int8 uint8
            datatype = gdal.GDT_Byte
        elif 'int16' in im_data.dtype.name:  # int16 uint16~DN值/反射率
            datatype = gdal.GDT_UInt16
        elif 'int32' in im_data.dtype.name:  # int16 uint16~DN值/反射率
            datatype = gdal.GDT_UInt32
        else:
            datatype = gdal.GDT_Float32
            # 判读数组维数
        if len(im_data.shape) == 3:
            im_bands, im_height, im_width = im_data.shape
        else:
            im_bands, (im_height, im_width) = 1, im_data.shape
            # 创建文件
        driver = gdal.GetDriverByName("GTiff")
        dataset = driver.Create(filename, im_width, im_height, im_bands, datatype)
        dataset.SetGeoTransform(im_GeoTransform)
        dataset.SetProjection(im_proj)
        if im_bands == 1:
            dataset.GetRasterBand(1).WriteArray(im_data)  # 写入数组数据
        else:
            for i in range(im_bands):
                dataset.GetRasterBand(i + 1).WriteArray(im_data[i])
        del dataset

    # =============================================================================
    #     函数3 calndvi,输入波段B G R NIR数组,返回单波段数组
    # =============================================================================
    def calndvi(self, im_data):
        # print(im_data.shape)
        band_r = im_data[2, :, :]#band3 R
        band_nir = im_data[3, :, :]#band4 NIR
        ndvi = (band_nir - band_r) / (band_nir + band_r)
        # print(ndvi.dtype.name)
        return ndvi

if __name__ == "__main__":


    filename = r'D:\浏览器下载位置\GF1_WFV4_E116.1_N38.5_20230621_L1A0007353828.tiff'
    run=Grid()
    img_proj, im_GeoTransform, im_data=run.read_tiff(filename)
    ndvi=run.calndvi(im_data)
    print(ndvi)
    run.write_tiff('1.tiff', img_proj, im_GeoTransform, ndvi)

代码讲解

1、GDAL库的open函数可以获取.tiff格式的影像,将影像存储在dataset的数据集对象中,该对象包括了波段数、宽高、仿射矩阵、地图投影信息信息。

分别用GetRasterBand、RasterXSize、RasterYSize、GetGeoTransform()、GetProjection()来获取这些信息。

2、ReadAsArray() 方法接受四个参数:起始点的横坐标和纵坐标 ( 0, 0),以及要读取的宽度和高度 (im_width, im_height)。这意味着它会从数据集中的 (0, 0) 点开始,读取宽度为 im_width,高度为 im_height 的数组数据。

返回的结果是一个包含数组数据的变量 im_data。你可以在后续的代码中使用 im_data 来处理或分析数据集中的数组信息。

3、通常情况下,使用del可以释放变量所占用的内存空间,或者删除列表中的某个元素,或者删除对象等。

4、后续的操作只需要对im_data进行就行。im_data[0, :, :],im_data[1, :, :],im_data[2, :, :],im_data[3, :, :]分别获取4个波段的值

5、然后计算NDVI为(近红-红)/(近红+红)

6、创建一个Grid类的子对象run。调用Grid类的读数据函数,获取im_data,使用calndvi计算NDVI,最后调用写函数,记得名字要带后缀.tiff.

验证

看看计算的NDVI的tiff图像在Arcgis中运行怎么样
在这里插入图片描述

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

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

相关文章

element中Notification组件(this.$notify)自定义样式

1、自定义样式效果 2、vue代码 this.notifications this.$notify({title: ,dangerouslyUseHTMLString: true,duration: obj.remindMethod3 ? 0:4500,customClass: notify-warning,offset: 50,showClose: false,message: this.$createElement("div",null,[this.$…

五指山下500年

工作中的困难 在工作中,我曾经遇到一件事情让我有强烈的情绪波动。那是一次团队内部分配任务的时候,我遇到了一个非常棘手的问题。 我需要在几个团队成员之间分配任务,但是我不知道如何分配才能让每个人都满意。我知道,如果任务…

微服务-sentinel详解

文章目录 一、前言二、知识点主要构成1、sentinel基本概念1.1、资源1.2、规则 2、sentinel的基本功能2.1、流量控制2.2、熔断降级 3、控制台安装3.1、官网下载jar包3.2、启动控制台 4、项目集成 sentinel4.1、依赖配置4.2、配置文件中配置sentinel控制台地址信息4.3、配置流控4…

美国陆军网络司令部利用人工智能增强网络攻防和作战决策能力

源自: 奇安网情局 声明:公众号转载的文章及图片出于非商业性的教育和科研目的供大家参考和探讨,并不意味着支持其观点或证实其内容的真实性。版权归原作者所有,如转载稿涉及版权等问题,请立即联系我们删除。 “人工智能技术与咨询…

零侵入,零改造,模拟人的“统计数字员工”成就新时代智能普查

“您好,我们是余杭区经济普查员,这是第五次全国经济普查告知书。”近期,小编陆陆续续看到了许多普查人员的辛勤身影。 啥是第五次全国经济普查? 第五次全国经济普查是一项重大国情国力调查,主要目的是全面调查我国第…

护眼灯什么价位的好?有什么性价比的台灯吗

台灯是卧室和书房必备的家用电器之一,现在市场上销售的台灯种类琳琅满目,样式让人眼花缭乱,价格和质量又参差不齐,再加上口若悬河的销售人员为产品做广告的误导,如果事先没有做足功课,盲目地去挑选一台适合…

Kind创建本地环境安装Ingress

目录 1.K8s什么要使用Ingress 2.在本地K8s集群安装Nginx Ingress controller 2.1.使用Kind创建本地集群 2.1.1.创建kind配置文件 2.1.2.执行创建命令 2.2.找到和当前k8s版本匹配的Ingress版本 2.2.1.查看当前的K8s版本 2.2.2.在官网中找到对应的合适版本 2.3.按照版本安…

分库分表篇-2.4 springBoot 集成Mycat(1.6) 分库分表,读写分离,分布式事务

文章目录 前言一、分库分表:二、读写分离:2.1 读写分离的实现:2.2 主从延迟:2.2.1 主从延迟造成的问题:2.2.2 主从延迟的原因:2.2.3 主从延迟的解决方案:2.2.3.1 db 层面:2.2.3.2 程…

苹果手机QQ聊天记录怎么恢复?不容错过的3个好方法!

之前把很久不用的QQ给卸载了,但是现在突然想起来里面有很重要的聊天记录,友友们,有什么办法能够帮我找回聊天记录吗? 随着微信的崛起,现在很多人已经不怎么使用QQ了,因此很多小伙伴都把QQ卸载了。但是卸载后…

BST55电子式流量传感器

原理、 结构 基于热式原理, 在封闭的探头内包含两个电阻, 其中一个被加热作为探 测电阻, 另一个未被加热作为基准电阻, 当介质流动时, 加热电阻 上的 热量被带走, 电阻值被改变, 两个电阻差值被…

分库分表篇-2.2 Mycat-分片规则

文章目录 前言一、Mycat table的分片:二、常用分片规则:2.1 id 范围分片:2.2 id 取模分片:2.3 按照枚举值 分片:2.4 一致性hash hash 环:2.5 ER 分片:2.6 库内分表:2.7 全局表&#…

七天内连续登陆天数

一、需求描述 业务理解1:七天内最大连续登陆天数 业务理解2:七天内最近连续登陆天数(最近一天如果未登陆则连续登陆天数为0) 示例说明: 二、数据结构 流量表 tracking 字段名字段中文名userid用户iddt分区 口径描…

如果你觉得自己很失败,请观看此内容 视频学习

目录 什么是成功?​​​​​​​ How can we succeed in such an unfair world? 我们如何在这个不公平的地球上获得成功? 如何去找到自己的不公平优势呢? 最开始也有常有人跟她说你做视频是赚不到钱的 你做了,并不代表你做…

河道漂浮物检测:安防监控/视频智能分析/AI算法智能分析技术如何助力河道整治工作?

随着社会的发展和人们生活水平的进步,水污染问题也越来越严重,水资源监管和治理成为城市发展的一大困扰,水面上的漂浮垃圾不仅会影响河道生态安全并阻碍船舶航行,还会影响人们的身体健康。 TSINGSEEE青犀AI智能分析平台在环保场景…

当连锁零售超市遇上温湿度监控,简直是王炸!

在食品行业中,温湿度监控是确保食品质量和安全性的至关重要的环节之一。温度和湿度是影响食品保存期限、品质、口感以及微生物滋生的关键因素。通过有效的监测和管理,可以降低食品受损和变质的风险,保障消费者的健康和权益。 客户案例 福建某…

设计模式之建造者模式与原型模式

目录 建造者模式 简介 使用场景 优缺点 模式结构 实现 原型模式 简介 应用场景 优缺点 模式结构 实现 建造者模式 简介 将复杂对象的构建与表示进行分离,使得同样的构建过程可以创建不同的表示。是一个将复杂的对象分解为多个简单的对象,然…

Elasticsearch分布式搜索结果处理

1.排序 elasticsearch默认是根据相关度算分(_score)来排序,但是也支持自定义方式对搜索结果排序。可以排序字段类型有:keyword类型、数值类型、地理坐标类型、日期类型等。 1.1.普通字段排序 keyword、数值、日期类型排序的语法…

四季同行·雷锋家乡学雷锋“青柚课堂“讲师培训

为了给益阳市“青柚课堂”性教育志愿者讲师团队增加新鲜血液,8月27日,我机构在益阳市红十字救护培训基地开展了湖南省第二期"四季同行雷锋家乡学雷锋"孵化项目"青柚课堂"乡村女童性教育推广计划2023年师资培训。本次活动由我机构“蚂…

虹科方案 | 车辆零部件温度采集解决方案

虹科提供的车辆零部件温度监控与采集解决方案,通过热电偶模块来采集、监控、处理温度数据,可以通过CAN / CAN FD进行传输,确保车辆系统的正常运行和安全性。 文章目录 一、热电偶在汽车领域的应用什么是热电偶模块?热电偶模块如何…

PSP - 蛋白质结构预测 OpenFold Multimer 训练模型的数据加载

欢迎关注我的CSDN:https://spike.blog.csdn.net/ 本文地址:https://spike.blog.csdn.net/article/details/132597659 OpenFold Multimer 是基于深度学习的方法,预测蛋白质的多聚体结构和相互作用。利用大规模的蛋白质序列和结构数据&#xff…