Manual-Labeling-Tool/WindSpeedModel/WindSpeedInversion.py

139 lines
5.0 KiB
Python
Raw Permalink Blame History

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

"""
@Project windProject
@File WindSpeedInversion.py
@Function :单景处理影像
@Author CZH
@Date 2025/10/19 14:39
@Version 1.0.0
"""
import os
import numpy as np
from ImageHandle import ImageHandler
from osgeo import ogr, gdal
import os
import argparse
import numpy as np
from PIL import Image
import math
from pathlib import Path
from WindSpeedModel import python_windspeedCmod5n,python_ERA5_windAngle
def read_img(filename):
"""
影像读取
:param filename:
:return:
"""
gdal.AllRegister()
img_dataset = gdal.Open(filename) # 打开文件
if img_dataset is None:
msg = 'Could not open ' + filename
print("ERROR", msg)
return None, None, None
im_proj = img_dataset.GetProjection() # 地图投影信息
if im_proj is None:
return None, None, None
im_geotrans = img_dataset.GetGeoTransform() # 仿射矩阵
im_width = img_dataset.RasterXSize # 栅格矩阵的行数
im_height = img_dataset.RasterYSize # 栅格矩阵的行数
im_arr = img_dataset.ReadAsArray(0, 0, im_width, im_height)
del img_dataset
return im_proj, im_geotrans, im_arr
def write_img_envi(filename, im_proj, im_geotrans, im_data, no_data='null'):
"""
影像保存
:param filename: 保存的路径
:param im_proj:
:param im_geotrans:
:param im_data:
:param no_data: 把无效值设置为 nodata
:return:
"""
gdal_dtypes = {
'int8': gdal.GDT_Byte,
'unit16': gdal.GDT_UInt16,
'int16': gdal.GDT_Int16,
'unit32': gdal.GDT_UInt32,
'int32': gdal.GDT_Int32,
'float32': gdal.GDT_Float32,
'float64': gdal.GDT_Float64,
}
if not gdal_dtypes.get(im_data.dtype.name, None) is None:
datatype = gdal_dtypes[im_data.dtype.name]
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
# 创建文件
if os.path.exists(os.path.split(filename)[0]) is False:
os.makedirs(os.path.split(filename)[0])
driver = gdal.GetDriverByName("ENVI") # 数据类型必须有,因为要计算需要多大内存空间
dataset = driver.Create(filename, im_width, im_height, im_bands, datatype)
dataset.SetGeoTransform(im_geotrans) # 写入仿射变换参数
dataset.SetProjection(im_proj) # 写入投影
if im_bands == 1:
# outRaster.GetRasterBand(1).WriteArray(array) # 写入数组数据
outband = dataset.GetRasterBand(1)
outband.WriteArray(im_data)
if no_data != 'null':
outband.SetNoDataValue(no_data)
outband.FlushCache()
else:
for i in range(im_bands):
outband = dataset.GetRasterBand(1 + i)
outband.WriteArray(im_data[i])
outband.FlushCache()
# outRaster.GetRasterBand(i + 1).WriteArray(array[i])
del dataset
dataset=None
def windVector2windDir(in_wind_dir_path):
winddir_proj, winddir_geotrans, winddir_arr = read_img(in_wind_dir_path)
wind_angle=python_ERA5_windAngle(winddir_arr[0,:,:],winddir_arr[1,:,:])
return wind_angle
def windSpeedInversionProcess(in_wind_dir_path,in_inc_angle_path,in_sar_sigma0_path,out_wind_speed_path):
wind_angle = windVector2windDir(in_wind_dir_path)
incangle_proj, incangle_geotrans, incangle_arr=read_img(in_inc_angle_path)
sarsigma0_proj, sarsigma0_geotrans, sarsigma0_arr=read_img(in_sar_sigma0_path)
windspeed_arr=python_windspeedCmod5n(wind_angle,incangle_arr,sarsigma0_arr)
write_img_envi(out_wind_speed_path, sarsigma0_proj, sarsigma0_geotrans, windspeed_arr)
def parse_args():
"""
解析参数文件
:return:
"""
parser = argparse.ArgumentParser(description='wind speed inversion')
parser.add_argument('--input_wind_dir', type=str, default=r'D:\Programs\SpacetyLabelAIPlante\Manual-Labeling-Tool\WindSpeedModel\TestData\SAR_EC_20240801\total_precipitation2024080110_resample.bin', help='wind direct')
parser.add_argument('--input_inc_angle', type=str, default=r'D:\Programs\SpacetyLabelAIPlante\Manual-Labeling-Tool\WindSpeedModel\TestData\SAR_EC_20240801\4254-DB-IncidenceAngle-GEO.bin', help='input incidence angle')
parser.add_argument('--input_sar_sigma0', type=str, default=r'D:\Programs\SpacetyLabelAIPlante\Manual-Labeling-Tool\WindSpeedModel\TestData\SAR_EC_20240801\4254-DB-GEO.bin', help='input sar sigma0 (dB)')
parser.add_argument('--output_wind_speed', type=str, default=r'D:\Programs\SpacetyLabelAIPlante\Manual-Labeling-Tool\WindSpeedModel\TestData\InverserWindSpeed.bin', help='output wind speed')
args = parser.parse_args()
return args
if __name__ == '__main__':
args=parse_args()
in_wind_dir_path = args.input_wind_dir
in_inc_angle_path=args.input_inc_angle
in_sar_sigma0_path = args.input_sar_sigma0
out_wind_speed_path = args.output_wind_speed
windSpeedInversionProcess(in_wind_dir_path,in_inc_angle_path,in_sar_sigma0_path,out_wind_speed_path)