2025-11-14 17:10:37 +00:00
"""
@Project : windProject
@File : WindSpeedInversion . py
2025-11-20 09:32:46 +00:00
@Function : 单景处理影像
2025-11-14 17:10:37 +00:00
@Author : CZH
@Date : 2025 / 10 / 19 14 : 39
@Version : 1.0 .0
"""
2025-11-20 09:32:46 +00:00
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 )