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
|
||
|