Exemple #1
0
def cumulated_precip_evo(initTime=None,
                         t_gap=6,
                         t_range=[6, 36],
                         day_back=0,
                         model='ECMWF',
                         data_source='MICAPS',
                         map_ratio=14 / 9,
                         zoom_ratio=20,
                         cntr_pnt=[104, 34],
                         south_China_sea=True,
                         area=None,
                         city=False,
                         output_dir=None,
                         Global=False,
                         **kwargs):
    fhours = np.arange(t_range[0], t_range[1] + 1, t_gap)
    # prepare data
    if (data_source == 'MICAPS'):
        try:
            data_dir = [
                utl.Cassandra_dir(data_type='surface',
                                  data_source=model,
                                  var_name='RAIN' + '%02d' % t_gap)
            ]
        except KeyError:
            raise ValueError('Can not find all directories needed')
        if (initTime == None):
            initTime = MICAPS_IO.get_latest_initTime(data_dir[0])
        filenames = [initTime + '.' + str(fhour).zfill(3) for fhour in fhours]
        # retrieve data from micaps server
        rain = MICAPS_IO.get_model_grids(data_dir[0], filenames=filenames)
        rain2 = rain.copy(deep=True)
        for itime in range(1, len(rain['forecast_period'].values)):
            rain2['data'].values[itime, :, :] = np.sum(
                rain['data'].values[0:itime + 1, :, :], axis=0)

    if (data_source == 'CIMISS'):
        if (initTime != None):
            filename = utl.model_filename(initTime, 0, UTC=True)
        else:
            filename = utl.filename_day_back_model(day_back=0,
                                                   fhour=0,
                                                   UTC=True)
        try:
            TPE1 = CMISS_IO.cimiss_model_by_times(
                '20' + filename[0:8],
                valid_times=fhours,
                data_code=utl.CMISS_data_code(data_source=model,
                                              var_name='TPE'),
                levattrs={
                    'long_name': 'Height above Ground',
                    'units': 'm',
                    '_CoordinateAxisType': '-'
                },
                fcst_level=0,
                fcst_ele="TPE",
                units='kg*m^-2')
        except KeyError:
            raise ValueError('Can not find all data needed')
        rain = TPE1.copy(deep=True)
        rain['data'].values = (TPE1['data'].values)


# set map extent
    if (area != None):
        south_China_sea = False

    if (area != None):
        cntr_pnt, zoom_ratio = utl.get_map_area(area_name=area)
    else:
        map_extent = [0, 0, 0, 0]
        map_extent[0] = cntr_pnt[0] - zoom_ratio * 1 * map_ratio
        map_extent[1] = cntr_pnt[0] + zoom_ratio * 1 * map_ratio
        map_extent[2] = cntr_pnt[1] - zoom_ratio * 1
        map_extent[3] = cntr_pnt[1] + zoom_ratio * 1

    delt_x = (map_extent[1] - map_extent[0]) * 0.2
    delt_y = (map_extent[3] - map_extent[2]) * 0.1
    mask1 = (rain['lon'] > map_extent[0] - delt_x) & (
        rain['lon'] < map_extent[1] + delt_x) & (
            rain['lat'] > map_extent[2] - delt_y) & (rain['lat'] <
                                                     map_extent[3] + delt_y)
    rain2 = rain2.where(mask1, drop=True)
    rain2.attrs['model'] = model
    rain2.attrs['t_gap'] = t_gap
    # draw
    QPF_graphics.draw_cumulated_precip_evo(rain=rain2,
                                           map_extent=map_extent,
                                           regrid_shape=20,
                                           city=city,
                                           south_China_sea=south_China_sea,
                                           output_dir=output_dir,
                                           Global=Global)
Exemple #2
0
def T2m_mean24(initTime=None,
               fhour=24,
               day_back=0,
               model='中央气象台中短期指导',
               map_ratio=19 / 9,
               zoom_ratio=20,
               cntr_pnt=[102, 34],
               data_source='MICAPS',
               south_China_sea=True,
               area='全国',
               city=False,
               output_dir=None,
               Global=False):

    # prepare data
    if (data_source == 'MICAPS'):
        data_dir = [
            utl.Cassandra_dir(data_type='surface',
                              data_source=model,
                              var_name='T2m')
        ]
        fhours = np.arange(fhour - 21, fhour + 1, 3)
        if (initTime is None):
            initTime = utl.filename_day_back_model(day_back=day_back,
                                                   fhour=fhour)[0:8]
        filenames = [initTime + '.' + str(fhour).zfill(3) for fhour in fhours]
        T_2m = MICAPS_IO.get_model_grids(data_dir[0], filenames=filenames)

        Tmean_2m = T_2m.isel(time=[-1]).copy()
        Tmean_2m['data'].values[0, :, :] = np.mean(T_2m['data'].values, axis=0)

    if (data_source == 'CIMISS'):
        # get filename
        fhours = np.arange(fhour - 18, fhour + 1, 3)
        if (initTime is None):
            initTime = utl.filename_day_back_model(day_back=day_back,
                                                   fhour=fhour,
                                                   UTC=True)[0:8]
        T_2m = CMISS_IO.cimiss_model_by_times('20' + initTime,
                                              valid_times=fhours,
                                              data_code=utl.CMISS_data_code(
                                                  data_source=model,
                                                  var_name='TEF2'),
                                              fcst_level=0,
                                              fcst_ele='TEF2',
                                              units='K',
                                              allExists=False)
        T_2m['data'].values = T_2m['data'].values - 273.15
        Tmean_2m = T_2m.isel(time=[-1]).copy()
        Tmean_2m['data'].values[0, :, :] = np.min(T_2m['data'].values, axis=0)


# set map extent
    if (area != '全国'):
        south_China_sea = False

    if (area != None):
        cntr_pnt, zoom_ratio = utl.get_map_area(area_name=area)

    map_extent = [0, 0, 0, 0]
    map_extent[0] = cntr_pnt[0] - zoom_ratio * 1 * map_ratio
    map_extent[1] = cntr_pnt[0] + zoom_ratio * 1 * map_ratio
    map_extent[2] = cntr_pnt[1] - zoom_ratio * 1
    map_extent[3] = cntr_pnt[1] + zoom_ratio * 1

    delt_x = (map_extent[1] - map_extent[0]) * 0.2
    delt_y = (map_extent[3] - map_extent[2]) * 0.1

    #+ to solve the problem of labels on all the contours
    mask1 = (Tmean_2m['lon'] > map_extent[0] - delt_x) & (
        Tmean_2m['lon'] < map_extent[1] + delt_x) & (
            Tmean_2m['lat'] > map_extent[2] - delt_y) & (
                Tmean_2m['lat'] < map_extent[3] + delt_y)
    Tmean_2m = Tmean_2m.where(mask1, drop=True)

    #- to solve the problem of labels on all the contours

    Tmean_2m.attrs['model'] = model
    Tmean_2m.attrs['title'] = '2米平均温度'

    elements_graphics.draw_T_2m(T_2m=Tmean_2m,
                                T_type='T_mean',
                                map_extent=map_extent,
                                regrid_shape=20,
                                city=city,
                                south_China_sea=south_China_sea,
                                output_dir=output_dir,
                                Global=Global)
Exemple #3
0
def tmp_evo(initTime=None,
            tmp_lev=850,
            t_gap=6,
            t_range=[6, 36],
            model='ECMWF',
            data_source='MICAPS',
            map_ratio=14 / 9,
            zoom_ratio=20,
            cntr_pnt=[104, 34],
            south_China_sea=True,
            area=None,
            **kwargs):

    fhours = np.arange(t_range[0], t_range[1], t_gap)
    #prepare data
    if (data_source == 'MICAPS'):
        try:
            data_dir = [
                utl.Cassandra_dir(data_type='high',
                                  data_source=model,
                                  var_name='TMP',
                                  lvl=tmp_lev),
                utl.Cassandra_dir(data_type='surface',
                                  data_source=model,
                                  var_name='PSFC')
            ]
        except KeyError:
            raise ValueError('Can not find all directories needed')

        # get filename
        if (initTime == None):
            initTime = MICAPS_IO.get_latest_initTime(data_dir[0])
        filenames = [initTime + '.' + str(fhour).zfill(3) for fhour in fhours]

        # retrieve data from micaps server
        tmp = MICAPS_IO.get_model_grids(data_dir[0], filenames=filenames)
        psfc = MICAPS_IO.get_model_grids(data_dir[1], filenames=filenames)

    if (data_source == 'CIMISS'):
        # get filename
        if (initTime != None):
            filename = utl.model_filename(initTime, 0, UTC=True)
        else:
            filename = utl.filename_day_back_model(day_back=0,
                                                   fhour=0,
                                                   UTC=True)
        try:
            tmp = CMISS_IO.cimiss_model_by_times(
                '20' + filename[0:8],
                valid_times=fhours,
                data_code=utl.CMISS_data_code(data_source=model,
                                              var_name='TEM'),
                levattrs={
                    'long_name': 'pressure_level',
                    'units': 'hPa',
                    '_CoordinateAxisType': '-'
                },
                fcst_level=tmp_lev,
                fcst_ele="TEM",
                units='K')
            tmp['data'].values = tmp['data'].values - 273.15

            psfc = CMISS_IO.cimiss_model_by_times(
                '20' + filename[0:8],
                valid_times=fhours,
                data_code=utl.CMISS_data_code(data_source=model,
                                              var_name='PRS'),
                fcst_level=0,
                fcst_ele="PRS",
                units='Pa')
            psfc['data'] = psfc['data'] / 100.

        except KeyError:
            raise ValueError('Can not find all data needed')
# set map extent
    if (area != None):
        south_China_sea = False

    if (area != None):
        cntr_pnt, zoom_ratio = utl.get_map_area(area_name=area)
    map_extent, delt_x, delt_y = utl.get_map_extent(cntr_pnt, zoom_ratio,
                                                    map_ratio)
    tmp = utl.cut_xrdata(map_extent, tmp, delt_x=delt_x, delt_y=delt_y)
    tmp = tmp.rolling({'lon': 3, 'lat': 3}).mean()
    psfc = utl.cut_xrdata(map_extent, psfc, delt_x=delt_x, delt_y=delt_y)
    tmp = utl.mask_terrian(tmp_lev, psfc, tmp)
    tmp.attrs['model'] = model
    coldwave_graphics.draw_tmp_evo(tmp=tmp,
                                   map_extent=map_extent,
                                   south_China_sea=south_China_sea,
                                   **kwargs)
Exemple #4
0
def T2m_mx24(initTime=None,
             fhour=24,
             day_back=0,
             model='中央气象台中短期指导',
             map_ratio=19 / 9,
             zoom_ratio=20,
             cntr_pnt=[102, 34],
             data_source='MICAPS',
             area=None,
             **kargws):

    # prepare data
    if (data_source == 'MICAPS'):
        try:
            data_dir = [
                utl.Cassandra_dir(data_type='surface',
                                  data_source=model,
                                  var_name='Tmx_2m')
            ]

            if (initTime != None):
                filename = utl.model_filename(initTime, fhour)
            else:
                filename = utl.filename_day_back_model(day_back=day_back,
                                                       fhour=fhour)

            Tmx_2m = MICAPS_IO.get_model_grid(data_dir[0], filename=filename)

        except:
            try:
                data_dir = [
                    utl.Cassandra_dir(data_type='surface',
                                      data_source=model,
                                      var_name='Tmx3_2m')
                ]
            except:
                data_dir = [
                    utl.Cassandra_dir(data_type='surface',
                                      data_source=model,
                                      var_name='T2m')
                ]
            fhours = np.arange(fhour - 21, fhour + 1, 3)
            if (initTime is None):
                initTime = utl.filename_day_back_model(day_back=day_back,
                                                       fhour=fhour)[0:8]
            filenames = [
                initTime + '.' + str(fhour).zfill(3) for fhour in fhours
            ]
            T_2m = MICAPS_IO.get_model_grids(data_dir[0], filenames=filenames)

            Tmx_2m = T_2m.isel(time=[-1]).copy()
            Tmx_2m['data'].values[0, :, :] = np.max(T_2m['data'].values,
                                                    axis=0)

    if (data_source == 'CIMISS'):
        # get filename
        fhours = np.arange(fhour - 18, fhour + 1, 3)
        if (initTime is None):
            initTime = utl.filename_day_back_model(day_back=day_back,
                                                   fhour=fhour,
                                                   UTC=True)[0:8]
        try:
            # retrieve data from CMISS server
            T_2m = CMISS_IO.cimiss_model_by_times(
                '20' + initTime,
                valid_times=fhours,
                data_code=utl.CMISS_data_code(data_source=model,
                                              var_name='MX2T6'),
                fcst_level=0,
                fcst_ele='MX2T6',
                units='K',
                allExists=False)
        except:
            T_2m = CMISS_IO.cimiss_model_by_times(
                '20' + initTime,
                valid_times=fhours,
                data_code=utl.CMISS_data_code(data_source=model,
                                              var_name='TEF2'),
                fcst_level=0,
                fcst_ele='TEF2',
                units='K',
                allExists=False)
            if T_2m is None:
                return
        T_2m['data'].values = T_2m['data'].values - 273.15
        Tmx_2m = T_2m.isel(time=[-1]).copy()
        Tmx_2m['data'].values[0, :, :] = np.max(T_2m['data'].values, axis=0)


# set map extent
    if (area != '全国'):
        south_China_sea = False

    if (area != None):
        cntr_pnt, zoom_ratio = utl.get_map_area(area_name=area)

    map_extent = [0, 0, 0, 0]
    map_extent[0] = cntr_pnt[0] - zoom_ratio * 1 * map_ratio
    map_extent[1] = cntr_pnt[0] + zoom_ratio * 1 * map_ratio
    map_extent[2] = cntr_pnt[1] - zoom_ratio * 1
    map_extent[3] = cntr_pnt[1] + zoom_ratio * 1

    delt_x = (map_extent[1] - map_extent[0]) * 0.2
    delt_y = (map_extent[3] - map_extent[2]) * 0.1

    #+ to solve the problem of labels on all the contours
    mask1 = (Tmx_2m['lon'] > map_extent[0] - delt_x) & (
        Tmx_2m['lon'] < map_extent[1] + delt_x) & (
            Tmx_2m['lat'] > map_extent[2] - delt_y) & (Tmx_2m['lat'] <
                                                       map_extent[3] + delt_y)
    Tmx_2m = Tmx_2m.where(mask1, drop=True)

    #- to solve the problem of labels on all the contours
    Tmx2 = xr.DataArray(np.squeeze(Tmx_2m['data'].values, axis=0),
                        name='data',
                        coords={
                            'time': ('time', [Tmx_2m['time'].values[0]]),
                            'fhour': ('time', [fhour]),
                            'lat': ('lat', Tmx_2m['lat'].values),
                            'lon': ('lon', Tmx_2m['lon'].values)
                        },
                        dims=('time', 'lat', 'lon'),
                        attrs={
                            'model_name': '中央气象台中短期指导',
                            'var_name': '2米最高温度',
                            'vhours': 24
                        })

    draw_SCMOC.draw_TMP2(TMP2=Tmx2, map_extent=map_extent, **kargws)