예제 #1
0
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
예제 #2
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)
예제 #3
0
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))
예제 #4
0
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
예제 #5
0
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)
예제 #6
0
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
예제 #7
0
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)