ToB企服应用市场:ToB评测及商务社交产业平台
标题:
批量计算遥感影像NDVI:Python代码
[打印本页]
作者:
去皮卡多
时间:
2024-11-9 14:24
标题:
批量计算遥感影像NDVI:Python代码
本文介绍基于
Python
中的gdal模块,批量基于
大量多波段遥感影像
文件,计算其每1景图像各自的
NDVI
数值,并将
多景效果
依次保存为栅格文件的方法。
如下图所示,现在有大量.tif格式的遥感影像文件,其中均含有
红光波段
与
近红外波段
(别的也可以含有其他光谱波段,有没有都不影响);我们希望,批量计算其每1景遥感影像的
NDVI
。
在之前的文章中,我们多次介绍过在不同软件或平台中计算
NDVI
的方法;而在本文中,我们就介绍一下基于
Python
中的gdal模块,实现
NDVI
批量计算的方法。
这里所需的代码如下。
# -*- coding: utf-8 -*-
"""
Created on Thu Apr 18 12:37:22 2024
@author: fkxxgis
"""
import os
from osgeo import gdal
original_folder = r"E:\04_Reconstruction\99_MODIS\new_data\2021_48STA_Result\Original"
output_folder = r"E:\04_Reconstruction\99_MODIS\new_data\2021_48STA_Result\NDVI_Original"
for filename in os.listdir(original_folder):
if filename.endswith('.tif'):
dataset = gdal.Open(os.path.join(original_folder, filename), gdal.GA_ReadOnly)
width = dataset.RasterXSize
height = dataset.RasterYSize
driver = gdal.GetDriverByName('GTiff')
output_dataset = driver.Create(os.path.join(output_folder, "NDVI_" + filename), width, height, 1, gdal.GDT_Float32)
band_red = dataset.GetRasterBand(3)
data_red = band_red.ReadAsArray()
data_red = data_red.astype(float)
band_nir = dataset.GetRasterBand(4)
data_nir = band_nir.ReadAsArray()
data_nir = data_nir.astype(float)
data_ndvi = (data_nir - data_red) / (data_nir + data_red)
output_band = output_dataset.GetRasterBand(1)
output_band.WriteArray(data_ndvi)
output_band.FlushCache()
output_dataset.SetGeoTransform(dataset.GetGeoTransform())
output_dataset.SetProjection(dataset.GetProjection())
dataset = None
output_dataset = None
print(filename, "finished!")
复制代码
代码团体也非常简朴。起首,我们界说输入文件与输入效果文件的路径,前者就是待计算
NDVI
的遥感影像文件路径,后者则是
NDVI
效果的遥感影像文件路径。
接下来,遍历original_folder文件夹中的文件。其中,os.listdir()用于获取文件夹中的文件列表,其后的endswith('.tif')用于筛选出以.tif扩展名结尾的文件。
随后,对于每个以.tif结尾的文件,起首利用gdal.Open()打开文件——其中的os.path.join()用于构建完备的文件路径;接下来获取影像数据集的宽度和高度,并利用gdal.GetDriverByName()获取
GTiff
驱动步伐,用于创建输出影像文件;同时,利用driver.Create()创建一个与原始影像具有相同大小的输出影像文件。
紧接着,从数据集中获取
红光
和
近红外
波段的数据。dataset.GetRasterBand()用以获取指定的栅格波段,而band.ReadAsArray()则将波段数据读取为数组;同时,我这里还用了astype()转换数组的格式,克制本来遥感影像的数据格式带来的题目——比方,如果本来遥感影像是
无符号整型
的数据格式,那么这里不加astype()计算
NDVI
就会有题目。
其次,即可计算
NDVI
。利用获取的
红光
和
近红外
波段数据计算
NDVI
,并将
NDVI
数据保存在data_ndvi数组中。
末了,将
NDVI
数据写入输出影像文件。output_dataset.GetRasterBand()获取输出影像文件的波段,band.WriteArray()将数据写入波段,band.FlushCache()革新波段缓存。
别的,记得通过output_dataset.SetGeoTransform()和output_dataset.SetProjection()设置输出影像文件的地理变更和投影信息。
同时,必要清理和关闭数据集,将数据集和输出数据集设置为None以开释资源。还可以打印
文件名
和finished!,表示当前文件处置惩罚完成。
实行上述代码,我们即可在效果文件夹中看到计算得到的
NDVI
数据;如下图所示。
至此,大功告成。
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
欢迎光临 ToB企服应用市场:ToB评测及商务社交产业平台 (https://dis.qidao123.com/)
Powered by Discuz! X3.4