# -*- coding: UTF-8 -*- """ @Project :microproduct @File :OneOrthoMain.py @Function :正射校正 @Author :KHZ @Contact: @Date :2021/8/14 @Version :1.0.0 """ import logging from tool.algorithm.block.blockprocess import BlockProcess from tool.algorithm.image.ImageHandle import ImageHandler from tool.algorithm.xml.CreateMetaDict import CreateMetaDict, CreateProductXml, OrthoAzimuth from tool.algorithm.xml.AnalysisXml import DictXml from tool.algorithm.algtools.PreProcess import PreProcess as pp import tarfile from tool.algorithm.xml.AlgXmlHandle import ManageAlgXML, CheckSource # 导入xml文件读取与检查文件 from OrthoAlg import IndirectOrthorectification, DEMProcess,rpc_correction,getRCImageRC,get_RPC_lon_lat,getRCImageRC2 from OrthoAlg import ScatteringAlg as alg from tool.algorithm.algtools.logHandler import LogHandler from tool.config.ConfigeHandle import Config as cf import os import glob # import gc import datetime import shutil import sys import scipy #解决打包错误 import scipy.spatial.transform # 用于解决打包错误 import scipy.spatial.transform.rotation import scipy.spatial.transform._rotation_groups # 用于解决打包错误 if cf.get('debug') == 'True': DEBUG = True else: DEBUG = False EXE_NAME = cf.get('exe_name') productLevel = cf.get('productLEVEL') tager = '-' + cf.get('tager') #env_str = os.getcwd() env_str =os.path.dirname(os.path.abspath(sys.argv[0])) #os.path.split(os.path.realpath(__file__))[0] os.environ['PROJ_LIB'] = env_str LogHandler.init_log_handler(os.path.join("run_log", EXE_NAME)) # r"run_log\Ortho" logger = logging.getLogger("mylog") logger.info(env_str) class LogHandler2: """日志记录工具,用于输出程序运行状况。 这里因为是单程序执行,没有必要调用logging 类。 具体日志策略: 1. 最外层使用try,catch 捕捉异常 2. 最后程序执行终止判断。 日志记录格式: 第一行: TaskID,时间,输入参数文件地址。 中间: 时间,状态,执行步骤,消息 最后一行: finished 表示程序执行完成 failed 程序执行出现错误 """ def __init__(self, sLogPath) -> None: ''' 初始化日志文件 args: sLogPath:str 日志文件的路径 raise: IOError:Exception 错误 ''' self.__sLogPath = sLogPath def loggingStart(self,sTaskID,sParamPath): '''输出日志开头 TaskID,时间,输入参数文件地址。 args: sTaskID:str 任务ID sParamPath:str 任务参数文件地址 return: None ''' sDateTime=datetime.datetime.now().strftime("%Y-%m-%d %H:%M:%S.%f") # 执行时间 sOutput="[{}],[{}],[{}]".format(sTaskID, sDateTime, sParamPath) self.__outputText(sOutput) pass def logging(self,sStates,sExecuteStep,sException): """输出中间计算信息""" sDateTime=datetime.datetime.now().strftime("%Y-%m-%d %H:%M:%S.%f") # 执行时间 sOutput="[{}],[{}],[{}],[{}]".format(sDateTime,sStates,sExecuteStep,sExecuteStep) self.__outputText(sOutput) pass def __outputText(self,sMessage): '''将消息输出到最终的日志文件中 ''' with open(self.__sLogPath, 'a', encoding='utf-8') as fp: fp.write("{}".format(sMessage)) def logggingEnd(self, bSuccessful): ''' 最后一行输出,判断输出的结果是否是正确的 ''' if bSuccessful: sEndText="\n{}\nfinished".format(datetime.datetime.now().strftime("%Y-%m-%d %H:%M:%S.%f")) else: sEndText="\n{}\nError".format(datetime.datetime.now().strftime("%Y-%m-%d %H:%M:%S.%f")) self.__outputText(sEndText) class OrthoMain: """ 间接定位法正射校正 主函数 """ def __init__(self, alg_xml_path): self.alg_xml_path = alg_xml_path self.imageHandler = ImageHandler() self.__alg_xml_handler = ManageAlgXML(alg_xml_path) self.__check_handler = CheckSource(self.__alg_xml_handler) self.__workspace_path = None self.__task_id = None self.__input_paras = {} # self.__output_paras = {} self.__in_processing_paras = {} # self.__out_processing_paras = {} self.__preprocessed_paras = {} self.__out_para = None def check_source(self): """ 检查算法相关的配置文件,图 像,辅助文件是否齐全 """ if self.__check_handler.check_alg_xml() is False: return False if self.__check_handler.check_run_env() is False: return False input_para_names = ["SLC", "DEM", "CorrectMethod"] # //todo 增加检查校正方法 if self.__check_handler.check_input_paras(input_para_names) is False: return False self.__workspace_path = self.__alg_xml_handler.get_workspace_path() self.__task_id = self.__alg_xml_handler.get_task_id() self.__input_paras = self.__alg_xml_handler.get_input_paras() # self.__output_paras = self.__alg_xml_handler.get_output_paras() self.__create_work_space() self.__in_processing_paras = self.__init_processing_paras(self.__input_paras) # 输入{paraname:paravalue} # self.__out_processing_paras = self.__init_processing_paras(self.__output_paras) # 输入{paraname:paravalue} self.__out_name = os.path.splitext(os.path.splitext(os.path.basename(self.__input_paras['SLC']['ParaValue']))[0])[0] # AlgorithmName = self.__alg_xml_handler.get_algorithm_name() # TaskId = self.__alg_xml_handler.get_task_id() result_name = self.__out_name + ".tar.gz" self.__out_para = os.path.join(self.__workspace_path, EXE_NAME, 'Output', result_name) isError, CorrectMethod = self.__check_handler.check_input_paras(['CorrectMethod']) # //todo 获取xml中校正方法 根据不同方法进行结果处理 if CorrectMethod.get('CorrectMethod') == '1' or CorrectMethod.get('CorrectMethod') == 1: logger.info("CorrectMethod is RPC!") # self.__out_para=self.__out_para.replace(".tar.gz","_RPC.tar.gz") self.__out_para=self.__out_para.replace(".tar.gz", tager + ".tar.gz") elif CorrectMethod.get('CorrectMethod') == '2' or CorrectMethod.get('CorrectMethod') == 2: logger.info("CorrectMethod is RD!") # self.__out_para=self.__out_para.replace(".tar.gz","_RD.tar.gz") self.__out_para=self.__out_para.replace(".tar.gz", tager + ".tar.gz") else: raise Exception('No CorrectMethod') self.__alg_xml_handler.write_out_para("OrthoProduct", self.__out_para) #写入输出参数 logger.info('check_source finished!') logger.info('progress bar :5%') return True def __create_work_space(self): """ 删除原有工作区文件夹,创建新工作区文件夹 """ self.__workspace_Output_path = os.path.join(self.__workspace_path, EXE_NAME, "Output") self.__workspace_Temporary_path = os.path.join(self.__workspace_path, EXE_NAME, "Temporary") self.__workspace_unpack_path = os.path.join(self.__workspace_path, EXE_NAME, "Temporary", "unpack") self.__workspace_ResampledDEM_path = os.path.join(self.__workspace_path, EXE_NAME, "Temporary", 'TestDEM') self.__workspace_LutImg_path = os.path.join(self.__workspace_path, EXE_NAME, "Temporary", 'TestLut') self.__workspace_IncidenceImg_path = os.path.join(self.__workspace_path, EXE_NAME, "Temporary", 'TestInc') self.__workspace_SimImg_path = os.path.join(self.__workspace_path, EXE_NAME, "Temporary", 'TestSim') self.__workspace_SARIntensity_path = os.path.join(self.__workspace_path, EXE_NAME, "Temporary", 'TestSAR') self.__workspace_package_path = os.path.join(self.__workspace_path, EXE_NAME, "Temporary", 'package') self.__workspace_origin_path = os.path.join(self.__workspace_path, EXE_NAME, "Temporary", "origin") path_list = [self.__workspace_Output_path, self.__workspace_Temporary_path, self.__workspace_unpack_path, self.__workspace_ResampledDEM_path, self.__workspace_LutImg_path, self.__workspace_IncidenceImg_path, self.__workspace_SimImg_path, self.__workspace_SARIntensity_path, self.__workspace_package_path, self.__workspace_origin_path] for path in path_list: if os.path.exists(path): if DEBUG is True: continue self.del_floder(path) os.makedirs(path) else: os.makedirs(path) logger.info('create new workspace success!') @staticmethod def force_del_file(file_path): """ 强制删除文件 """ if os.path.isdir(file_path): for main_dir, subdir, file_name_list in os.walk(file_path): for filename in file_name_list: apath = main_dir + filename # noinspection PyBroadException try: os.remove(apath) except Exception as error: # 使用windows命令行强制删除 os.system("del /f /q %s" % apath) elif os.path.isfile(file_path) is True: # noinspection PyBroadException try: os.remove(file_path) except Exception as error: # 使用windows命令行强制删除 os.system("del /f /q %s" % file_path) @staticmethod def make_targz(output_filename, source_dir): """ 一次性打包整个根目录。空子目录会被打包。 如果只打包不压缩,将"w:gz"参数改为"w:"或"w"即可。 :param output_filename:输出压缩包的完整路径,eg:'E:\test.tar.gz' :param source_dir:需要打包的跟目录,eg: 'E:\testFfile\'打包文件夹里面的所有文件,'E:\testFfile'打包文件夹 """ dir = os.path.split(output_filename)[0] if os.path.exists(dir) is False: os.makedirs(dir) with tarfile.open(output_filename, "w:gz") as tar: tar.add(source_dir, arcname=os.path.basename(source_dir)) @staticmethod def del_floder(path_data): """ 删除整个文件夹 """ if os.path.isdir(path_data): shutil.rmtree(path_data) def del_temp_workspace(self): """ 临时工作区 """ if DEBUG is True: return path = self.__workspace_path + EXE_NAME + r'\Temporary' if os.path.exists(path): self.del_floder(path) def __init_processing_paras(self, names): """ :param names:字典列表,每个字典为一个输入产品的配置信息 """ processing_paras = {} for name in names: para = names[name] if para is None: logger.error(name + "is None!") return False if para['ParaType'] == 'File': if para['DataType'] == 'File': para_path = os.path.join(self.__workspace_path, para['ParaValue']) processing_paras.update({name: para_path}) if para['DataType'] == 'xml': para_path = os.path.join(self.__workspace_path, para['ParaValue']) processing_paras.update({name: para_path}) if para['DataType']=="ymal": para_path = os.path.join(self.__workspace_path, para['ParaValue']) processing_paras.update({name: para_path}) if para['DataType'] == 'tar.gz': para_path = os.path.join(self.__workspace_path, para['ParaValue']) tar_gz_dic = self.__dec_tar_gz(name, para_path, self.__workspace_unpack_path) processing_paras.update(tar_gz_dic) if para['DataType'] == 'tif' or para['DataType'] == 'tiff': # 新增修改dem数据为文件绝对路径 if para['ParaValue'] != 'empty' and para['ParaValue'] != 'Empty' and para['ParaValue'] != '': para_path_list = para['ParaValue'].split(";") if len(para_path_list) != 0: dem_path = os.path.join(self.__workspace_origin_path, para['ParaName']) if os.path.exists(dem_path) is False: os.mkdir(dem_path) for file_path in para_path_list: tif_name = os.path.basename(file_path) shutil.copy(file_path, os.path.join(dem_path, tif_name)) para_path = os.path.join(self.__workspace_origin_path,para['ParaName']) processing_paras.update({name: para_path}) if para['DataType'] == 'zip': # 新增修改dem数据为文件绝对路径 if para['ParaValue'] != 'empty' and para['ParaValue'] != 'Empty' and para['ParaValue'] != '': para_path_list = para['ParaValue'].split(";") if len(para_path_list) != 0: dem_path = os.path.join(self.__workspace_origin_path, para['ParaName']) if os.path.exists(dem_path) is False: os.mkdir(dem_path) for file_path in para_path_list: BlockProcess.unzip_dem(file_path, dem_path) # tif_name = os.path.basename(file_path) # shutil.copy(file_path, os.path.join(dem_path, tif_name)) para_path = os.path.join(self.__workspace_origin_path,para['ParaName']) processing_paras.update({name: dem_path}) elif para['ParaType'] == 'Value': if para['DataType'] == 'float': value = float(para['ParaValue']) processing_paras.update({name: value}) return processing_paras def __dec_tar_gz(self, name1, tar_gz_path, out_dir): """ 解压.tar_gz格式景影像文件 :param tar_gz_path:.tar_gz文件路径 :param out_dir:输出文件夹 :return para_dic:全极化影像路径 """ # 创建文件夹 name = os.path.split(tar_gz_path)[1].rstrip('.tar.gz') file_dir = os.path.join(out_dir, name + '\\') if os.path.exists(file_dir) is False: os.makedirs(file_dir) # 解压 t = tarfile.open(tar_gz_path) t.extractall(path=file_dir) # 获取文件夹内的文件 para_dic = {} if os.path.exists(file_dir + name + '\\'): meta_xml_paths = list(glob.glob(os.path.join(file_dir + name, '*.meta.xml'))) para_dic.update({'SLC': file_dir + name}) else: meta_xml_paths = list(glob.glob(os.path.join(file_dir, '*.meta.xml'))) para_dic.update({'SLC': file_dir}) if meta_xml_paths == []: raise Exception('there is not .meta.xml in path: ', file_dir + '\\') para_dic.update({'META': meta_xml_paths[0]}) self.image_meta_xml = meta_xml_paths # para_dic.update({name1: file_dir}) # {SLC: file_path} # 获取文件夹内的文件 hh_flag, hv_flag, vh_flag, vv_flag, dh_flag = 0, 0, 0, 0, 0 # if os.path.exists(file_dir + name + '\\'): in_tif_paths = list(glob.glob(os.path.join(file_dir + name + '\\', '*.tif'))) if in_tif_paths == []: in_tif_paths = list(glob.glob(os.path.join(file_dir + name + '\\', '*.tiff'))) else: in_tif_paths = list(glob.glob(os.path.join(file_dir, '*.tif'))) if in_tif_paths == []: in_tif_paths = list(glob.glob(os.path.join(file_dir, '*.tiff'))) for in_tif_path in in_tif_paths: # 获取极化类型 if 'hh' in os.path.basename(in_tif_path) or 'HH' in os.path.basename(in_tif_path): hh_flag = 1 elif 'hv' in os.path.basename(in_tif_path) or 'HV' in os.path.basename(in_tif_path): hv_flag = 1 elif 'vh' in os.path.basename(in_tif_path) or 'VH' in os.path.basename(in_tif_path): vh_flag = 1 elif 'vv' in os.path.basename(in_tif_path) or 'VV' in os.path.basename(in_tif_path): vv_flag = 1 elif "DH" in os.path.basename(in_tif_path): dh_flag = 1 if hh_flag == 0 and hv_flag == 0 and vh_flag == 0 and vv_flag == 0 and dh_flag == 0: raise Exception('can not found files: HH、HV、VH、VV、DH in path:', tar_gz_path) self.processinfo = [hh_flag, hv_flag, vh_flag, vv_flag,dh_flag] return para_dic def process_handle(self): isError, CorrectMethod = self.__check_handler.check_input_paras(['CorrectMethod']) # //todo 获取xml中校正方法 根据不同方法进行结果处理 if CorrectMethod.get('CorrectMethod') == '1' or CorrectMethod.get('CorrectMethod') == 1: logger.info("CorrectMethod is RPC!") return self.RD_process_handle() elif CorrectMethod.get('CorrectMethod') == '2' or CorrectMethod.get('CorrectMethod') == 2: logger.info("CorrectMethod is RD!") return self.RD_process_handle() else: raise Exception('No CorrectMethod') def RPC_process_handle(self): logger.info(datetime.datetime.now().strftime('%Y-%m-%d %H:%M:%S.%f')) # print(datetime.datetime.now().strftime('%Y-%m-%d %H:%M:%S.%f')) # 1、DEM拼接、裁剪、重采样 Orth_Slc=[] # in_dem_path = self.__in_processing_paras['DEM'] # meta_file_path = self.__in_processing_paras['META'] # .meta文件路径 # out_dem_path = self.__workspace_ResampledDEM_path # dem_merged_path=DEMProcess.dem_merged(in_dem_path, meta_file_path, out_dem_path) # 生成TestDEM\mergedDEM_VRT.tif # 2、间接定位法求解行列坐标 slc_paths = self.__in_processing_paras["SLC"] rpc_slc_path=None for slc_path in os.listdir(slc_paths): if slc_path.find(".tiff")>0: slc_path_temp=os.path.join(slc_paths,slc_path) # out_power_path=os.path.join(self.__workspace_Temporary_path,slc_path.replace(".tiff","_db.tif").replace("L1A","L1B")) out_power_path=os.path.join(self.__workspace_Temporary_path,slc_path.replace(".tiff","_db.tif").replace("L1A","L1B").replace("HH","h_h").replace("HV","h_v").replace("VH","v_h").replace("VV","v_v")) alg.sar_backscattering_coef_RPC(slc_path_temp,self.__in_processing_paras['META'],out_power_path) rpc_slc_path=slc_path_temp.replace(".tiff",".rpc") if not os.path.exists(rpc_slc_path): rpc_slc_path=slc_path_temp.replace(".tiff",".rpb") if not os.path.exists(rpc_slc_path): logger.error("rpc file Not Found!") # out_slc_power_path=os.path.join(self.__workspace_package_path,os.path.basename(out_power_path.replace("_db.tif",".tif").replace("L1B","L4"))) out_slc_power_path=os.path.join(self.__workspace_package_path,os.path.basename(out_power_path.replace("_db.tif","-ortho.tif"))) rpc_correction(out_power_path,rpc_slc_path,out_slc_power_path) logger.info('progress bar: 30%') # 2.1 生成映射表 # slc_path=os.path.join(slc_paths,os.listdir(slc_paths)[0]) # out_rpc_rc_path = os.path.join(self.__workspace_package_path,"ori_sim-ortho.tif") # get_RPC_lon_lat(out_power_path,out_rpc_rc_path) # #getRCImageRC(slc_path_temp,out_rpc_rc_path,rpc_slc_path) # logger.info('progress bar: 70%') # # 2.2 生成局地入射角 # Orthorectification = IndirectOrthorectification(os.path.join(os.path.dirname(__file__),"config.yaml")) # Orthorectification.IndirectOrthorectification(self.__in_processing_paras["SLC"],self.__workspace_package_path) # 改动1 # out_incangle_path=os.path.join(self.__workspace_package_path,"inci_Angle-ortho.tif") # out_localincangle_path=os.path.join(self.__workspace_package_path,"LocalincidentAngle-ortho.tif") # out_incangle_geo_path=os.path.join(self.__workspace_package_path,"inc_angle.tif") # out_localincangle_geo_path=os.path.join(self.__workspace_package_path,"LocalincidenceAngle.tif") # 决定入射角名字 # Orthorectification.getRPC_incidenceAngle_lon_lat(dem_merged_path,out_rpc_rc_path,self.__workspace_Temporary_path,self.__workspace_package_path,out_incangle_path,out_localincangle_path,out_incangle_geo_path,out_localincangle_geo_path) # 2.3 输出结果 # self.del_floder(self.__workspace_processing_path) logger.info('process_handle finished!') logger.info('progress bar :90%') # 7、打包生成快视图 for tiff_name in os.listdir(self.__workspace_package_path): if tiff_name.find(".tiff")>0 or tiff_name.find(".tif")>0: self.imageHandler.write_quick_view(os.path.join(self.__workspace_package_path,tiff_name)) # 1/5、移动原始数据 ------------------------- 这里限制 原始数据是否进入 最终产品列表中 for maindir, subdir, file_name_list in os.walk(slc_paths): for filename in file_name_list: apath = os.path.join(maindir, filename) file_type = apath.split('.')[-1] if file_type in ["xml"]: output = os.path.join(self.__workspace_package_path, filename) shutil.copy(apath, output) else: output=os.path.join(self.__workspace_package_path, filename) shutil.copy(apath, output) # 生成元文件案例 # xml_path = "./model_meta.xml" tem_folder=self.__workspace_path + EXE_NAME + r"\Temporary""\\" image_path=out_slc_power_path# os.path.join(self.__workspace_package_path, "OrthoMapTable.tif") out_path1 = os.path.join(tem_folder, "trans_geo_projcs.tif") out_path2 = os.path.join(tem_folder, "trans_projcs_geo.tif") # par_dict = CreateDict().calu_nature(image_path, self.processinfo, out_path1, out_path2) # # dem_path=os.path.join(self.__workspace_ResampledDEM_path, 'mergedDEM.tif') # out_dem_path1 = os.path.join(tem_folder, "trans_dem_geo_projcs.tif") # out_dem_path2 = os.path.join(tem_folder, "trans_dem_projcs_geo.tif") # # par_dict2 = CreateDict().calu_dem_nature(dem_path, dem_meta, out_dem_path1, out_dem_path2, sampling_f, para_A_arr) # # par_dict2 = CreateDict().calu_dem_nature(dem_path, dem_meta, out_dem_path1, out_dem_path2, sampling_f, para_A_arr) # par_dict2 = CreateDict().calu_dem_nature(dem_path, out_dem_path1, out_dem_path2, None,Orthorectification.SatelliteOrbitModel.A_arr) # model_xml_path = os.path.join(self.__workspace_Temporary_path, "creat_standard.meta.xml") # 输出xml路径 # CreateStadardXmlFile(xml_path, self.alg_xml_path, par_dict, par_dict2, model_xml_path).create_standard_xml() # # sar_image_meta_xml = list(glob.glob(os.path.join(self.__workspace_package_path, '*.meta.xml'))) # meta_xml_path = os.path.join(self.__workspace_package_path, os.path.basename(self.__out_para).replace(".tar.gz",".meta.xml")) # CreateMetafile(sar_image_meta_xml[0], self.alg_xml_path, model_xml_path, meta_xml_path).process(os.path.basename(self.__in_processing_paras["SLC"])) model_path = "./product.xml" meta_xml_path = os.path.join(self.__workspace_package_path, os.path.basename(self.__out_para).replace(".tar.gz", ".meta.xml")) para_dict = CreateMetaDict(image_path, self.__in_processing_paras['META'], self.__workspace_package_path, out_path1, out_path2).calu_nature() para_dict.update({"ProductProductionInfo_BandSelection": "1,2"}) para_dict.update({"ProductProductionInfo_AuxiliaryDataDescription": "DEM"}) CreateProductXml(para_dict, model_path, meta_xml_path).create_standard_xml() # 生成压缩包 logger.info('progress bar :94%') logger.info('start make targz..') self.del_floder(self.__workspace_unpack_path) self.del_floder(self.__workspace_ResampledDEM_path) self.del_floder(self.__workspace_LutImg_path) self.del_floder(self.__workspace_IncidenceImg_path) self.del_floder(self.__workspace_SimImg_path) self.del_floder(self.__workspace_SARIntensity_path) self.make_targz(self.__out_para, self.__workspace_package_path+"\\") logger.info('make targz finish') logger.info('progress bar :100%') return True pass def cut_dem(self, dem_merged_path, meta_file_path): _, scopes = DictXml(meta_file_path).get_extend() intersect_polygon = pp().intersect_polygon(scopes) if intersect_polygon is None: raise Exception('cal intersect box fail!') shp_path = os.path.join(self.__workspace_Temporary_path, 'IntersectPolygon.shp') if pp().write_polygon_shp(shp_path, intersect_polygon, 4326) is False: raise Exception('create intersect shp fail!') dem_process = os.path.join(self.__workspace_Temporary_path, 'dem_cut.tif') pp().cut_img(dem_process, dem_merged_path, shp_path) return dem_process def process_sim_ori(self, ori_sim, sim_ori): p = pp() scopes = () scopes += p.box2scope('34.60;34.67;113.05;113.18') intersect_polygon = pp().intersect_polygon(scopes) if intersect_polygon is None: raise Exception('create intersect shp fail!') shp_path = os.path.join(self.__workspace_Temporary_path, 'IntersectPolygon.shp') if pp().write_polygon_shp(shp_path, intersect_polygon, 4326) is False: raise Exception('create intersect shp fail!') sim_ori_process = os.path.join(self.__workspace_Temporary_path, 'sim_ori_process.tif') pp().cut_img(sim_ori_process, sim_ori, shp_path) return sim_ori_process def RD_process_handle(self): # RPC logger.info(datetime.datetime.now().strftime('%Y-%m-%d %H:%M:%S.%f')) # print(datetime.datetime.now().strftime('%Y-%m-%d %H:%M:%S.%f')) # 1、DEM拼接、裁剪、重采样 Orth_Slc=[] in_dem_path = self.__in_processing_paras['DEM'] meta_file_path = self.__in_processing_paras['META'] # .meta文件路径 out_dem_path = self.__workspace_ResampledDEM_path dem_merged_path=DEMProcess.dem_merged(in_dem_path, meta_file_path, out_dem_path) # 生成TestDEM\mergedDEM_VRT.tif dem_path = self.cut_dem(dem_merged_path, meta_file_path) # 2、间接定位法求解行列坐标 slc_paths = self.__in_processing_paras["SLC"] # 2.1 生成映射表 slc_path=os.path.join(slc_paths,os.listdir(slc_paths)[0]) # 2.2 生成局地入射角 path2 = env_str Orthorectification = IndirectOrthorectification(os.path.join(path2,"config.yaml")) Orthorectification.IndirectOrthorectification(self.__in_processing_paras["SLC"], self.__workspace_package_path) # 改动1 # 2.3 输出结果 # 3 处理RD in_slc_path=None for slc_path in os.listdir(slc_paths): if slc_path.find(".tiff")>0 and (slc_path.find("_HH_")>0 or slc_path.find("_VV_")>0 or slc_path.find("_DH_")>0): in_slc_path=os.path.join(slc_paths,slc_path) break # 获取校正模型后 Orthorectification.preCaldem_sar_rc(dem_path,in_slc_path,self.__workspace_Temporary_path,self.__workspace_package_path.replace("\\","\\\\")) # 初步筛选坐标范围 logger.info('progress bar: 40%') # clip_dem_reample_path=os.path.join(self.__workspace_Temporary_path, "SAR_dem.tiff") # infooption=gdal.InfoOptions("-json") # clip_dem_tif_info=gdal.Info(clip_dem_reample_path,options=infooption) # dem_merged_info=gdal.Info(dem_merged_path,options=infooption) # sampling_f=clip_dem_tif_info['size'][0]/dem_merged_info['size'][0] out_dir_path=self.__workspace_package_path.replace("\\","\\\\") this_outSpace_path = out_dir_path this_out_dem_slantRange_path = out_dir_path + "\\" + "dem_slantRange.tiff"#// 地形斜距 this_out_plant_slantRange_path = out_dir_path + "\\" + "flat_slantRange.tiff"#// 平地斜距 # 保留结果 if(os.path.exists(this_out_dem_slantRange_path)): os.remove(this_out_dem_slantRange_path) if(os.path.exists(this_out_plant_slantRange_path)): os.remove(this_out_plant_slantRange_path) this_out_dem_rc_path = out_dir_path + "\\" + "WGS_SAR_map.tiff"#// 经纬度与行列号映射 if(os.path.exists(this_out_dem_rc_path)): os.remove(this_out_dem_rc_path) this_out_sar_sim_path = out_dir_path + "\\" + "sar_sim.tiff" if (os.path.exists(this_out_sar_sim_path)): os.remove(this_out_sar_sim_path) this_out_sar_sim_wgs_path = out_dir_path + "\\" + "sar_sim_wgs.tiff" # // 经纬度与行列号映射 if (os.path.exists(this_out_sar_sim_wgs_path)): os.remove(this_out_sar_sim_wgs_path) this_out_incidence_path = out_dir_path + "\\" + "incidentAngle.tiff"#// 入射角 this_out_localIncidenct_path = out_dir_path + "\\" + "localincidentAngle.tiff"#// 局地入射角 this_out_inc_angle_rpc_path = out_dir_path + "\\" + "RD_incidentAngle.tiff"#// 局地入射角 this_out_local_inc_angle_rpc_path = out_dir_path + "\\" + "RD_localincidentAngle.tiff"#// 局地入射角 if (os.path.exists(this_out_inc_angle_rpc_path)): shutil.move(this_out_inc_angle_rpc_path, out_dir_path + "\\" + "inci_angle.tif") if (os.path.exists(this_out_local_inc_angle_rpc_path)): shutil.move(this_out_local_inc_angle_rpc_path, out_dir_path + "\\" + "LocalIncidentAngle.tif") if(os.path.exists(this_out_incidence_path)): shutil.move(this_out_incidence_path,out_dir_path + "\\" + "inc_Angle-ortho.tif") if(os.path.exists(this_out_localIncidenct_path)): shutil.move(this_out_localIncidenct_path,out_dir_path + "\\" + "LocalIncidenceAngle-ortho.tif") this_out_ori_sim_tiff = out_dir_path + "\\" + "RD_ori_sim.tif"#// 局地入射角 if (os.path.exists(this_out_ori_sim_tiff)): shutil.move(this_out_ori_sim_tiff, out_dir_path + "\\" + "ori_sim-ortho.tif") this_out_sim_ori_tiff = out_dir_path + "\\" + "RD_sim_ori.tif" # // 局地入射角 if (os.path.exists(this_out_sim_ori_tiff)): shutil.move(this_out_sim_ori_tiff, out_dir_path + "\\" + "sim_ori-ortho.tif") # GTC 入射角 GTC_rc_path=os.path.join(self.__workspace_package_path,"ori_sim-ortho.tif") GTC_out_path=self.__workspace_package_path parameter_path = os.path.join(self.__workspace_package_path, "orth_para.txt") dem_rc = os.path.join(self.__workspace_package_path, "sim_ori-ortho.tif") # dem_rc_pro = self.process_sim_ori(this_in_rpc_lon_lat_path, dem_rc) # shutil.move(dem_rc_pro, dem_rc) in_tif_paths = list(glob.glob(os.path.join(slc_paths, '*.tiff'))) for in_tif_path in in_tif_paths: out_sar_path = os.path.join(GTC_out_path, os.path.split(in_tif_path)[1]) slc_path_temp=os.path.join(slc_paths,in_tif_path) out_power_path=os.path.join(self.__workspace_Temporary_path,slc_path_temp.replace(".tiff","-lin.tif").replace("L1A","L1B")).replace("HH","h_h").replace("HV","h_v").replace("VH","v_h").replace("VV","v_v").replace("DH","d_h") # out_power_path=os.path.join(self.__workspace_Temporary_path,slc_path_temp.replace(".tiff","_db.tif")) alg.sar_backscattering_coef(slc_path_temp,self.__in_processing_paras['META'],out_power_path) lin_tif_path = os.path.join(self.__workspace_Temporary_path, os.path.basename(out_power_path).split('-')[0] + "-lin_geo.tif") Orthorectification.calInterpolation_bil_Wgs84_rc_sar_sigma(parameter_path, dem_rc, out_power_path, lin_tif_path) tempout_tif_path = os.path.join(self.__workspace_package_path, os.path.basename(lin_tif_path).split('-')[0] + tager + '.tif') alg.lin_to_db(lin_tif_path, tempout_tif_path) # 线性值转回DB值 for tiff_name in os.listdir(self.__workspace_package_path): if tiff_name.find(".tiff")>0 or tiff_name.find(".tif")>0: self.imageHandler.write_quick_view(os.path.join(self.__workspace_package_path,tiff_name)) # 1/5、原始数据中的.incidence.xml、.meta.xml输出,影像不输出 for maindir, subdir, file_name_list in os.walk(slc_paths): for filename in file_name_list: apath = os.path.join(maindir, filename) file_type = apath.split('.')[-1] if file_type in ["xml"]: output = os.path.join(self.__workspace_package_path, filename) shutil.copy(apath, output) elif 'lin' in filename: continue else: output=os.path.join(self.__workspace_package_path, filename) shutil.copy(apath, output) tem_folder=self.__workspace_path + EXE_NAME + r"\Temporary""\\" image_path=tempout_tif_path# os.path.join(self.__workspace_package_path, "OrthoMapTable.tif") out_path1 = os.path.join(tem_folder, "trans_geo_projcs.tif") out_path2 = os.path.join(tem_folder, "trans_projcs_geo.tif") model_path = "./product.xml" meta_xml_path = os.path.join(self.__workspace_package_path, os.path.basename(self.__out_para).replace(".tar.gz",".meta.xml")) para_dict = CreateMetaDict(image_path, self.__in_processing_paras['META'], self.__workspace_package_path, out_path1, out_path2).calu_nature() Azimuth = os.path.join(self.__workspace_Temporary_path, 'Azimuth.txt') if os.path.exists(Azimuth): Azimuth_incidence = OrthoAzimuth.get_Azimuth_incidence(Azimuth) else: logger.error("read Azimuth txt failed!") Azimuth_incidence = 'None' para_dict.update({"ObservationGeometry_SatelliteAzimuth": Azimuth_incidence}) para_dict.update({"imageinfo_ProductName": '正射校正'}) para_dict.update({"imageinfo_ProductIdentifier": 'Ortho'}) para_dict.update({"imageinfo_ProductLevel": productLevel}) para_dict.update({"ProductProductionInfo_BandSelection": "1,2"}) para_dict.update({"ProductProductionInfo_AuxiliaryDataDescription": "DEM"}) CreateProductXml(para_dict, model_path, meta_xml_path).create_standard_xml() temp_folder = os.path.join(self.__workspace_path, EXE_NAME, 'Output') out_xml = os.path.join(temp_folder, os.path.basename(meta_xml_path)) if os.path.exists(temp_folder) is False: os.mkdir(temp_folder) # CreateProductXml(para_dict, model_path, out_xml).create_standard_xml() shutil.copy(meta_xml_path, out_xml) # 生成压缩包 logger.info('progress bar :94%') logger.info('start make targz..') # self.del_floder(self.__workspace_unpack_path) # self.del_floder(self.__workspace_ResampledDEM_path) # self.del_floder(self.__workspace_LutImg_path) # self.del_floder(self.__workspace_IncidenceImg_path) # self.del_floder(self.__workspace_SimImg_path) # self.del_floder(self.__workspace_SARIntensity_path) self.make_targz(self.__out_para, self.__workspace_package_path+"\\") logger.info('make targz finish') logger.info('progress bar :100%') return True pass if __name__ == '__main__': start = datetime.datetime.now() try: if len(sys.argv) < 2: xml_path = 'Ortho.xml' else: xml_path = sys.argv[1] OrthoMain = OrthoMain(xml_path) if OrthoMain.check_source() is False: raise Exception('check_source() failed!') if OrthoMain.process_handle() is False: raise Exception('check_source() failed!') logger.info('successful production of ortho products!') except Exception: logger.exception("run-time error!") finally: OrthoMain.del_temp_workspace() pass end = datetime.datetime.now() logger.info('running use time: %s ' % (end - start))