示例#1
0
def gh_uv_div(initTime=None, fhour=6, day_back=0,model='GRAPES_GFS',
    gh_lev=500,uv_lev=850,
    map_ratio=14/9,zoom_ratio=20,cntr_pnt=[104,34],
    south_China_sea=True,area =None,city=False,output_dir=None,data_source='MICAPS',**kwargs):

    if(area != None):
        south_China_sea=False

    # micaps data directory
    if(data_source=='MICAPS'):
        try:
            data_dir = [utl.Cassandra_dir(data_type='high',data_source=model,var_name='HGT',lvl=gh_lev),
                        utl.Cassandra_dir(data_type='high',data_source=model,var_name='UGRD',lvl=uv_lev),
                        utl.Cassandra_dir(data_type='high',data_source=model,var_name='VGRD',lvl=uv_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):
            filename = utl.model_filename(initTime, fhour)
        else:
            filename=utl.filename_day_back_model(day_back=day_back,fhour=fhour)

        # retrieve data from micaps server
        gh = MICAPS_IO.get_model_grid(data_dir[0], filename=filename)
        if gh is None:
            return
        
        u = MICAPS_IO.get_model_grid(data_dir[1], filename=filename)
        if u is None:
            return
            
        v = MICAPS_IO.get_model_grid(data_dir[2], filename=filename)
        if v is None:
            return
        
        psfc = MICAPS_IO.get_model_grid(data_dir[3], filename=filename)
        
        init_time = gh.coords['forecast_reference_time'].values

    if(data_source =='CIMISS'):
        
        # get filename
        if(initTime != None):
            filename = utl.model_filename(initTime, fhour,UTC=True)
        else:
            filename=utl.filename_day_back_model(day_back=day_back,fhour=fhour,UTC=True)
        
        # retrieve data from CIMISS server 
        try:       
            gh=CMISS_IO.cimiss_model_by_time('20'+filename[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.

            u=CMISS_IO.cimiss_model_by_time('20'+filename[0:8],valid_time=fhour,
                        data_code=utl.CMISS_data_code(data_source=model,var_name='WIU'),
                        levattrs={'long_name':'pressure_level', 'units':'hPa', '_CoordinateAxisType':'-'},
                        fcst_level=uv_lev, fcst_ele="WIU", units='m/s')
            if u is None:
                return
                
            v=CMISS_IO.cimiss_model_by_time('20'+filename[0:8],valid_time=fhour,
                        data_code=utl.CMISS_data_code(data_source=model,var_name='WIV'),
                        levattrs={'long_name':'pressure_level', 'units':'hPa', '_CoordinateAxisType':'-'},
                        fcst_level=uv_lev, fcst_ele="WIV", units='m/s')
            if v 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')
    # prepare data

    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)

#+ to solve the problem of labels on all the contours
    dx,dy=mpcalc.lat_lon_grid_deltas(u['lon'].values.squeeze(),u['lat'].values.squeeze())
    div=mpcalc.divergence(u['data'].values.squeeze()*units('m/s'),
                         v['data'].values.squeeze()*units('m/s'),
                         dx, dy, dim_order='yx')
    div_xr=u.copy(deep=True)
    div_xr['data'].values=div.magnitude[np.newaxis,np.newaxis,:,:]
    div_xr['data'].values=gaussian_filter(div_xr['data'].values,1)

    gh=utl.mask_terrian(gh_lev,psfc,gh)
    u=utl.mask_terrian(uv_lev,psfc,u)
    v=utl.mask_terrian(uv_lev,psfc,v)
    div_xr=utl.mask_terrian(uv_lev,psfc,div_xr)

    gh=utl.cut_xrdata(map_extent, gh, delt_x=delt_x, delt_y=delt_y)
    u=utl.cut_xrdata(map_extent, u, delt_x=delt_x, delt_y=delt_y)
    v=utl.cut_xrdata(map_extent, v, delt_x=delt_x, delt_y=delt_y)
    div_xr=utl.cut_xrdata(map_extent, div_xr, delt_x=delt_x, delt_y=delt_y)
    gh.attrs['model']=model

    div_xr.attrs['units']='s$^{-1}$'
    uv=xr.merge([u.rename({'data': 'u'}),v.rename({'data': 'v'})])
#- to solve the problem of labels on all the contours
    dynamic_graphics.draw_gh_uv_div(
        div=div_xr, gh=gh, uv=uv,
        map_extent=map_extent, regrid_shape=20,
        city=city,south_China_sea=south_China_sea,
        output_dir=output_dir)
示例#2
0
def gh_uv_wsp(initTime=None,
              fhour=6,
              day_back=0,
              model='ECMWF',
              gh_lev=500,
              uv_lev=850,
              map_ratio=14 / 9,
              zoom_ratio=20,
              cntr_pnt=[104, 34],
              south_China_sea=True,
              area=None,
              city=False,
              output_dir=None,
              data_source='MICAPS',
              Global=False,
              **kwargs):

    if (area != None):
        south_China_sea = False

    # micaps data directory
    if (data_source == 'MICAPS'):
        try:
            data_dir = [
                utl.Cassandra_dir(data_type='high',
                                  data_source=model,
                                  var_name='HGT',
                                  lvl=gh_lev),
                utl.Cassandra_dir(data_type='high',
                                  data_source=model,
                                  var_name='UGRD',
                                  lvl=uv_lev),
                utl.Cassandra_dir(data_type='high',
                                  data_source=model,
                                  var_name='VGRD',
                                  lvl=uv_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
        print(initTime)
        if (initTime != None):
            filename = utl.model_filename(initTime, fhour)
        else:
            filename = utl.filename_day_back_model(day_back=day_back,
                                                   fhour=fhour)

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

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

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

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

    if (data_source == 'CIMISS'):

        # get filename
        if (initTime != None):
            filename = utl.model_filename(initTime, fhour, UTC=True)
        else:
            filename = utl.filename_day_back_model(day_back=day_back,
                                                   fhour=fhour,
                                                   UTC=True)
        try:
            # retrieve data from CIMISS server
            gh = CMISS_IO.cimiss_model_by_time(
                '20' + filename[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.

            u = CMISS_IO.cimiss_model_by_time(
                '20' + filename[0:8],
                valid_time=fhour,
                data_code=utl.CMISS_data_code(data_source=model,
                                              var_name='WIU'),
                levattrs={
                    'long_name': 'pressure_level',
                    'units': 'hPa',
                    '_CoordinateAxisType': '-'
                },
                fcst_level=uv_lev,
                fcst_ele="WIU",
                units='m/s')
            if u is None:
                return

            v = CMISS_IO.cimiss_model_by_time(
                '20' + filename[0:8],
                valid_time=fhour,
                data_code=utl.CMISS_data_code(data_source=model,
                                              var_name='WIV'),
                levattrs={
                    'long_name': 'pressure_level',
                    'units': 'hPa',
                    '_CoordinateAxisType': '-'
                },
                fcst_level=uv_lev,
                fcst_ele="WIV",
                units='m/s')
            if v 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')
    # prepare data
    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)

    gh = utl.mask_terrian(gh_lev, psfc, gh)
    u = utl.mask_terrian(uv_lev, psfc, u)
    v = utl.mask_terrian(uv_lev, psfc, v)
    #+ to solve the problem of labels on all the contours
    gh = utl.cut_xrdata(map_extent, gh, delt_x=delt_x, delt_y=delt_y)
    u = utl.cut_xrdata(map_extent, u, delt_x=delt_x, delt_y=delt_y)
    v = utl.cut_xrdata(map_extent, v, delt_x=delt_x, delt_y=delt_y)
    #- to solve the problem of labels on all the contours
    uv = xr.merge([u.rename({'data': 'u'}), v.rename({'data': 'v'})])

    wsp = (u['data']**2 + v['data']**2)**0.5
    gh.attrs['model'] = model
    synoptic_graphics.draw_gh_uv_wsp(wsp=wsp,
                                     gh=gh,
                                     uv=uv,
                                     map_extent=map_extent,
                                     regrid_shape=20,
                                     city=city,
                                     south_China_sea=south_China_sea,
                                     output_dir=output_dir,
                                     Global=Global)
示例#3
0
def PV_Div_uv(initTime=None,
              fhour=6,
              day_back=0,
              model='ECMWF',
              map_ratio=14 / 9,
              zoom_ratio=20,
              cntr_pnt=[104, 34],
              levels=[
                  1000, 950, 925, 900, 850, 800, 700, 600, 500, 400, 300, 250,
                  200, 100
              ],
              lvl_ana=250,
              Global=False,
              south_China_sea=True,
              area=None,
              city=False,
              output_dir=None,
              data_source='MICAPS',
              **kwargs):

    # micaps data directory
    if (area != None):
        south_China_sea = False

    # micaps data directory
    if (data_source == 'MICAPS'):
        try:
            data_dir = [
                utl.Cassandra_dir(data_type='high',
                                  data_source=model,
                                  var_name='RH',
                                  lvl=''),
                utl.Cassandra_dir(data_type='high',
                                  data_source=model,
                                  var_name='UGRD',
                                  lvl=''),
                utl.Cassandra_dir(data_type='high',
                                  data_source=model,
                                  var_name='VGRD',
                                  lvl=''),
                utl.Cassandra_dir(data_type='high',
                                  data_source=model,
                                  var_name='TMP',
                                  lvl=''),
                utl.Cassandra_dir(data_type='high',
                                  data_source=model,
                                  var_name='HGT',
                                  lvl='')
            ]
        except KeyError:
            raise ValueError('Can not find all directories needed')

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

        # retrieve data from micaps server
        rh = MICAPS_IO.get_model_3D_grid(directory=data_dir[0][0:-1],
                                         filename=filename,
                                         levels=levels,
                                         allExists=False)
        if rh is None:
            return

        u = MICAPS_IO.get_model_3D_grid(directory=data_dir[1][0:-1],
                                        filename=filename,
                                        levels=levels,
                                        allExists=False)
        if u is None:
            return

        v = MICAPS_IO.get_model_3D_grid(directory=data_dir[2][0:-1],
                                        filename=filename,
                                        levels=levels,
                                        allExists=False)
        if v is None:
            return

        t = MICAPS_IO.get_model_3D_grid(directory=data_dir[3][0:-1],
                                        filename=filename,
                                        levels=levels,
                                        allExists=False)
        if t is None:
            return

    if (data_source == 'CIMISS'):
        # get filename
        if (initTime != None):
            filename = utl.model_filename(initTime, fhour, UTC=True)
        else:
            filename = utl.filename_day_back_model(day_back=day_back,
                                                   fhour=fhour,
                                                   UTC=True)
        try:
            # retrieve data from CIMISS server
            rh = CMISS_IO.cimiss_model_3D_grid(
                data_code=utl.CMISS_data_code(data_source=model,
                                              var_name='RHU'),
                init_time_str='20' + filename[0:8],
                valid_time=fhour,
                fcst_levels=levels,
                fcst_ele="RHU",
                units='%')
            if rh is None:
                return

            u = CMISS_IO.cimiss_model_3D_grid(
                data_code=utl.CMISS_data_code(data_source=model,
                                              var_name='WIU'),
                init_time_str='20' + filename[0:8],
                valid_time=fhour,
                fcst_levels=levels,
                fcst_ele="WIU",
                units='m/s')
            if u is None:
                return

            v = CMISS_IO.cimiss_model_3D_grid(
                data_code=utl.CMISS_data_code(data_source=model,
                                              var_name='WIV'),
                init_time_str='20' + filename[0:8],
                valid_time=fhour,
                fcst_levels=levels,
                fcst_ele="WIV",
                units='m/s')
            if v is None:
                return

            t = CMISS_IO.cimiss_model_3D_grid(
                data_code=utl.CMISS_data_code(data_source=model,
                                              var_name='TEM'),
                init_time_str='20' + filename[0:8],
                valid_time=fhour,
                fcst_levels=levels,
                fcst_ele="TEM",
                units='K')
            if t is None:
                return
            t['data'].values = t['data'].values - 273.15
            t['data'].attrs['units'] = 'C'
        except KeyError:
            raise ValueError('Can not find all data needed')

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

    mask2 = (u['lon'] >
             map_extent[0] - delt_x) & (u['lon'] < map_extent[1] + delt_x) & (
                 u['lat'] > map_extent[2] - delt_y) & (u['lat'] <
                                                       map_extent[3] + delt_y)

    mask3 = (t['lon'] >
             map_extent[0] - delt_x) & (t['lon'] < map_extent[1] + delt_x) & (
                 t['lat'] > map_extent[2] - delt_y) & (t['lat'] <
                                                       map_extent[3] + delt_y)
    #- to solve the problem of labels on all the contours
    rh = rh.where(mask1, drop=True)
    u = u.where(mask2, drop=True)
    v = v.where(mask2, drop=True)
    t = t.where(mask3, drop=True)
    uv = xr.merge([u.rename({'data': 'u'}), v.rename({'data': 'v'})])

    lats = np.squeeze(rh['lat'].values)
    lons = np.squeeze(rh['lon'].values)

    pres = np.array(levels) * 100 * units('Pa')
    tmpk = mpcalc.smooth_n_point(
        (t['data'].values.squeeze() + 273.15), 9, 2) * units('kelvin')
    thta = mpcalc.potential_temperature(pres[:, None, None], tmpk)

    uwnd = mpcalc.smooth_n_point(u['data'].values.squeeze(), 9,
                                 2) * units.meter / units.second
    vwnd = mpcalc.smooth_n_point(v['data'].values.squeeze(), 9,
                                 2) * units.meter / units.second

    dx, dy = mpcalc.lat_lon_grid_deltas(lons, lats)

    # Comput the PV on all isobaric surfaces
    pv_raw = mpcalc.potential_vorticity_baroclinic(
        thta, pres[:, None, None], uwnd, vwnd, dx[None, :, :], dy[None, :, :],
        lats[None, :, None] * units('degrees'))
    div_raw = mpcalc.divergence(uwnd,
                                vwnd,
                                dx[None, :, :],
                                dy[None, :, :],
                                dim_order='yx')

    # prepare data
    idx_z1 = list(pres.m).index(((lvl_ana * units('hPa')).to(pres.units)).m)

    pv = rh.copy(deep=True)
    pv['data'].values = np.array(pv_raw).reshape(
        np.append(1,
                  np.array(pv_raw).shape))
    pv['data'].attrs['units'] = str(pv_raw.units)
    pv.attrs['model'] = model
    pv = pv.where(pv['level'] == lvl_ana, drop=True)

    div = u.copy(deep=True)
    div['data'].values = np.array(div_raw).reshape(
        np.append(1,
                  np.array(div_raw).shape))
    div['data'].attrs['units'] = str(div_raw.units)
    div = div.where(div['level'] == lvl_ana, drop=True)

    uv = uv.where(uv['level'] == lvl_ana, drop=True)

    synoptic_graphics.draw_PV_Div_uv(pv=pv,
                                     uv=uv,
                                     div=div,
                                     map_extent=map_extent,
                                     regrid_shape=20,
                                     city=city,
                                     south_China_sea=south_China_sea,
                                     output_dir=output_dir,
                                     Global=Global)
示例#4
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)
示例#5
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)
示例#6
0
def mslp_gust10m(initTime=None,
                 fhour=6,
                 day_back=0,
                 model='ECMWF',
                 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):

    # micaps data directory
    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='10M_GUST_6H')
            ]
        except KeyError:
            raise ValueError('Can not find all directories needed')

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

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

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

    if (data_source == 'CIMISS'):

        # get filename
        if (initTime != None):
            filename = utl.model_filename(initTime, fhour, UTC=True)
        else:
            filename = utl.filename_day_back_model(day_back=day_back,
                                                   fhour=fhour,
                                                   UTC=True)
        try:
            gust = CMISS_IO.cimiss_model_by_time('20' + filename[0:8],
                                                 valid_time=fhour,
                                                 data_code=utl.CMISS_data_code(
                                                     data_source=model,
                                                     var_name='GUST10T6'),
                                                 fcst_level=0,
                                                 fcst_ele="GUST10T6",
                                                 units='m/s')
            if gust is None:
                return

            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'),
                    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'),
                    fcst_level=0,
                    fcst_ele="SSP",
                    units='Pa')
            if mslp is None:
                return
            mslp['data'] = mslp['data'] / 100.
        except KeyError:
            raise ValueError('Can not find all data needed')
    # prepare data

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

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

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

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

    elements_graphics.draw_mslp_gust10m(gust=gust,
                                        mslp=mslp,
                                        map_extent=map_extent,
                                        regrid_shape=20,
                                        city=city,
                                        south_China_sea=south_China_sea,
                                        output_dir=output_dir,
                                        Global=Global)
示例#7
0
def wind_rh_according_to_4D_data(
        initTime=None,
        fhour=6,
        day_back=0,
        model='ECMWF',
        sta_fcs={
            'lon': [101.82, 101.32, 101.84, 102.23, 102.2681],
            'lat': [28.35, 27.91, 28.32, 27.82, 27.8492],
            'altitude': [3600, 3034.62, 3240, 1669, 1941.5],
            'name': ['健美乡', '项脚乡', '\n锦屏镇', '\n马道镇', 'S9005  ']
        },
        draw_zd=True,
        levels=[1000, 950, 925, 900, 850, 800, 700, 600, 500],
        map_ratio=19 / 9,
        zoom_ratio=1,
        south_China_sea=False,
        area='全国',
        city=False,
        output_dir=None,
        bkgd_type='satellite',
        data_source='MICAPS'):

    # micaps data directory
    if (area != '全国'):
        south_China_sea = False

    # prepare data
    if (area != '全国'):
        cntr_pnt, zoom_ratio = utl.get_map_area(area_name=area)

    cntr_pnt = np.append(np.mean(sta_fcs['lon']), np.mean(sta_fcs['lat']))
    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

    bkgd_level = utl.cal_background_zoom_ratio(zoom_ratio)
    # micaps data directory
    if (data_source == 'MICAPS'):
        try:
            data_dir = [
                utl.Cassandra_dir(data_type='high',
                                  data_source=model,
                                  var_name='HGT',
                                  lvl=''),
                utl.Cassandra_dir(data_type='high',
                                  data_source=model,
                                  var_name='RH',
                                  lvl=''),
                utl.Cassandra_dir(data_type='high',
                                  data_source=model,
                                  var_name='UGRD',
                                  lvl=''),
                utl.Cassandra_dir(data_type='high',
                                  data_source=model,
                                  var_name='VGRD',
                                  lvl=''),
                utl.Cassandra_dir(data_type='surface',
                                  data_source=model,
                                  var_name='u10m'),
                utl.Cassandra_dir(data_type='surface',
                                  data_source=model,
                                  var_name='v10m'),
                utl.Cassandra_dir(data_type='surface',
                                  data_source=model,
                                  var_name='Td2m'),
                utl.Cassandra_dir(data_type='surface',
                                  data_source=model,
                                  var_name='T2m')
            ]
        except KeyError:
            raise ValueError('Can not find all directories needed')

        # get filename
        if (initTime != None):
            filename = utl.model_filename(initTime, fhour)
        else:
            filename = utl.filename_day_back_model(day_back=day_back,
                                                   fhour=fhour)
            initTime = filename[0:8]

        # retrieve data from micaps server
        gh = MICAPS_IO.get_model_3D_grid(directory=data_dir[0][0:-1],
                                         filename=filename,
                                         levels=levels)
        if (gh is None):
            return
        gh['data'].values = gh['data'].values * 10

        rh = MICAPS_IO.get_model_3D_grid(directory=data_dir[1][0:-1],
                                         filename=filename,
                                         levels=levels,
                                         allExists=False)
        if rh is None:
            return

        u = MICAPS_IO.get_model_3D_grid(directory=data_dir[2][0:-1],
                                        filename=filename,
                                        levels=levels,
                                        allExists=False)
        if u is None:
            return

        v = MICAPS_IO.get_model_3D_grid(directory=data_dir[3][0:-1],
                                        filename=filename,
                                        levels=levels,
                                        allExists=False)
        if v is None:
            return

        u10m = MICAPS_IO.get_model_grid(directory=data_dir[4],
                                        filename=filename)
        if u10m is None:
            return

        v10m = MICAPS_IO.get_model_grid(directory=data_dir[5],
                                        filename=filename)
        if v10m is None:
            return

        td2m = MICAPS_IO.get_model_grid(directory=data_dir[6],
                                        filename=filename)
        if td2m is None:
            return

        t2m = MICAPS_IO.get_model_grid(directory=data_dir[7],
                                       filename=filename)
        if t2m is None:
            return

        if (draw_zd == True):
            validtime = (datetime.strptime('20' + initTime, '%Y%m%d%H') +
                         timedelta(hours=fhour)).strftime("%Y%m%d%H")
            directory_obs = utl.Cassandra_dir(data_type='surface',
                                              data_source='OBS',
                                              var_name='PLOT_ALL')
            try:
                zd_sta = MICAPS_IO.get_station_data(filename=validtime +
                                                    '0000.000',
                                                    directory=directory_obs,
                                                    dropna=True,
                                                    cache=False)
                obs_valid = True
            except:
                zd_sta = MICAPS_IO.get_station_data(directory=directory_obs,
                                                    dropna=True,
                                                    cache=False)
                obs_valid = False

            zd_lon = zd_sta['lon'].values
            zd_lat = zd_sta['lat'].values
            zd_alt = zd_sta['Alt'].values
            zd_u, zd_v = mpcalc.wind_components(
                zd_sta['Wind_speed_2m_avg'].values * units('m/s'),
                zd_sta['Wind_angle_2m_avg'].values * units.deg)

            idx_zd = np.where((zd_lon > map_extent[0])
                              & (zd_lon < map_extent[1])
                              & (zd_lat > map_extent[2])
                              & (zd_lat < map_extent[3]))

            zd_sm_lon = zd_lon[idx_zd[0]]
            zd_sm_lat = zd_lat[idx_zd[0]]
            zd_sm_alt = zd_alt[idx_zd[0]]
            zd_sm_u = zd_u[idx_zd[0]]
            zd_sm_v = zd_v[idx_zd[0]]

    if (data_source == 'CIMISS'):
        # get filename
        if (initTime != None):
            filename = utl.model_filename(initTime, fhour, UTC=True)
        else:
            filename = utl.filename_day_back_model(day_back=day_back,
                                                   fhour=fhour,
                                                   UTC=True)
        try:
            # retrieve data from CMISS server

            gh = CIMISS_IO.cimiss_model_3D_grid(
                data_code=utl.CMISS_data_code(data_source=model,
                                              var_name='GPH'),
                init_time_str='20' + filename[0:8],
                valid_time=fhour,
                levattrs={
                    'long_name': 'pressure_level',
                    'units': 'hPa',
                    '_CoordinateAxisType': '-'
                },
                fcst_levels=levels,
                fcst_ele="GPH",
                units='gpm')
            if gh is None:
                return

            rh = CIMISS_IO.cimiss_model_3D_grid(
                data_code=utl.CMISS_data_code(data_source=model,
                                              var_name='RHU'),
                init_time_str='20' + filename[0:8],
                valid_time=fhour,
                levattrs={
                    'long_name': 'pressure_level',
                    'units': 'hPa',
                    '_CoordinateAxisType': '-'
                },
                fcst_levels=levels,
                fcst_ele="RHU",
                units='%')
            if rh is None:
                return

            u = CIMISS_IO.cimiss_model_3D_grid(
                data_code=utl.CMISS_data_code(data_source=model,
                                              var_name='WIU'),
                init_time_str='20' + filename[0:8],
                valid_time=fhour,
                levattrs={
                    'long_name': 'pressure_level',
                    'units': 'hPa',
                    '_CoordinateAxisType': '-'
                },
                fcst_levels=levels,
                fcst_ele="WIU",
                units='m/s')
            if u is None:
                return

            v = CIMISS_IO.cimiss_model_3D_grid(
                data_code=utl.CMISS_data_code(data_source=model,
                                              var_name='WIV'),
                init_time_str='20' + filename[0:8],
                valid_time=fhour,
                levattrs={
                    'long_name': 'pressure_level',
                    'units': 'hPa',
                    '_CoordinateAxisType': '-'
                },
                fcst_levels=levels,
                fcst_ele="WIV",
                units='m/s')
            if v is None:
                return

            if (model == 'ECMWF'):
                td2m = CIMISS_IO.cimiss_model_by_time(
                    '20' + filename[0:8],
                    valid_time=fhour,
                    data_code=utl.CMISS_data_code(data_source=model,
                                                  var_name='DPT'),
                    levattrs={
                        'long_name': 'height_above_ground',
                        'units': 'm',
                        '_CoordinateAxisType': '-'
                    },
                    fcst_level=0,
                    fcst_ele="DPT",
                    units='K')
                if td2m is None:
                    return

                t2m = CIMISS_IO.cimiss_model_by_time(
                    '20' + filename[0:8],
                    valid_time=fhour,
                    data_code=utl.CMISS_data_code(data_source=model,
                                                  var_name='TEF2'),
                    levattrs={
                        'long_name': 'height_above_ground',
                        'units': 'm',
                        '_CoordinateAxisType': '-'
                    },
                    fcst_level=0,
                    fcst_ele="TEF2",
                    units='K')
                if t2m is None:
                    return

                v10m = CIMISS_IO.cimiss_model_by_time(
                    '20' + filename[0:8],
                    valid_time=fhour,
                    data_code=utl.CMISS_data_code(data_source=model,
                                                  var_name='WIV10'),
                    levattrs={
                        'long_name': 'height_above_ground',
                        'units': 'm',
                        '_CoordinateAxisType': '-'
                    },
                    fcst_level=0,
                    fcst_ele="WIV10",
                    units='m/s')
                if v10m is None:
                    return

                u10m = CIMISS_IO.cimiss_model_by_time(
                    '20' + filename[0:8],
                    valid_time=fhour,
                    data_code=utl.CMISS_data_code(data_source=model,
                                                  var_name='WIU10'),
                    levattrs={
                        'long_name': 'height_above_ground',
                        'units': 'm',
                        '_CoordinateAxisType': '-'
                    },
                    fcst_level=0,
                    fcst_ele="WIU10",
                    units='m/s')
                if u10m is None:
                    return

            if (model == 'GRAPES_GFS'):
                rh2m = CIMISS_IO.cimiss_model_by_time(
                    '20' + filename[0:8],
                    valid_time=fhour,
                    data_code=utl.CMISS_data_code(data_source=model,
                                                  var_name='RHF2'),
                    levattrs={
                        'long_name': 'height_above_ground',
                        'units': 'm',
                        '_CoordinateAxisType': '-'
                    },
                    fcst_level=2,
                    fcst_ele="RHF2",
                    units='%')
                if rh2m is None:
                    return

                v10m = CIMISS_IO.cimiss_model_by_time(
                    '20' + filename[0:8],
                    valid_time=fhour,
                    data_code=utl.CMISS_data_code(data_source=model,
                                                  var_name='WIV10'),
                    levattrs={
                        'long_name': 'height_above_ground',
                        'units': 'm',
                        '_CoordinateAxisType': '-'
                    },
                    fcst_level=10,
                    fcst_ele="WIV10",
                    units='m/s')
                if v10m is None:
                    return

                u10m = CIMISS_IO.cimiss_model_by_time(
                    '20' + filename[0:8],
                    valid_time=fhour,
                    data_code=utl.CMISS_data_code(data_source=model,
                                                  var_name='WIU10'),
                    levattrs={
                        'long_name': 'height_above_ground',
                        'units': 'm',
                        '_CoordinateAxisType': '-'
                    },
                    fcst_level=10,
                    fcst_ele="WIU10",
                    units='m/s')
                if u10m is None:
                    return
        except KeyError:
            raise ValueError('Can not find all data needed')

        if (draw_zd == True):
            if (initTime == None):
                initTime1 = CIMISS_IO.cimiss_get_obs_latest_time(
                    data_code="SURF_CHN_MUL_HOR")
                initTime = (datetime.strptime('20' + initTime1, '%Y%m%d%H') -
                            timedelta(days=day_back)).strftime("%Y%m%d%H")[2:]

            validtime = (datetime.strptime('20' + initTime, '%Y%m%d%H') +
                         timedelta(hours=fhour)).strftime("%Y%m%d%H")
            data_code = utl.CMISS_data_code(data_source='OBS',
                                            var_name='PLOT_sfc')
            zd_sta = CIMISS_IO.cimiss_obs_by_time(
                times=validtime + '0000',
                data_code=data_code,
                sta_levels="011,012,013,014",
                elements=
                "Station_Id_C,Station_Id_d,lat,lon,Alti,TEM,WIN_D_Avg_2mi,WIN_S_Avg_2mi,RHU"
            )
            obs_valid = True
            if (zd_sta is None):
                CIMISS_IO.cimiss_get_obs_latest_time(data_code=data_code,
                                                     latestTime=6)
                zd_sta = CIMISS_IO.cimiss_obs_by_time(directory=directory_obs,
                                                      dropna=True,
                                                      cache=False)
                obs_valid = False

            zd_lon = zd_sta['lon'].values
            zd_lat = zd_sta['lat'].values
            zd_alt = zd_sta['Alti'].values
            zd_u, zd_v = mpcalc.wind_components(
                zd_sta['WIN_S_Avg_2mi'].values * units('m/s'),
                zd_sta['WIN_D_Avg_2mi'].values * units.deg)

            idx_zd = np.where((zd_lon > map_extent[0])
                              & (zd_lon < map_extent[1])
                              & (zd_lat > map_extent[2])
                              & (zd_lat < map_extent[3])
                              & (zd_sta['WIN_S_Avg_2mi'].values < 1000))

            zd_sm_lon = zd_lon[idx_zd[0]]
            zd_sm_lat = zd_lat[idx_zd[0]]
            zd_sm_alt = zd_alt[idx_zd[0]]
            zd_sm_u = zd_u[idx_zd[0]]
            zd_sm_v = zd_v[idx_zd[0]]

#maskout area
    delt_xy = rh['lon'].values[1] - rh['lon'].values[0]
    #+ to solve the problem of labels on all the contours
    mask1 = (rh['lon'] > map_extent[0] - delt_xy) & (
        rh['lon'] < map_extent[1] + delt_xy) & (
            rh['lat'] > map_extent[2] - delt_xy) & (rh['lat'] <
                                                    map_extent[3] + delt_xy)
    mask2 = (u10m['lon'] > map_extent[0] - delt_xy) & (
        u10m['lon'] < map_extent[1] + delt_xy) & (
            u10m['lat'] > map_extent[2] - delt_xy) & (u10m['lat'] <
                                                      map_extent[3] + delt_xy)
    #- to solve the problem of labels on all the contours
    rh = rh.where(mask1, drop=True)
    u = u.where(mask1, drop=True)
    v = v.where(mask1, drop=True)
    gh = gh.where(mask1, drop=True)
    u10m = u10m.where(mask2, drop=True)
    v10m = v10m.where(mask2, drop=True)
    #prepare interpolator
    Ex1 = np.squeeze(u['data'].values).flatten()
    Ey1 = np.squeeze(v['data'].values).flatten()
    Ez1 = np.squeeze(rh['data'].values).flatten()
    z = (np.squeeze(gh['data'].values)).flatten()

    coords = np.zeros((np.size(levels), u['lat'].size, u['lon'].size, 3))
    coords[..., 1] = u['lat'].values.reshape((1, u['lat'].size, 1))
    coords[..., 2] = u['lon'].values.reshape((1, 1, u['lon'].size))
    coords = coords.reshape((Ex1.size, 3))
    coords[:, 0] = z

    interpolator_U = LinearNDInterpolator(coords, Ex1, rescale=True)
    interpolator_V = LinearNDInterpolator(coords, Ey1, rescale=True)
    interpolator_RH = LinearNDInterpolator(coords, Ez1, rescale=True)

    #process sta_fcs 10m wind
    coords2 = np.zeros((np.size(sta_fcs['lon']), 3))
    coords2[:, 0] = sta_fcs['altitude']
    coords2[:, 1] = sta_fcs['lat']
    coords2[:, 2] = sta_fcs['lon']
    u_sta = interpolator_U(coords2)
    v_sta = interpolator_V(coords2)
    RH_sta = interpolator_RH(coords2)
    wsp_sta = (u_sta**2 + v_sta**2)**0.5
    u10m_2D = u10m.interp(lon=('points', sta_fcs['lon']),
                          lat=('points', sta_fcs['lat']))
    v10m_2D = v10m.interp(lon=('points', sta_fcs['lon']),
                          lat=('points', sta_fcs['lat']))
    if (model == 'GRAPES_GFS' and data_source == 'CIMISS'):
        rh2m_2D = rh2m.interp(lon=('points', sta_fcs['lon']),
                              lat=('points', sta_fcs['lat']))['data'].values
    else:
        td2m_2D = td2m.interp(lon=('points', sta_fcs['lon']),
                              lat=('points', sta_fcs['lat']))
        t2m_2D = t2m.interp(lon=('points', sta_fcs['lon']),
                            lat=('points', sta_fcs['lat']))
        if (data_source == 'MICAPS'):
            rh2m_2D = mpcalc.relative_humidity_from_dewpoint(
                t2m_2D['data'].values * units('degC'),
                td2m_2D['data'].values * units('degC')) * 100
        else:
            rh2m_2D = mpcalc.relative_humidity_from_dewpoint(
                t2m_2D['data'].values * units('kelvin'),
                td2m_2D['data'].values * units('kelvin')) * 100

    wsp10m_2D = (u10m_2D['data'].values**2 + v10m_2D['data'].values**2)**0.5
    winddir10m = mpcalc.wind_direction(u10m_2D['data'].values * units('m/s'),
                                       v10m_2D['data'].values * units('m/s'))
    if (np.isnan(wsp_sta).any()):
        if (wsp_sta.size == 1):
            wsp_sta[np.isnan(wsp_sta)] = np.squeeze(
                wsp10m_2D[np.isnan(wsp_sta)])
            RH_sta[np.isnan(RH_sta)] = np.squeeze(
                np.array(rh2m_2D)[np.isnan(RH_sta)])
        else:
            wsp_sta[np.isnan(wsp_sta)] = np.squeeze(wsp10m_2D)[np.isnan(
                wsp_sta)]
            RH_sta[np.isnan(RH_sta)] = np.squeeze(
                np.array(rh2m_2D))[np.isnan(RH_sta)]
    u_sta, v_sta = mpcalc.wind_components(wsp_sta * units('m/s'), winddir10m)

    #process zd_sta 10m wind
    zd_fcst_obs = None
    if (draw_zd is True):
        coords3 = np.zeros((np.size(zd_sm_alt), 3))
        coords3[:, 0] = zd_sm_alt
        coords3[:, 1] = zd_sm_lat
        coords3[:, 2] = zd_sm_lon
        u_sm_sta = interpolator_U(coords3)
        v_sm_sta = interpolator_V(coords3)
        wsp_sm_sta = (u_sm_sta**2 + v_sm_sta**2)**0.5
        u10m_sm = u10m.interp(lon=('points', zd_sm_lon),
                              lat=('points', zd_sm_lat))
        v10m_sm = v10m.interp(lon=('points', zd_sm_lon),
                              lat=('points', zd_sm_lat))
        wsp10m_sta = np.squeeze(
            (u10m_sm['data'].values**2 + v10m_sm['data'].values**2)**0.5)
        winddir10m_sm = mpcalc.wind_direction(
            u10m_sm['data'].values * units('m/s'),
            v10m_sm['data'].values * units('m/s'))
        if (np.isnan(wsp_sm_sta).any()):
            wsp_sm_sta[np.isnan(wsp_sm_sta)] = wsp10m_sta[np.isnan(wsp_sm_sta)]
        u_sm_sta, v_sm_sta = mpcalc.wind_components(wsp_sm_sta * units('m/s'),
                                                    winddir10m_sm)

        zd_fcst_obs = {
            'lon': zd_sm_lon,
            'lat': zd_sm_lat,
            'altitude': zd_sm_alt,
            'U': np.squeeze(np.array(u_sm_sta)),
            'V': np.squeeze(np.array(v_sm_sta)),
            'obs_valid': obs_valid,
            'U_obs': np.squeeze(np.array(zd_sm_u)),
            'V_obs': np.squeeze(np.array(zd_sm_v))
        }
#prepare for graphics
    sta_fcs_fcst = {
        'lon': sta_fcs['lon'],
        'lat': sta_fcs['lat'],
        'altitude': sta_fcs['altitude'],
        'name': sta_fcs['name'],
        'RH': np.array(RH_sta),
        'U': np.squeeze(np.array(u_sta)),
        'V': np.squeeze(np.array(v_sta))
    }

    fcst_info = gh.coords

    local_scale_graphics.draw_wind_rh_according_to_4D_data(
        sta_fcs_fcst=sta_fcs_fcst,
        zd_fcst_obs=zd_fcst_obs,
        fcst_info=fcst_info,
        map_extent=map_extent,
        draw_zd=draw_zd,
        bkgd_type=bkgd_type,
        bkgd_level=bkgd_level,
        output_dir=None)
示例#8
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)
示例#9
0
def gh_uv_VVEL(initTime=None,
               fhour=6,
               day_back=0,
               model='ECMWF',
               gh_lev=500,
               uvw_lev=850,
               map_ratio=19 / 9,
               zoom_ratio=20,
               cntr_pnt=[102, 34],
               south_China_sea=True,
               area='全国',
               city=False,
               output_dir=None,
               data_source='MICAPS',
               Global=False):

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

    # micaps data directory
    if (data_source == 'MICAPS'):
        try:
            data_dir = [
                utl.Cassandra_dir(data_type='high',
                                  data_source=model,
                                  var_name='HGT',
                                  lvl=gh_lev),
                utl.Cassandra_dir(data_type='high',
                                  data_source=model,
                                  var_name='UGRD',
                                  lvl=uvw_lev),
                utl.Cassandra_dir(data_type='high',
                                  data_source=model,
                                  var_name='VGRD',
                                  lvl=uvw_lev),
                utl.Cassandra_dir(data_type='high',
                                  data_source=model,
                                  var_name='VVEL',
                                  lvl=uvw_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):
            filename = utl.model_filename(initTime, fhour)
        else:
            filename = utl.filename_day_back_model(day_back=day_back,
                                                   fhour=fhour)

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

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

        v = MICAPS_IO.get_model_grid(data_dir[2], filename=filename)
        if v is None:
            return
        w = MICAPS_IO.get_model_grid(data_dir[3], filename=filename)

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

        if (model == 'GRAPES_GFS'):
            data_dir2 = utl.Cassandra_dir(data_type='high',
                                          data_source=model,
                                          var_name='SPFH',
                                          lvl=uvw_lev)
            data_dir3 = utl.Cassandra_dir(data_type='high',
                                          data_source=model,
                                          var_name='TMP',
                                          lvl=uvw_lev)
            SPFH = MICAPS_IO.get_model_grid(data_dir2, filename=filename)
            TMP = MICAPS_IO.get_model_grid(data_dir3, filename=filename)
            temp = mpcalc.vertical_velocity_pressure(
                (w['data'].values / 100) * units('m/s'),
                (np.zeros_like(w['data'].values) + uvw_lev) * units.hPa,
                TMP['data'].values * units.degC,
                mixing=SPFH['data'].values * units['g/kg']).magnitude * 100.
            w['data'].values = temp
        init_time = gh.coords['forecast_reference_time'].values

    if (data_source == 'CIMISS'):

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

        # retrieve data from CMISS server
        try:
            gh = CMISS_IO.cimiss_model_by_time(
                '20' + filename[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.

            u = CMISS_IO.cimiss_model_by_time(
                '20' + filename[0:8],
                valid_time=fhour,
                data_code=utl.CMISS_data_code(data_source=model,
                                              var_name='WIU'),
                levattrs={
                    'long_name': 'pressure_level',
                    'units': 'hPa',
                    '_CoordinateAxisType': '-'
                },
                fcst_level=uvw_lev,
                fcst_ele="WIU",
                units='m/s')
            if u is None:
                return

            v = CMISS_IO.cimiss_model_by_time(
                '20' + filename[0:8],
                valid_time=fhour,
                data_code=utl.CMISS_data_code(data_source=model,
                                              var_name='WIV'),
                levattrs={
                    'long_name': 'pressure_level',
                    'units': 'hPa',
                    '_CoordinateAxisType': '-'
                },
                fcst_level=uvw_lev,
                fcst_ele="WIV",
                units='m/s')
            if v is None:
                return

            w = CMISS_IO.cimiss_model_by_time(
                '20' + filename[0:8],
                valid_time=fhour,
                data_code=utl.CMISS_data_code(data_source=model,
                                              var_name='VVP'),
                levattrs={
                    'long_name': 'pressure_level',
                    'units': 'hPa',
                    '_CoordinateAxisType': '-'
                },
                fcst_level=uvw_lev,
                fcst_ele="VVP",
                units='Pa.s-1')
            if w is None:
                return
            w['data'].values = w['data'].values * 100

            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')
    # prepare data

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

    w['data'].values = gaussian_filter(w['data'].values, 5)

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

    gh = utl.mask_terrian(gh_lev, psfc, gh)
    u = utl.mask_terrian(uvw_lev, psfc, u)
    v = utl.mask_terrian(uvw_lev, psfc, v)
    w = utl.mask_terrian(uvw_lev, psfc, w)

    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)
    u = utl.cut_xrdata(map_extent, u, delt_x=delt_x, delt_y=delt_y)
    v = utl.cut_xrdata(map_extent, v, delt_x=delt_x, delt_y=delt_y)
    VVEL = utl.cut_xrdata(map_extent, w, delt_x=delt_x, delt_y=delt_y)

    gh.attrs['model'] = model

    VVEL.attrs['units'] = '0.01Pa.s-1'
    uv = xr.merge([u.rename({'data': 'u'}), v.rename({'data': 'v'})])
    #- to solve the problem of labels on all the contours
    dynamic_graphics.draw_gh_uv_VVEL(VVEL=VVEL,
                                     gh=gh,
                                     uv=uv,
                                     map_extent=map_extent,
                                     regrid_shape=20,
                                     city=city,
                                     south_China_sea=south_China_sea,
                                     output_dir=output_dir,
                                     Global=Global)
示例#10
0
def Time_Crossection_rh_uv_Temp(initTime=None,model='ECMWF',points={'lon':[116.3833], 'lat':[39.9]},
    levels=[1000, 950, 925, 900, 850, 800, 700,600,500,400,300,200],data_source='MICAPS',
    t_gap=3,t_range=[0,48],lw_ratio=[16,9],output_dir=None,**kwargs):
  
    fhours = np.arange(t_range[0], t_range[1], t_gap)

    # 读数据
    if(data_source == 'MICAPS'):
        try:
            data_dir = [utl.Cassandra_dir(data_type='high',data_source=model,var_name='TMP',lvl=''),
                        utl.Cassandra_dir(data_type='high',data_source=model,var_name='UGRD',lvl=''),
                        utl.Cassandra_dir(data_type='high',data_source=model,var_name='VGRD',lvl=''),
                        utl.Cassandra_dir(data_type='high',data_source=model,var_name='RH',lvl=''),
                        utl.Cassandra_dir(data_type='surface',data_source=model,var_name='PSFC')]
        except KeyError:
            raise ValueError('Can not find all directories needed')
        
        if(initTime==None):
            initTime = get_latest_initTime(data_dir[0][0:-1]+"850")
        filenames = [initTime+'.'+str(fhour).zfill(3) for fhour in fhours]
        TMP_4D=get_model_3D_grids(directory=data_dir[0][0:-1],filenames=filenames,levels=levels, allExists=False)
        u_4D=get_model_3D_grids(directory=data_dir[1][0:-1],filenames=filenames,levels=levels, allExists=False)
        v_4D=get_model_3D_grids(directory=data_dir[2][0:-1],filenames=filenames,levels=levels, allExists=False)
        rh_4D=get_model_3D_grids(directory=data_dir[3][0:-1],filenames=filenames,levels=levels, allExists=False)
        Psfc_3D=get_model_grids(directory=data_dir[4][0:-1],filenames=filenames,allExists=False)

    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:
            rh_4D=CMISS_IO.cimiss_model_3D_grids(init_time_str='20'+filename[0:8],valid_times=fhours,
                        data_code=utl.CMISS_data_code(data_source=model,var_name='RHU'),
                        fcst_levels=levels, fcst_ele="RHU", units='%',pbar=True)

            u_4D=CMISS_IO.cimiss_model_3D_grids(init_time_str='20'+filename[0:8],valid_times=fhours,
                        data_code=utl.CMISS_data_code(data_source=model,var_name='WIU'),
                        fcst_levels=levels, fcst_ele="WIU", units='m/s',pbar=True)
                
            v_4D=CMISS_IO.cimiss_model_3D_grids(init_time_str='20'+filename[0:8],valid_times=fhours,
                        data_code=utl.CMISS_data_code(data_source=model,var_name='WIV'),
                        fcst_levels=levels, fcst_ele="WIV", units='m/s',pbar=True)

            TMP_4D=CMISS_IO.cimiss_model_3D_grids(init_time_str='20'+filename[0:8],valid_times=fhours,
                        data_code=utl.CMISS_data_code(data_source=model,var_name='TEM'),
                        fcst_levels=levels, fcst_ele="TEM", units='K',pbar=True)
            TMP_4D['data'].values=TMP_4D['data'].values-273.15

            Psfc_3D=CMISS_IO.cimiss_model_grids(init_time_str='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',pbar=True)

        except KeyError:
            raise ValueError('Can not find all data needed')

    TMP_2D=TMP_4D.interp(lon=('points', points['lon']), lat=('points', points['lat']))
    u_2D=u_4D.interp(lon=('points', points['lon']), lat=('points', points['lat']))
    v_2D=v_4D.interp(lon=('points', points['lon']), lat=('points', points['lat']))
    rh_2D=rh_4D.interp(lon=('points', points['lon']), lat=('points', points['lat']))
    rh_2D.attrs['model']=model
    rh_2D.attrs['points']=points
    Psfc_1D=Psfc_3D.interp(lon=('points', points['lon']), lat=('points', points['lat']))
    v_2D2,pressure_2D = xr.broadcast(v_2D['data'],v_2D['level'])
    v_2D2,Psfc_2D = xr.broadcast(v_2D['data'],Psfc_1D['data'])
    terrain_2D=pressure_2D-Psfc_2D

    crossection_graphics.draw_Time_Crossection_rh_uv_Temp(
                    rh_2D=rh_2D, u_2D=u_2D, v_2D=v_2D,TMP_2D=TMP_2D,terrain_2D=terrain_2D,
                    t_range=t_range,model=model,lw_ratio=lw_ratio,output_dir=output_dir)                    
示例#11
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)
示例#12
0
def Crosssection_Wind_Temp_RH(
    initTime=None, fhour=24,
    levels=[1000, 950, 925, 900, 850, 800, 700,600,500,400,300,200],
    day_back=0,model='ECMWF',data_source='MICAPS',
    output_dir=None,
    st_point = [43.5, 111.5],
    ed_point = [33, 125.0],
    map_extent=[70,140,15,55],
    lw_ratio=[16,9],
    h_pos=[0.125, 0.665, 0.25, 0.2],**kwargs ):

    if(data_source == 'MICAPS'):
        try:
            data_dir = [utl.Cassandra_dir(data_type='high',data_source=model,var_name='RH',lvl=''),
                        utl.Cassandra_dir(data_type='high',data_source=model,var_name='UGRD',lvl=''),
                        utl.Cassandra_dir(data_type='high',data_source=model,var_name='VGRD',lvl=''),
                        utl.Cassandra_dir(data_type='high',data_source=model,var_name='TMP',lvl=''),
                        utl.Cassandra_dir(data_type='high',data_source=model,var_name='HGT',lvl='500'),
                        utl.Cassandra_dir(data_type='surface',data_source=model,var_name='PSFC')]
        except KeyError:
            raise ValueError('Can not find all directories needed')

        if(initTime != None):
            filename = utl.model_filename(initTime, fhour)
        else:
            filename=utl.filename_day_back_model(day_back=day_back,fhour=fhour)
            
        rh=get_model_3D_grid(directory=data_dir[0][0:-1],filename=filename,levels=levels, allExists=False)
        u=get_model_3D_grid(directory=data_dir[1][0:-1],filename=filename,levels=levels, allExists=False)
        v=get_model_3D_grid(directory=data_dir[2][0:-1],filename=filename,levels=levels, allExists=False)
        t=get_model_3D_grid(directory=data_dir[3][0:-1],filename=filename,levels=levels, allExists=False)
        gh=get_model_grid(data_dir[4], filename=filename)
        psfc=get_model_grid(data_dir[5], filename=filename)

    if(data_source == 'CIMISS'):
        if(initTime != None):
            filename = utl.model_filename(initTime, fhour,UTC=True)
        else:
            filename=utl.filename_day_back_model(day_back=day_back,fhour=fhour,UTC=True)
            
        try:
            rh=CMISS_IO.cimiss_model_3D_grid(init_time_str='20'+filename[0:8],valid_time=fhour,
                        data_code=utl.CMISS_data_code(data_source=model,var_name='RHU'),
                        fcst_levels=levels, fcst_ele="RHU", units='%')

            u=CMISS_IO.cimiss_model_3D_grid(init_time_str='20'+filename[0:8],valid_time=fhour,
                        data_code=utl.CMISS_data_code(data_source=model,var_name='WIU'),
                        fcst_levels=levels, fcst_ele="WIU", units='m/s')
                
            v=CMISS_IO.cimiss_model_3D_grid(init_time_str='20'+filename[0:8],valid_time=fhour,
                        data_code=utl.CMISS_data_code(data_source=model,var_name='WIV'),
                        fcst_levels=levels, fcst_ele="WIV", units='m/s')

            t=CMISS_IO.cimiss_model_3D_grid(init_time_str='20'+filename[0:8],valid_time=fhour,
                        data_code=utl.CMISS_data_code(data_source=model,var_name='TEM'),
                        fcst_levels=levels, fcst_ele="TEM", units='K')
            t['data'].values=t['data'].values-273.15

            gh=CMISS_IO.cimiss_model_by_time('20'+filename[0:8],valid_time=fhour,
                        data_code=utl.CMISS_data_code(data_source=model,var_name='GPH'),
                        fcst_level=500, fcst_ele="GPH", units='gpm')
            gh['data'].values=gh['data'].values/10.

            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') 

    rh = rh.metpy.parse_cf().squeeze()
    u = u.metpy.parse_cf().squeeze()
    v = v.metpy.parse_cf().squeeze()
    t = t.metpy.parse_cf().squeeze()
    psfc=psfc.metpy.parse_cf().squeeze()

    #if(psfc['lon'].values[0] != t['lon'].values[0]):
    mask1 = (
            (psfc['lon']>=t['lon'].values.min())&
            (psfc['lon']<=t['lon'].values.max())&
            (psfc['lat']>=t['lat'].values.min())&
            (psfc['lat']<=t['lat'].values.max())
            )

    t2,psfc_bdcst=xr.broadcast(t['data'],psfc['data'].where(mask1, drop=True))
    mask2=(psfc_bdcst > -10000)
    psfc_bdcst=psfc_bdcst.where(mask2, drop=True)
    #else:
    #    psfc_bdcst=psfc['data'].copy

    resolution=u['lon'][1]-u['lon'][0]
    x,y=np.meshgrid(u['lon'], u['lat'])

    dx,dy=mpcalc.lat_lon_grid_deltas(u['lon'],u['lat'])

    cross = cross_section(rh, st_point, ed_point)
    cross_rh=cross.set_coords(('lat', 'lon'))
    cross = cross_section(u, st_point, ed_point)
    cross_u=cross.set_coords(('lat', 'lon'))
    cross = cross_section(v, st_point, ed_point)
    cross_v=cross.set_coords(('lat', 'lon'))
    
    cross_psfc = cross_section(psfc_bdcst, st_point, ed_point)

    cross_u['data'].attrs['units']=units.meter/units.second
    cross_v['data'].attrs['units']=units.meter/units.second
    cross_u['t_wind'], cross_v['n_wind'] = mpcalc.cross_section_components(cross_u['data'],cross_v['data'])
    
    cross = cross_section(t, st_point, ed_point)
    cross_Temp=cross.set_coords(('lat', 'lon'))

    cross_Td = mpcalc.dewpoint_rh(cross_Temp['data'].values*units.celsius,
                cross_rh['data'].values* units.percent)

    rh,pressure = xr.broadcast(cross_rh['data'],cross_Temp['level'])
    cross_terrain=pressure-cross_psfc

    crossection_graphics.draw_Crosssection_Wind_Temp_RH(
                    cross_rh=cross_rh, cross_Temp=cross_Temp, cross_u=cross_u,
                    cross_v=cross_v,cross_terrain=cross_terrain,gh=gh,
                    h_pos=h_pos,st_point=st_point,ed_point=ed_point,lw_ratio=lw_ratio,
                    levels=levels,map_extent=map_extent,model=model,
                    output_dir=output_dir)
示例#13
0
def Crosssection_Wind_Theta_e_Qv(
    initTime=None, fhour=24,
    levels=[1000, 950, 925, 900, 850, 800, 700,600,500,400,300,200],
    day_back=0,model='GRAPES_GFS',data_source='MICAPS',
    lw_ratio=[16,9],
    output_dir=None,
    st_point = [20, 120.0],
    ed_point = [50, 130.0],
    map_extent=[70,140,15,55],
    h_pos=[0.125, 0.665, 0.25, 0.2],**kwargs ):

    if(data_source == 'MICAPS'):
        try:
            data_dir = [utl.Cassandra_dir(data_type='high',data_source=model,var_name='RH',lvl=''),
                        utl.Cassandra_dir(data_type='high',data_source=model,var_name='UGRD',lvl=''),
                        utl.Cassandra_dir(data_type='high',data_source=model,var_name='VGRD',lvl=''),
                        utl.Cassandra_dir(data_type='high',data_source=model,var_name='TMP',lvl=''),
                        utl.Cassandra_dir(data_type='high',data_source=model,var_name='HGT',lvl='500'),
                        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)
        else:
            filename=utl.filename_day_back_model(day_back=day_back,fhour=fhour)
            
        # retrieve data from micaps server
        rh=get_model_3D_grid(directory=data_dir[0][0:-1],filename=filename,levels=levels, allExists=False)
        u=get_model_3D_grid(directory=data_dir[1][0:-1],filename=filename,levels=levels, allExists=False)
        v=get_model_3D_grid(directory=data_dir[2][0:-1],filename=filename,levels=levels, allExists=False)
        v2=get_model_3D_grid(directory=data_dir[2][0:-1],filename=filename,levels=levels, allExists=False)
        t=get_model_3D_grid(directory=data_dir[3][0:-1],filename=filename,levels=levels, allExists=False)
        gh=get_model_grid(data_dir[4], filename=filename)
        psfc=get_model_grid(data_dir[5], filename=filename)
    if(data_source == 'CIMISS'):
        # get filename
        if(initTime != None):
            filename = utl.model_filename(initTime, fhour,UTC=True)
        else:
            filename=utl.filename_day_back_model(day_back=day_back,fhour=fhour,UTC=True)
        try:
            rh=CMISS_IO.cimiss_model_3D_grid(init_time_str='20'+filename[0:8],valid_time=fhour,
                        data_code=utl.CMISS_data_code(data_source=model,var_name='RHU'),
                        fcst_levels=levels, fcst_ele="RHU", units='%')

            u=CMISS_IO.cimiss_model_3D_grid(init_time_str='20'+filename[0:8],valid_time=fhour,
                        data_code=utl.CMISS_data_code(data_source=model,var_name='WIU'),
                        fcst_levels=levels, fcst_ele="WIU", units='m/s')
                
            v=CMISS_IO.cimiss_model_3D_grid(init_time_str='20'+filename[0:8],valid_time=fhour,
                        data_code=utl.CMISS_data_code(data_source=model,var_name='WIV'),
                        fcst_levels=levels, fcst_ele="WIV", units='m/s')

            v2=CMISS_IO.cimiss_model_3D_grid(init_time_str='20'+filename[0:8],valid_time=fhour,
                        data_code=utl.CMISS_data_code(data_source=model,var_name='WIV'),
                        fcst_levels=levels, fcst_ele="WIV", units='m/s')

            t=CMISS_IO.cimiss_model_3D_grid(init_time_str='20'+filename[0:8],valid_time=fhour,
                        data_code=utl.CMISS_data_code(data_source=model,var_name='TEM'),
                        fcst_levels=levels, fcst_ele="TEM", units='K')
            t['data'].values=t['data'].values-273.15

            gh=CMISS_IO.cimiss_model_by_time('20'+filename[0:8],valid_time=fhour,
                            data_code=utl.CMISS_data_code(data_source=model,var_name='GPH'),
                            fcst_level=500, fcst_ele="GPH", units='gpm')
            gh['data'].values=gh['data'].values/10.

            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')   
    rh = rh.metpy.parse_cf().squeeze()
    u = u.metpy.parse_cf().squeeze()
    v = v.metpy.parse_cf().squeeze()
    v2 = v2.metpy.parse_cf().squeeze()
    psfc=psfc.metpy.parse_cf().squeeze()
    t = t.metpy.parse_cf().squeeze()

    resolution=u['lon'][1]-u['lon'][0]
    x,y=np.meshgrid(u['lon'], u['lat'])
    # +form 3D psfc
    mask1 = (
            (psfc['lon']>=t['lon'].values.min())&
            (psfc['lon']<=t['lon'].values.max())&
            (psfc['lat']>=t['lat'].values.min())&
            (psfc['lat']<=t['lat'].values.max())
            )

    t2,psfc_bdcst=xr.broadcast(t['data'],psfc['data'].where(mask1, drop=True))
    mask2=(psfc_bdcst > -10000)
    psfc_bdcst=psfc_bdcst.where(mask2, drop=True)
    # -form 3D psfc

    dx,dy=mpcalc.lat_lon_grid_deltas(u['lon'],u['lat'])

    #rh=rh.rename(dict(lat='latitude',lon='longitude'))
    cross = cross_section(rh, st_point, ed_point)
    cross_rh=cross.set_coords(('lat', 'lon'))
    cross = cross_section(u, st_point, ed_point)
    cross_u=cross.set_coords(('lat', 'lon'))
    cross = cross_section(v, st_point, ed_point)
    cross_v=cross.set_coords(('lat', 'lon'))
    cross_psfc = cross_section(psfc_bdcst, st_point, ed_point)

    cross_u['data'].attrs['units']=units.meter/units.second
    cross_v['data'].attrs['units']=units.meter/units.second
    cross_u['t_wind'], cross_v['n_wind'] = mpcalc.cross_section_components(cross_u['data'],cross_v['data'])
    
    cross = cross_section(t, st_point, ed_point)
    cross_t=cross.set_coords(('lat', 'lon'))

    cross_Td = mpcalc.dewpoint_rh(cross_t['data'].values*units.celsius,
                cross_rh['data'].values* units.percent)

    rh,pressure = xr.broadcast(cross_rh['data'],cross_t['level'])
    pressure.attrs['units']='hPa'
    
    Qv = mpcalc.specific_humidity_from_dewpoint(cross_Td,
                pressure)

    cross_Qv = xr.DataArray(np.array(Qv)*1000.,
                    coords=cross_rh['data'].coords,
                    dims=cross_rh['data'].dims,
                    attrs={'units': units('g/kg')})

    Theta_e=mpcalc.equivalent_potential_temperature(pressure,
                                                cross_t['data'].values*units.celsius, 
                                                cross_Td)
    cross_terrain=pressure-cross_psfc

    cross_Theta_e = xr.DataArray(np.array(Theta_e),
                        coords=cross_rh['data'].coords,
                        dims=cross_rh['data'].dims,
                        attrs={'units': Theta_e.units})

    crossection_graphics.draw_Crosssection_Wind_Theta_e_Qv(
                    cross_Qv=cross_Qv, cross_Theta_e=cross_Theta_e, cross_u=cross_u,
                    cross_v=cross_v,cross_terrain=cross_terrain,gh=gh,
                    h_pos=h_pos,st_point=st_point,ed_point=ed_point,
                    levels=levels,map_extent=map_extent,lw_ratio=lw_ratio,
                    output_dir=output_dir)
示例#14
0
def fg_uv_tmp(initTime=None, fhour=6, day_back=0,model='ECMWF',
    fg_lev=500,
    map_ratio=16/9,zoom_ratio=20,cntr_pnt=[102,34],
    south_China_sea=True,area = None,city=False,output_dir=None,data_source='MICAPS',
    **kwargs):

    if(area != None):
        south_China_sea=False

    # micaps data directory
    if(data_source=='MICAPS'):
        try:
            data_dir = [utl.Cassandra_dir(data_type='high',data_source=model,var_name='HGT',lvl=fg_lev),
                        utl.Cassandra_dir(data_type='high',data_source=model,var_name='UGRD',lvl=fg_lev),
                        utl.Cassandra_dir(data_type='high',data_source=model,var_name='VGRD',lvl=fg_lev),
                        utl.Cassandra_dir(data_type='high',data_source=model,var_name='TMP',lvl=fg_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):
            filename = utl.model_filename(initTime, fhour)
        else:
            filename=utl.filename_day_back_model(day_back=day_back,fhour=fhour)

        # retrieve data from micaps server
        gh = MICAPS_IO.get_model_grid(data_dir[0], filename=filename)
        if gh is None:
            return
        
        u = MICAPS_IO.get_model_grid(data_dir[1], filename=filename)
        if u is None:
            return
            
        v = MICAPS_IO.get_model_grid(data_dir[2], filename=filename)
        if v is None:
            return
        tmp = MICAPS_IO.get_model_grid(data_dir[3], filename=filename)
        
        psfc = MICAPS_IO.get_model_grid(data_dir[4], filename=filename)
        
    if(data_source =='CIMISS'):
        
        # get filename
        if(initTime != None):
            filename = utl.model_filename(initTime, fhour,UTC=True)
        else:
            filename=utl.filename_day_back_model(day_back=day_back,fhour=fhour,UTC=True)
        
        # retrieve data from CIMISS server 
        try:       
            gh=CMISS_IO.cimiss_model_by_time('20'+filename[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=fg_lev, fcst_ele="GPH", units='gpm')
            if gh is None:
                return
            gh['data'].values=gh['data'].values/10.

            u=CMISS_IO.cimiss_model_by_time('20'+filename[0:8],valid_time=fhour,
                        data_code=utl.CMISS_data_code(data_source=model,var_name='WIU'),
                        levattrs={'long_name':'pressure_level', 'units':'hPa', '_CoordinateAxisType':'-'},
                        fcst_level=fg_lev, fcst_ele="WIU", units='m/s')
            if u is None:
                return
                
            v=CMISS_IO.cimiss_model_by_time('20'+filename[0:8],valid_time=fhour,
                        data_code=utl.CMISS_data_code(data_source=model,var_name='WIV'),
                        levattrs={'long_name':'pressure_level', 'units':'hPa', '_CoordinateAxisType':'-'},
                        fcst_level=fg_lev, fcst_ele="WIV", units='m/s')
            if v is None:
                return

            tmp=CMISS_IO.cimiss_model_by_time('20'+filename[0:8],valid_time=fhour,
                        data_code=utl.CMISS_data_code(data_source=model,var_name='TEM'),
                        levattrs={'long_name':'pressure_level', 'units':'hPa', '_CoordinateAxisType':'-'},
                        fcst_level=fg_lev, fcst_ele="TEM", units='K')
            if tmp is None:
                return
            tmp['data'].values=tmp['data'].values-273.15

            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')

    #caluculate_fg
    pressure=fg_lev*units('hPa')
    theta = mpcalc.potential_temperature(pressure, tmp['data'].values.squeeze()*units('degC'))
    dx,dy=mpcalc.lat_lon_grid_deltas(tmp['lon'].values.squeeze(),tmp['lat'].values.squeeze())
    fg=mpcalc.frontogenesis(theta,u['data'].values.squeeze()*units('mps'),v['data'].values.squeeze()*units('mps'),dx,dy,dim_order='yx')

    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)

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

    fg_xr=u.copy()
    fg_xr['data'].values=fg.magnitude[np.newaxis,np.newaxis,:,:]
    fg_xr=utl.cut_xrdata(map_extent, fg_xr, delt_x=delt_x, delt_y=delt_y)
    u=utl.cut_xrdata(map_extent, u, delt_x=delt_x, delt_y=delt_y)
    v=utl.cut_xrdata(map_extent, v, delt_x=delt_x, delt_y=delt_y)
    tmp=utl.cut_xrdata(map_extent, tmp, delt_x=delt_x, delt_y=delt_y)

    fg_xr=utl.mask_terrian(fg_lev,psfc,fg_xr)
    u=utl.mask_terrian(fg_lev,psfc,u)
    v=utl.mask_terrian(fg_lev,psfc,v)
    tmp=utl.mask_terrian(fg_lev,psfc,tmp)

    fg_xr.attrs['model']=model
    fg_xr.attrs['units']='K*s${^{-1}}$ m${^{-1}}$'
    uv=xr.merge([u.rename({'data': 'u'}),v.rename({'data': 'v'})])
#- to solve the problem of labels on all the contours
    dynamic_graphics.draw_fg_uv_tmp(
        fg=fg_xr, tmp=tmp, uv=uv,
        map_extent=map_extent, regrid_shape=20,
        city=city,south_China_sea=south_China_sea,
        output_dir=output_dir)
示例#15
0
def T2m_mslp_uv10m(initTime=None,
                   fhour=6,
                   day_back=0,
                   model='ECMWF',
                   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'):
        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='u10m'),
                utl.Cassandra_dir(data_type='surface',
                                  data_source=model,
                                  var_name='v10m'),
                utl.Cassandra_dir(data_type='surface',
                                  data_source=model,
                                  var_name='T2m')
            ]
        except KeyError:
            raise ValueError('Can not find all directories needed')

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

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

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

        v10m = MICAPS_IO.get_model_grid(data_dir[2], filename=filename)
        if v10m is None:
            return
        t2m = MICAPS_IO.get_model_grid(data_dir[3], filename=filename)
        if t2m is None:
            return

    if (data_source == 'CIMISS'):
        # get filename
        if (initTime != None):
            filename = utl.model_filename(initTime, fhour, UTC=True)
        else:
            filename = utl.filename_day_back_model(day_back=day_back,
                                                   fhour=fhour,
                                                   UTC=True)
        try:
            # retrieve data from CMISS server
            t2m = CMISS_IO.cimiss_model_by_time('20' + filename[0:8],
                                                valid_time=fhour,
                                                data_code=utl.CMISS_data_code(
                                                    data_source=model,
                                                    var_name='TEF2'),
                                                fcst_level=0,
                                                fcst_ele="TEF2",
                                                units='K')
            if t2m is None:
                return
            t2m['data'].values = t2m['data'].values - 273.15

            u10m = CMISS_IO.cimiss_model_by_time('20' + filename[0:8],
                                                 valid_time=fhour,
                                                 data_code=utl.CMISS_data_code(
                                                     data_source=model,
                                                     var_name='WIU10'),
                                                 fcst_level=0,
                                                 fcst_ele="WIU10",
                                                 units='m/s')
            if u10m is None:
                return

            v10m = CMISS_IO.cimiss_model_by_time('20' + filename[0:8],
                                                 valid_time=fhour,
                                                 data_code=utl.CMISS_data_code(
                                                     data_source=model,
                                                     var_name='WIV10'),
                                                 fcst_level=0,
                                                 fcst_ele="WIV10",
                                                 units='m/s')
            if v10m is None:
                return

            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.
        except KeyError:
            raise ValueError('Can not find all data needed')

    if (area != None):
        cntr_pnt, zoom_ratio = utl.get_map_area(area_name=area)
    if (area != '全国'):
        south_China_sea = False

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

    t2m = t2m.where(mask1, drop=True)
    t2m.attrs['model'] = model
    u10m = u10m.where(mask2, drop=True)
    v10m = v10m.where(mask2, drop=True)
    uv10m = xr.merge(
        [u10m.rename({'data': 'u10m'}),
         v10m.rename({'data': 'v10m'})])
    mslp = mslp.where(mask3, drop=True)
    mslp.attrs['model'] = model

    # draw
    elements_graphics.draw_T2m_mslp_uv10m(t2m=t2m,
                                          mslp=mslp,
                                          uv10m=uv10m,
                                          map_extent=map_extent,
                                          regrid_shape=20,
                                          city=city,
                                          south_China_sea=south_China_sea,
                                          output_dir=output_dir,
                                          Global=Global)
示例#16
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)
示例#17
0
def T2m_all_type(initTime=None,
                 fhour=24,
                 day_back=0,
                 model='中央气象台中短期指导',
                 Var_plot='Tmn_2m',
                 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'):
        try:
            data_dir = [
                utl.Cassandra_dir(data_type='surface',
                                  data_source=model,
                                  var_name=Var_plot)
            ]
        except KeyError:
            raise ValueError('Can not find all directories needed')

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

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

    if (data_source == 'CIMISS'):
        # get filename
        if (initTime != None):
            filename = utl.model_filename(initTime, fhour, UTC=True)
        else:
            filename = utl.filename_day_back_model(day_back=day_back,
                                                   fhour=fhour,
                                                   UTC=True)
        try:
            # retrieve data from CMISS server
            T_2m = CMISS_IO.cimiss_model_by_time(
                '20' + filename[0:8],
                valid_time=fhour,
                data_code=utl.CMISS_data_code(data_source=model,
                                              var_name='TEF2'),
                levattrs={
                    'long_name': 'Mean_sea_level',
                    'units': 'm',
                    '_CoordinateAxisType': '-'
                },
                fcst_level=0,
                fcst_ele="TEF2",
                units='K')
            if T_2m is None:
                return
            T_2m['data'].values = T_2m['data'].values - 273.15

        except KeyError:
            raise ValueError('Can not find all data needed')


# 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 = (T_2m['lon'] > map_extent[0] - delt_x) & (
        T_2m['lon'] < map_extent[1] + delt_x) & (
            T_2m['lat'] > map_extent[2] - delt_y) & (T_2m['lat'] <
                                                     map_extent[3] + delt_y)
    T_2m = T_2m.where(mask1, drop=True)

    titles = {
        'Tmn_2m': '过去24小时2米最低温度',
        'Tmx_2m': '过去24小时2米最高温度',
        'T2m': '2米温度'
    }
    #- to solve the problem of labels on all the contours
    T_2m.attrs['model'] = model
    T_2m.attrs['title'] = titles[Var_plot]

    elements_graphics.draw_T_2m(T_2m=T_2m,
                                map_extent=map_extent,
                                regrid_shape=20,
                                city=city,
                                south_China_sea=south_China_sea,
                                output_dir=output_dir,
                                Global=Global)
示例#18
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)
示例#19
0
def low_level_wind(initTime=None,
                   fhour=6,
                   day_back=0,
                   model='ECMWF',
                   wind_level='100m',
                   data_source='MICAPS',
                   map_ratio=19 / 9,
                   zoom_ratio=20,
                   cntr_pnt=[102, 34],
                   south_China_sea=True,
                   area='全国',
                   city=False,
                   output_dir=None,
                   Global=False):

    # micaps data directory
    if (data_source == 'MICAPS'):
        try:
            data_dir = [
                utl.Cassandra_dir(data_type='surface',
                                  data_source=model,
                                  var_name='u' + wind_level),
                utl.Cassandra_dir(data_type='surface',
                                  data_source=model,
                                  var_name='v' + wind_level)
            ]
        except KeyError:
            raise ValueError('Can not find all directories needed')

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

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

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

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

        # prepare data

        if (area != None):
            cntr_pnt, zoom_ratio = utl.get_map_area(area_name=area)
        if (area != '全国'):
            south_China_sea = False
    if (data_source == 'CIMISS'):
        # get filename
        if (initTime != None):
            filename = utl.model_filename(initTime, fhour, UTC=True)
        else:
            filename = utl.filename_day_back_model(day_back=day_back,
                                                   fhour=fhour,
                                                   UTC=True)
        try:
            # retrieve data from CMISS server
            u10m = CMISS_IO.cimiss_model_by_time(
                '20' + filename[0:8],
                valid_time=fhour,
                data_code=utl.CMISS_data_code(data_source=model,
                                              var_name='WIU' +
                                              wind_level[0:-1]),
                fcst_level=0,
                fcst_ele="WIU" + wind_level[0:-1],
                units='m*s-1')
            if u10m is None:
                return

            v10m = CMISS_IO.cimiss_model_by_time(
                '20' + filename[0:8],
                valid_time=fhour,
                data_code=utl.CMISS_data_code(data_source=model,
                                              var_name='WIV' +
                                              wind_level[0:-1]),
                fcst_level=0,
                fcst_ele="WIV" + wind_level[0:-1],
                units='m*s-1')
            if v10m is None:
                return
        except KeyError:
            raise ValueError('Can not find all data needed')

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

    u10m = u10m.where(mask1, drop=True)
    v10m = v10m.where(mask1, drop=True)
    uv = xr.merge([u10m.rename({'data': 'u'}), v10m.rename({'data': 'v'})])
    uv.attrs['model'] = model
    uv.attrs['level'] = wind_level

    elements_graphics.draw_low_level_wind(uv=uv,
                                          map_extent=map_extent,
                                          regrid_shape=20,
                                          city=city,
                                          south_China_sea=south_China_sea,
                                          output_dir=output_dir,
                                          Global=Global)
示例#20
0
def gh_uv_tadv(initTime=None, fhour=6, day_back=0,model='ECMWF',
    gh_lev=500,uv_lev=850,
    map_ratio=14/9,zoom_ratio=20,cntr_pnt=[104,34],
    south_China_sea=True,area =None,city=False,output_dir=None,data_source='MICAPS',
    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=gh_lev),
                        utl.Cassandra_dir(data_type='high',data_source=model,var_name='UGRD',lvl=uv_lev),
                        utl.Cassandra_dir(data_type='high',data_source=model,var_name='VGRD',lvl=uv_lev),
                        utl.Cassandra_dir(data_type='high',data_source=model,var_name='TMP',lvl=uv_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):
            filename = utl.model_filename(initTime, fhour)
        else:
            filename=utl.filename_day_back_model(day_back=day_back,fhour=fhour)

        # retrieve data from micaps server
        gh = MICAPS_IO.get_model_grid(data_dir[0], filename=filename)
        if gh is None:
            return
        
        u = MICAPS_IO.get_model_grid(data_dir[1], filename=filename)
        if u is None:
            return
            
        v = MICAPS_IO.get_model_grid(data_dir[2], filename=filename)
        if v is None:
            return
        tmp = MICAPS_IO.get_model_grid(data_dir[3], filename=filename)
        if tmp is None:
            return   
        psfc = MICAPS_IO.get_model_grid(data_dir[4], filename=filename)
        
    if(data_source=='CIMISS'):
        # get filename
        if(initTime != None):
            filename = utl.model_filename(initTime, fhour,UTC=True)
        else:
            filename=utl.filename_day_back_model(day_back=day_back,fhour=fhour,UTC=True)
        try:
            # retrieve data from CIMISS server        
            gh=CMISS_IO.cimiss_model_by_time('20'+filename[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.

            u=CMISS_IO.cimiss_model_by_time('20'+filename[0:8],valid_time=fhour,
                        data_code=utl.CMISS_data_code(data_source=model,var_name='WIU'),
                        levattrs={'long_name':'pressure_level', 'units':'hPa', '_CoordinateAxisType':'-'},
                        fcst_level=uv_lev, fcst_ele="WIU", units='m/s')
            if u is None:
                return
                
            v=CMISS_IO.cimiss_model_by_time('20'+filename[0:8],valid_time=fhour,
                        data_code=utl.CMISS_data_code(data_source=model,var_name='WIV'),
                        levattrs={'long_name':'pressure_level', 'units':'hPa', '_CoordinateAxisType':'-'},
                        fcst_level=uv_lev, fcst_ele="WIV", units='m/s')
            if v is None:
                return

            tmp=CMISS_IO.cimiss_model_by_time('20'+filename[0:8],valid_time=fhour,
                        data_code=utl.CMISS_data_code(data_source=model,var_name='TEM'),
                        levattrs={'long_name':'pressure_level', 'units':'hPa', '_CoordinateAxisType':'-'},
                        fcst_level=uv_lev, fcst_ele="TEM", units='K')
            if tmp is None:
                return   
            tmp['data'].values=tmp['data'].values-273.15

            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')                
# 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)

    gh=utl.cut_xrdata(map_extent, gh, delt_x=delt_x, delt_y=delt_y)
    u=utl.cut_xrdata(map_extent, u, delt_x=delt_x, delt_y=delt_y)
    v=utl.cut_xrdata(map_extent, v, delt_x=delt_x, delt_y=delt_y)
    tmp=utl.cut_xrdata(map_extent, tmp, delt_x=delt_x, delt_y=delt_y)
    tadv_xr=tmp.copy(deep=True)
    tadv=-1*mbd.advection(tmp['data'].values.squeeze(),u['data'].values.squeeze(),v['data'].values.squeeze(),tmp['lat'].values,tmp['lon'].values)
    tadv_xr['data'].values=tadv[np.newaxis,np.newaxis,:,:]
    gh=utl.mask_terrian(gh_lev,psfc,gh)
    u=utl.mask_terrian(uv_lev,psfc,u)
    tadv_xr=utl.mask_terrian(uv_lev,psfc,tadv_xr)

    gh.attrs['model']=model
    uv=xr.merge([u.rename({'data': 'u'}),v.rename({'data': 'v'})])

#draw
    thermal_graphics.draw_gh_uv_tadv(
        tadv=tadv_xr, gh=gh, uv=uv,
        map_extent=map_extent, regrid_shape=20,
        city=city,south_China_sea=south_China_sea,
        output_dir=output_dir,Global=Global)        
示例#21
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)
示例#22
0
def TMP850_extreme_uv(initTime=None, fhour=6, day_back=0,model='ECMWF',
    uv_lev=850,tmp_lev=850,
    map_ratio=13/9,zoom_ratio=20,cntr_pnt=[102,34],
    south_China_sea=True,area =None,city=False,output_dir=None,data_source='MICAPS',
    Global=False,**kwargs):

#prepare data
    if(data_source =='MICAPS'):   
        try:
            data_dir = [utl.Cassandra_dir(data_type='high',data_source=model,var_name='UGRD',lvl=uv_lev),
                        utl.Cassandra_dir(data_type='high',data_source=model,var_name='VGRD',lvl=uv_lev),
                        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):
            filename = utl.model_filename(initTime, fhour)
        else:
            filename=utl.filename_day_back_model(day_back=day_back,fhour=fhour)

        # retrieve data from micaps server
        u = MICAPS_IO.get_model_grid(data_dir[0], filename=filename)
        if u is None:
            return
            
        v = MICAPS_IO.get_model_grid(data_dir[1], filename=filename)
        if v is None:
            return
        tmp = MICAPS_IO.get_model_grid(data_dir[2], filename=filename)
        if tmp is None:
            return   

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

    if(data_source=='CIMISS'):
        # get filename
        if(initTime != None):
            filename = utl.model_filename(initTime, fhour,UTC=True)
        else:
            filename=utl.filename_day_back_model(day_back=day_back,fhour=fhour,UTC=True)
        try:
            u=CMISS_IO.cimiss_model_by_time('20'+filename[0:8],valid_time=fhour,
                        data_code=utl.CMISS_data_code(data_source=model,var_name='WIU'),
                        levattrs={'long_name':'pressure_level', 'units':'hPa', '_CoordinateAxisType':'-'},
                        fcst_level=uv_lev, fcst_ele="WIU", units='m/s')
            if u is None:
                return
                
            v=CMISS_IO.cimiss_model_by_time('20'+filename[0:8],valid_time=fhour,
                        data_code=utl.CMISS_data_code(data_source=model,var_name='WIV'),
                        levattrs={'long_name':'pressure_level', 'units':'hPa', '_CoordinateAxisType':'-'},
                        fcst_level=uv_lev, fcst_ele="WIV", units='m/s')
            if v is None:
                return

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

            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')                
# set map extent
    tmp_extr=utl.get_var_extr(tmp+273.15,Var_name='t850')

    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['data'].values=gaussian_filter(tmp['data'].values,5)
    u=utl.mask_terrian(uv_lev,psfc,u)
    v=utl.mask_terrian(uv_lev,psfc,v)
    tmp=utl.mask_terrian(tmp_lev,psfc,tmp)
    tmp_extr=utl.mask_terrian(tmp_lev,psfc,tmp_extr)
#to solve the problem of labels on all the contours
    tmp=utl.cut_xrdata(map_extent,tmp,delt_x=delt_x,delt_y=delt_y)
    u=utl.cut_xrdata(map_extent,u,delt_x=delt_x,delt_y=delt_y)
    v=utl.cut_xrdata(map_extent,v,delt_x=delt_x,delt_y=delt_y)
    tmp_extr=utl.cut_xrdata(map_extent,tmp_extr,delt_x=delt_x,delt_y=delt_y)

    tmp.attrs['model']=model
    uv=xr.merge([u.rename({'data': 'u'}),v.rename({'data': 'v'})])
#draw
    thermal_graphics.draw_gh_uv_tmp_extr(
        tmp=tmp, tmp_extr=tmp_extr, uv=uv,
        map_extent=map_extent, regrid_shape=20,
        city=city,south_China_sea=south_China_sea,
        output_dir=output_dir,Global=Global)
示例#23
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)
示例#24
0
def compare_gh_uv(anaTime=None,
                  anamodel='GRAPES_GFS',
                  fhour=24,
                  model='ECMWF',
                  data_source='MICAPS',
                  gh_lev=500,
                  uv_lev=850,
                  area=None,
                  map_ratio=14 / 9,
                  zoom_ratio=20,
                  cntr_pnt=[104, 34],
                  **products_kwargs):

    if (area != None):
        south_China_sea = False

    # micaps data directory
    if (data_source == 'MICAPS'):
        try:
            data_dir = [
                utl.Cassandra_dir(data_type='high',
                                  data_source=model,
                                  var_name='HGT',
                                  lvl=gh_lev),
                utl.Cassandra_dir(data_type='high',
                                  data_source=model,
                                  var_name='UGRD',
                                  lvl=uv_lev),
                utl.Cassandra_dir(data_type='high',
                                  data_source=model,
                                  var_name='VGRD',
                                  lvl=uv_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 (anaTime == None):
            anaTime = MICAPS_IO.get_latest_initTime(data_dir[-1])
            initTime = (datetime.strptime('20' + anaTime, '%Y%m%d%H') -
                        timedelta(hours=fhour)).strftime("%Y%m%d%H")[2:10]

        if (anaTime != None):
            filename_ana = utl.model_filename(anaTime, 0)
            initTime = (datetime.strptime('20' + anaTime, '%Y%m%d%H') -
                        timedelta(hours=fhour)).strftime("%Y%m%d%H")[2:10]
            filename_fcst = utl.model_filename(initTime, fhour)

        # retrieve data from micaps server
        gh_ana = MICAPS_IO.get_model_grid(data_dir[0], filename=filename_ana)
        u_ana = MICAPS_IO.get_model_grid(data_dir[1], filename=filename_ana)
        v_ana = MICAPS_IO.get_model_grid(data_dir[2], filename=filename_ana)
        psfc_ana = MICAPS_IO.get_model_grid(data_dir[3], filename=filename_ana)
        gh_fcst = MICAPS_IO.get_model_grid(data_dir[0], filename=filename_fcst)
        u_fcst = MICAPS_IO.get_model_grid(data_dir[1], filename=filename_fcst)
        v_fcst = MICAPS_IO.get_model_grid(data_dir[2], filename=filename_fcst)
        psfc_fcst = MICAPS_IO.get_model_grid(data_dir[3],
                                             filename=filename_fcst)

    if (data_source == 'CIMISS'):

        # get filename
        if (anaTime != None):
            anaTime = utl.model_filename(anaTime, fhour, UTC=True)[0:8]
        else:
            anaTime = utl.filename_day_back_model(fhour=fhour, UTC=True)[0:8]
        initTime = (datetime.strptime('20' + anaTime, '%Y%m%d%H') -
                    timedelta(hours=fhour)).strftime("%Y%m%d%H")[2:10]
        try:
            # retrieve data from CIMISS server
            gh_ana = CMISS_IO.cimiss_model_by_time(
                '20' + anaTime,
                valid_time=0,
                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')
            gh_ana['data'].values = gh_ana['data'].values / 10.
            gh_fcst = CMISS_IO.cimiss_model_by_time(
                '20' + initTime,
                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')
            gh_fcst['data'].values = gh_fcst['data'].values / 10.

            u_ana = CMISS_IO.cimiss_model_by_time(
                '20' + anaTime,
                valid_time=0,
                data_code=utl.CMISS_data_code(data_source=model,
                                              var_name='WIU'),
                levattrs={
                    'long_name': 'pressure_level',
                    'units': 'hPa',
                    '_CoordinateAxisType': '-'
                },
                fcst_level=uv_lev,
                fcst_ele="WIU",
                units='m/s')
            u_fcst = CMISS_IO.cimiss_model_by_time(
                '20' + initTime,
                valid_time=fhour,
                data_code=utl.CMISS_data_code(data_source=model,
                                              var_name='WIU'),
                levattrs={
                    'long_name': 'pressure_level',
                    'units': 'hPa',
                    '_CoordinateAxisType': '-'
                },
                fcst_level=uv_lev,
                fcst_ele="WIU",
                units='m/s')

            v_ana = CMISS_IO.cimiss_model_by_time(
                '20' + anaTime,
                valid_time=0,
                data_code=utl.CMISS_data_code(data_source=model,
                                              var_name='WIV'),
                levattrs={
                    'long_name': 'pressure_level',
                    'units': 'hPa',
                    '_CoordinateAxisType': '-'
                },
                fcst_level=uv_lev,
                fcst_ele="WIV",
                units='m/s')
            v_fcst = CMISS_IO.cimiss_model_by_time(
                '20' + initTime,
                valid_time=fhour,
                data_code=utl.CMISS_data_code(data_source=model,
                                              var_name='WIV'),
                levattrs={
                    'long_name': 'pressure_level',
                    'units': 'hPa',
                    '_CoordinateAxisType': '-'
                },
                fcst_level=uv_lev,
                fcst_ele="WIV",
                units='m/s')

            psfc_ana = CMISS_IO.cimiss_model_by_time(
                '20' + anaTime,
                valid_time=0,
                data_code=utl.CMISS_data_code(data_source=model,
                                              var_name='PRS'),
                levattrs={
                    'long_name': 'sea_surface_pressure',
                    'units': 'hPa',
                    '_CoordinateAxisType': '-'
                },
                fcst_level=0,
                fcst_ele="PRS",
                units='Pa')
            psfc_fcst = CMISS_IO.cimiss_model_by_time(
                '20' + initTime,
                valid_time=fhour,
                data_code=utl.CMISS_data_code(data_source=model,
                                              var_name='PRS'),
                levattrs={
                    'long_name': 'sea_surface_pressure',
                    'units': 'hPa',
                    '_CoordinateAxisType': '-'
                },
                fcst_level=0,
                fcst_ele="PRS",
                units='Pa')
            psfc_ana['data'] = psfc_ana['data'] / 100.
            psfc_fcst['data'] = psfc_fcst['data'] / 100.
        except KeyError:
            raise ValueError('Can not find all data needed')
    # prepare data
    if (all([
            gh_ana, u_ana, v_ana, psfc_ana, gh_fcst, u_fcst, v_fcst, psfc_fcst
    ]) is False):
        print('some data is not avaliable')
        return

    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

    gh_ana = utl.cut_xrdata(map_extent, gh_ana)
    u_ana = utl.cut_xrdata(map_extent, u_ana)
    v_ana = utl.cut_xrdata(map_extent, v_ana)
    psfc_ana = utl.cut_xrdata(map_extent, psfc_ana)

    gh_fcst = utl.cut_xrdata(map_extent, gh_fcst)
    u_fcst = utl.cut_xrdata(map_extent, u_fcst)
    v_fcst = utl.cut_xrdata(map_extent, v_fcst)
    psfc_fcst = utl.cut_xrdata(map_extent, psfc_fcst)

    u_ana = utl.mask_terrian(uv_lev, psfc_ana, u_ana)
    v_ana = utl.mask_terrian(uv_lev, psfc_ana, v_ana)
    gh_ana = utl.mask_terrian(gh_lev, psfc_ana, gh_ana)
    u_fcst = utl.mask_terrian(uv_lev, psfc_fcst, u_fcst)
    v_fcst = utl.mask_terrian(uv_lev, psfc_fcst, v_fcst)
    gh_fcst = utl.mask_terrian(gh_lev, psfc_fcst, gh_fcst)

    uv_ana = xr.merge(
        [u_ana.rename({'data': 'u'}),
         v_ana.rename({'data': 'v'})])
    uv_fcst = xr.merge(
        [u_fcst.rename({'data': 'u'}),
         v_fcst.rename({'data': 'v'})])

    gh_ana.attrs = {'model_name': model}
    u_ana.attrs = {'model_name': model}
    v_ana.attrs = {'model_name': model}
    gh_fcst.attrs = {'model_name': model}
    u_fcst.attrs = {'model_name': model}
    v_fcst.attrs = {'model_name': model}

    vs_ana.draw_compare_gh_uv(gh_ana=gh_ana,
                              uv_ana=uv_ana,
                              gh_fcst=gh_fcst,
                              uv_fcst=uv_fcst,
                              map_extent=map_extent,
                              **products_kwargs)
示例#25
0
def periodmean_gh_uv_pwat_ulj(initTimes=None,
                              fhours=[0],
                              day_back=0,
                              model='ECMWF',
                              gh_lev=500,
                              uv_lev=850,
                              ulj_lev=200,
                              map_ratio=14 / 9,
                              zoom_ratio=20,
                              cntr_pnt=[104, 34],
                              south_China_sea=True,
                              area=None,
                              city=False,
                              output_dir=None,
                              data_source='MICAPS',
                              Global=False,
                              **kwargs):

    if (area != None):
        south_China_sea = False

    # micaps data directory
    if (data_source == 'MICAPS'):
        try:
            data_dir = [
                utl.Cassandra_dir(data_type='high',
                                  data_source=model,
                                  var_name='HGT',
                                  lvl=gh_lev),
                utl.Cassandra_dir(data_type='high',
                                  data_source=model,
                                  var_name='UGRD',
                                  lvl=uv_lev),
                utl.Cassandra_dir(data_type='high',
                                  data_source=model,
                                  var_name='VGRD',
                                  lvl=uv_lev),
                utl.Cassandra_dir(data_type='high',
                                  data_source=model,
                                  var_name='UGRD',
                                  lvl=ulj_lev),
                utl.Cassandra_dir(data_type='high',
                                  data_source=model,
                                  var_name='VGRD',
                                  lvl=ulj_lev),
                utl.Cassandra_dir(data_type='surface',
                                  data_source=model,
                                  var_name='TCWV'),
                utl.Cassandra_dir(data_type='surface',
                                  data_source=model,
                                  var_name='PSFC')
            ]
        except KeyError:
            raise ValueError('Can not find all directories needed')

        filenames = []
        # get filename
        if (initTimes != None):
            for initTime in initTimes:
                for fhour in fhours:
                    filenames.append(utl.model_filename(initTime, fhour))
        else:
            filenames = utl.filename_day_back_model(day_back=day_back,
                                                    fhour=fhour)

        # retrieve data from micaps server
        gh = MICAPS_IO.get_model_grids(data_dir[0], filenames=filenames)
        u = MICAPS_IO.get_model_grids(data_dir[1], filenames=filenames)
        v = MICAPS_IO.get_model_grids(data_dir[2], filenames=filenames)
        u2 = MICAPS_IO.get_model_grids(data_dir[3], filenames=filenames)
        v2 = MICAPS_IO.get_model_grids(data_dir[4], filenames=filenames)
        pwat = MICAPS_IO.get_model_grids(data_dir[5], filenames=filenames)
        psfc = MICAPS_IO.get_model_grids(data_dir[6], filenames=filenames)

    if (data_source == 'CIMISS'):
        # get filename
        filenames = []
        if (initTimes != None):
            for initTime in initTimes:
                for fhour in fhours:
                    filenames.append(
                        '20' + utl.model_filename(initTime, fhour, UTC=True))
        else:
            filenames = utl.filename_day_back_model(day_back=day_back,
                                                    fhour=fhour,
                                                    UTC=True)
        try:
            # retrieve data from CIMISS server
            gh = utl.cimiss_model_ana_grids(data_code=utl.CMISS_data_code(
                data_source=model, var_name='GPH'),
                                            filenames=filenames,
                                            fcst_level=gh_lev,
                                            fcst_ele="GPH",
                                            units='gpm')
            gh['data'].values = gh['data'].values / 10.

            u = utl.cimiss_model_ana_grids(data_code=utl.CMISS_data_code(
                data_source=model, var_name='WIU'),
                                           filenames=filenames,
                                           fcst_level=uv_lev,
                                           fcst_ele="WIU",
                                           units='m/s')

            v = utl.cimiss_model_ana_grids(data_code=utl.CMISS_data_code(
                data_source=model, var_name='WIV'),
                                           filenames=filenames,
                                           fcst_level=uv_lev,
                                           fcst_ele="WIV",
                                           units='m/s')

            u2 = utl.cimiss_model_ana_grids(data_code=utl.CMISS_data_code(
                data_source=model, var_name='WIU'),
                                            filenames=filenames,
                                            fcst_level=ulj_lev,
                                            fcst_ele="WIU",
                                            units='m/s')

            v2 = utl.cimiss_model_ana_grids(data_code=utl.CMISS_data_code(
                data_source=model, var_name='WIV'),
                                            filenames=filenames,
                                            fcst_level=ulj_lev,
                                            fcst_ele="WIV",
                                            units='m/s')

            if (model == 'ECMWF'):
                pwat = utl.cimiss_model_ana_grids(
                    data_code=utl.CMISS_data_code(data_source=model,
                                                  var_name='TCWV'),
                    filenames=filenames,
                    fcst_level=0,
                    fcst_ele="TCWV",
                    units='kg m-2')
            else:
                pwat = utl.cimiss_model_ana_grids(
                    data_code=utl.CMISS_data_code(data_source=model,
                                                  var_name='TIWV'),
                    filenames=filenames,
                    fcst_level=0,
                    fcst_ele="TIWV",
                    units='kg m-2')

            psfc = utl.cimiss_model_ana_grids(data_code=utl.CMISS_data_code(
                data_source=model, var_name='PRS'),
                                              filenames=filenames,
                                              fcst_level=0,
                                              fcst_ele="PRS",
                                              units='Pa')
            psfc['data'] = psfc['data'] / 100.

        except KeyError:
            raise ValueError('Can not find all data needed')
    # prepare data

    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)

    gh = utl.cut_xrdata(map_extent, gh, delt_x=delt_x, delt_y=delt_y)
    u = utl.cut_xrdata(map_extent, u, delt_x=delt_x, delt_y=delt_y)
    v = utl.cut_xrdata(map_extent, v, delt_x=delt_x, delt_y=delt_y)
    u2 = utl.cut_xrdata(map_extent, u2, delt_x=delt_x, delt_y=delt_y)
    v2 = utl.cut_xrdata(map_extent, v2, delt_x=delt_x, delt_y=delt_y)
    pwat = utl.cut_xrdata(map_extent, pwat, delt_x=delt_x, delt_y=delt_y)

    gh = utl.mask_terrian(gh_lev, psfc, gh)
    u = utl.mask_terrian(uv_lev, psfc, u)
    v = utl.mask_terrian(uv_lev, psfc, v)
    u2 = utl.mask_terrian(ulj_lev, psfc, u2)
    v2 = utl.mask_terrian(ulj_lev, psfc, v2)

    uv = xr.merge([u.rename({'data': 'u'}), v.rename({'data': 'v'})])
    ulj = mpcalc.wind_speed(u2['data'].values * units('m/s'),
                            v2['data'].values * units('m/s'))
    ulj_xr = u2.copy(deep=True)
    ulj_xr['data'].values = ulj.magnitude

    pwat_mean = pwat.mean('time')
    gh_mean = gh.mean('time')
    ulj_mean = ulj_xr.mean('time')
    uv_mean = uv.mean('time')

    gh_mean.attrs['model'] = model
    gh_mean.attrs['st_time'] = gh['time'].values[0]
    gh_mean.attrs['ed_time'] = gh['time'].values[-1]

    synoptic_graphics.draw_gh_uv_pwat_ulj(pwat=pwat_mean,
                                          gh=gh_mean,
                                          uv=uv_mean,
                                          ulj=ulj_mean,
                                          map_extent=map_extent,
                                          regrid_shape=20,
                                          city=city,
                                          south_China_sea=south_China_sea,
                                          output_dir=output_dir)
示例#26
0
def gh_uv_spfh(initTime=None, fhour=6, day_back=0,model='ECMWF',
    gh_lev=500,uv_lev=850,spfh_lev=850,
    map_ratio=14/9,zoom_ratio=20,cntr_pnt=[104,34],
    south_China_sea=True,area =None,city=False,output_dir=None,data_source='MICAPS',
    Global=False,**kwargs):

    if(area != None):
        south_China_sea=False

    if(data_source=='MICAPS'):
        # 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='high',data_source=model,var_name='UGRD',lvl=uv_lev),
                        utl.Cassandra_dir(data_type='high',data_source=model,var_name='VGRD',lvl=uv_lev),
                        utl.Cassandra_dir(data_type='high',data_source=model,var_name='SPFH',lvl=spfh_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):
            filename = utl.model_filename(initTime, fhour)
        else:
            filename=utl.filename_day_back_model(day_back=day_back,fhour=fhour)

        # retrieve data from micaps server
        gh = MICAPS_IO.get_model_grid(data_dir[0], filename=filename)
        if gh is None:
            return
        
        u = MICAPS_IO.get_model_grid(data_dir[1], filename=filename)
        if u is None:
            return
            
        v = MICAPS_IO.get_model_grid(data_dir[2], filename=filename)
        if v is None:
            return
        spfh = MICAPS_IO.get_model_grid(data_dir[3], filename=filename)
        if spfh is None:
            return

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


    if(data_source == 'CIMISS'):

        # get filename
        if(initTime != None):
            filename = utl.model_filename(initTime, fhour,UTC=True)
        else:
            filename=utl.filename_day_back_model(day_back=day_back,fhour=fhour,UTC=True)
        try:
            # retrieve data from CIMISS server        
            gh=CMISS_IO.cimiss_model_by_time('20'+filename[0:8],valid_time=fhour,
                        data_code=utl.CMISS_data_code(data_source=model,var_name='GPH'),
                        fcst_level=gh_lev, fcst_ele="GPH", units='gpm')
            if gh is None:
                return
            gh['data'].values=gh['data'].values/10.

            u=CMISS_IO.cimiss_model_by_time('20'+filename[0:8],valid_time=fhour,
                        data_code=utl.CMISS_data_code(data_source=model,var_name='WIU'),
                        fcst_level=uv_lev, fcst_ele="WIU", units='m/s')
            if u is None:
                return
                
            v=CMISS_IO.cimiss_model_by_time('20'+filename[0:8],valid_time=fhour,
                        data_code=utl.CMISS_data_code(data_source=model,var_name='WIV'),
                        fcst_level=uv_lev, fcst_ele="WIV", units='m/s')
            if v is None:
                return

            spfh=CMISS_IO.cimiss_model_by_time('20'+filename[0:8], valid_time=fhour,
                        data_code=utl.CMISS_data_code(data_source=model,var_name='SHU'),
                        fcst_level=spfh_lev, fcst_ele="SHU", units='kg.kg-1')
            if spfh is None:
                return
            spfh['data'].values=spfh['data'].values*1000

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

    mask2 = (u['lon'] > map_extent[0]-delt_x) & (u['lon'] < map_extent[1]+delt_x) & (u['lat'] > map_extent[2]-delt_y) & (u['lat'] < map_extent[3]+delt_y)

    mask3 = (spfh['lon'] > map_extent[0]-delt_x) & (spfh['lon'] < map_extent[1]+delt_x) & (spfh['lat'] > map_extent[2]-delt_y) & (spfh['lat'] < map_extent[3]+delt_y)

    gh=utl.cut_xrdata(map_extent,gh,delt_x=delt_x,delt_y=delt_y)
    u=utl.cut_xrdata(map_extent, u, delt_x=delt_x, delt_y=delt_y)
    v=utl.cut_xrdata(map_extent, v, delt_x=delt_x, delt_y=delt_y)
    spfh=utl.cut_xrdata(map_extent, spfh, delt_x=delt_x, delt_y=delt_y)

    gh=utl.mask_terrian(gh_lev,psfc,gh)
    u=utl.mask_terrian(uv_lev,psfc,u)
    v=utl.mask_terrian(uv_lev,psfc,v)
    spfh=utl.mask_terrian(spfh_lev,psfc,spfh)
#- to solve the problem of labels on all the contours
    gh=gh.where(mask1,drop=True)
    gh.attrs['model']=model
    u=u.where(mask2,drop=True)
    v=v.where(mask2,drop=True)
    spfh=spfh.where(mask3,drop=True)

    uv=xr.merge([u.rename({'data': 'u'}),v.rename({'data': 'v'})])

    moisture_graphics.draw_gh_uv_spfh(
        spfh=spfh, gh=gh, uv=uv,
        map_extent=map_extent, regrid_shape=20,
        city=city,south_China_sea=south_China_sea,
        output_dir=output_dir,Global=Global)
示例#27
0
def gh_uv_r6(initTime=None,
             fhour=6,
             day_back=0,
             model='ECMWF',
             gh_lev=500,
             uv_lev=850,
             map_ratio=14 / 9,
             zoom_ratio=20,
             cntr_pnt=[104, 34],
             south_China_sea=True,
             area=None,
             city=False,
             output_dir=None,
             data_source='MICAPS',
             Global=False,
             **kwargs):

    if (area != None):
        south_China_sea = False

    # micaps data directory
    if (data_source == 'MICAPS'):
        try:
            data_dir = [
                utl.Cassandra_dir(data_type='high',
                                  data_source=model,
                                  var_name='HGT',
                                  lvl=gh_lev),
                utl.Cassandra_dir(data_type='high',
                                  data_source=model,
                                  var_name='UGRD',
                                  lvl=uv_lev),
                utl.Cassandra_dir(data_type='high',
                                  data_source=model,
                                  var_name='VGRD',
                                  lvl=uv_lev),
                utl.Cassandra_dir(data_type='surface',
                                  data_source=model,
                                  var_name='RAIN06'),
                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)
        else:
            filename = utl.filename_day_back_model(day_back=day_back,
                                                   fhour=fhour)

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

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

        v = MICAPS_IO.get_model_grid(data_dir[2], filename=filename)
        if v is None:
            return
        r6 = MICAPS_IO.get_model_grid(data_dir[3], filename=filename)
        if r6 is None:
            return
        psfc = MICAPS_IO.get_model_grid(data_dir[4], filename=filename)

    if (data_source == 'CIMISS'):

        # get filename
        if (initTime != None):
            filename = utl.model_filename(initTime, fhour, UTC=True)
        else:
            filename = utl.filename_day_back_model(day_back=day_back,
                                                   fhour=fhour,
                                                   UTC=True)
        try:
            # retrieve data from CIMISS server
            gh = CMISS_IO.cimiss_model_by_time(
                '20' + filename[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.

            u = CMISS_IO.cimiss_model_by_time(
                '20' + filename[0:8],
                valid_time=fhour,
                data_code=utl.CMISS_data_code(data_source=model,
                                              var_name='WIU'),
                levattrs={
                    'long_name': 'pressure_level',
                    'units': 'hPa',
                    '_CoordinateAxisType': '-'
                },
                fcst_level=uv_lev,
                fcst_ele="WIU",
                units='m/s')
            if u is None:
                return

            v = CMISS_IO.cimiss_model_by_time(
                '20' + filename[0:8],
                valid_time=fhour,
                data_code=utl.CMISS_data_code(data_source=model,
                                              var_name='WIV'),
                levattrs={
                    'long_name': 'pressure_level',
                    'units': 'hPa',
                    '_CoordinateAxisType': '-'
                },
                fcst_level=uv_lev,
                fcst_ele="WIV",
                units='m/s')
            if v is None:
                return

            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'),
                                                 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 - 6,
                                                 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

            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')

        r6 = TPE1.copy(deep=True)
        r6['data'].values = TPE1['data'].values - TPE2['data'].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

    gh = utl.cut_xrdata(map_extent, gh, delt_x=delt_x, delt_y=delt_y)
    u = utl.cut_xrdata(map_extent, u, delt_x=delt_x, delt_y=delt_y)
    v = utl.cut_xrdata(map_extent, v, delt_x=delt_x, delt_y=delt_y)
    r6 = utl.cut_xrdata(map_extent, r6, delt_x=delt_x, delt_y=delt_y)

    gh = utl.mask_terrian(gh_lev, psfc, gh)
    u = utl.mask_terrian(uv_lev, psfc, u)
    v = utl.mask_terrian(uv_lev, psfc, v)

    gh.attrs['model'] = model
    uv = xr.merge([u.rename({'data': 'u'}), v.rename({'data': 'v'})])

    synoptic_graphics.draw_gh_uv_r6(r6=r6,
                                    gh=gh,
                                    uv=uv,
                                    map_extent=map_extent,
                                    regrid_shape=20,
                                    city=city,
                                    south_China_sea=south_China_sea,
                                    output_dir=output_dir,
                                    Global=Global)
示例#28
0
def isentropic_uv(initTime=None,
                  fhour=6,
                  day_back=0,
                  model='ECMWF',
                  data_source='MICAPS',
                  isentlev=310,
                  map_ratio=19 / 9,
                  zoom_ratio=20,
                  cntr_pnt=[102, 34],
                  levels=[
                      1000, 950, 925, 900, 850, 800, 700, 600, 500, 400, 300,
                      250, 200, 100
                  ],
                  Global=False,
                  south_China_sea=True,
                  area='全国',
                  city=False,
                  output_dir=None):
    # micaps data directory
    if (data_source == 'MICAPS'):
        try:
            data_dir = [
                utl.Cassandra_dir(data_type='high',
                                  data_source=model,
                                  var_name='RH',
                                  lvl=''),
                utl.Cassandra_dir(data_type='high',
                                  data_source=model,
                                  var_name='UGRD',
                                  lvl=''),
                utl.Cassandra_dir(data_type='high',
                                  data_source=model,
                                  var_name='VGRD',
                                  lvl=''),
                utl.Cassandra_dir(data_type='high',
                                  data_source=model,
                                  var_name='TMP',
                                  lvl=''),
                utl.Cassandra_dir(data_type='high',
                                  data_source=model,
                                  var_name='HGT',
                                  lvl='')
            ]
        except KeyError:
            raise ValueError('Can not find all directories needed')

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

        # retrieve data from micaps server
        rh = MICAPS_IO.get_model_3D_grid(directory=data_dir[0][0:-1],
                                         filename=filename,
                                         levels=levels,
                                         allExists=False)
        if rh is None:
            return

        u = MICAPS_IO.get_model_3D_grid(directory=data_dir[1][0:-1],
                                        filename=filename,
                                        levels=levels,
                                        allExists=False)
        if u is None:
            return

        v = MICAPS_IO.get_model_3D_grid(directory=data_dir[2][0:-1],
                                        filename=filename,
                                        levels=levels,
                                        allExists=False)
        if v is None:
            return

        t = MICAPS_IO.get_model_3D_grid(directory=data_dir[3][0:-1],
                                        filename=filename,
                                        levels=levels,
                                        allExists=False)
        if t is None:
            return

    if (data_source == 'CIMISS'):
        # get filename
        if (initTime != None):
            filename = utl.model_filename(initTime, fhour, UTC=True)
        else:
            filename = utl.filename_day_back_model(day_back=day_back,
                                                   fhour=fhour,
                                                   UTC=True)
        try:
            # retrieve data from CMISS server
            rh = CMISS_IO.cimiss_model_3D_grid(
                init_time_str='20' + filename[0:8],
                valid_time=fhour,
                data_code=utl.CMISS_data_code(data_source=model,
                                              var_name='RHU'),
                fcst_levels=levels,
                fcst_ele="RHU",
                units='%')
            if rh is None:
                return

            u = CMISS_IO.cimiss_model_3D_grid(
                init_time_str='20' + filename[0:8],
                valid_time=fhour,
                data_code=utl.CMISS_data_code(data_source=model,
                                              var_name='WIU'),
                fcst_levels=levels,
                fcst_ele="WIU",
                units='m/s')
            if u is None:
                return

            v = CMISS_IO.cimiss_model_3D_grid(
                init_time_str='20' + filename[0:8],
                valid_time=fhour,
                data_code=utl.CMISS_data_code(data_source=model,
                                              var_name='WIV'),
                fcst_levels=levels,
                fcst_ele="WIV",
                units='m/s')
            if v is None:
                return

            t = CMISS_IO.cimiss_model_3D_grid(
                init_time_str='20' + filename[0:8],
                valid_time=fhour,
                data_code=utl.CMISS_data_code(data_source=model,
                                              var_name='TEM'),
                fcst_levels=levels,
                fcst_ele="TEM",
                units='K')
            if t is None:
                return
            t['data'].values = t['data'].values - 273.15
        except KeyError:
            raise ValueError('Can not find all data needed')

    lats = np.squeeze(rh['lat'].values)
    lons = np.squeeze(rh['lon'].values)

    pres = np.array(levels) * 100 * units('Pa')
    tmp = t['data'].values.squeeze() * units('degC')
    uwnd = u['data'].values.squeeze() * units.meter / units.second
    vwnd = v['data'].values.squeeze() * units.meter / units.second
    relh = rh['data'].values.squeeze() * units.meter / units.percent

    isentlev = isentlev * units.kelvin

    isent_anal = mpcalc.isentropic_interpolation(isentlev,
                                                 pres,
                                                 tmp,
                                                 relh,
                                                 uwnd,
                                                 vwnd,
                                                 axis=0)

    isentprs, isentrh, isentu, isentv = isent_anal

    # 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

    idx_x1 = np.where((lons > map_extent[0] - delt_x)
                      & (lons < map_extent[1] + delt_x))
    idx_y1 = np.where((lats > map_extent[2] - delt_y)
                      & (lats < map_extent[3] + delt_y))

    mask1 = ((t['lon'] > map_extent[0] - delt_x) &
             (t['lon'] < map_extent[1] + delt_x) &
             (t['lat'] > map_extent[2] - delt_y) &
             (t['lat'] < map_extent[3] + delt_y) &
             (t['level'] == t['level'].values[0]))
    isentrh1 = t.where(mask1, drop=True)
    isentrh1['data'].values = [[
        np.array(isentrh)[0, idx_y1[0][0]:(idx_y1[0][-1] + 1),
                          idx_x1[0][0]:(idx_x1[0][-1] + 1)]
    ]]
    isentrh1.attrs['model'] = model
    isentrh1['level'].values = [np.array(isentlev)]

    isentu1 = isentrh1.copy()
    isentu1['data'].values = [[
        np.array(isentu)[0, idx_y1[0][0]:(idx_y1[0][-1] + 1),
                         idx_x1[0][0]:(idx_x1[0][-1] + 1)]
    ]]

    isentv1 = isentrh1.copy()
    isentv1['data'].values = [[
        np.array(isentv)[0, idx_y1[0][0]:(idx_y1[0][-1] + 1),
                         idx_x1[0][0]:(idx_x1[0][-1] + 1)]
    ]]

    isentuv1 = xr.merge([
        isentu1.rename({'data': 'isentu'}),
        isentv1.rename({'data': 'isentv'})
    ])

    isentprs1 = isentrh1.copy()
    isentprs1['data'].values = [[
        np.array(isentprs)[0, idx_y1[0][0]:(idx_y1[0][-1] + 1),
                           idx_x1[0][0]:(idx_x1[0][-1] + 1)]
    ]]

    isentropic_graphics.draw_isentropic_uv(isentrh=isentrh1,
                                           isentuv=isentuv1,
                                           isentprs=isentprs1,
                                           map_extent=map_extent,
                                           regrid_shape=20,
                                           city=city,
                                           south_China_sea=south_China_sea,
                                           output_dir=output_dir,
                                           Global=Global)
示例#29
0
def gh_uv_wvfl(initTime=None, fhour=6, day_back=0,model='GRAPES_GFS',
    gh_lev=500,uv_lev=850,wvfl_lev=850,
    map_ratio=19/9,zoom_ratio=20,cntr_pnt=[102,34],
    south_China_sea=True,area = '全国',city=False,output_dir=None,data_source='MICAPS',
    Global=False):

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

    # micaps data directory
    if(data_source =='MICAPS'):        
        try:
            data_dir = [utl.Cassandra_dir(data_type='high',data_source=model,var_name='HGT',lvl=gh_lev),
                        utl.Cassandra_dir(data_type='high',data_source=model,var_name='UGRD',lvl=uv_lev),
                        utl.Cassandra_dir(data_type='high',data_source=model,var_name='VGRD',lvl=uv_lev),
                        utl.Cassandra_dir(data_type='high',data_source=model,var_name='WVFL',lvl=wvfl_lev)
                        ]
        except KeyError:
            raise ValueError('Can not find all directories needed')

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

        # retrieve data from micaps server
        gh = MICAPS_IO.get_model_grid(data_dir[0], filename=filename)
        if gh is None:
            return
        
        u = MICAPS_IO.get_model_grid(data_dir[1], filename=filename)
        if u is None:
            return
            
        v = MICAPS_IO.get_model_grid(data_dir[2], filename=filename)
        if v is None:
            return
        wvfl = MICAPS_IO.get_model_grid(data_dir[3], filename=filename)
        if wvfl is None:
            return

    if(data_source =='CIMISS'):

        # get filename
        if(initTime != None):
            filename = utl.model_filename(initTime, fhour,UTC=True)
        else:
            filename=utl.filename_day_back_model(day_back=day_back,fhour=fhour,UTC=True)
        try:
            # retrieve data from CMISS server        
            gh=CMISS_IO.cimiss_model_by_time('20'+filename[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.

            u=CMISS_IO.cimiss_model_by_time('20'+filename[0:8],valid_time=fhour,
                        data_code=utl.CMISS_data_code(data_source=model,var_name='WIU'),
                        levattrs={'long_name':'pressure_level', 'units':'hPa', '_CoordinateAxisType':'-'},
                        fcst_level=uv_lev, fcst_ele="WIU", units='m/s')
            if u is None:
                return
                
            v=CMISS_IO.cimiss_model_by_time('20'+filename[0:8],valid_time=fhour,
                        data_code=utl.CMISS_data_code(data_source=model,var_name='WIV'),
                        levattrs={'long_name':'pressure_level', 'units':'hPa', '_CoordinateAxisType':'-'},
                        fcst_level=uv_lev, fcst_ele="WIV", units='m/s')
            if v is None:
                return

            wvfl=CMISS_IO.cimiss_model_by_time('20'+filename[0:8],valid_time=fhour,
                        data_code=utl.CMISS_data_code(data_source=model,var_name='MOFU'),
                        levattrs={'long_name':'pressure_level', 'units':'hPa', '_CoordinateAxisType':'-'},
                        fcst_level=wvfl_lev, fcst_ele="MOFU", units='10^-1*g/cm*hPa*s')
            if wvfl is None:
                return                
        except KeyError:
            raise ValueError('Can not find all data needed')            
    # 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
    mask1 = (gh['lon'] > map_extent[0]-delt_x) & (gh['lon'] < map_extent[1]+delt_x) & (gh['lat'] > map_extent[2]-delt_y) & (gh['lat'] < map_extent[3]+delt_y)
    mask2 = (u['lon'] > map_extent[0]-delt_x) & (u['lon'] < map_extent[1]+delt_x) & (u['lat'] > map_extent[2]-delt_y) & (u['lat'] < map_extent[3]+delt_y)
    mask3 = (wvfl['lon'] > map_extent[0]-delt_x) & (u['lon'] < map_extent[1]+delt_x) & (u['lat'] > map_extent[2]-delt_y) & (u['lat'] < map_extent[3]+delt_y)

#- to solve the problem of labels on all the contours
    gh=gh.where(mask1,drop=True)
    gh.attrs['model']=model
    u=u.where(mask2,drop=True)
    v=v.where(mask2,drop=True)
    uv=xr.merge([u.rename({'data': 'u'}),v.rename({'data': 'v'})])
    wvfl=v.where(wvfl,drop=True)

    moisture_graphics.draw_gh_uv_wvfl(
        wvfl=wvfl, gh=gh, uv=uv,
        map_extent=map_extent, regrid_shape=20,
        city=city,south_China_sea=south_China_sea,
        output_dir=output_dir,Global=Global)
示例#30
0
def Miller_Composite_Chart(initTime=None,
                           fhour=24,
                           day_back=0,
                           model='GRAPES_GFS',
                           map_ratio=14 / 9,
                           zoom_ratio=20,
                           cntr_pnt=[104, 34],
                           data_source='MICAPS',
                           Global=False,
                           south_China_sea=True,
                           area=None,
                           city=False,
                           output_dir=None,
                           **kwargs):

    # micaps data directory
    if (data_source == 'MICAPS'):
        try:
            data_dir = [
                utl.Cassandra_dir(data_type='high',
                                  data_source=model,
                                  var_name='RH',
                                  lvl='700'),
                utl.Cassandra_dir(data_type='high',
                                  data_source=model,
                                  var_name='UGRD',
                                  lvl='300'),
                utl.Cassandra_dir(data_type='high',
                                  data_source=model,
                                  var_name='VGRD',
                                  lvl='300'),
                utl.Cassandra_dir(data_type='high',
                                  data_source=model,
                                  var_name='UGRD',
                                  lvl='500'),
                utl.Cassandra_dir(data_type='high',
                                  data_source=model,
                                  var_name='VGRD',
                                  lvl='500'),
                utl.Cassandra_dir(data_type='high',
                                  data_source=model,
                                  var_name='UGRD',
                                  lvl='850'),
                utl.Cassandra_dir(data_type='high',
                                  data_source=model,
                                  var_name='VGRD',
                                  lvl='850'),
                utl.Cassandra_dir(data_type='high',
                                  data_source=model,
                                  var_name='TMP',
                                  lvl='700'),
                utl.Cassandra_dir(data_type='high',
                                  data_source=model,
                                  var_name='HGT',
                                  lvl='500'),
                utl.Cassandra_dir(data_type='surface',
                                  data_source=model,
                                  var_name='BLI'),
                utl.Cassandra_dir(data_type='surface',
                                  data_source=model,
                                  var_name='Td2m'),
                utl.Cassandra_dir(data_type='surface',
                                  data_source=model,
                                  var_name='PRMSL')
            ]
        except KeyError:
            raise ValueError('Can not find all directories needed')

        # get filename
        if (initTime != None):
            filename = utl.model_filename(initTime, fhour)
            filename2 = utl.model_filename(initTime, fhour - 12)
        else:
            filename = utl.filename_day_back_model(day_back=day_back,
                                                   fhour=fhour)
            filename2 = utl.filename_day_back_model(day_back=day_back,
                                                    fhour=fhour - 12)

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

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

        v_300 = MICAPS_IO.get_model_grid(directory=data_dir[2],
                                         filename=filename)
        if v_300 is None:
            return

        u_500 = MICAPS_IO.get_model_grid(directory=data_dir[3],
                                         filename=filename)
        if u_500 is None:
            return

        v_500 = MICAPS_IO.get_model_grid(directory=data_dir[4],
                                         filename=filename)
        if v_500 is None:
            return

        u_850 = MICAPS_IO.get_model_grid(directory=data_dir[5],
                                         filename=filename)
        if u_850 is None:
            return

        v_850 = MICAPS_IO.get_model_grid(directory=data_dir[6],
                                         filename=filename)
        if v_850 is None:
            return

        t_700 = MICAPS_IO.get_model_grid(directory=data_dir[7],
                                         filename=filename)
        if t_700 is None:
            return

        hgt_500 = MICAPS_IO.get_model_grid(directory=data_dir[8],
                                           filename=filename)
        if hgt_500 is None:
            return

        hgt_500_2 = MICAPS_IO.get_model_grid(directory=data_dir[8],
                                             filename=filename2)
        if hgt_500_2 is None:
            return

        BLI = MICAPS_IO.get_model_grid(directory=data_dir[9],
                                       filename=filename)
        if BLI is None:
            return

        Td2m = MICAPS_IO.get_model_grid(directory=data_dir[10],
                                        filename=filename)
        if Td2m is None:
            return

        PRMSL = MICAPS_IO.get_model_grid(directory=data_dir[11],
                                         filename=filename)
        if PRMSL is None:
            return

        PRMSL2 = MICAPS_IO.get_model_grid(directory=data_dir[11],
                                          filename=filename2)
        if PRMSL2 is None:
            return

    if (data_source == 'CIMISS'):

        # get filename
        if (initTime != None):
            filename = utl.model_filename(initTime, fhour, UTC=True)
            filename2 = utl.model_filename(initTime, fhour - 12, UTC=True)
        else:
            filename = utl.filename_day_back_model(day_back=day_back,
                                                   fhour=fhour,
                                                   UTC=True)
            filename2 = utl.filename_day_back_model(day_back=day_back,
                                                    fhour=fhour - 12,
                                                    UTC=True)
        try:
            # retrieve data from CIMISS server
            rh_700 = CMISS_IO.cimiss_model_by_time(
                '20' + filename[0:8],
                valid_time=fhour,
                data_code=utl.CMISS_data_code(data_source=model,
                                              var_name='RHU'),
                fcst_level=700,
                fcst_ele="RHU",
                units='%')
            if rh_700 is None:
                return

            hgt_500 = CMISS_IO.cimiss_model_by_time(
                '20' + filename[0:8],
                valid_time=fhour,
                data_code=utl.CMISS_data_code(data_source=model,
                                              var_name='GPH'),
                fcst_level=500,
                fcst_ele="GPH",
                units='gpm')
            if hgt_500 is None:
                return
            hgt_500['data'].values = hgt_500['data'].values / 10.

            hgt_500_2 = CMISS_IO.cimiss_model_by_time(
                '20' + filename2[0:8],
                valid_time=fhour,
                data_code=utl.CMISS_data_code(data_source=model,
                                              var_name='GPH'),
                fcst_level=500,
                fcst_ele="GPH",
                units='gpm')
            if hgt_500_2 is None:
                return
            hgt_500_2['data'].values = hgt_500_2['data'].values / 10.

            u_300 = CMISS_IO.cimiss_model_by_time(
                '20' + filename[0:8],
                valid_time=fhour,
                data_code=utl.CMISS_data_code(data_source=model,
                                              var_name='WIU'),
                fcst_level=300,
                fcst_ele="WIU",
                units='m/s')
            if u_300 is None:
                return

            v_300 = CMISS_IO.cimiss_model_by_time(
                '20' + filename[0:8],
                valid_time=fhour,
                data_code=utl.CMISS_data_code(data_source=model,
                                              var_name='WIV'),
                fcst_level=300,
                fcst_ele="WIV",
                units='m/s')
            if v_300 is None:
                return

            u_500 = CMISS_IO.cimiss_model_by_time(
                '20' + filename[0:8],
                valid_time=fhour,
                data_code=utl.CMISS_data_code(data_source=model,
                                              var_name='WIU'),
                fcst_level=500,
                fcst_ele="WIU",
                units='m/s')
            if u_500 is None:
                return

            v_500 = CMISS_IO.cimiss_model_by_time(
                '20' + filename[0:8],
                valid_time=fhour,
                data_code=utl.CMISS_data_code(data_source=model,
                                              var_name='WIV'),
                fcst_level=500,
                fcst_ele="WIV",
                units='m/s')
            if v_500 is None:
                return

            u_850 = CMISS_IO.cimiss_model_by_time(
                '20' + filename[0:8],
                valid_time=fhour,
                data_code=utl.CMISS_data_code(data_source=model,
                                              var_name='WIU'),
                fcst_level=850,
                fcst_ele="WIU",
                units='m/s')
            if u_850 is None:
                return

            v_850 = CMISS_IO.cimiss_model_by_time(
                '20' + filename[0:8],
                valid_time=fhour,
                data_code=utl.CMISS_data_code(data_source=model,
                                              var_name='WIV'),
                fcst_level=850,
                fcst_ele="WIV",
                units='m/s')
            if v_850 is None:
                return

            BLI = CMISS_IO.cimiss_model_by_time('20' + filename2[0:8],
                                                valid_time=fhour,
                                                data_code=utl.CMISS_data_code(
                                                    data_source=model,
                                                    var_name='PLI'),
                                                fcst_level=0,
                                                fcst_ele="PLI",
                                                units='Pa')
            if BLI is None:
                return

            #1000hPa 露点温度代替2m露点温度
            Td2m = CMISS_IO.cimiss_model_by_time('20' + filename2[0:8],
                                                 valid_time=fhour,
                                                 data_code=utl.CMISS_data_code(
                                                     data_source=model,
                                                     var_name='DPT'),
                                                 fcst_level=1000,
                                                 fcst_ele="DPT",
                                                 units='Pa')
            if Td2m is None:
                return
            Td2m['data'].values = Td2m['data'].values - 273.15

            if (model == 'ECMWF'):
                PRMSL = 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'),
                    fcst_level=0,
                    fcst_ele="GSSP",
                    units='Pa')
            else:
                PRMSL = 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'),
                    fcst_level=0,
                    fcst_ele="SSP",
                    units='Pa')

            t_700 = CMISS_IO.cimiss_model_by_time(
                '20' + filename[0:8],
                valid_time=fhour,
                data_code=utl.CMISS_data_code(data_source=model,
                                              var_name='TEM'),
                fcst_level=700,
                fcst_ele="TEM",
                units='K')
            if t_700 is None:
                return
            t_700['data'].values = t_700['data'].values - 273.15

            if PRMSL is None:
                return
            PRMSL['data'] = PRMSL['data'] / 100.

            if (model == 'ECMWF'):
                PRMSL2 = CMISS_IO.cimiss_model_by_time(
                    '20' + filename2[0:8],
                    valid_time=fhour,
                    data_code=utl.CMISS_data_code(data_source=model,
                                                  var_name='GSSP'),
                    fcst_level=0,
                    fcst_ele="GSSP",
                    units='Pa')
            else:
                PRMSL2 = CMISS_IO.cimiss_model_by_time(
                    '20' + filename2[0:8],
                    valid_time=fhour,
                    data_code=utl.CMISS_data_code(data_source=model,
                                                  var_name='SSP'),
                    fcst_level=0,
                    fcst_ele="SSP",
                    units='Pa')
            if PRMSL2 is None:
                return
            PRMSL2['data'] = PRMSL2['data'] / 100.
        except KeyError:
            raise ValueError('Can not find all data needed')

    lats = np.squeeze(rh_700['lat'].values)
    lons = np.squeeze(rh_700['lon'].values)
    x, y = np.meshgrid(rh_700['lon'], rh_700['lat'])

    tmp_700 = t_700['data'].values.squeeze() * units('degC')
    u_300 = (u_300['data'].values.squeeze() * units.meter /
             units.second).to('kt')
    v_300 = (v_300['data'].values.squeeze() * units.meter /
             units.second).to('kt')
    u_500 = (u_500['data'].values.squeeze() * units.meter /
             units.second).to('kt')
    v_500 = (v_500['data'].values.squeeze() * units.meter /
             units.second).to('kt')
    u_850 = (u_850['data'].values.squeeze() * units.meter /
             units.second).to('kt')
    v_850 = (v_850['data'].values.squeeze() * units.meter /
             units.second).to('kt')
    hgt_500 = (hgt_500['data'].values.squeeze()) * 10 / 9.8 * units.meter
    rh_700 = rh_700['data'].values.squeeze()
    lifted_index = BLI['data'].values.squeeze() * units.kelvin
    Td_sfc = Td2m['data'].values.squeeze() * units('degC')
    dx, dy = mpcalc.lat_lon_grid_deltas(lons, lats)

    avor_500 = mpcalc.absolute_vorticity(u_500, v_500, dx, dy,
                                         y * units.degree)
    pmsl = PRMSL['data'].values.squeeze() * units('hPa')

    hgt_500_2 = (hgt_500_2['data'].values.squeeze()) * 10 / 9.8 * units.meter
    pmsl2 = PRMSL2['data'].values.squeeze() * units('hPa')

    # 500 hPa CVA
    vort_adv_500 = mpcalc.advection(
        avor_500, [u_500.to('m/s'), v_500.to('m/s')],
        (dx, dy), dim_order='yx') * 1e9
    vort_adv_500_smooth = gaussian_filter(vort_adv_500, 4)

    wspd_300 = gaussian_filter(mpcalc.wind_speed(u_300, v_300), 5)
    wspd_500 = gaussian_filter(mpcalc.wind_speed(u_500, v_500), 5)
    wspd_850 = gaussian_filter(mpcalc.wind_speed(u_850, v_850), 5)

    Td_dep_700 = tmp_700 - mpcalc.dewpoint_rh(tmp_700, rh_700 / 100.)

    pmsl_change = pmsl - pmsl2
    hgt_500_change = hgt_500 - hgt_500_2

    mask_500 = ma.masked_less_equal(wspd_500, 0.66 * np.max(wspd_500)).mask
    u_500[mask_500] = np.nan
    v_500[mask_500] = np.nan

    # 300 hPa
    mask_300 = ma.masked_less_equal(wspd_300, 0.66 * np.max(wspd_300)).mask
    u_300[mask_300] = np.nan
    v_300[mask_300] = np.nan

    # 850 hPa
    mask_850 = ma.masked_less_equal(wspd_850, 0.66 * np.max(wspd_850)).mask
    u_850[mask_850] = np.nan
    v_850[mask_850] = np.nan

    # 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

    fcst_info = {
        'lon': lons,
        'lat': lats,
        'forecast_period': fhour,
        'model': model,
        'forecast_reference_time':
        t_700.coords['forecast_reference_time'].values
    }

    synthetical_graphics.draw_Miller_Composite_Chart(
        fcst_info=fcst_info,
        u_300=u_300,
        v_300=v_300,
        u_500=u_500,
        v_500=v_500,
        u_850=u_850,
        v_850=v_850,
        pmsl_change=pmsl_change,
        hgt_500_change=hgt_500_change,
        Td_dep_700=Td_dep_700,
        Td_sfc=Td_sfc,
        pmsl=pmsl,
        lifted_index=lifted_index,
        vort_adv_500_smooth=vort_adv_500_smooth,
        map_extent=map_extent,
        add_china=True,
        city=city,
        south_China_sea=south_China_sea,
        output_dir=output_dir,
        Global=False)