예제 #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)
예제 #2
0
def cumulated_precip(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.sum('time')

    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_time('20' + filename[0:8],
                                                 valid_time=fhours[0],
                                                 data_code=utl.CMISS_data_code(
                                                     data_source=model,
                                                     var_name='TPE'),
                                                 fcst_level=0,
                                                 fcst_ele="TPE",
                                                 units='kg*m^-2')
            if TPE1 is None:
                return

            TPE2 = CMISS_IO.cimiss_model_by_time('20' + filename[0:8],
                                                 valid_time=fhours[-1],
                                                 data_code=utl.CMISS_data_code(
                                                     data_source=model,
                                                     var_name='TPE'),
                                                 fcst_level=0,
                                                 fcst_ele="TPE",
                                                 units='kg*m^-2')
            if TPE2 is None:
                return

        except KeyError:
            raise ValueError('Can not find all data needed')
        rain = TPE1.copy(deep=True)
        rain['data'].values = (TPE2['data'].values - TPE1['data'].values)
        rain2 = rain.sum('time')
# 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
    rain = utl.cut_xrdata(map_extent=map_extent,
                          xr_input=rain,
                          delt_y=delt_y,
                          delt_x=delt_x)
    rain2.attrs['model'] = model
    rain2.attrs['t_gap'] = t_gap
    rain2.attrs['initTime'] = datetime.strptime(initTime, '%y%m%d%H')
    rain2.attrs['fhour1'] = fhours[0]
    rain2.attrs['fhour2'] = fhours[-1]
    # draw
    QPF_graphics.draw_cumulated_precip(rain=rain2,
                                       map_extent=map_extent,
                                       city=city,
                                       south_China_sea=south_China_sea,
                                       output_dir=output_dir,
                                       Global=Global)
예제 #3
0
def mslp_rain_snow(initTime=None,
                   fhour=24,
                   day_back=0,
                   model='ECMWF',
                   atime=6,
                   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):
    '''
    issues:
    1. CIMISS 上上没有上没有GRAPES-GFS的降雪,所以当data_source='CIMISS',model='GRAPES_GFS'无法出图
    '''

    # prepare data
    if (data_source == 'MICAPS'):
        try:
            data_dir = [
                utl.Cassandra_dir(data_type='surface',
                                  data_source=model,
                                  var_name='PRMSL'),
                utl.Cassandra_dir(data_type='surface',
                                  data_source=model,
                                  var_name='RAIN' + '%02d' % atime),
                utl.Cassandra_dir(data_type='surface',
                                  data_source=model,
                                  var_name='SNOW' + '%02d' % atime),
            ]
        except KeyError:
            raise ValueError('Can not find all directories needed')

        # get filename
        if (initTime != None):
            filename = utl.model_filename(initTime, fhour)
            if (atime > 3):
                filename_mslp = utl.model_filename(initTime,
                                                   int(fhour - atime / 2))
        else:
            filename = utl.filename_day_back_model(day_back=day_back,
                                                   fhour=fhour)
            if (atime > 3):
                filename_mslp = utl.filename_day_back_model(
                    day_back=day_back, fhour=int(fhour - atime / 2))

        # retrieve data from micaps server
        mslp = get_model_grid(data_dir[0], filename=filename)
        if mslp is None:
            return
        rain = get_model_grid(data_dir[1], filename=filename)
        if rain is None:
            return
        snow = get_model_grid(data_dir[2], filename=filename)
        if snow is None:
            return

    if (data_source == 'CIMISS'):
        # get filename
        if (initTime != None):
            filename = utl.model_filename(initTime, fhour, UTC=True)
            if (atime > 3):
                filename_gh = utl.filename_day_back_model(initTime,
                                                          fhour=int(fhour -
                                                                    atime / 2),
                                                          UTC=True)
        else:
            filename = utl.filename_day_back_model(day_back=day_back,
                                                   fhour=fhour,
                                                   UTC=True)
            if (atime > 3):
                filename_gh = utl.filename_day_back_model(day_back=day_back,
                                                          fhour=int(fhour -
                                                                    atime / 2),
                                                          UTC=True)
        try:
            # retrieve data from CIMISS server
            if (model == 'ECMWF'):
                mslp = CMISS_IO.cimiss_model_by_time(
                    '20' + filename[0:8],
                    valid_time=fhour,
                    data_code=utl.CMISS_data_code(data_source=model,
                                                  var_name='GSSP'),
                    levattrs={
                        'long_name': 'Mean_sea_level',
                        'units': 'm',
                        '_CoordinateAxisType': '-'
                    },
                    fcst_level=0,
                    fcst_ele="GSSP",
                    units='Pa')
            else:
                mslp = CMISS_IO.cimiss_model_by_time(
                    '20' + filename[0:8],
                    valid_time=fhour,
                    data_code=utl.CMISS_data_code(data_source=model,
                                                  var_name='SSP'),
                    levattrs={
                        'long_name': 'Mean_sea_level',
                        'units': 'm',
                        '_CoordinateAxisType': '-'
                    },
                    fcst_level=0,
                    fcst_ele="SSP",
                    units='Pa')
            if mslp is None:
                return
            mslp['data'] = mslp['data'] / 100.

            TPE1 = CMISS_IO.cimiss_model_by_time(
                '20' + filename[0:8],
                valid_time=fhour,
                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')
            if TPE1 is None:
                return

            TPE2 = CMISS_IO.cimiss_model_by_time(
                '20' + filename[0:8],
                valid_time=fhour - atime,
                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')
            if TPE2 is None:
                return

            TTSP1 = CMISS_IO.cimiss_model_by_time(
                '20' + filename[0:8],
                valid_time=fhour,
                data_code=utl.CMISS_data_code(data_source=model,
                                              var_name='TTSP'),
                levattrs={
                    'long_name': 'Height above Ground',
                    'units': 'm',
                    '_CoordinateAxisType': '-'
                },
                fcst_level=0,
                fcst_ele="TTSP",
                units='kg*m^-2')
            if TTSP1 is None:
                return

            TTSP2 = CMISS_IO.cimiss_model_by_time(
                '20' + filename[0:8],
                valid_time=fhour - atime,
                data_code=utl.CMISS_data_code(data_source=model,
                                              var_name='TTSP'),
                levattrs={
                    'long_name': 'Height above Ground',
                    'units': 'm',
                    '_CoordinateAxisType': '-'
                },
                fcst_level=0,
                fcst_ele="TTSP",
                units='kg*m^-2')
            if TTSP2 is None:
                return
        except KeyError:
            raise ValueError('Can not find all data needed')
        rain = TPE1.copy(deep=True)
        rain['data'].values = (TPE1['data'].values -
                               TPE2['data'].values) * 1000

        snow = TTSP1.copy(deep=True)
        snow['data'].values = (TTSP1['data'].values -
                               TTSP2['data'].values) * 1000


# 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 = [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 = (mslp['lon'] > map_extent[0] - delt_x) & (
        mslp['lon'] < map_extent[1] + delt_x) & (
            mslp['lat'] > map_extent[2] - delt_y) & (mslp['lat'] <
                                                     map_extent[3] + delt_y)

    mask2 = (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)

    mslp = mslp.where(mask1, drop=True)
    mslp.attrs['model'] = model
    rain = rain.where(mask2, drop=True)
    snow = snow.where(mask2, drop=True)
    snow.attrs['atime'] = atime

    rain_snow = xr.merge(
        [rain.rename({'data': 'rain'}),
         snow.rename({'data': 'snow'})])

    mask1 = ((rain_snow['rain'] - rain_snow['snow']) >
             0.1) & (rain_snow['snow'] > 0.1)
    sleet = rain_snow['rain'].where(mask1)

    mask2 = ((rain_snow['rain'] - rain_snow['snow']) <
             0.1) & (rain_snow['snow'] > 0.1)
    snw = rain_snow['snow'].where(mask2)

    mask3 = (rain_snow['rain'] > 0.1) & (rain_snow['snow'] < 0.1)
    rn = rain_snow['rain'].where(mask3)
    rn.attrs['atime'] = atime
    # draw
    QPF_graphics.draw_mslp_rain_snow(rain=rn,
                                     snow=snw,
                                     sleet=sleet,
                                     mslp=mslp,
                                     map_extent=map_extent,
                                     regrid_shape=20,
                                     city=city,
                                     south_China_sea=south_China_sea,
                                     output_dir=output_dir,
                                     Global=Global)
예제 #4
0
def gh_rain(initTime=None,
            fhour=24,
            day_back=0,
            model='ECMWF',
            gh_lev=500,
            atime=6,
            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):

    # prepare data
    if (data_source == 'MICAPS'):
        try:
            data_dir = [
                utl.Cassandra_dir(data_type='high',
                                  data_source=model,
                                  var_name='HGT',
                                  lvl=str(gh_lev)),
                utl.Cassandra_dir(data_type='surface',
                                  data_source=model,
                                  var_name='RAIN' + '%02d' % atime),
                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):
            filename = utl.model_filename(initTime, fhour)
            if (atime > 3):
                filename_gh = utl.model_filename(initTime,
                                                 int(fhour - atime / 2))
        else:
            filename = utl.filename_day_back_model(day_back=day_back,
                                                   fhour=fhour)
            if (atime > 3):
                filename_gh = utl.filename_day_back_model(day_back=day_back,
                                                          fhour=int(fhour -
                                                                    atime / 2))

        # retrieve data from micaps server
        gh = MICAPS_IO.get_model_grid(data_dir[0], filename=filename_gh)
        if gh is None:
            return

        rain = MICAPS_IO.get_model_grid(data_dir[1], filename=filename)
        if rain is None:
            return

        psfc = MICAPS_IO.get_model_grid(data_dir[2], filename=filename)

    if (data_source == 'CIMISS'):
        # get filename
        if (initTime != None):
            filename = utl.model_filename(initTime, fhour, UTC=True)
            if (atime > 3):
                filename_gh = utl.model_filename(initTime,
                                                 fhour=int(fhour - atime / 2),
                                                 UTC=True)
        else:
            filename = utl.filename_day_back_model(day_back=day_back,
                                                   fhour=fhour,
                                                   UTC=True)
            if (atime > 3):
                filename_gh = utl.filename_day_back_model(day_back=day_back,
                                                          fhour=int(fhour -
                                                                    atime / 2),
                                                          UTC=True)
        try:
            # retrieve data from CIMISS server
            gh = CMISS_IO.cimiss_model_by_time(
                '20' + filename_gh[0:8],
                valid_time=fhour,
                data_code=utl.CMISS_data_code(data_source=model,
                                              var_name='GPH'),
                levattrs={
                    'long_name': 'pressure_level',
                    'units': 'hPa',
                    '_CoordinateAxisType': '-'
                },
                fcst_level=gh_lev,
                fcst_ele="GPH",
                units='gpm')
            if gh is None:
                return
            gh['data'].values = gh['data'].values / 10.

            TPE1 = CMISS_IO.cimiss_model_by_time(
                '20' + filename[0:8],
                valid_time=fhour,
                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')
            if TPE1 is None:
                return

            TPE2 = CMISS_IO.cimiss_model_by_time(
                '20' + filename[0:8],
                valid_time=fhour - atime,
                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')
            if TPE2 is None:
                return

            psfc = CMISS_IO.cimiss_model_by_time('20' + filename[0:8],
                                                 valid_time=fhour,
                                                 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')
        rain = TPE1.copy(deep=True)
        rain['data'].values = TPE1['data'].values - TPE2['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)

    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

    gh = utl.cut_xrdata(map_extent, gh, delt_x=delt_x, delt_y=delt_y)
    rain = utl.cut_xrdata(map_extent, rain, delt_x=delt_x, delt_y=delt_y)

    gh = utl.mask_terrian(gh_lev, psfc, gh)

    gh.attrs['model'] = model
    gh.attrs['lev'] = gh_lev
    rain.attrs['atime'] = atime

    # draw
    QPF_graphics.draw_gh_rain(rain=rain,
                              gh=gh,
                              map_extent=map_extent,
                              regrid_shape=20,
                              city=city,
                              south_China_sea=south_China_sea,
                              output_dir=output_dir,
                              Global=Global)
예제 #5
0
파일: QPF.py 프로젝트: netgodz/nmc_met_map
def gh_rain(initial_time=None,
            fhour=24,
            day_back=0,
            model='ECMWF',
            gh_lev='500',
            atime=6,
            map_ratio=19 / 9,
            zoom_ratio=20,
            cntr_pnt=[102, 34],
            south_China_sea=True,
            area='全国',
            city=False,
            output_dir=None,
            Global=False):

    if (area != '全国'):
        south_China_sea = False

    # micaps data directory
    try:
        data_dir = [
            utl.Cassandra_dir(data_type='high',
                              data_source=model,
                              var_name='HGT',
                              lvl=gh_lev),
            utl.Cassandra_dir(data_type='surface',
                              data_source=model,
                              var_name='RAIN' + '%02d' % atime)
        ]
    except KeyError:
        raise ValueError('Can not find all directories needed')

    # get filename
    if (initial_time != None):
        filename = utl.model_filename(initial_time, fhour)
        if (atime > 3):
            filename_gh = utl.model_filename(initial_time, fhour / 2.)
    else:
        filename = utl.filename_day_back_model(day_back=day_back, fhour=fhour)
        if (atime > 3):
            filename_gh = utl.filename_day_back_model(day_back=day_back,
                                                      fhour=fhour / 2.)

    # retrieve data from micaps server
    gh = get_model_grid(data_dir[0], filename=filename_gh)
    if gh is None:
        return

    rain = get_model_grid(data_dir[1], filename=filename)

    init_time = gh.coords['forecast_reference_time'].values

    # prepare data

    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
    idx_x1 = np.where((gh.coords['lon'].values > map_extent[0] - delt_x)
                      & (gh.coords['lon'].values < map_extent[1] + delt_x))
    idx_y1 = np.where((gh.coords['lat'].values > map_extent[2] - delt_y)
                      & (gh.coords['lat'].values < map_extent[3] + delt_y))

    idx_x2 = np.where((rain.coords['lon'].values > map_extent[0] - delt_x)
                      & (rain.coords['lon'].values < map_extent[1] + delt_x))
    idx_y2 = np.where((rain.coords['lat'].values > map_extent[2] - delt_y)
                      & (rain.coords['lat'].values < map_extent[3] + delt_y))
    #- to solve the problem of labels on all the contours

    gh = {
        'lon':
        gh.coords['lon'].values[idx_x1],
        'lat':
        gh.coords['lat'].values[idx_y1],
        'data':
        gh['data'].values[0, 0, idx_y1[0][0]:(idx_y1[0][-1] + 1),
                          idx_x1[0][0]:(idx_x1[0][-1] + 1)],
        'lev':
        gh_lev,
        'model':
        model,
        'fhour':
        fhour,
        'init_time':
        init_time
    }

    rain = {
        'lon':
        rain.coords['lon'].values[idx_x2],
        'lat':
        rain.coords['lat'].values[idx_y2],
        'data':
        copy.deepcopy(rain['data'].values[0, idx_y2[0][0]:(idx_y2[0][-1] + 1),
                                          idx_x2[0][0]:(idx_x2[0][-1] + 1)])
    }

    QPF_graphics.draw_gh_rain(rain=rain,
                              gh=gh,
                              atime=atime,
                              map_extent=map_extent,
                              regrid_shape=20,
                              city=city,
                              south_China_sea=south_China_sea,
                              output_dir=output_dir,
                              Global=Global)
예제 #6
0
파일: QPF.py 프로젝트: netgodz/nmc_met_map
def mslp_rain_snow(initial_time=None,
                   fhour=24,
                   day_back=0,
                   model='ECMWF',
                   atime=6,
                   map_ratio=19 / 9,
                   zoom_ratio=20,
                   cntr_pnt=[102, 34],
                   south_China_sea=True,
                   area='全国',
                   city=False,
                   output_dir=None,
                   Global=False):

    if (area != '全国'):
        south_China_sea = False

    # micaps data directory
    try:
        data_dir = [
            utl.Cassandra_dir(data_type='surface',
                              data_source=model,
                              var_name='PRMSL'),
            utl.Cassandra_dir(data_type='surface',
                              data_source=model,
                              var_name='RAIN' + '%02d' % atime),
            utl.Cassandra_dir(data_type='surface',
                              data_source=model,
                              var_name='SNOW' + '%02d' % atime),
        ]
    except KeyError:
        raise ValueError('Can not find all directories needed')

    # get filename
    if (initial_time != None):
        filename = utl.model_filename(initial_time, fhour)
        if (atime > 3):
            filename_mslp = utl.model_filename(initial_time, fhour / 2.)
    else:
        filename = utl.filename_day_back_model(day_back=day_back, fhour=fhour)
        if (atime > 3):
            filename_mslp = utl.filename_day_back_model(day_back=day_back,
                                                        fhour=fhour / 2.)

    # retrieve data from micaps server
    mslp = get_model_grid(data_dir[0], filename=filename)
    if mslp is None:
        return

    rain = get_model_grid(data_dir[1], filename=filename)
    snow = get_model_grid(data_dir[2], filename=filename)
    init_time = mslp.coords['forecast_reference_time'].values

    # prepare data

    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
    idx_x1 = np.where((mslp.coords['lon'].values > map_extent[0] - delt_x)
                      & (mslp.coords['lon'].values < map_extent[1] + delt_x))
    idx_y1 = np.where((mslp.coords['lat'].values > map_extent[2] - delt_y)
                      & (mslp.coords['lat'].values < map_extent[3] + delt_y))

    idx_x2 = np.where((rain.coords['lon'].values > map_extent[0] - delt_x)
                      & (rain.coords['lon'].values < map_extent[1] + delt_x))
    idx_y2 = np.where((rain.coords['lat'].values > map_extent[2] - delt_y)
                      & (rain.coords['lat'].values < map_extent[3] + delt_y))
    #- to solve the problem of labels on all the contours
    rain_snow = xr.merge(
        [rain.rename({'data': 'rain'}),
         snow.rename({'data': 'snow'})])

    mask1 = ((rain_snow['rain'] - rain_snow['snow']) >
             0.1) & (rain_snow['snow'] > 0.1)
    sleet = rain_snow['rain'].where(mask1)

    mask2 = ((rain_snow['rain'] - rain_snow['snow']) <
             0.1) & (rain_snow['snow'] > 0.1)
    snw = rain_snow['snow'].where(mask2)

    mask3 = (rain_snow['rain'] > 0.1) & (rain_snow['snow'] < 0.1)
    rn = rain_snow['rain'].where(mask3)

    mslp = {
        'lon':
        mslp.coords['lon'].values[idx_x1],
        'lat':
        mslp.coords['lat'].values[idx_y1],
        'data':
        mslp['data'].values[0, idx_y1[0][0]:(idx_y1[0][-1] + 1),
                            idx_x1[0][0]:(idx_x1[0][-1] + 1)],
        'model':
        model,
        'fhour':
        fhour,
        'init_time':
        init_time
    }
    rain = {
        'lon':
        rn.coords['lon'].values[idx_x2],
        'lat':
        rn.coords['lat'].values[idx_y2],
        'data':
        rn.values[0, idx_y2[0][0]:(idx_y2[0][-1] + 1),
                  idx_x2[0][0]:(idx_x2[0][-1] + 1)]
    }
    snow = {
        'lon':
        snw.coords['lon'].values[idx_x2],
        'lat':
        snw.coords['lat'].values[idx_y2],
        'data':
        snw.values[0, idx_y2[0][0]:(idx_y2[0][-1] + 1),
                   idx_x2[0][0]:(idx_x2[0][-1] + 1)]
    }
    sleet = {
        'lon':
        sleet.coords['lon'].values[idx_x2],
        'lat':
        sleet.coords['lat'].values[idx_y2],
        'data':
        sleet.values[0, idx_y2[0][0]:(idx_y2[0][-1] + 1),
                     idx_x2[0][0]:(idx_x2[0][-1] + 1)]
    }

    QPF_graphics.draw_mslp_rain_snow(rain=rain,
                                     snow=snow,
                                     sleet=sleet,
                                     mslp=mslp,
                                     atime=atime,
                                     map_extent=map_extent,
                                     regrid_shape=20,
                                     city=city,
                                     south_China_sea=south_China_sea,
                                     output_dir=output_dir,
                                     Global=Global)
예제 #7
0
def cu_rain(initTime=None,
            atime=6,
            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,
            **kwargs):

    # prepare data
    if (data_source == 'MICAPS'):
        try:
            data_dir = [
                utl.Cassandra_dir(data_type='surface',
                                  data_source='CLDAS',
                                  var_name='RAIN01')
            ]
        except KeyError:
            raise ValueError('Can not find all directories needed')

        # get filename
        if (initTime == None):
            initTime = (datetime.now() -
                        timedelta(hours=2)).strftime('%y%m%d%H')
        filenames = []
        for ihour in range(0, atime):
            filenames.append((datetime.strptime(initTime, '%y%m%d%H') -
                              timedelta(hours=ihour)).strftime('%y%m%d%H') +
                             '.000')

        # retrieve data from micaps server
        rain = MICAPS_IO.get_model_grids(data_dir[0], filenames=filenames)
        if rain is None:
            return

    if (data_source == 'CIMISS'):
        # get filename
        if (initTime == None):
            initTime = (datetime.now() -
                        timedelta(hours=2 + 8)).strftime('%y%m%d%H')
        filenames = []
        for ihour in range(0, atime):
            filenames.append((datetime.strptime(initTime, '%y%m%d%H') -
                              timedelta(hours=ihour)).strftime('%Y%m%d%H') +
                             '0000')
        try:
            # retrieve data from CIMISS server
            rain = CIMISS_IO.cimiss_analysis_by_times(
                times_str=filenames,
                fcst_ele='PRE',
                data_code=utl.CMISS_data_code(data_source='CLDAS',
                                              var_name='PRE'),
            )
            if rain is None:
                return
            rain = rain.rename({'PRE': 'data'})
        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=cntr_pnt,
                                                    zoom_ratio=zoom_ratio,
                                                    map_ratio=map_ratio)
    rain = utl.cut_xrdata(map_extent, rain, delt_x=delt_x, delt_y=delt_y)
    rain['data'].values[rain['data'].values == 9999.] = np.nan
    cu_rain = rain.sum('time')
    cu_rain.attrs['obs_time'] = datetime.strptime(initTime, '%y%m%d%H')
    cu_rain.attrs['model'] = 'CLDAS'
    cu_rain.attrs['atime'] = atime
    cu_rain.attrs['var_name'] = '累积降水'
    # draw
    QPF_graphics.draw_obs_cu_rain(rain=cu_rain,
                                  map_extent=map_extent,
                                  regrid_shape=20,
                                  city=city,
                                  south_China_sea=south_China_sea,
                                  output_dir=output_dir)