Beispiel #1
0
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!")
Beispiel #2
0
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
Beispiel #3
0
    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
Beispiel #4
0
    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
Beispiel #5
0
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
Beispiel #6
0
    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)