609 lines
26 KiB
Python
609 lines
26 KiB
Python
|
"""
|
|||
|
@Project :microproduct
|
|||
|
@File :AtmosphericDelayAlg.py
|
|||
|
@Function :主程序,执行入口
|
|||
|
@Author :LMM
|
|||
|
@Date :2021/09/3 14:39
|
|||
|
@Version :1.0.0
|
|||
|
"""
|
|||
|
|
|||
|
import numpy as np
|
|||
|
import netCDF4 as Nc
|
|||
|
from osgeo import gdal
|
|||
|
import math
|
|||
|
from PIL import Image
|
|||
|
import scipy.spatial
|
|||
|
import scipy.spatial.transform._rotation_groups
|
|||
|
# from scipy.interpolate import interp1d
|
|||
|
# from scipy import interpolate, integrate
|
|||
|
from scipy import interpolate, integrate
|
|||
|
# from pykrige.ok import OrdinaryKriging
|
|||
|
# import pykrige
|
|||
|
from pykrige import OrdinaryKriging
|
|||
|
from xml.etree.ElementTree import ElementTree
|
|||
|
from tool.algorithm.image.ImageHandle import ImageHandler
|
|||
|
from AtmosphericDelayAuxData import ReadImage
|
|||
|
import logging
|
|||
|
from tool.algorithm.algtools.logHandler import LogHandler
|
|||
|
import gc
|
|||
|
LogHandler.init_log_handler(r"run_log\AtmosphericDelay")
|
|||
|
logger = logging.getLogger("mylog")
|
|||
|
|
|||
|
Rd = 287.05 # [j/kg/K] specific gas constants dry air
|
|||
|
Rv = 461.495 # [j/kg/K] water vapour
|
|||
|
k1 = 0.776*100 # [K/hPa]
|
|||
|
k2 = 0.716*100 # [K/hPa]
|
|||
|
k22 = 0.233*100 # [K/hPa]
|
|||
|
k3 = 3.75*1000*100 # [K^2/hPa]
|
|||
|
zref = 15000 # zref for integration- tropopause
|
|||
|
zincr = 15 # z increment spacing for vertical interpolation before integration
|
|||
|
vertres = 5 # vertical resolution for comparing dem to vert profiles of delay
|
|||
|
|
|||
|
class AtmosphericDelay:
|
|||
|
"""
|
|||
|
function: 计算天顶距延迟值ZTD
|
|||
|
"""
|
|||
|
def __init__(self):
|
|||
|
pass
|
|||
|
|
|||
|
def aps_wrf_sar(self, file, temp, re_hum, geo_height, dem_file, p_level=None):
|
|||
|
"""
|
|||
|
计算干湿图
|
|||
|
para: file:NC_geo_h.tif :参考数据,用来获取气象数据的经纬度、分辨率等信息
|
|||
|
para: temp:NC_temp.tif
|
|||
|
para: re_hum:NC_re_hum.tif
|
|||
|
para: geo_height:NC_geo_h.tif
|
|||
|
para: p_level:NC_level.tif
|
|||
|
para: dem_file:dem影像数据
|
|||
|
"""
|
|||
|
dem, max_dem = ReadImage().read_dem(dem_file)
|
|||
|
lon, lat, lon_min, lat_max, lon_max, lat_min, n_lat, n_lon, nncols, nnrows, lon_res, lat_res,\
|
|||
|
lats, lons = ReadImage().read_lon_lat(file)
|
|||
|
lon_dem, lat_dem, lon_min_dem, lat_max_dem, lon_max_dem, lat_min_dem, n_lat_dem, n_lon_dem, nncols_dem, nnrows_dem, lon_res_dem, lat_res_dem, \
|
|||
|
lats_dem, lons_dem = ReadImage().read_lon_lat(dem_file)
|
|||
|
min_lon_lat_dem = min(n_lon_dem, n_lat_dem)
|
|||
|
|
|||
|
logger.info('ERA data ready !')
|
|||
|
# 1、 计算e
|
|||
|
svpw = 6.1121 * np.exp(((17.502 * (temp - 273.16)) / (240.97 + temp - 273.16)))
|
|||
|
svpi = 6.1121 * np.exp((22.587 * (temp - 273.16)) / (273.86 + temp - 273.16))
|
|||
|
temp_bound1 = 273.16 # 0
|
|||
|
temp_bound2 = 250.16 # -23
|
|||
|
wgt = (temp - temp_bound2)/(temp_bound1 - temp_bound2)
|
|||
|
svp = svpi + (svpw - svpi) * (wgt ** 2)
|
|||
|
for k in range(0, 37):
|
|||
|
for i in range(0, n_lat):
|
|||
|
for j in range(0, n_lon):
|
|||
|
if temp[i, j, k].all() > 273.16:
|
|||
|
svp[i, j, k] = svpw[i, j, k]
|
|||
|
elif temp[i, j, k].all() < 250.16:
|
|||
|
svp[i, j, k] = svpi[i, j, k]
|
|||
|
else:
|
|||
|
svp[i, j, k] = svp[i, j, k]
|
|||
|
|
|||
|
# svp = 6.11 * np.exp(2500000 / Rv * ((temp - 273.16) / (temp * 273.16)))
|
|||
|
e = re_hum*svp/100
|
|||
|
# 2、 计算pressure
|
|||
|
pressure = p_level # {ndarray:(5,5,37)}
|
|||
|
# 3、 计算get_z
|
|||
|
g0 = 9.80665
|
|||
|
# 重力加速度随纬度和高度而变化
|
|||
|
# geo_height = geo_height / g0
|
|||
|
# g = 9.80616 * (1 - 0.002637 * np.cos(2 * lats*(math.pi/180)) + 0.0000059 * (np.cos(2 * lats*(math.pi/180)))**2)
|
|||
|
# r_max = 6378137
|
|||
|
# r_min = 6356752
|
|||
|
# r_e = np.sqrt(1/(((np.cos(lats*(math.pi/180))**2)/(r_max**2)) + ((np.sin(lats*(math.pi/180))**2)/(r_min**2))))
|
|||
|
# get_z = (geo_height * r_e) / (g / g0 * r_e - geo_height)
|
|||
|
get_z = geo_height/g0
|
|||
|
|
|||
|
cd_slices = max_dem // vertres + 1
|
|||
|
min_lon_lat = min(n_lon, n_lat)
|
|||
|
max_lon_lat = max(n_lon, n_lat)
|
|||
|
cd_stack_dry = np.zeros((min_lon_lat, cd_slices), dtype=float)
|
|||
|
cd_stack_wet = np.zeros((min_lon_lat, cd_slices), dtype=float)
|
|||
|
# 4、 计算0-15000插值
|
|||
|
x_i = np.array(range(0, zref, zincr))
|
|||
|
logger.info('begin calc wet and dry of diff levels !')
|
|||
|
for m in range(0, min_lon_lat):
|
|||
|
yn = m
|
|||
|
xn = m
|
|||
|
geopo_hgt = get_z[yn, xn, :] # 位势高度 [37,]
|
|||
|
# y_p = pressure[yn, xn, :] # 压力水平level [37,]
|
|||
|
y_p = np.array([1, 2, 3, 5, 7, 10, 20, 30, 50, 70, 100, 125, 150, 175, 200, 225, 250, 300, 350, 400,
|
|||
|
450, 500, 550, 600, 650, 700, 750, 775, 800, 825, 850, 875, 900, 925, 950, 975, 1000])
|
|||
|
y_e = e[yn, xn, :] # 相对湿度 [37,]
|
|||
|
y_t = temp[yn, xn, :] # 温度 [37,]
|
|||
|
|
|||
|
y_e_i = np.zeros((1, 1000), dtype=float)
|
|||
|
y_p_i = np.zeros((1, 1000), dtype=float)
|
|||
|
y_t_i = np.zeros((1, 1000), dtype=float)
|
|||
|
# 判断位势能是否在0-15000之间,避免超出范围的位势能出现插值异常
|
|||
|
if np.min(x_i) > np.min(geopo_hgt) and np.max(x_i) < np.max(geopo_hgt):
|
|||
|
tre_yei = interpolate.interp1d(geopo_hgt, y_e)
|
|||
|
y_e_i = tre_yei(x_i)
|
|||
|
tre_yt = interpolate.interp1d(geopo_hgt, y_t)
|
|||
|
y_t_i = tre_yt(x_i)
|
|||
|
tre_yp = interpolate.interp1d(geopo_hgt, y_p)
|
|||
|
y_p_i = tre_yp(x_i)
|
|||
|
if np.min(x_i) < np.min(geopo_hgt) and np.max(x_i) < np.max(geopo_hgt):
|
|||
|
for f in range(0, 999):
|
|||
|
if x_i[f+1] > np.min(geopo_hgt) > x_i[f]:
|
|||
|
tre_yei = interpolate.interp1d(geopo_hgt, y_e)
|
|||
|
y_e_i[0, f+1:] = tre_yei(x_i[f+1:])
|
|||
|
y_e_i[0, 0:f + 1] = y_e[np.argmin(geopo_hgt)]
|
|||
|
|
|||
|
tre_yt = interpolate.interp1d(geopo_hgt, y_t)
|
|||
|
y_t_i[0, f+1:] = tre_yt(x_i[f+1:])
|
|||
|
y_t_i[0, 0:f + 1] = y_t[np.argmin(geopo_hgt)]
|
|||
|
|
|||
|
tre_yp = interpolate.interp1d(geopo_hgt, y_p)
|
|||
|
y_p_i[0, f+1:] = tre_yp(x_i[f+1:])
|
|||
|
y_p_i[0, 0:f + 1] = y_p[np.argmin(geopo_hgt)] # {ndarray:(1:1000)}
|
|||
|
break
|
|||
|
if np.min(x_i) > np.min(geopo_hgt) and np.max(x_i) > np.max(geopo_hgt):
|
|||
|
for g in range(0, 999):
|
|||
|
if x_i[g + 1] > np.max(geopo_hgt) > x_i[g]:
|
|||
|
tre_yei = interpolate.interp1d(geopo_hgt, y_e)
|
|||
|
y_e_i[0, 0:g+1] = tre_yei(x_i[0:g+1])
|
|||
|
y_e_i[0, g+1:] = y_e[np.argmax(geopo_hgt)]
|
|||
|
|
|||
|
tre_yt = interpolate.interp1d(geopo_hgt, y_t)
|
|||
|
y_t_i[0, 0:g+1] = tre_yt(x_i[0:g+1])
|
|||
|
y_t_i[0, g+1:] = y_t[np.argmax(geopo_hgt)]
|
|||
|
|
|||
|
tre_yp = interpolate.interp1d(geopo_hgt, y_p)
|
|||
|
y_p_i[0, 0:g+1] = tre_yp(x_i[0:g+1])
|
|||
|
y_p_i[0, g+1:] = y_p[np.argmax(geopo_hgt)]
|
|||
|
if np.min(x_i) < np.min(geopo_hgt) and np.max(x_i) > np.max(geopo_hgt):
|
|||
|
for g in range(0, 999):
|
|||
|
if x_i[g + 1] > np.min(geopo_hgt) > x_i[g]:
|
|||
|
m = g+1
|
|||
|
y_e_i[0, 0:m] = y_e[np.argmin(geopo_hgt)]
|
|||
|
y_t_i[0, 0:m] = y_t[np.argmin(geopo_hgt)]
|
|||
|
y_p_i[0, 0:m] = y_p[np.argmin(geopo_hgt)]
|
|||
|
if x_i[g + 1] > np.max(geopo_hgt) > x_i[g]:
|
|||
|
n = g+1
|
|||
|
y_e_i[0, n:] = y_e[np.argmax(geopo_hgt)]
|
|||
|
y_t_i[0, n:] = y_t[np.argmax(geopo_hgt)]
|
|||
|
y_p_i[0, n:] = y_p[np.argmax(geopo_hgt)]
|
|||
|
|
|||
|
tre_yei = interpolate.interp1d(geopo_hgt, y_e)
|
|||
|
y_e_i[0, m:n] = tre_yei(x_i[m:n])
|
|||
|
|
|||
|
tre_yt = interpolate.interp1d(geopo_hgt, y_t)
|
|||
|
y_t_i[0, m:n] = tre_yt(x_i[m:n])
|
|||
|
|
|||
|
tre_yp = interpolate.interp1d(geopo_hgt, y_p)
|
|||
|
y_p_i[0, m:n] = tre_yp(x_i[m:n])
|
|||
|
|
|||
|
# 1、 计算湿延迟
|
|||
|
# tmp_01 = ((k2 - (Rd * k1 / Rv)) * YeI / YTI + k3 * YeI / (YTI ** 2))
|
|||
|
tmp_01 = k22 * y_e_i / y_t_i+k3 * y_e_i / (y_t_i ** 2)
|
|||
|
lw = np.zeros((1, 1000), dtype=float)
|
|||
|
lw1 = (10 ** (-6)) * integrate.cumtrapz(tmp_01, x_i) # (1,999)
|
|||
|
lw1 = np.fliplr(lw1) # 左右翻转(1,999)
|
|||
|
lw[0, 0:999] = lw1[0, :]
|
|||
|
|
|||
|
# 2、 计算干延迟
|
|||
|
tmp_02 = k1 * y_p_i / y_t_i
|
|||
|
|
|||
|
ld = np.zeros((1, 1000), dtype=float)
|
|||
|
ld_1 = (10 ** (-6)) * integrate.cumtrapz(tmp_02, x_i) # (1,999)
|
|||
|
ld_1 = np.fliplr(ld_1) # (1,999)
|
|||
|
ld[0, 0:999] = ld_1[0, :]
|
|||
|
|
|||
|
# ld = 2.2768 * YPI/(1-0.00266*np.cos(lats[0, m, 0]*(math.pi/180))-0.00028*XI) # ld计算方法2 横着(1000,)
|
|||
|
# ld =(10 ** (-6)) *(k1*Rd/g0)*(YPI-YPI[0,999]) # ld计算方法3
|
|||
|
# 3、在(0,maxdem)上做插值
|
|||
|
cdi = np.array(range(0, max_dem, vertres))
|
|||
|
xi_range = x_i
|
|||
|
|
|||
|
ld_range = ld[0, :]
|
|||
|
lw_range = lw[0, :]
|
|||
|
# ld_i = interpolate.interp1d(xi_range, ld_range, kind="cubic")
|
|||
|
ld_i = interpolate.interp1d(xi_range, ld_range)
|
|||
|
# lw_i = interpolate.interp1d(xi_range, lw_range, kind="cubic")
|
|||
|
lw_i = interpolate.interp1d(xi_range, lw_range)
|
|||
|
ldi = np.zeros((max_dem//vertres+1, 1), dtype=float)
|
|||
|
lwi = np.zeros((max_dem//vertres+1, 1), dtype=float)
|
|||
|
for i in range(0, max_dem // vertres):
|
|||
|
ldi[i, 0] = ld_i(cdi[i])
|
|||
|
lwi[i, 0] = lw_i(cdi[i])
|
|||
|
cd_stack_dry[m, :] = ldi[:, 0].T
|
|||
|
cd_stack_wet[m, :] = lwi[:, 0].T
|
|||
|
logger.info('finish calc wet and dry delay of diff levels !')
|
|||
|
|
|||
|
cdstack_interp_dry_wet = np.zeros((min_lon_lat_dem, min_lon_lat_dem, cd_stack_dry.shape[1]), dtype=float) # 修改插值网格分辨率
|
|||
|
# cdstack_interp_dry_wet = np.zeros((min_lon_lat, min_lon_lat, cd_stack_dry.shape[1]), dtype=float)
|
|||
|
|
|||
|
# np.zeros((max_lon_lat, 1), dtype=float)
|
|||
|
# 创建data01、data02
|
|||
|
data01 = np.zeros((min_lon_lat, 1), dtype=float)
|
|||
|
data02 = np.zeros((min_lon_lat, 1), dtype=float)
|
|||
|
new_lon = np.zeros((n_lon, 1), dtype=float)
|
|||
|
new_lat = np.zeros((n_lat, 1), dtype=float)
|
|||
|
new_lon[:, 0] = lon
|
|||
|
new_lat[:, 0] = lat
|
|||
|
data01[0:min_lon_lat, 0] = new_lon[0:min_lon_lat, 0]
|
|||
|
data02[0:min_lon_lat, 0] = new_lat[0:min_lon_lat, 0]
|
|||
|
data01 = data01.reshape(data01.shape[0], 1) # 水平转垂直
|
|||
|
data02 = data02.reshape(data02.shape[0], 1) # 水平转垂直
|
|||
|
|
|||
|
lat_max = lat_min+(min_lon_lat-1) * (-lat_res)
|
|||
|
lon_max = lon_min+(min_lon_lat-1) * lon_res
|
|||
|
logger.info('start interpolation dry and wet delay...')
|
|||
|
# 在网格上进行克里金插值
|
|||
|
# 1. 先插值到 气象数据给的分辨率
|
|||
|
try:
|
|||
|
for i in range(0, cd_stack_dry.shape[1] - 1):
|
|||
|
data03 = cd_stack_dry[:, i] + cd_stack_wet[:, i]
|
|||
|
cdstack_interp_dry_wet[:, :, i] = self.kringing(data01, data02, data03, lon_min, lat_max, lon_max,
|
|||
|
lat_min, lon_res_dem, -lat_res_dem, min_lon_lat_dem)
|
|||
|
except:
|
|||
|
logger.info('calc kringing error !')
|
|||
|
logger.info('start calc rbf ... !')
|
|||
|
for i in range(0, cd_stack_dry.shape[1] - 1):
|
|||
|
data03 = cd_stack_dry[:, i] + cd_stack_wet[:, i]
|
|||
|
cdstack_interp_dry_wet[:, :, i] = self.calc_rbf(data01, data02, data03, lon_min, lat_max, lon_max,
|
|||
|
lat_min, lon_res_dem, -lat_res_dem, min_lon_lat_dem)
|
|||
|
logger.info('calc kringing interv finish !')
|
|||
|
return cdstack_interp_dry_wet
|
|||
|
|
|||
|
# try:
|
|||
|
# for i in range(0, cd_stack_dry.shape[1]-1):
|
|||
|
# data03 = cd_stack_dry[:, i]+cd_stack_wet[:, i]
|
|||
|
# cdstack_interp_dry_wet[:, :, i] = self.kringing(data01, data02, data03, lon_min, lat_max, lon_max,
|
|||
|
# lat_min, lon_res, -lat_res, min_lon_lat)
|
|||
|
# except:
|
|||
|
# logger.info('calc kringing error !')
|
|||
|
# logger.info('start calc rbf ... !')
|
|||
|
# for i in range(0, cd_stack_dry.shape[1]-1):
|
|||
|
# data03 = cd_stack_dry[:, i]+cd_stack_wet[:, i]
|
|||
|
# cdstack_interp_dry_wet[:, :, i] = self.calc_rbf(data01, data02, data03, lon_min, lat_max, lon_max,
|
|||
|
# lat_min, lon_res, -lat_res, min_lon_lat)
|
|||
|
# logger.info('calc kringing interv finish !')
|
|||
|
|
|||
|
|
|||
|
@staticmethod
|
|||
|
def calc_ztd(dry_wet_file_name, dem_file):
|
|||
|
"""
|
|||
|
计算ztd
|
|||
|
wet_file_name:干湿校正文件路径
|
|||
|
dem_file: dem文件路径
|
|||
|
"""
|
|||
|
cdstack_interp_dry_wet = ImageHandler().get_all_band_array(dry_wet_file_name)
|
|||
|
dem = ImageHandler().get_all_band_array(dem_file)
|
|||
|
nncols = ImageHandler().get_img_width(dem_file)
|
|||
|
nnrows = ImageHandler().get_img_height(dem_file)
|
|||
|
|
|||
|
wet_dry_wid = ImageHandler().get_img_width(dry_wet_file_name)
|
|||
|
dem_wid = ImageHandler().get_img_width(dem_file)
|
|||
|
|
|||
|
wet_dry_hgt = ImageHandler().get_img_height(dry_wet_file_name)
|
|||
|
dem_hgt = ImageHandler().get_img_height(dem_file)
|
|||
|
|
|||
|
wetcorrection = np.zeros((nnrows, nncols), dtype=float)
|
|||
|
rounddem = np.round(dem/vertres)
|
|||
|
rounddem[np.where(dem < 0)] = 0
|
|||
|
|
|||
|
ratio_wid = (dem_wid/wet_dry_wid)
|
|||
|
ratio_hgt = (dem_hgt/wet_dry_hgt)
|
|||
|
|
|||
|
for i in range(1, wet_dry_hgt+1):
|
|||
|
for j in range(1, wet_dry_wid+1):
|
|||
|
|
|||
|
m1 = round((i - 1) * ratio_hgt)
|
|||
|
m2 = round(i * ratio_hgt)
|
|||
|
n1 = round((j - 1) * ratio_wid)
|
|||
|
n2 = round(j * ratio_wid)
|
|||
|
|
|||
|
t1_array02 = np.zeros((m2-m1, n2-n1), dtype=float)
|
|||
|
|
|||
|
for h in range(0, cdstack_interp_dry_wet.shape[2]):
|
|||
|
t1_array = rounddem[m1:m2, n1:n2]
|
|||
|
t1_array01 = np.where(t1_array == h, 1, 0)
|
|||
|
t1_array01 = np.where(t1_array01 > 0, cdstack_interp_dry_wet[i-1, j-1, h], 0)
|
|||
|
t1_array02 = t1_array02+t1_array01
|
|||
|
wet_block_array = t1_array02
|
|||
|
wetcorrection[m1:m2, n1:n2] = wet_block_array
|
|||
|
|
|||
|
ztd = wetcorrection
|
|||
|
logger.info('calc ztd finish !')
|
|||
|
return ztd
|
|||
|
|
|||
|
@staticmethod
|
|||
|
def read_nc(infile):
|
|||
|
"""
|
|||
|
读取气象数据
|
|||
|
infile:气象数据路径
|
|||
|
"""
|
|||
|
nc_data_obj = Nc.Dataset(infile)
|
|||
|
keys = nc_data_obj.variables.keys()
|
|||
|
|
|||
|
if 'longitude' in keys:
|
|||
|
lons = nc_data_obj.variables['longitude'][:]
|
|||
|
lats = nc_data_obj.variables['latitude'][:]
|
|||
|
|
|||
|
elif 'lon' in keys:
|
|||
|
lons = nc_data_obj.variables['lon'][:]
|
|||
|
lats = nc_data_obj.variables['lat'][:]
|
|||
|
else:
|
|||
|
logger.info("Specify variable names in the .nc file !")
|
|||
|
temp = np.array(nc_data_obj.variables["t"]) # temp in K 温度
|
|||
|
# temp =(temp-255.6357)/0.00153279
|
|||
|
|
|||
|
hum = np.array(nc_data_obj.variables["r"]) # relative humidity in percent 湿度
|
|||
|
# hum = (hum-41.8782447)/0.0012780
|
|||
|
|
|||
|
geo_h = np.array(nc_data_obj.variables["z"]) # Geopotential Height in m 重力势
|
|||
|
# geo_h =(H-237742.3474)/7.243160
|
|||
|
|
|||
|
p_levs = np.array(nc_data_obj.variables["level"])
|
|||
|
|
|||
|
nc_data_obj.close() # 关闭文件
|
|||
|
return lons, lats, temp, hum, geo_h, p_levs
|
|||
|
|
|||
|
@staticmethod
|
|||
|
def read_dem(demfile):
|
|||
|
"""
|
|||
|
读取dem数据
|
|||
|
demfile:dem数据路径
|
|||
|
"""
|
|||
|
dem = np.array(Image.open(demfile))
|
|||
|
maxdem = math.ceil(np.max(dem)/100)*100+50 # 四舍五入向上取值
|
|||
|
return dem, maxdem
|
|||
|
|
|||
|
@staticmethod
|
|||
|
def copy_channel(num_lat, num_lon, air_temp, rel_hum, h, lons, lats, plevs):
|
|||
|
"""
|
|||
|
改变数据维度
|
|||
|
"""
|
|||
|
temp_1 = np.zeros((num_lat, num_lon, 37), dtype=float)
|
|||
|
hum_1 = np.zeros((num_lat, num_lon, 37), dtype=float)
|
|||
|
h_1 = np.zeros((num_lat, num_lon, 37), dtype=float)
|
|||
|
lat_1 = np.zeros((1, num_lat, 37), dtype=float)
|
|||
|
lon_1 = np.zeros((1, num_lon, 37), dtype=float)
|
|||
|
p_level_1 = np.zeros((num_lat, num_lon, 37), dtype=float)
|
|||
|
|
|||
|
for i in range(0, 37):
|
|||
|
a = air_temp[0, i, :, :]
|
|||
|
temp_1[0:num_lat, 0:num_lon, i] = a
|
|||
|
|
|||
|
b = rel_hum[0, i, :, :]
|
|||
|
hum_1[0:num_lat, 0:num_lon, i] = b
|
|||
|
|
|||
|
c = h[0, i, :, :]
|
|||
|
h_1[:, :, i] = c
|
|||
|
del air_temp, rel_hum, h
|
|||
|
air_temp, rel_hum, h = temp_1, hum_1, h_1
|
|||
|
|
|||
|
for i in range(0, 37):
|
|||
|
d = lons
|
|||
|
lon_1[0, :, i] = d
|
|||
|
|
|||
|
e = lats
|
|||
|
lat_1[0, :, i] = e
|
|||
|
del lons, lats
|
|||
|
lons, lats = lon_1, lat_1
|
|||
|
|
|||
|
# Plevs = Plevs/100
|
|||
|
for i in range(0, 37):
|
|||
|
p_level_1[:, :, i] = p_level_1[:, :, i] + plevs[i]
|
|||
|
# print("输出Plevs1", Plevs1[:, :, i])
|
|||
|
p_level = p_level_1
|
|||
|
return air_temp, rel_hum, h, lons, lats, p_level
|
|||
|
|
|||
|
@staticmethod
|
|||
|
def calc_rbf(data01, data002, data003, lon_min, lat_max, lon_max, lat_min, lon_res, lat_res, min_lon_lat):
|
|||
|
"""
|
|||
|
rbf插值
|
|||
|
"""
|
|||
|
# gridx = np.arange(lon_min, lon_max, lon_res) # 三个参数的意思:范围0.0 - 0.6 ,每隔0.1划分一个网格
|
|||
|
# gridy = np.arange(lat_min, lat_max, lat_res)
|
|||
|
|
|||
|
gridx = np.linspace(lon_min, lon_max, min_lon_lat) # 三个参数的意思:范围(lon_min, lon_max) ,每隔Lon_Res划分一个网格
|
|||
|
gridy = np.linspace(lat_min, lat_max, min_lon_lat)
|
|||
|
|
|||
|
func = interpolate.Rbf(data01, data002, data003, function='multiquadric')
|
|||
|
znew = func(gridx, gridy)
|
|||
|
return znew
|
|||
|
|
|||
|
@staticmethod
|
|||
|
def kringing(data01, data02, data03, lon_min, lat_max, lon_max, lat_min, lon_res, lat_res, min_lon_lat):
|
|||
|
"""
|
|||
|
克里金插值方法
|
|||
|
"""
|
|||
|
# gridx = np.arange(lon_min, lon_max+lon_res, lon_res) # 三个参数的意思:范围(lon_min, lon_max) ,每隔Lon_Res划分一个网格
|
|||
|
# gridy = np.arange(lat_min, lat_max+lat_res, lat_res)
|
|||
|
|
|||
|
# ok3d = ok.OrdinaryKriging(data01, data02, data03, variogram_model="linear") # 模型
|
|||
|
# ok3d = ok.OrdinaryKriging(data01, data02, data03) # 模型
|
|||
|
gridx = np.linspace(lon_min, lon_max, min_lon_lat) # 三个参数的意思:范围(lon_min, lon_max) ,每隔Lon_Res划分一个网格
|
|||
|
gridy = np.linspace(lat_min, lat_max, min_lon_lat)
|
|||
|
|
|||
|
# ok3d = pykrige.OrdinaryKriging(data01, data02, data03) # 模型
|
|||
|
ok3d = OrdinaryKriging(data01, data02, data03)
|
|||
|
|
|||
|
k3d1, ss3d = ok3d.execute("grid", gridx, gridy) # k3d1是结果,给出了每个网格点处对应的值
|
|||
|
# print(np.round(k3d1, 6)) # 小数点后6位
|
|||
|
return k3d1
|
|||
|
|
|||
|
@staticmethod
|
|||
|
def write_dry_wet_tif(ref_image_dem, ref_image_nc, in_array, out_path):
|
|||
|
"""
|
|||
|
存为tif数据
|
|||
|
ref_image:参考影像路径
|
|||
|
in_array:输入数组
|
|||
|
outpath:输出路径
|
|||
|
"""
|
|||
|
dataset_dem = gdal.Open(ref_image_dem) # 获取dem宽高及分辨率
|
|||
|
x_size = dataset_dem.RasterXSize
|
|||
|
y_size = dataset_dem.RasterYSize
|
|||
|
trans_dem = dataset_dem.GetGeoTransform()
|
|||
|
|
|||
|
dataset_nc = gdal.Open(ref_image_nc) # 获取气象数据坐标信息
|
|||
|
trans_nc = dataset_nc.GetGeoTransform()
|
|||
|
|
|||
|
tran_geo = [trans_nc[0], trans_dem[1], 0, trans_nc[3], 0, trans_dem[5]]
|
|||
|
if len(in_array.shape) == 3:
|
|||
|
im_height, im_width, im_bands = in_array.shape
|
|||
|
else:
|
|||
|
im_bands, (im_height, im_width) = 1, in_array.shape
|
|||
|
|
|||
|
pro = dataset_nc.GetProjection()
|
|||
|
|
|||
|
gdal.AllRegister()
|
|||
|
drive = gdal.GetDriverByName("GTiff")
|
|||
|
newfile = drive.Create(out_path, y_size, y_size, im_bands, gdal.GDT_Float32)
|
|||
|
newfile.SetProjection(pro)
|
|||
|
newfile.SetGeoTransform(tran_geo)
|
|||
|
if im_bands == 1:
|
|||
|
newfile.GetRasterBand(1).WriteArray(in_array) # 写入数组数据
|
|||
|
else:
|
|||
|
for i in range(0, im_bands):
|
|||
|
newfile.GetRasterBand(i + 1).WriteArray(in_array[:, :, i])
|
|||
|
# dataset.GetRasterBand(i + 1).WriteArray(im_data[i])
|
|||
|
del newfile
|
|||
|
|
|||
|
@staticmethod
|
|||
|
def write_tif(ref_image, in_array, out_path):
|
|||
|
"""
|
|||
|
存为tif数据
|
|||
|
ref_image:参考影像路径
|
|||
|
in_array:输入数组
|
|||
|
outpath:输出路径
|
|||
|
"""
|
|||
|
dataset = gdal.Open(ref_image)
|
|||
|
x_size = dataset.RasterXSize
|
|||
|
y_size = dataset.RasterYSize
|
|||
|
|
|||
|
if len(in_array.shape) == 3:
|
|||
|
im_height, im_width, im_bands = in_array.shape
|
|||
|
else:
|
|||
|
im_bands, (im_height, im_width) = 1, in_array.shape
|
|||
|
|
|||
|
pro = dataset.GetProjection()
|
|||
|
geo = dataset.GetGeoTransform()
|
|||
|
gdal.AllRegister()
|
|||
|
drive = gdal.GetDriverByName("GTiff")
|
|||
|
newfile = drive.Create(out_path, x_size, y_size, im_bands, gdal.GDT_Float32)
|
|||
|
newfile.SetProjection(pro)
|
|||
|
newfile.SetGeoTransform(geo)
|
|||
|
if im_bands == 1:
|
|||
|
newfile.GetRasterBand(1).WriteArray(in_array) # 写入数组数据
|
|||
|
else:
|
|||
|
for i in range(0, im_bands):
|
|||
|
newfile.GetRasterBand(i + 1).WriteArray(in_array[:, :, i])
|
|||
|
# dataset.GetRasterBand(i + 1).WriteArray(im_data[i])
|
|||
|
del newfile
|
|||
|
|
|||
|
@staticmethod
|
|||
|
def write_ztd_tif(ref_image_dem, ref_image_nc, in_array, out_path):
|
|||
|
"""
|
|||
|
存为tif数据
|
|||
|
ref_image:参考影像路径
|
|||
|
in_array:输入数组
|
|||
|
outpath:输出路径
|
|||
|
"""
|
|||
|
dataset_dem = gdal.Open(ref_image_dem)
|
|||
|
x_size = dataset_dem.RasterXSize
|
|||
|
y_size = dataset_dem.RasterYSize
|
|||
|
trans_dem = dataset_dem.GetGeoTransform()
|
|||
|
|
|||
|
dataset_nc = gdal.Open(ref_image_nc) # 获取气象数据坐标信息
|
|||
|
trans_nc = dataset_nc.GetGeoTransform()
|
|||
|
|
|||
|
tran_geo = [trans_nc[0], trans_dem[1], 0, trans_nc[3], 0, trans_dem[5]]
|
|||
|
|
|||
|
if len(in_array.shape) == 3:
|
|||
|
im_height, im_width, im_bands = in_array.shape
|
|||
|
else:
|
|||
|
im_bands, (im_height, im_width) = 1, in_array.shape
|
|||
|
|
|||
|
pro = dataset_nc.GetProjection()
|
|||
|
|
|||
|
gdal.AllRegister()
|
|||
|
drive = gdal.GetDriverByName("GTiff")
|
|||
|
newfile = drive.Create(out_path, x_size, y_size, im_bands, gdal.GDT_Float32)
|
|||
|
newfile.SetProjection(pro)
|
|||
|
newfile.SetGeoTransform(tran_geo)
|
|||
|
if im_bands == 1:
|
|||
|
newfile.GetRasterBand(1).WriteArray(in_array) # 写入数组数据
|
|||
|
else:
|
|||
|
for i in range(0, im_bands):
|
|||
|
newfile.GetRasterBand(i + 1).WriteArray(in_array[:, :, i])
|
|||
|
# dataset.GetRasterBand(i + 1).WriteArray(im_data[i])
|
|||
|
del newfile
|
|||
|
|
|||
|
@staticmethod
|
|||
|
def cal_phase_bias(local_file, ztd_file, waveLength):
|
|||
|
"""
|
|||
|
function: 计算延迟转换,输出像素-DLOS表
|
|||
|
param: local_file : 输入-局部入射角文件路径
|
|||
|
param: ztd_file : 输入-大气延迟表 ZTD路径
|
|||
|
param: waveLength : 影像对应的波长
|
|||
|
"""
|
|||
|
ztd_array = ImageHandler.get_band_array(ztd_file, 1) # 获取大气延迟表ztd
|
|||
|
local_angle_array = ImageHandler.get_band_array(local_file, 1) # 获取局部入射角
|
|||
|
dlos = (1 / np.cos(local_angle_array)) * ztd_array # 计算公式
|
|||
|
phase_bias = 4 * math.pi /waveLength * dlos # 计算主影像相位误差
|
|||
|
return dlos#phase_bias
|
|||
|
|
|||
|
def complex_phase_removal(self, PhaseError_m, PhaseError_a, intervene_sar,waveLength):
|
|||
|
"""
|
|||
|
function: isce输出的复数干涉图 除以e^(0+wj),得到去除延迟相位的复数干涉图
|
|||
|
param: PhaseError_m: 主影像相位误差图
|
|||
|
param: PhaseError_a:辅影像相位误差图
|
|||
|
param: intervene_sar:原始干涉图
|
|||
|
"""
|
|||
|
phase_bias_m = ImageHandler.get_band_array(PhaseError_m, 1) # 计算主影像相位误差
|
|||
|
phase_bias_a = ImageHandler.get_band_array(PhaseError_a, 1) # 计算辅影像相位误差
|
|||
|
|
|||
|
bias =(4 * math.pi /waveLength)*(phase_bias_m-phase_bias_a) # 延迟相位
|
|||
|
sar_phase = ImageHandler.get_band_array(intervene_sar, 1)
|
|||
|
complex64_sar_phase = sar_phase.astype(np.complex64)
|
|||
|
complex_phase = bias * (1j)
|
|||
|
fl64_com = complex_phase.astype(np.complex64) # 另存为complex64
|
|||
|
bias_result = complex64_sar_phase/np.exp(fl64_com)
|
|||
|
bias_result[np.isnan(bias_result)] = 0 + 0j
|
|||
|
return bias_result
|
|||
|
|
|||
|
@staticmethod
|
|||
|
def get_radarwavelength(IW1):
|
|||
|
"""
|
|||
|
读取波长
|
|||
|
:param IW1:
|
|||
|
:return:
|
|||
|
"""
|
|||
|
tree = ElementTree()
|
|||
|
tree.parse(IW1)
|
|||
|
root = tree.getroot()
|
|||
|
RadarCenterFrequency = root.find('component').find('component').find('component')
|
|||
|
element_trees = list(RadarCenterFrequency)
|
|||
|
value = 0
|
|||
|
for element in element_trees:
|
|||
|
if len(element.attrib) == 1:
|
|||
|
if element.attrib["name"]=="radarwavelength":
|
|||
|
value=float(element.find('value').text)
|
|||
|
return value
|
|||
|
|
|||
|
@staticmethod
|
|||
|
def get_polarization(IW1):
|
|||
|
"""
|
|||
|
读取极化方式
|
|||
|
:param IW1:
|
|||
|
:return:
|
|||
|
"""
|
|||
|
tree = ElementTree()
|
|||
|
tree.parse(IW1)
|
|||
|
root = tree.getroot()
|
|||
|
RadarCenterFrequency = root.find('component').find('component').find('component')
|
|||
|
element_trees = list(RadarCenterFrequency)
|
|||
|
value = 0
|
|||
|
for element in element_trees:
|
|||
|
if len(element.attrib) == 1:
|
|||
|
if element.attrib["name"]=="polarization":
|
|||
|
value=element.find('value').text
|
|||
|
return value
|
|||
|
|