使用Py6S模型实现高分一号WFV3数据的大气校正通过研究区的范围求DEM高度
时间: 2024-03-10 10:45:06 浏览: 222
使用Py6S模型实现高分一号WFV3数据的大气校正,可以按照以下步骤进行:
1. 安装Py6S模块:在Python环境下,使用pip install py6s安装Py6S模块。
2. 准备数据:下载高分一号WFV3数据,并使用相关软件读取数据。
3. 设置6S模型参数:根据研究区的纬度、经度、日期、时间、太阳天顶角、卫星天顶角、相对方位角、大气气溶胶光学厚度等参数,设置6S模型参数。
4. 实现大气校正:使用6S模型计算研究区中每个像元的大气校正系数,对数据进行大气校正。
5. 求解DEM高度:在研究区的范围内,使用遥感数据或测量数据建立DEM模型,从而得到该区域内地形的高程信息。
具体实现过程可以参考以下代码:
```python
import numpy as np
from Py6S import *
from osgeo import gdal
# 设置6S模型参数
def set_6s_parameters(latitude, longitude, datetime, altitude, solar_z, view_z, relative_az, aot):
s = SixS()
s.altitudes.set_sensor_satellite_level()
s.geometry.solar_z = solar_z
s.geometry.view_z = view_z
s.geometry.relative_azimuth = relative_az
s.geometry.lat = latitude
s.geometry.lon = longitude
s.altitudes.set_sensor_satellite_level()
s.altitudes.set_target_custom_altitude(altitude)
s.aero_profile = AeroProfile.PredefinedType(AeroProfile.Maritime)
s.atmos_profile = AtmosProfile.UserWaterAndOzone(datetime.month, aot)
s.wavelength = Wavelength(PredefinedWavelengths.Landsat_TM_B1)
s.aot550 = aot
s.run()
return s.outputs.transmittance_total, s.outputs.downward_radiance, s.outputs.radiance_reflected
# 实现大气校正
def atmospheric_correction(input_file, output_file, latitude, longitude, date, time, altitude, aot):
# 读取高分一号WFV3数据
dataset = gdal.Open(input_file)
metadata = dataset.GetMetadata()
solar_z = float(metadata['SUN_ELEVATION'])
band_num = dataset.RasterCount
gt = dataset.GetGeoTransform()
pixel_size = gt[1]
view_z = np.zeros((band_num,), dtype=np.float32) + 0.01
relative_az = np.zeros((band_num,), dtype=np.float32)
for i in range(band_num):
view_z[i] = 0.01
relative_az[i] = 0.0
# 设置6S模型参数
trans, l_down, l_ref = set_6s_parameters(latitude, longitude, date, altitude, solar_z, view_z, relative_az, aot)
# 对数据进行大气校正
for i in range(band_num):
band = dataset.GetRasterBand(i + 1)
arr = band.ReadAsArray().astype(np.float32)
arr[arr == 0] = np.nan
arr *= trans[i]
arr -= l_down[i]
arr /= l_ref[i]
driver = gdal.GetDriverByName('GTiff')
outDataSet = driver.Create(output_file, dataset.RasterXSize, dataset.RasterYSize, band_num, band.DataType)
outDataSet.SetGeoTransform(gt)
outDataSet.SetProjection(dataset.GetProjection())
outBand = outDataSet.GetRasterBand(i + 1)
outBand.WriteArray(arr)
outBand.FlushCache()
# 关闭数据集
dataset = None
# 求解DEM高度
def get_dem_height(input_file, output_file):
dataset = gdal.Open(input_file)
band = dataset.GetRasterBand(1)
arr = band.ReadAsArray()
gt = dataset.GetGeoTransform()
rows, cols = arr.shape
x_arr = np.linspace(gt[0] + gt[1] / 2, gt[0] + gt[1] * (cols - 0.5), cols)
y_arr = np.linspace(gt[3] + gt[5] * (rows - 0.5), gt[3] + gt[5] / 2, rows)
xv, yv = np.meshgrid(x_arr, y_arr)
driver = gdal.GetDriverByName('GTiff')
outDataSet = driver.Create(output_file, cols, rows, 1, band.DataType)
outDataSet.SetGeoTransform(gt)
outDataSet.SetProjection(dataset.GetProjection())
outBand = outDataSet.GetRasterBand(1)
outBand.WriteArray(arr)
outBand.FlushCache()
dataset = None
# 输入数据路径
input_file = 'input.tif'
# 输出数据路径
output_file = 'output.tif'
# 研究区纬度
latitude = 30.0
# 研究区经度
longitude = 120.0
# 日期
date = datetime.datetime(2018, 7, 1, 8, 0)
# 海拔高度
altitude = 100.0
# 大气气溶胶光学厚度
aot = 0.1
# 对高分一号WFV3数据进行大气校正
atmospheric_correction(input_file, output_file, latitude, longitude, date, time, altitude, aot)
# 求解DEM高度
get_dem_height(output_file, 'dem.tif')
```
其中,input_file和output_file分别为输入数据路径和输出数据路径;latitude和longitude分别为研究区的纬度和经度;date为日期;altitude为海拔高度;aot为大气气溶胶光学厚度。在实现大气校正时,需要根据数据参数设置相应的6S模型参数,对数据进行大气校正;在求解DEM高度时,可以使用gdal库读取处理后的数据,使用遥感数据或测量数据建立DEM模型,从而得到该区域内地形的高程信息。
阅读全文