【python】批量实现modis数据的辐射定标,大气校正及地形校正

批量实现modis数据的辐射定标,大气校正及地形校正

1.定义辐射定标函数

def radiance_cal(band, gain, bias, scale_factor):
    rad = gain * (band - bias) * scale_factor
    return rad

2.定义反射率计算函数

def reflectance_cal(rad, esun, d):
    refl = np.pi * rad * d ** 2 / (esun * np.cos(np.deg2rad(sza)))
    return refl

3.获取增益、偏移和比例因子等信息

meta = modis_file.GetMetadata('SUBDATASETS')
gain = float(meta['gain'])
bias = float(meta['bias'])
scale_factor = float(meta['scale_factor'])
esun = float(meta['esun'])
d = float(meta['distance'])
sza = float(meta['sza'])

4.可视化输出结果

xsize = modis_file.RasterXSize
ysize = modis_file.RasterYSize
gt = modis_file.GetGeoTransform()
xmin, xres, _, ymax, _, yres = gt
xmax = xmin + xsize * xres
ymin = ymax + ysize * yres
xx, yy = np.meshgrid(np.linspace(xmin, xmax, xsize), np.linspace(ymin, ymax, ysize))
xy = np.column_stack((xx.flatten(), yy.flatten()))
xy = np.flipud(xy)
values = np.flipud(reflectance).ravel()
grid = griddata(xy, values, (xx, yy), method='cubic')
plt.imshow(grid, cmap='gray')
plt.show()

5.批量执行 MODIS 数据的辐射校正、大气校正和地形校正
完整代码

import os
import numpy as np
from osgeo import gdal

# 设置 MODIS 文件路径
data_dir = "/path/to/modis/data/"

# 设置输出文件路径
out_dir = "/path/to/output/dir/"

# 加载大气校正和地形校正模块
import spectral
import spectral.io.envi as envi

# 加载 MODIS 文件列表
file_list = os.listdir(data_dir)

# 循环处理每个 MODIS 文件
for file_name in file_list:
    if file_name.endswith(".hdf"):
        # 设置输出文件名
        out_name = file_name.replace(".hdf", ".tif")

        # 定义函数,用于执行辐射校正
        def radiance_correction(file_name, out_dir, out_name):
            # 加载 MODIS 数据
            hdf_file = gdal.Open(os.path.join(data_dir, file_name), gdal.GA_ReadOnly)
            subdatasets = hdf_file.GetSubDatasets()

            # 选择辐射数据集
            radiance_subdataset = None
            for i in subdatasets:
                if "Radiance" in i[0]:
                    radiance_subdataset = i[0]
                    break
            if radiance_subdataset is None:
                raise Exception("Radiance subdataset not found in HDF file.")

            # 加载辐射数据
            radiance_data = gdal.Open(radiance_subdataset, gdal.GA_ReadOnly)
            radiance_band = radiance_data.GetRasterBand(1)
            radiance_array = radiance_band.ReadAsArray()

            # 加载定标数据
            calibration_subdataset = None
            for i in subdatasets:
                if "Reflectance" in i[0]:
                    calibration_subdataset = i[0]
                    break
            if calibration_subdataset is None:
                raise Exception("Reflectance subdataset not found in HDF file.")
            calibration_data = gdal.Open(calibration_subdataset, gdal.GA_ReadOnly)

            # 加载定标参数
            slope_band = calibration_data.GetRasterBand(1)
            slope_array = slope_band.ReadAsArray()
            intercept_band = calibration_data.GetRasterBand(2)
            intercept_array = intercept_band.ReadAsArray()

            # 执行辐射校正
            radiance_array = radiance_array * slope_array + intercept_array

            # 保存结果
            out_driver = gdal.GetDriverByName("GTiff")
            out_file = out_driver.Create(os.path.join(out_dir, out_name), radiance_band.XSize, radiance_band.YSize, 1, radiance_band.DataType)
            out_file.GetRasterBand(1).WriteArray(radiance_array)

            # 释放资源
            out_file.FlushCache()
            out_file = None
            radiance_band = None
            radiance_data = None
            hdf_file = None
            gdal.UseExceptions()

        # 执行辐射校正
        radiance_correction(file_name, out_dir, out_name)

        # 加载辐射校正结果
        radiance_file = os.path.join(out_dir, out_name)
        radiance_data = gdal.Open(radiance_file, gdal.GA_ReadOnly)
        radiance_band = radiance_data.GetRasterBand(1)
        radiance_array = radiance_band.ReadAsArray
  • 2
    点赞
  • 28
    收藏
    觉得还不错? 一键收藏
  • 4
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值