def nc2hdf(sourcefile, savefile, format="NETCDF4"): ''' NetCDF转HDF :param sourcefile: :param savefile: :param format: :return: ''' nc_type = jt.judge_model_data_type(sourcefile) print("NetCDF Convert To HDF!") if nc_type == ModelDataType.NETCDF: nc = Nc(sourcefile) f = Dataset(savefile, 'w', format=format) # 全局属性包含IsContainsGroup,自定义的,用于netcdf转hdf时判断是否包含组 l = nc.dataset.ncattrs() if "IsContainsGroup" in nc.dataset.ncattrs(): is_contains_group = nc.dataset.getncattr("IsContainsGroup") if is_contains_group == "True": f = set_group(nc.variables, f) # 设置group信息 else: f = set_dims(nc.dimensions, f) f = set_vars(nc.variables, f) # 设置全局变量信息 for g_attr in nc.dataset.ncattrs(): f.setncattr(g_attr, nc.dataset.getncattr(g_attr)) f.close() print("Convert Success!") print("out put : " + savefile) else: print("please choose hdf type file!")
def create_algorithm(file): ''' 根据文件类型判断数据类型,输出解码类 :param file: :return: ''' data_type = None try: modelDataType = jt.judge_model_data_type(file) if modelDataType == ModelDataType.NETCDF: # nc类型 data_type = Nc(file) elif modelDataType == ModelDataType.HDF: data_type = HDF(file) elif modelDataType == ModelDataType.MICAPS4: data_type = M4(file) elif modelDataType == ModelDataType.GRIB: # 增加判断是GRIB1还是2 xxf 20191210 if (g2.judgeGribType(file) == "GRIB1"): data_type = GRIB1Info(file) else: data_type = GRIB2Info(file) pass except: return data_type #logger.error("AlgorithmFactory error : ", exc_info=1) finally: return data_type
def OnTreeClicked(self): item = self.currentItem() if self.currentIndex().parent() == self.rootIndex(): self.tabWidget.tab1UI(self.fdict[item.text(2)][1]) self.tabWidget.flagExD = 1 self.tabWidget.tab3UI() modelDataType = jt.judge_model_data_type(item.text(2)) if modelDataType == ModelDataType.MICAPS4: self.tabWidget.tab1UI(str(self.fdict.get(item.text(2), '')[1])) self.tabWidget.tab3UI(self.fdict[item.text(2)][0], model='MICAPS4') else: modelDataType = jt.judge_model_data_type(item.text(2)) if modelDataType == ModelDataType.NETCDF or modelDataType == ModelDataType.HDF: tmp = list(self.fdict[item.text(2)][0].values())[0] if isinstance(tmp, nct.Variable): s = self.fdict[item.text(2)][0].get(item.text(0), '') self.tabWidget.tab1UI(str(s)) self.tabWidget.tab3UI(item.text(0), self.fdict[item.text(2)][0], model='NetCDF') elif isinstance(tmp, dict): for k, v in self.fdict[item.text(2)][0].items(): if item.text(0) == k: self.tabWidget.tab1UI(str(k)) self.tabWidget.tab3UI() for val in v: if item.text(0) == val: self.tabWidget.tab1UI(str(v[val])) self.tabWidget.tab3UI( item.text(0), self.fdict[item.text(2)][0][k], model='HDF') elif modelDataType == ModelDataType.GRIB: pass
def create_algorithm(file): import lib.judgetype as jt from lib.judgetype import ModelDataType from module.algorithm.netcdf.netcdf import Nc from module.algorithm.netcdf.hdf import HDF from module.algorithm.micaps.pymicaps import M4 import module.algorithm.grib.grib2_info as g2 from module.algorithm.grib.grib2_info import GRIB2Info from module.algorithm.grib.grib1_info import GRIB1Info from module.mrc_core.gloalConfig import GloalConfig ''' 根据文件类型判断数据类型,输出解码类 :param file: :return: ''' data_type = None modelDataType = None try: modelDataType = jt.judge_model_data_type(file) if modelDataType == ModelDataType.NETCDF: # nc类型 data_type = Nc(file) elif modelDataType == ModelDataType.HDF: data_type = HDF(file) elif modelDataType == ModelDataType.MICAPS4: data_type = M4(file) elif modelDataType == ModelDataType.GRIB: # 增加判断是GRIB1还是2 xxf 20191210 if (g2.judgeGribType(file) == "GRIB1"): data_type = GRIB1Info(file) else: data_type = GRIB2Info( file, GloalConfig.LibNetPath() + '/grib2Parameters.xml') pass except: return data_type, modelDataType # logger.error("AlgorithmFactory error : ", exc_info=1) finally: return data_type, modelDataType
def hdf2nc(sourcefile, savefile, format="NETCDF4"): """ Dataset(self, filename, mode="r", clobber=True, diskless=False, persist=False, keepweakref=False, format='NETCDF4'): Default `'NETCDF4'`, which means the data isstored in an HDF5 file, using netCDF 4 API features. Setting`format='NETCDF4_CLASSIC'` will create an HDF5 file, using only netCDF 3 compatible API features :param sourcefile: :param savefile: :return: """ hdf_type = jt.judge_model_data_type(sourcefile) print("HDF Convert To NetCDF!") # hdf_type=ncf.judge_nc_type(sourcefile) if hdf_type == ModelDataType.HDF: hdf = HDF(sourcefile) f = Dataset(savefile, 'w', format=format) if hdf.contains_group == True: # 解析出来HDF包含组 f.setncattr( "IsContainsGroup", "True" ) # 全局变量写入包含组信息,自定义的,用于netcdf转hdf时判断是否包含组 2019/7/9 by xxf for g in hdf.groups: # 遍历组 f = set_dims(hdf.groups[g].dimensions, f) # 设置每个组的dimensions和variables f = set_vars(hdf.groups[g].variables, f, g) else: f = set_dims(hdf.dimensions, f) f = set_vars(hdf.variables, f) # 设置全局变量信息 for g_attr in hdf.dataset.ncattrs(): f.setncattr(g_attr, hdf.dataset.getncattr(g_attr)) f.close() print("Convert Success!") print("out put : " + savefile) return 0 else: print("please choose hdf type file!") return 1
def OpenFile(self): global save_path save_path = '' if not isinstance(self.action, ActionQ): message = QMessageBox(title="错误", text="执行错误") message.show() return try: #fileDialog = QFileDialog(parent=self.mainWindow, caption=self.action.toolTip()) # v=QFileDialog.FileMode(2) # fileDialog.setFileMode(v) #files = fileDialog.getOpenFileNames(parent=self.mainWindow, caption=self.action.toolTip()) #files = QFileDialog.getOpenFileNames(self.mainWindow, "选取文件", r"/","Binary files(*.nc , *.hdf ,*.GRB, *.grb2);;All Files (*)") fileList = list() files = QFileDialog.getOpenFileNames( self.mainWindow, "选取文件", save_path, "Binary files(*.nc , *.hdf ,*.GRB, *.grb2);;All Files (*)") save_path = files[0] for file in files[0]: modelDataType = jt.judge_model_data_type(file) if modelDataType == ModelDataType.NETCDF or modelDataType == ModelDataType.HDF: regex_str = ".*?([\u4E00-\u9FA5]+).*?" match_obj = re.findall(regex_str, file) if match_obj: reply = QMessageBox.information( self, '提示', '您的NetCDF或者HDF文件路径中包含中文,继续执行请点击确认!', QMessageBox.Yes | QMessageBox.No) if reply == QMessageBox.Yes: logpath = os.path.join(os.path.abspath('.'), 'log') if not os.path.exists(logpath): os.makedirs(logpath) tmppath = os.path.join(logpath, 'temp') if not os.path.exists(tmppath): os.makedirs(tmppath) #ncfile = datetime.datetime.now().strftime('%Y%m%d%H%M%S') ncfile = datetime.datetime.now().strftime( '%Y%m%d%H') tmpdir = os.path.join(tmppath, ncfile) if not os.path.exists(tmpdir): os.makedirs(tmpdir) shutil.copy(file, tmpdir) (filepath, tempfilename) = os.path.split(file) file = os.path.join(tmpdir, tempfilename) fileList.append(file) else: pass else: fileList.append(file) else: fileList.append(file) return fileList #return files[0] except Exception as arg: logger.error(str(arg), exc_info=1) print(arg) QMessageBox.warning(self, '警告', '打开文件异常,请检查文件!', QMessageBox.Yes, QMessageBox.No)