def fy4a_1km_correct(in_file, out_file, obs_dir, temp_dir, resultid, planid, datatime, resolution_type): print('<<< 1km correct: {}'.format(in_file)) area_type = 'Full_DISK' if os.path.isfile(out_file): print('数据已经存在: {}'.format(out_file)) if not exist_result_data(resultid=resultid, datatime=datatime, resolution_type=resolution_type, area_type=area_type): add_result_data(resultid=resultid, planid=planid, address=out_file, datatime=datatime, resolution_type=resolution_type, area_type=area_type) return runday = datatime.strftime('%Y%m%d') runhour = int(datatime.strftime("%H")) if not os.path.isdir(temp_dir): os.makedirs(temp_dir) flag = ForecastDataPerday(obs_dir=obs_dir, mid_dir=temp_dir, runday=runday) if not flag: print(f'没有足够的MID数据:{runday}{runhour}0000') if flag: CaculateNCLine(nc_file=in_file, mid_dir=temp_dir, out_file=out_file, runday=runday, runhour=runhour) if os.path.isfile(out_file) and not exist_result_data(resultid=resultid, datatime=datatime, resolution_type=resolution_type, area_type=area_type): add_result_data(resultid=resultid, planid=planid, address=out_file, datatime=datatime, resolution_type=resolution_type, area_type=area_type) return 0
def fy3d_envi2hdf(in_file, out_file, resultid, planid, datatime, resolution_type): area_type = 'Full_DISK' if os.path.isfile(out_file): print('数据已经存在: {}'.format(out_file)) if not exist_result_data(resultid=resultid, datatime=datatime, resolution_type=resolution_type, area_type=area_type): add_result_data(resultid=resultid, planid=planid, address=out_file, datatime=datatime, resolution_type=resolution_type, area_type=area_type, element=None) return print('<<< fy3d_envi2hdf: {}'.format(in_file)) try: in_file_gc = in_file in_file_bc = in_file_gc.replace('Gc', 'Bc') in_file_dc = in_file_gc.replace('Gc', 'Dc') in_file_sz = in_file_gc.replace('Gc', 'Sz') ssi = FY3DSSIENVI(in_file_gc) dirssi = FY3DSSIENVI(in_file_bc) difssi = FY3DSSIENVI(in_file_dc) sz = FY3DSSIENVI(in_file_sz) except Exception as why: print(why) return result = { 'SSI': (ssi.get_data() / 1000., np.float), 'DirSSI': (dirssi.get_data() / 1000., np.float), 'DifSSI': (difssi.get_data() / 1000., np.float), 'Sz': (sz.get_data(), np.float) } write_out_file(out_file, result, full_value=FULL_VALUE) if os.path.isfile(out_file) and not exist_result_data( resultid=resultid, datatime=datatime, resolution_type=resolution_type, area_type=area_type): add_result_data(resultid=resultid, planid=planid, address=out_file, datatime=datatime, resolution_type=resolution_type, area_type=area_type, element=None)
def plot_map_full(in_file, resultid='', planid='', datatime='', resolution_type=None): print('plot_map_orbit <<<:{}'.format(in_file)) if not os.path.isfile(in_file): print('数据不存在:{}'.format(in_file)) return if 'fy4a' in resultid.lower(): rgb = FY4ASSI(in_file).get_rgb_ref() else: print('不支持的卫星:{}'.format(resultid)) return element = "Cloud" area_type = "Full" out_file1 = in_file + ".PNG" try: if not os.path.isfile(out_file1): plot_fy4a_cloud_disk(rgb, out_file=out_file1, resolution_type=resolution_type) else: print('文件已经存在,跳过:{}'.format(out_file1)) # 入库 if os.path.isfile(out_file1) and not exist_result_data( resultid=resultid, datatime=datatime, resolution_type=resolution_type, element=element, area_type=area_type): add_result_data(resultid=resultid, planid=planid, address=out_file1, datatime=datatime, resolution_type=resolution_type, area_type=area_type, element=element) except Exception as why: print(why) print('绘制{}图像错误:{}'.format(area_type, out_file1))
def itcal(in_file, out_file, resultid=None, planid=None, datatime=None, resolution_type=None): # 如果原来的整点数据不存在,直接使用G0进行补充 # 如果原来的整点数据存在,使用G0进行校正 area_type = 'Full_DISK' if os.path.isfile(out_file): print('数据已经存在: {}'.format(out_file)) if not exist_result_data(resultid=resultid, datatime=datatime, resolution_type=resolution_type, area_type=area_type): add_result_data(resultid=resultid, planid=planid, address=out_file, datatime=datatime, resolution_type=resolution_type, area_type=area_type, element=None) return print('<<< itcal: {}'.format(in_file)) beta = 35.0 # 常量 try: datas = FY4ASSI(in_file) except Exception as why: print(why) print('初始化FY4A SSI读取类错误') return date_time = FY4ASSI.get_date_time_orbit(in_file) y, m, d, hr, minus = assignTime(date_time) e = assignE(y, m, d) doy = calDoy(y, m, d) delta = calDelta(doy) print(delta) try: lons = FY4ASSI.get_longitude_4km() lats = FY4ASSI.get_latitude_4km() except Exception as why: print(why) print('读取lons和lats错误') return DQF = np.ones_like(lons, dtype=np.int8) # 标识数据集 Omega = calOmega(hr, minus, lons, e) cos_the_taz = calCosThetaz(lats, delta, Omega) G0 = calG0(doy, cos_the_taz) print('G0') print(np.nanmin(G0), np.nanmax(G0)) print((G0 > 0).sum()) index_invalid_g0 = np.logical_or( G0 >= 1500, G0 <= 0) # ########################## G0的无效值赋值为nan G0[index_invalid_g0] = np.nan if np.isnan(G0).all(): print('Warning::::::::没有有效的G0数据,不生产数据') return # G0无效 DQF[index_invalid_g0] = 0 # 校正总直散数据 if os.path.isfile(in_file): try: Itol = datas.get_ssi() Ib = datas.get_dirssi() Id = datas.get_difssi() except Exception as why: print(why) print('读取ssi,dirssi和difssi错误') return # 将G0 >= 1400, G0 <= 0的值置为nan Itol[index_invalid_g0] = np.nan Ib[index_invalid_g0] = np.nan Id[index_invalid_g0] = np.nan # Itol 有效 index_valid_itol = np.logical_and(np.isfinite(Itol), Itol < G0) DQF[index_valid_itol] = 1 # 校正G0有效,但是Itol无效的数据 index_invalid_itol = np.logical_or( Itol > G0, np.logical_and(np.isnan(Itol), np.isfinite(G0))) Itol[index_invalid_itol] = G0_Correct * G0[index_invalid_itol] Ib[index_invalid_itol] = 0.3 * Itol[index_invalid_itol] Id[index_invalid_itol] = 0.7 * Itol[index_invalid_itol] DQF[index_invalid_itol] = 2 else: Itol = G0_Correct * G0 Ib = 0.3 * Itol Id = 0.7 * Itol # 计算Gt和DNI Rb = calRb(lats, beta, delta, Omega, cos_the_taz) Ai = Ib / G0 Gt = calGt(Ib, Id, Ai, Rb, beta, Itol) DNI = Ib / cos_the_taz # 校正Gt index_invalid_gt = np.logical_and(Gt < 0, np.isfinite(G0)) Gt[index_invalid_gt] = 0.75 * G0[index_invalid_gt] DQF[index_invalid_gt] = 3 Gt[lats < 0] = np.nan # 20191121 AnNing 根据用户需求,Gt的数据只生产北半球 # 输出数据 result = { 'G0': G0, 'Gt': Gt, 'DNI': DNI, 'SSI': Itol, 'DirSSI': Ib, 'DifSSI': Id, 'DQF': DQF } try: _write_out_file(out_file, result) if os.path.isfile(out_file) and not exist_result_data( resultid=resultid, datatime=datatime, resolution_type=resolution_type, area_type=area_type): add_result_data(resultid=resultid, planid=planid, address=out_file, datatime=datatime, resolution_type=resolution_type, area_type=area_type, element=None) except Exception as why: print(why) print('输出结果文件错误') return
def plot_map_full(in_file, vmin=0, vmax=1000, resultid='', planid='', datatime='', resolution_type=None): print('plot_map_orbit <<<:{}'.format(in_file)) if not os.path.isfile(in_file): print('数据不存在:{}'.format(in_file)) return dir_ = os.path.dirname(in_file) in_filename = os.path.basename(in_file) if 'fy4a' in resultid.lower(): datas = FY4ASSI(in_file) elif 'fy3d' in resultid.lower(): datas = FY3DSSI(in_file) else: print('不支持的卫星:{}'.format(resultid)) return datas_ = { 'Itol': datas.get_ssi, 'Ib': datas.get_ib, 'Id': datas.get_id, 'G0': datas.get_g0, 'Gt': datas.get_gt, 'DNI': datas.get_dni, } for element in datas_.keys(): try: data = datas_[element]() except Exception as why: print(why) print('读取数据错误:{}'.format(element)) data = None if data is not None: # 快视图绘制 area_type = 'Full_DISK' out_filename1 = in_filename + '_{}_{}.PNG'.format( area_type, element) out_file1 = os.path.join(dir_, out_filename1) try: if not os.path.isfile(out_file1): plot_image_disk(data, out_file=out_file1, resultid=resultid, resolution_type=resolution_type, vmin=vmin, vmax=vmax) else: print('文件已经存在,跳过:{}'.format(out_file1)) # 入库 if os.path.isfile(out_file1) and not exist_result_data( resultid=resultid, datatime=datatime, resolution_type=resolution_type, element=element, area_type=area_type): add_result_data(resultid=resultid, planid=planid, address=out_file1, datatime=datatime, resolution_type=resolution_type, area_type=area_type, element=element) except Exception as why: print(why) print('绘制{}图像错误:{}'.format(area_type, out_file1)) # 等经纬图绘制 area_type = 'Full_LATLON' out_filename2 = in_filename + '_{}_{}.PNG'.format( area_type, element) out_file2 = os.path.join(dir_, out_filename2) # try: if not os.path.isfile(out_file2): plot_image_map(data, out_file=out_file2, resultid=resultid, resolution_type=resolution_type, vmin=vmin, vmax=vmax) else: print('文件已经存在,跳过:{}'.format(out_file2)) # 入库 if os.path.isfile(out_file2) and not exist_result_data( resultid=resultid, datatime=datatime, resolution_type=resolution_type, element=element, area_type=area_type): add_result_data(resultid=resultid, planid=planid, address=out_file2, datatime=datatime, resolution_type=resolution_type, area_type=area_type, element=element)
def combine_full(in_files, out_file, day=False, resultid=None, planid=None, datatime=None, resolution_type=None): """ :param in_files: :param out_file: :param day: 是否日合成,因为日合成的时候,要改变数据的单位为KW/m2 :param resultid: :param planid: :param datatime: :param resolution_type: :return: """ out_path = os.path.dirname(out_file) if not os.path.isdir(out_path): os.makedirs(out_path) area_type = 'Full_DISK' if os.path.isfile(out_file): print('文件已经存在,跳过:{}'.format(out_file)) if not exist_result_data(resultid=resultid, datatime=datatime, resolution_type=resolution_type, area_type=area_type): print('开始入库') add_result_data(resultid=resultid, planid=planid, address=out_file, datatime=datatime, resolution_type=resolution_type, area_type=area_type) return data_all = { 'SSI': None, 'DirSSI': None, 'DifSSI': None, 'G0': None, 'Gt': None, 'DNI': None, } for in_file in in_files: print('combine <<< :{}'.format(in_file)) try: datas = FY4ASSI(in_file) # 日合成的时候,只使用整点数据 if day: date_time = FY4ASSI.get_date_time_orbit(in_file) if date_time.minute != 0: continue data_get = { 'SSI': datas.get_ssi, 'DirSSI': datas.get_ib, 'DifSSI': datas.get_id, 'G0': datas.get_g0, 'Gt': datas.get_gt, 'DNI': datas.get_dni, } for dataname in data_all: data_all[dataname] = add_data(data_all[dataname], data_get[dataname]()) except Exception as why: print(why) print('合成数据过程出错,文件为:{}'.format(in_file)) continue # 从时次产品转为日产品的时候,单位变为kw/m2 try: if day: print('从时次产品转为日产品的时候,单位变为kw/m2') for dataname in data_all: data = data_all[dataname] if data is not None: data_all[dataname] = data * 0.001 except Exception as why: print(why) print('转换单位出错') try: _write_out_file(out_file, data_all) if os.path.isfile(out_file) and not exist_result_data(resultid=resultid, datatime=datatime, resolution_type=resolution_type, area_type=area_type): print('开始入库') add_result_data(resultid=resultid, planid=planid, address=out_file, datatime=datatime, resolution_type=resolution_type, area_type=area_type) except Exception as why: print(why) print('输出结果文件错误') return
def fy4a_ssi_4km_to_1km(in_file, out_file, resultid=None, planid=None, datatime=None, resolution_type=None): print('<<< itcal: {}'.format(in_file)) area_type = 'Full_DISK' if os.path.isfile(out_file): print('数据已经存在: {}'.format(out_file)) if not exist_result_data(resultid=resultid, datatime=datatime, resolution_type=resolution_type, area_type=area_type): add_result_data(resultid=resultid, planid=planid, address=out_file, datatime=datatime, resolution_type=resolution_type, area_type=area_type) return datas = FY4ASSI(in_file) data_get = { 'SSI': datas.get_ssi, 'DirSSI': datas.get_ib, 'DifSSI': datas.get_id, 'G0': datas.get_g0, 'Gt': datas.get_gt, 'DNI': datas.get_dni, } result = {} elements = data_get.keys() lats_4km = FY4ASSI.get_latitude_4km() lons_4km = FY4ASSI.get_longitude_4km() lats_1km = FY4ASSI.get_latitude_1km() lons_1km = FY4ASSI.get_longitude_1km() ddem = FY4ASSI.get_ddem_1km() lats_min = np.nanmin(lats_1km) - 5 lats_max = np.nanmax(lats_1km) + 5 lons_min = np.nanmin(lons_1km) - 5 lons_max = np.nanmax(lons_1km) + 5 print(lats_min, lats_max, lons_min, lons_max) index1 = np.logical_and.reduce(( lons_4km <= lons_max, lons_4km >= lons_min, lats_4km <= lats_max, lats_4km >= lats_min, )) for element in elements: print(element) values = data_get.get(element)() index2 = np.isfinite(values) index = np.logical_and(index1, index2) valid_count = index.sum() print(index1.sum()) print(index2.sum()) print('有效点数量:{}'.format(valid_count)) if valid_count <= 0: data = np.full_like(lons_1km, np.nan) else: lats_ = lats_4km[index].reshape(-1, 1) lons_ = lons_4km[index].reshape(-1, 1) points = np.concatenate((lons_, lats_), axis=1) values = values[index] data = griddata(points, values, (lons_1km, lats_1km), method='linear') data = topoCorrection(data, ddem) result[element] = data _write_out_file(out_file, result) if os.path.isfile(out_file) and not exist_result_data( resultid=resultid, datatime=datatime, resolution_type=resolution_type, area_type=area_type): add_result_data(resultid=resultid, planid=planid, address=out_file, datatime=datatime, resolution_type=resolution_type, area_type=area_type)