예제 #1
0
def sta_SkewT(model='ECMWF',points={'lon':[116.3833], 'lat':[39.9]},
    levels=[1000, 950, 925, 900, 850, 800, 700,600,500,400,300,250,200,150,100],
    fhour=3,output_dir=None):

    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='HGT',lvl=''),
                    utl.Cassandra_dir(data_type='high',data_source=model,var_name='RH',lvl='')]
    except KeyError:
        raise ValueError('Can not find all directories needed')

    # # 度数据
    initTime = get_latest_initTime(data_dir[0][0:-1]+"850")
    filename = initTime+'.'+str(fhour).zfill(3)
    TMP_4D=get_model_3D_grid(directory=data_dir[0][0:-1],filename=filename,levels=levels, allExists=False)
    TMP_2D=TMP_4D.interp(lon=('points', points['lon']), lat=('points', points['lat']))

    u_4D=get_model_3D_grid(directory=data_dir[1][0:-1],filename=filename,levels=levels, allExists=False)
    u_2D=u_4D.interp(lon=('points', points['lon']), lat=('points', points['lat']))

    v_4D=get_model_3D_grid(directory=data_dir[2][0:-1],filename=filename,levels=levels, allExists=False)
    v_2D=v_4D.interp(lon=('points', points['lon']), lat=('points', points['lat']))

    HGT_4D=get_model_3D_grid(directory=data_dir[3][0:-1],filename=filename,levels=levels, allExists=False)
    HGT_2D=HGT_4D.interp(lon=('points', points['lon']), lat=('points', points['lat']))
    HGT_2D.attrs['model']=model
    HGT_2D.attrs['points']=points

    RH_4D=get_model_3D_grid(directory=data_dir[4][0:-1],filename=filename,levels=levels, allExists=False)
    RH_2D=RH_4D.interp(lon=('points', points['lon']), lat=('points', points['lat']))

    wind_dir_2D=mpcalc.wind_direction(u_2D['data'].values* units.meter / units.second,
        v_2D['data'].values* units.meter / units.second)
    wsp10m_2D=(u_2D['data']**2+v_2D['data']**2)**0.5
    Td2m=mpcalc.dewpoint_rh(TMP_2D['data'].values*units('degC'),RH_2D['data'].values/100.)

    p = np.squeeze(levels) * units.hPa
    T = np.squeeze(TMP_2D['data'].values) * units.degC
    Td = np.squeeze(np.array(Td2m)) * units.degC
    wind_speed = np.squeeze(wsp10m_2D.values) * units.meter
    wind_dir = np.squeeze(np.array(wind_dir_2D)) * units.degrees
    u=np.squeeze(u_2D['data'].values)* units.meter
    v=np.squeeze(v_2D['data'].values)* units.meter

    fcst_info= xr.DataArray(np.array(u_2D['data'].values),
                        coords=u_2D['data'].coords,
                        dims=u_2D['data'].dims,
                        attrs={'points': points,
                                'model': model})

    sta_graphics.draw_sta_skewT(
        p=p,T=T,Td=Td,wind_speed=wind_speed,wind_dir=wind_dir,u=u,v=v,
        fcst_info=fcst_info)
예제 #2
0
def point_fcst(
        model='ECMWF',
        output_dir=None,
        t_range=[0,60],
        t_gap=3,
        points={'lon':[116.3833], 'lat':[39.9], 'altitude':[1351]},
        initTime=None,day_back=0,
        extra_info={
            'output_head_name':' ',
            'output_tail_name':' ',
            'point_name':' '}
            ):

    #+get all the directories needed
    try:
        dir_rqd=[utl.Cassandra_dir(data_type='surface',data_source=model,var_name='T2m'),
                        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='RAIN'+str(t_gap).zfill(2))]
    except KeyError:
        raise ValueError('Can not find all required directories needed')
    
    #-get all the directories needed
    if(initTime == None):
        initTime = get_latest_initTime(dir_rqd[0])
        #initTime=utl.filename_day_back_model(day_back=day_back,fhour=0)[0:8]

    directory=dir_rqd[0][0:-1]
    fhours = np.arange(t_range[0], t_range[1], t_gap)
    filenames = [initTime+'.'+str(fhour).zfill(3) for fhour in fhours]
    t2m=utl.get_model_points_gy(dir_rqd[0], filenames, points,allExists=False)
    u10m=utl.get_model_points_gy(dir_rqd[1], filenames, points,allExists=False)
    v10m=utl.get_model_points_gy(dir_rqd[2], filenames, points,allExists=False)
    rn=utl.get_model_points_gy(dir_rqd[3], filenames, points,allExists=False)
    sta_graphics.draw_point_fcst(t2m=t2m,u10m=u10m,v10m=v10m,rn=rn,
        model=model,
        output_dir=output_dir,
        points=points,
        extra_info=extra_info
            )                 
예제 #3
0
def point_fcst_rn_according_to_3D_field_box_line(output_dir=None,
                                                 t_range=[6, 60],
                                                 t_gap=6,
                                                 points={
                                                     'lon': [116.3833],
                                                     'lat': [39.9]
                                                 },
                                                 initTime=None,
                                                 obs_ID=54511,
                                                 extra_info={
                                                     'output_head_name': ' ',
                                                     'output_tail_name': ' ',
                                                     'point_name': ' ',
                                                     'drw_thr': True
                                                 },
                                                 **kwargs):

    try:
        dir_rqd = utl.Cassandra_dir(data_type='surface',
                                    data_source='ECMWF_ENSEMBLE',
                                    var_name='RAIN' + str(t_gap).zfill(2) +
                                    '_RAW')
    except KeyError:
        raise ValueError('Can not find all required directories needed')

    #-get all the directories needed
    if (initTime == None):
        initTime = get_latest_initTime(dir_rqd)
        #initTime=utl.filename_day_back_model(day_back=day_back,fhour=0)[0:8]

    if (t_range[1] > 72):
        fhours = np.append(np.arange(t_range[0], 72, t_gap),
                           np.arange(72, t_range[1], 6))
    else:
        fhours = np.arange(t_range[0], t_range[1], t_gap)

    filenames = [initTime + '.' + str(fhour).zfill(3) for fhour in fhours]

    rn = utl.get_model_points_gy(dir_rqd, filenames, points, allExists=False)
    rn.attrs['model'] = 'ECMWF_ENSEMBLE'

    Ensemble_graphics.box_line_rn(rn=rn,
                                  points=points,
                                  extra_info=extra_info,
                                  output_dir=output_dir)
예제 #4
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],
        t_gap=3,
        t_range=[0, 48],
        output_dir=None):

    fhours = np.arange(t_range[0], t_range[1], t_gap)

    # 读数据

    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)
    TMP_2D = TMP_4D.interp(lon=('points', points['lon']),
                           lat=('points', points['lat']))

    u_4D = get_model_3D_grids(directory=data_dir[1][0:-1],
                              filenames=filenames,
                              levels=levels,
                              allExists=False)
    u_2D = u_4D.interp(lon=('points', points['lon']),
                       lat=('points', points['lat']))

    v_4D = get_model_3D_grids(directory=data_dir[2][0:-1],
                              filenames=filenames,
                              levels=levels,
                              allExists=False)
    v_2D = v_4D.interp(lon=('points', points['lon']),
                       lat=('points', points['lat']))

    rh_4D = get_model_3D_grids(directory=data_dir[3][0:-1],
                               filenames=filenames,
                               levels=levels,
                               allExists=False)
    rh_2D = rh_4D.interp(lon=('points', points['lon']),
                         lat=('points', points['lat']))
    rh_2D.attrs['model'] = model
    rh_2D.attrs['points'] = points

    Psfc_3D = get_model_grids(directory=data_dir[4][0:-1],
                              filenames=filenames,
                              allExists=False)
    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,
        output_dir=output_dir)
예제 #5
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],
                 south_China_sea=True,
                 area='全国',
                 city=False,
                 output_dir=None,
                 Global=False):

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

    # micaps data directory
    try:
        data_dir = [
            utl.Cassandra_dir(data_type='surface',
                              data_source=model,
                              var_name=Var_plot)
        ]
    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
    T_2m = get_model_grid(data_dir[0], filename=filename)
    if T_2m is None:
        return
    init_time = T_2m.coords['forecast_reference_time'].values

    # prepare data

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

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

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

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

    titles = {
        'Tmn_2m': '过去24小时2米最低温度',
        'Tmx_2m': '过去24小时2米最高温度',
        'T2m': '2米温度'
    }
    #- to solve the problem of labels on all the contours
    T_2m = {
        'lon':
        T_2m.coords['lon'].values[idx_x1],
        'lat':
        T_2m.coords['lat'].values[idx_y1],
        'data':
        T_2m['data'].values[0, 0, idx_y1[0][0]:(idx_y1[0][-1] + 1),
                            idx_x1[0][0]:(idx_x1[0][-1] + 1)],
        'model':
        model,
        'fhour':
        fhour,
        'title':
        titles[Var_plot],
        'init_time':
        init_time
    }

    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)
예제 #6
0
def point_wind_time_fcst_according_to_3D_wind(
        model='ECMWF',
        output_dir=None,
        t_range=[0,60],
        t_gap=3,
        points={'lon':[116.3833], 'lat':[39.9], 'altitude':[1351]},
        initTime=None,draw_obs=True,obs_ID=54511,day_back=0,
        extra_info={
            'output_head_name':' ',
            'output_tail_name':' ',
            'point_name':' ',
            'drw_thr':True,
            'levels_for_interp':[1000, 950, 925, 900, 850, 800, 700, 600, 500]}
            ):

    #+get all the directories needed
    try:
        dir_rqd=[utl.Cassandra_dir(data_type='high',data_source=model,var_name='HGT',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='')]
    except KeyError:
        raise ValueError('Can not find all required directories needed')
    
    #-get all the directories needed
    if(initTime == None):
        initTime = get_latest_initTime(dir_rqd[0][0:-1]+'/850')
        #initTime=utl.filename_day_back_model(day_back=day_back,fhour=0)[0:8]

    directory=dir_rqd[0][0:-1]
    fhours = np.arange(t_range[0], t_range[1], t_gap)
    filenames = [initTime+'.'+str(fhour).zfill(3) for fhour in fhours]
    HGT_4D=get_model_3D_grids(directory=directory,filenames=filenames,levels=extra_info['levels_for_interp'], allExists=False)
    directory=dir_rqd[1][0:-1]
    U_4D=get_model_3D_grids(directory=directory,filenames=filenames,levels=extra_info['levels_for_interp'], allExists=False)
    directory=dir_rqd[2][0:-1]
    V_4D=get_model_3D_grids(directory=directory,filenames=filenames,levels=extra_info['levels_for_interp'], allExists=False)
    #obs
    if(draw_obs == True):
        initial_time=pd.to_datetime(str(V_4D['forecast_reference_time'].values)).replace(tzinfo=None).to_pydatetime()
        sign=0
        for ifhour in V_4D['forecast_period'].values:
            temp=(initial_time+timedelta(hours=ifhour))
            filenames_obs=temp.strftime("%Y%m%d%H")+'0000.000'
            try:
                obs_data=get_station_data('SURFACE/PLOT/',filename=filenames_obs)
            except:
                break

            if(obs_data is not None):
                temp=obs_data.where(obs_data['ID']==obs_ID).dropna(how='all')
                if ((ifhour == V_4D['forecast_period'].values[0]) or ((ifhour > V_4D['forecast_period'].values[0]) and (sign==0))):
                    if(len(temp) > 0):
                        sta_obs_data=obs_data.where(obs_data['ID']==obs_ID).dropna(how='all').reset_index()
                        sign=1
                else:
                    if(len(temp) > 0):
                        sta_obs_data=sta_obs_data.append(temp).reset_index()
            if(obs_data is None):
                break
        try:
            sta_obs_data
        except:
            draw_obs=False

    delt_xy=HGT_4D['lon'].values[1]-HGT_4D['lon'].values[0]
    mask = (HGT_4D['lon']<(points['lon']+2*delt_xy))&(HGT_4D['lon']>(points['lon']-2*delt_xy))&(HGT_4D['lat']<(points['lat']+2*delt_xy))&(HGT_4D['lat']>(points['lat']-2*delt_xy))

    HGT_4D_sm=HGT_4D['data'].where(mask,drop=True)
    U_4D_sm=U_4D['data'].where(mask,drop=True)
    V_4D_sm=V_4D['data'].where(mask,drop=True)

    lon_md=np.squeeze(HGT_4D_sm['lon'].values)
    lat_md=np.squeeze(HGT_4D_sm['lat'].values)
    alt_md=np.squeeze(HGT_4D_sm.values*10).flatten()
    time_md=np.squeeze(HGT_4D_sm['forecast_period'].values)

    coords = np.zeros((len(time_md),len(extra_info['levels_for_interp']),len(lat_md),len(lon_md),4))
    coords[...,0]=time_md.reshape((len(time_md),1,1,1))
    coords[...,2] = lat_md.reshape((1,1,len(lat_md),1))
    coords[...,3] = lon_md.reshape((1,1,1,len(lon_md)))
    coords = coords.reshape((alt_md.size,4))
    coords[:,1]=alt_md

    interpolator_U = LinearNDInterpolator(coords,U_4D_sm.values.reshape((U_4D_sm.values.size)),rescale=True)
    interpolator_V = LinearNDInterpolator(coords,V_4D_sm.values.reshape((V_4D_sm.values.size)),rescale=True)

    coords2 = np.zeros((len(time_md),1,1,1,4))
    coords2[...,0]=time_md.reshape((len(time_md),1,1,1))
    coords2[...,1]=points['altitude'][0]
    coords2[...,2] = points['lat'][0]
    coords2[...,3] = points['lon'][0]
    coords2 = coords2.reshape((time_md.size,4))

    U_interped=np.squeeze(interpolator_U(coords2))
    V_interped=np.squeeze(interpolator_V(coords2))
    time_info=HGT_4D_sm.coords

    sta_graphics.draw_point_wind(U=U_interped,V=V_interped,
        model=model,
        output_dir=output_dir,
        points=points,
        time_info=time_info,
        extra_info=extra_info
            )        
예제 #7
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)
예제 #8
0
def point_uv_gust_tmp_rh_rn_fcst(output_dir=None,
                                 t_range=[0, 60],
                                 t_gap=3,
                                 points={
                                     'lon': [116.3833],
                                     'lat': [39.9],
                                     'altitude': [1351]
                                 },
                                 initTime=None,
                                 day_back=0,
                                 extra_info={
                                     'output_head_name': ' ',
                                     'output_tail_name': ' ',
                                     'point_name': ' '
                                 },
                                 **kwargs):

    #+get all the directories needed
    try:
        dir_rqd = [
            utl.Cassandra_dir(data_type='surface',
                              data_source='中央气象台中短期指导',
                              var_name='T2m'),
            utl.Cassandra_dir(data_type='surface',
                              data_source='中央气象台中短期指导',
                              var_name='u10m'),
            utl.Cassandra_dir(data_type='surface',
                              data_source='中央气象台中短期指导',
                              var_name='v10m'),
            utl.Cassandra_dir(data_type='surface',
                              data_source='中央气象台中短期指导',
                              var_name='rh2m'),
            utl.Cassandra_dir(data_type='surface',
                              data_source='中央气象台中短期指导',
                              var_name='RAIN' + str(t_gap).zfill(2)),
            utl.Cassandra_dir(data_type='surface',
                              data_source='OBS',
                              var_name='PLOT_GUST')
        ]
    except KeyError:
        raise ValueError('Can not find all required directories needed')

    #-get all the directories needed
    if (initTime == None):
        initTime = MICAPS_IO.get_latest_initTime(dir_rqd[0])
        #initTime=utl.filename_day_back_model(day_back=day_back,fhour=0)[0:8]

    gust_sta = MICAPS_IO.get_station_data(directory=dir_rqd[5],
                                          dropna=True,
                                          cache=False)
    datetime_sta = pd.to_datetime(str(
        gust_sta.time[0])).replace(tzinfo=None).to_pydatetime()
    datetime_model_initTime = datetime.strptime('20' + initTime, '%Y%m%d%H')

    u10_his_md = []
    v10_his_md = []
    wsp_his_sta_point = []

    model_filenames_his = None
    for iinit in range(0, 240, 12):
        for ifhour in range(0, 87, 3):
            for iobs in range(0, 168, 1):
                initTime_his = datetime_model_initTime - timedelta(hours=iinit)
                validTime_his = initTime_his + timedelta(hours=ifhour)
                staTime_his = datetime_sta - timedelta(hours=iobs)
                if (staTime_his == validTime_his):
                    model_filename_his = initTime_his.strftime(
                        '%Y%m%d%H')[2:10] + '.' + str(ifhour).zfill(3)
                    sta_filename_his = validTime_his.strftime(
                        '%Y%m%d%H') + '0000.000'
                    data_md1 = MICAPS_IO.get_model_grid(
                        dir_rqd[1], filename=model_filename_his)
                    if (data_md1 is None):
                        continue
                    data_md2 = MICAPS_IO.get_model_grid(
                        dir_rqd[1], filename=model_filename_his)
                    if (data_md2 is None):
                        continue
                    data_sta = MICAPS_IO.get_station_data(
                        directory=dir_rqd[5],
                        filename=sta_filename_his,
                        dropna=True,
                        cache=True)
                    if (data_sta is None):
                        continue
                    u10_his_md.append(data_md1)
                    v10_his_md.append(data_md2)
                    wsp_his_sta_interp = utl.sta_to_point_interpolation(
                        points=points, sta=data_sta, var_name='Gust_speed')
                    wsp_his_sta_point.append(wsp_his_sta_interp[:])

    u10_his_md = xr.concat(u10_his_md, dim='time')
    v10_his_md = xr.concat(v10_his_md, dim='time')
    wsp_his_md = (u10_his_md**2 + v10_his_md**2)**0.5
    wsp_his_md_point = wsp_his_md.interp(lon=('points', points['lon']),
                                         lat=('points', points['lat']))

    model = LinearRegression(copy_X=True,
                             fit_intercept=True,
                             n_jobs=1,
                             normalize=False)
    x = np.squeeze(wsp_his_md_point['data'].values).reshape(-1, 1)
    y = np.squeeze(wsp_his_sta_point).reshape(-1, 1)
    model.fit(x, y)
    if (model.coef_ < 0.2):
        f2 = np.polyfit(np.squeeze(x), np.squeeze(y), 2)
        model2 = np.poly1d(f2)

    fhours = np.arange(t_range[0], t_range[1], t_gap)
    filenames = [initTime + '.' + str(fhour).zfill(3) for fhour in fhours]
    t2m = utl.get_model_points_gy(dir_rqd[0],
                                  filenames,
                                  points,
                                  allExists=False)
    u10m = utl.get_model_points_gy(dir_rqd[1],
                                   filenames,
                                   points,
                                   allExists=False)
    v10m = utl.get_model_points_gy(dir_rqd[2],
                                   filenames,
                                   points,
                                   allExists=False)
    rh = utl.get_model_points_gy(dir_rqd[3],
                                 filenames,
                                 points,
                                 allExists=False)
    rn = utl.get_model_points_gy(dir_rqd[4],
                                 filenames,
                                 points,
                                 allExists=False)

    gust10m_predict = u10m.copy()
    if (model.coef_ > 0.2):
        gust10m_predict['data'].values = np.squeeze(
            model.predict(
                np.squeeze((u10m['data'].values**2 +
                            v10m['data'].values**2)**0.5).reshape(-1,
                                                                  1))).reshape(
                                                                      -1, 1, 1)
    else:
        gust10m_predict['data'].values = np.squeeze(
            model2(
                np.squeeze((u10m['data'].values**2 +
                            v10m['data'].values**2)**0.5))).reshape(-1, 1, 1)

    sta_graphics.draw_point_uv_tmp_rh_rn_gust_fcst(t2m=t2m,
                                                   u10m=u10m,
                                                   v10m=v10m,
                                                   rh=rh,
                                                   rn=rn,
                                                   gust=gust10m_predict,
                                                   model='中央气象台中短期指导',
                                                   output_dir=output_dir,
                                                   points=points,
                                                   extra_info=extra_info)
예제 #9
0
def Station_Synthetical_Forecast_From_Cassandra(
        model='ECMWF',
        output_dir=None,
        t_range=[0,84],
        t_gap=3,
        points={'lon':[116.3833], 'lat':[39.9]},
        initTime=None,
        draw_VIS=True,drw_thr=False,
        extra_info={
            'output_head_name':' ',
            'output_tail_name':' ',
            'point_name':' '}
            ):

    #+get all the directories needed
    try:
        dir_rqd=[ 
                "ECMWF_HR/10_METRE_WIND_GUST_IN_THE_LAST_3_HOURS/",
                "ECMWF_HR/10_METRE_WIND_GUST_IN_THE_LAST_6_HOURS/",
                "ECMWF_HR/TCDC/",
                "ECMWF_HR/LCDC/",
                "ECMWF_HR/UGRD_100M/",
                "ECMWF_HR/VGRD_100M/",
                "NWFD_SCMOC/VIS/",

                utl.Cassandra_dir(
                    data_type='surface',data_source=model,var_name='RAIN03'),
                utl.Cassandra_dir(
                    data_type='surface',data_source=model,var_name='RAIN06'),
                utl.Cassandra_dir(
                    data_type='surface',data_source=model,var_name='T2m'),
                utl.Cassandra_dir(
                    data_type='surface',data_source=model,var_name='u10m'),
                utl.Cassandra_dir(
                    data_type='surface',data_source=model,var_name='v10m'),
                ]
    except KeyError:
        raise ValueError('Can not find all required directories needed')
    
    try:
        dir_opt=[ 
                utl.Cassandra_dir(
                    data_type='surface',data_source=model,var_name='Td2m')
                ]
        name_opt=['Td2m']
    except:
        dir_opt=[
                utl.Cassandra_dir(data_type='surface',data_source=model,var_name='rh2m')
                ]
        name_opt=['rh2m']
          
    #+get all the directories needed

    if(initTime == None):
        last_file={model:get_latest_initTime(dir_rqd[0]),
                    'SCMOC':get_latest_initTime(dir_rqd[6]),
                    }
    else:
        last_file={model:initTime[0],
                    'SCMOC':initTime[1],
                    }        

    y_s={model:int('20'+last_file[model][0:2]),
        'SCMOC':int('20'+last_file['SCMOC'][0:2])}
    m_s={model:int(last_file[model][2:4]),
        'SCMOC':int(last_file['SCMOC'][2:4])}
    d_s={model:int(last_file[model][4:6]),
        'SCMOC':int(last_file['SCMOC'][4:6])}
    h_s={model:int(last_file[model][6:8]),
        'SCMOC':int(last_file['SCMOC'][6:8])}

    fhours = np.arange(t_range[0], t_range[1], t_gap)

    for ifhour in fhours:
        if (ifhour == fhours[0] ):
            time_all=datetime(y_s['SCMOC'],m_s['SCMOC'],d_s['SCMOC'],h_s['SCMOC'])+timedelta(hours=int(ifhour))
        else:
            time_all=np.append(time_all,datetime(y_s['SCMOC'],m_s['SCMOC'],d_s['SCMOC'],h_s['SCMOC'])+timedelta(hours=int(ifhour)))            

    filenames = [last_file[model]+'.'+str(fhour).zfill(3) for fhour in fhours]
    t2m=utl.get_model_points_gy(dir_rqd[9], filenames, points,allExists=False)
    
    if(name_opt[0] == 'rh2m'):
        rh2m=utl.get_model_points_gy(dir_opt[0], filenames, points,allExists=False)
        Td2m=mpcalc.dewpoint_rh(t2m['data'].values*units('degC'),rh2m['data'].values/100.)
        p_vapor=(rh2m['data'].values/100.)*6.105*(math.e**((17.27*t2m['data'].values/(237.7+t2m['data'].values))))

    if(name_opt[0] == 'Td2m'):
        Td2m=utl.get_model_points_gy(dir_opt[0], filenames, points,allExists=False)        
        rh2m=mpcalc.relative_humidity_from_dewpoint(t2m['data'].values* units('degC'),
                Td2m['data'].values* units('degC'))
        p_vapor=(np.array(rh2m))*6.105*(math.e**((17.27*t2m['data'].values/(237.7+t2m['data'].values))))
        Td2m=np.array(Td2m['data'].values)* units('degC')

    u10m=utl.get_model_points_gy(dir_rqd[10], filenames, points,allExists=False)
    v10m=utl.get_model_points_gy(dir_rqd[11], filenames, points,allExists=False)
    wsp10m=(u10m['data']**2+v10m['data']**2)**0.5
    AT=1.07*t2m['data'].values+0.2*p_vapor-0.65*wsp10m-2.7      
    if((t_range[1]) > 72):
        fhours = np.arange(6, t_range[1], 6)
        filenames = [last_file[model]+'.'+str(fhour).zfill(3) for fhour in fhours]
        r03=utl.get_model_points_gy(dir_rqd[8], filenames, points,allExists=False)
    else:
        r03=utl.get_model_points_gy(dir_rqd[7], filenames, points,allExists=False)

    fhours = np.arange(t_range[0], t_range[1], t_gap)
    filenames = [last_file['SCMOC']+'.'+str(fhour).zfill(3) for fhour in fhours]
    VIS=utl.get_model_points_gy(dir_rqd[6], filenames, points,allExists=False,fill_null=True,Null_value=-0.001)     

    if(last_file['SCMOC'] == last_file[model] and t_range[1] > 72):
        fhours = np.append(np.arange(3,72,3),np.arange(72, (t_range[1]), 6))
        filenames = [last_file[model]+'.'+str(fhour).zfill(3) for fhour in fhours]
        filenames2 = [last_file[model]+'.'+str(fhour).zfill(3) for fhour in fhours]            

    if(last_file['SCMOC'] != last_file[model] and t_range[1] > 60):
        fhours = np.append(np.arange(3,60,3),np.arange(60, (t_range[1]), 6))
        filenames = [last_file[model]+'.'+str(fhour+12).zfill(3) for fhour in fhours]
        filenames2 = [last_file[model]+'.'+str(fhour).zfill(3) for fhour in fhours]

    if(last_file['SCMOC'] != last_file[model] and t_range[1] <= 60):
        fhours = np.arange(t_range[0], t_range[1], t_gap)
        filenames = [last_file[model]+'.'+str(fhour+12).zfill(3) for fhour in fhours]
        filenames2 = [last_file[model]+'.'+str(fhour).zfill(3) for fhour in fhours]

    if(last_file['SCMOC'] == last_file[model] and t_range[1] <= 72):
        fhours = np.arange(t_range[0], t_range[1], t_gap)
        filenames = [last_file[model]+'.'+str(fhour).zfill(3) for fhour in fhours]
        filenames2 = [last_file[model]+'.'+str(fhour).zfill(3) for fhour in fhours]

    TCDC=utl.get_model_points_gy(dir_rqd[2], filenames2, points,allExists=False)
    LCDC=utl.get_model_points_gy(dir_rqd[3], filenames2, points,allExists=False)
    u100m=utl.get_model_points_gy(dir_rqd[4], filenames2, points,allExists=False)
    v100m=utl.get_model_points_gy(dir_rqd[5], filenames2, points,allExists=False)
    wsp100m=(u100m['data']**2+v100m['data']**2)**0.5

    if(fhours[-1] < 120):
        gust10m=utl.get_model_points_gy(dir_rqd[0], filenames, points,allExists=False)
    if(fhours[-1] > 120):
        if(last_file['SCMOC'] == last_file[model]):
            fhours = np.arange(0, t_range[1], 6)
            filenames = [last_file[model]+'.'+str(fhour).zfill(3) for fhour in fhours]
        if(last_file['SCMOC'] != last_file[model]):
            fhours = np.arange(0, t_range[1], 6)
            filenames = [last_file[model]+'.'+str(fhour+12).zfill(3) for fhour in fhours]
        gust10m=utl.get_model_points_gy(dir_rqd[1], filenames, points,allExists=False)        
        
    sta_graphics.draw_Station_Synthetical_Forecast_From_Cassandra(
            t2m=t2m,Td2m=Td2m,AT=AT,u10m=u10m,v10m=v10m,u100m=u100m,v100m=v100m,
            gust10m=gust10m,wsp10m=wsp10m,wsp100m=wsp100m,r03=r03,TCDC=TCDC,LCDC=LCDC,
            draw_VIS=draw_VIS,VIS=VIS,drw_thr=drw_thr,
            time_all=time_all,
            model=model,points=points,
            output_dir=output_dir,extra_info=extra_info)
예제 #10
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)
예제 #11
0
def dT2m_mean24(initTime=None,
                fhour=48,
                day_back=0,
                map_ratio=19 / 9,
                zoom_ratio=20,
                cntr_pnt=[102, 34],
                south_China_sea=True,
                area='全国',
                city=False,
                output_dir=None,
                Global=False):

    data_dir = [
        utl.Cassandra_dir(data_type='surface',
                          data_source='ECMWF',
                          var_name='T2m')
    ]
    fhours1 = 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]
    filenames1 = [initTime + '.' + str(fhour).zfill(3) for fhour in fhours1]

    if (fhour >= 48):
        fhours2 = np.arange(fhour - 21 - 24, fhour + 1 - 24, 3)
        filenames2 = [
            initTime + '.' + str(fhour).zfill(3) for fhour in fhours2
        ]
    if (fhour >= 36 and fhour < 48):
        fhours2 = np.arange(fhour - 21 + 12 - 24, fhour + 1 + 12 - 24, 3)
        initTime2 = (datetime.strptime('20' + initTime, '%Y%m%d%H') -
                     timedelta(hours=12)).strftime('%Y%m%d%H')[2:10]
        filenames2 = [
            initTime2 + '.' + str(fhour).zfill(3) for fhour in fhours2
        ]
    if (fhour >= 24 and fhour < 36):
        fhours2 = np.arange(fhour - 21 + 24 - 24, fhour + 1 + 24 - 24, 3)
        initTime2 = (datetime.strptime('20' + initTime, '%Y%m%d%H') -
                     timedelta(hours=24)).strftime('%Y%m%d%H')[2:10]
        filenames2 = [
            initTime2 + '.' + str(fhour).zfill(3) for fhour in fhours2
        ]
    if (fhour < 24):
        print('fhour should > 24')
        return

# prepare data
    T_2m1 = MICAPS_IO.get_model_grids(data_dir[0], filenames=filenames1)
    Tmn_2m1 = T_2m1.isel(time=[-1]).copy()
    Tmn_2m1['data'].values[0, :, :] = np.mean(T_2m1['data'].values, axis=0)

    T_2m2 = MICAPS_IO.get_model_grids(data_dir[0], filenames=filenames2)
    Tmn_2m2 = T_2m2.isel(time=[-1]).copy()
    Tmn_2m2['data'].values[0, :, :] = np.mean(T_2m2['data'].values, axis=0)

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

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

    dTmn_2m.attrs['model'] = 'ECMWF'
    dTmn_2m.attrs['title'] = '2米最低温度24小时变温'

    elements_graphics.draw_dT_2m(dT_2m=dTmn_2m,
                                 T_type='dT2m_meann',
                                 map_extent=map_extent,
                                 regrid_shape=20,
                                 city=city,
                                 south_China_sea=south_China_sea,
                                 output_dir=output_dir,
                                 Global=Global)
예제 #12
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)
예제 #13
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)
예제 #14
0
def gh_uv_VVEL(initial_time=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,
               Global=False):

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

    # micaps data directory
    try:
        data_dir = [
            utl.Cassandra_dir(data_type='high',
                              data_source=model,
                              var_name='HGT',
                              lvl=gh_lev),
            utl.Cassandra_dir(data_type='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)
        ]
    except KeyError:
        raise ValueError('Can not find all directories needed')

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

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

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

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

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

    # prepare data

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

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

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

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

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

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

    VVEL = {
        'lon':
        w.coords['lon'].values[idx_x2],
        'lat':
        w.coords['lat'].values[idx_y2],
        'data':
        np.squeeze(w['data'].values[0, 0, idx_y2[0][0]:(idx_y2[0][-1] + 1),
                                    idx_x2[0][0]:(idx_x2[0][-1] + 1)]),
        'lev':
        uvw_lev
    }

    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)
예제 #15
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)
예제 #16
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)
예제 #17
0
def mslp_gust10m(initTime=None,
                 fhour=6,
                 day_back=0,
                 model='ECMWF',
                 map_ratio=19 / 9,
                 zoom_ratio=20,
                 cntr_pnt=[102, 34],
                 south_China_sea=True,
                 area='全国',
                 city=False,
                 output_dir=None,
                 Global=False):

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

    # micaps data directory
    try:
        data_dir = [
            utl.Cassandra_dir(data_type='surface',
                              data_source=model,
                              var_name='PRMSL'),
            utl.Cassandra_dir(data_type='surface',
                              data_source=model,
                              var_name='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 = get_model_grid(data_dir[0], filename=filename)
    if mslp is None:
        return

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

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

    # prepare data

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

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

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

    #+ to solve the problem of labels on all the contours
    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 = ((mslp['lon'] >
              (map_extent[0] - delt_x)) & (mslp['lon'] <
                                           (map_extent[1] + delt_x)))

    mask3 = ((mslp['lat'] >
              (map_extent[2] - delt_y)) & (mslp['lat'] <
                                           (map_extent[3] + delt_y)))
    #- to solve the problem of labels on all the contours

    mslp = {
        'lon': mslp.coords['lon'].where(mask2, drop=True).values,
        'lat': mslp.coords['lat'].where(mask3, drop=True).values,
        'data': np.squeeze(mslp['data'].where(mask1, drop=True).values),
        'model': model,
        'fhour': fhour,
        'init_time': init_time
    }
    gust = {
        'lon': gust.coords['lon'].where(mask2, drop=True).values,
        'lat': gust.coords['lat'].where(mask3, drop=True).values,
        'data': np.squeeze(gust['data'].where(mask1, drop=True).values),
    }

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

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

    # micaps data directory
    try:
        data_dir = [
            utl.Cassandra_dir(data_type='surface',
                              data_source=model,
                              var_name='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 = get_model_grid(data_dir[0], filename=filename)
    if u10m is None:
        return

    v10m = 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)

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

    mask2 = ((u10m['lon'] >
              (map_extent[0] - delt_x)) & (u10m['lon'] <
                                           (map_extent[1] + delt_x)))

    mask3 = ((u10m['lat'] >
              (map_extent[2] - delt_y)) & (u10m['lat'] <
                                           (map_extent[3] + delt_y)))
    #- to solve the problem of labels on all the contours

    uv10m = {
        'lon': u10m.coords['lon'].where(mask2, drop=True).values,
        'lat': u10m.coords['lat'].where(mask3, drop=True).values,
        'lev': wind_level,
        'udata': np.squeeze(u10m['data'].where(mask1, drop=True).values),
        'vdata': np.squeeze(v10m['data'].where(mask1, drop=True).values),
        'model': model,
        'fhour': fhour,
        'init_time': init_time
    }

    wsp10m = {
        'lon': u10m.coords['lon'].where(mask2, drop=True).values,
        'lat': u10m.coords['lat'].where(mask3, drop=True).values,
        'data': ((uv10m['udata'])**2 + (uv10m['vdata'])**2)**0.5
    }

    elements_graphics.draw_low_level_wind(uv=uv10m,
                                          wsp=wsp10m,
                                          map_extent=map_extent,
                                          regrid_shape=20,
                                          city=city,
                                          south_China_sea=south_China_sea,
                                          output_dir=output_dir,
                                          Global=Global)
예제 #20
0
def dT2m_mx24(initTime=None, fhour=48,
    map_ratio=19/9,zoom_ratio=20,cntr_pnt=[102,34],area=None,south_China_sea=True,
    **kargws):

    data_dir = [utl.Cassandra_dir(data_type='surface',data_source='中央气象台中短期指导',var_name='Tmx_2m')]
    fhours1 = np.arange(fhour-24, fhour+1, 24)
    if(initTime is None):
        initTime=utl.filename_day_back_model(day_back=day_back,fhour=fhour)[0:8]
    filename1 = initTime+'.'+str(fhour).zfill(3)

    if(fhour >= 48):
        fhour2 = fhour-24
        filename2 = initTime+'.'+str(fhour2).zfill(3)
    if(fhour >=36 and fhour < 48):
        fhour2 = fhour-12
        initTime2=(datetime.strptime('20'+initTime,'%Y%m%d%H')-timedelta(hours=12)).strftime('%Y%m%d%H')[2:10]
        filename2=initTime2+'.'+str(fhour2).zfill(3)
    if(fhour >=24 and fhour < 36):
        fhour2 = fhour
        initTime2=(datetime.strptime('20'+initTime,'%Y%m%d%H')-timedelta(hours=24)).strftime('%Y%m%d%H')[2:10]
        filename2=initTime2+'.'+str(fhour2).zfill(3)
    if(fhour < 24):
        print('fhour should > 24')
        return

# prepare data
    T_2m1 = MICAPS_IO.get_model_grid(data_dir[0], filename=filename1)

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

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

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

    draw_SCMOC.draw_dT2m(dTmx2,map_extent=map_extent,south_China_sea=south_China_sea,**kargws)
예제 #21
0
def point_uv_ecgust_tmp_rh_rn_fcst(output_dir=None,
                                   t_range=[0, 60],
                                   t_gap=3,
                                   points={
                                       'lon': [116.3833],
                                       'lat': [39.9],
                                       'altitude': [1351]
                                   },
                                   initTime=None,
                                   day_back=0,
                                   extra_info={
                                       'output_head_name': ' ',
                                       'output_tail_name': ' ',
                                       'point_name': ' '
                                   },
                                   **kwargs):

    #+get all the directories needed
    try:
        dir_rqd = [
            utl.Cassandra_dir(data_type='surface',
                              data_source='中央气象台中短期指导',
                              var_name='T2m'),
            utl.Cassandra_dir(data_type='surface',
                              data_source='中央气象台中短期指导',
                              var_name='u10m'),
            utl.Cassandra_dir(data_type='surface',
                              data_source='中央气象台中短期指导',
                              var_name='v10m'),
            utl.Cassandra_dir(data_type='surface',
                              data_source='中央气象台中短期指导',
                              var_name='rh2m'),
            utl.Cassandra_dir(data_type='surface',
                              data_source='中央气象台中短期指导',
                              var_name='RAIN' + str(t_gap).zfill(2)),
            utl.Cassandra_dir(data_type='surface',
                              data_source='ECMWF',
                              var_name='10M_GUST_3H')
        ]
    except KeyError:
        raise ValueError('Can not find all required directories needed')

    #-get all the directories needed
    if (initTime == None):
        initTime = MICAPS_IO.get_latest_initTime(dir_rqd[0])
        initTime2 = MICAPS_IO.get_latest_initTime(dir_rqd[-1])
        #initTime=utl.filename_day_back_model(day_back=day_back,fhour=0)[0:8]

    fhours = np.arange(t_range[0], t_range[1], t_gap)
    fhours2 = np.arange(t_range[0], t_range[1] + 12, t_gap)
    filenames = [initTime + '.' + str(fhour).zfill(3) for fhour in fhours]
    filenames2 = [initTime2 + '.' + str(fhour).zfill(3) for fhour in fhours2]
    t2m = utl.get_model_points_gy(dir_rqd[0],
                                  filenames,
                                  points,
                                  allExists=False)
    u10m = utl.get_model_points_gy(dir_rqd[1],
                                   filenames,
                                   points,
                                   allExists=False)
    v10m = utl.get_model_points_gy(dir_rqd[2],
                                   filenames,
                                   points,
                                   allExists=False)
    rh = utl.get_model_points_gy(dir_rqd[3],
                                 filenames,
                                 points,
                                 allExists=False)
    rn = utl.get_model_points_gy(dir_rqd[4],
                                 filenames,
                                 points,
                                 allExists=False)
    gust = utl.get_model_points_gy(dir_rqd[5],
                                   filenames2,
                                   points,
                                   allExists=False)

    sta_graphics.draw_point_uv_tmp_rh_rn_gust_fcst(t2m=t2m,
                                                   u10m=u10m,
                                                   v10m=v10m,
                                                   rh=rh,
                                                   rn=rn,
                                                   gust=gust,
                                                   model='中央气象台中短期指导',
                                                   output_dir=output_dir,
                                                   points=points,
                                                   extra_info=extra_info)
예제 #22
0
def Crosssection_Wind_Theta_e_Qv(
        initial_time=None,
        fhour=24,
        levels=[1000, 950, 925, 900, 850, 800, 700, 600, 500, 400, 300, 200],
        day_back=0,
        model='ECMWF',
        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]):

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

    # get filename
    if (initial_time != None):
        filename = utl.model_filename(initial_time, 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)
    if rh is None:
        return
    rh = rh.metpy.parse_cf().squeeze()

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

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

    v2 = get_model_3D_grid(directory=data_dir[2][0:-1],
                           filename=filename,
                           levels=levels,
                           allExists=False)
    if v2 is None:
        return
    v2 = v2.metpy.parse_cf().squeeze()

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

    gh = get_model_grid(data_dir[4], filename=filename)
    if t is None:
        return

    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'])
    for ilvl in levels:
        u2d = u.sel(level=ilvl)
        #u2d['data'].attrs['units']=units.meter/units.second
        v2d = v.sel(level=ilvl)
        #v2d['data'].attrs['units']=units.meter/units.second

        absv2d = mpcalc.absolute_vorticity(
            u2d['data'].values * units.meter / units.second,
            v2d['data'].values * units.meter / units.second, dx, dy,
            y * units.degree)

        if (ilvl == levels[0]):
            absv3d = v2
            absv3d['data'].loc[dict(level=ilvl)] = np.array(absv2d)
        else:
            absv3d['data'].loc[dict(level=ilvl)] = np.array(absv2d)
    absv3d['data'].attrs['units'] = absv2d.units

    #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_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 = cross_section(absv3d, st_point, ed_point)

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

    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_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,
        gh=gh,
        h_pos=h_pos,
        st_point=st_point,
        ed_point=ed_point,
        levels=levels,
        map_extent=map_extent,
        output_dir=output_dir)
예제 #23
0
def Station_Snow_Synthetical_Forecast_From_Cassandra(
        model='ECMWF',
        output_dir=None,
        t_range=[0,84],
        t_gap=3,
        points={'lon':[116.3833], 'lat':[39.9]},
        initTime=None,
        draw_VIS=True,drw_thr=False,
        extra_info={
            'output_head_name':' ',
            'output_tail_name':' ',
            'point_name':' '}
            ):

    #+get all the directories needed
    try:
        dir_rqd=[ 
                "ECMWF_HR/10_METRE_WIND_GUST_IN_THE_LAST_3_HOURS/",
                "ECMWF_HR/10_METRE_WIND_GUST_IN_THE_LAST_6_HOURS/",
                "ECMWF_HR/SNOD/",
                "ECMWF_HR/SDEN/",
                "ECMWF_HR/UGRD_100M/",
                "ECMWF_HR/VGRD_100M/",
                "NWFD_SCMOC/VIS/",
                "NCEP_GFS_HR/SNOD/",
                "ECMWF_HR/SNOW06/",
                utl.Cassandra_dir(
                    data_type='surface',data_source=model,var_name='T2m'),
                utl.Cassandra_dir(
                    data_type='surface',data_source=model,var_name='u10m'),
                utl.Cassandra_dir(
                    data_type='surface',data_source=model,var_name='v10m'),
                'ECMWF_ENSEMBLE/RAW/SNOW06/'
                ]
    except KeyError:
        raise ValueError('Can not find all required directories needed')
    
    try:
        dir_opt=[ 
                utl.Cassandra_dir(
                    data_type='surface',data_source=model,var_name='Td2m')
                ]
        name_opt=['Td2m']
    except:
        dir_opt=[
                utl.Cassandra_dir(data_type='surface',data_source=model,var_name='rh2m')
                ]
        name_opt=['rh2m']
          
    #+get all the directories needed

    if(initTime == None):
        last_file={model:get_latest_initTime(dir_rqd[0]),
                    'SCMOC':get_latest_initTime(dir_rqd[6]),
                    }
    else:
        last_file={model:initTime[0],
                    'SCMOC':initTime[1],
                    }        

    y_s={model:int('20'+last_file[model][0:2]),
        'SCMOC':int('20'+last_file['SCMOC'][0:2])}
    m_s={model:int(last_file[model][2:4]),
        'SCMOC':int(last_file['SCMOC'][2:4])}
    d_s={model:int(last_file[model][4:6]),
        'SCMOC':int(last_file['SCMOC'][4:6])}
    h_s={model:int(last_file[model][6:8]),
        'SCMOC':int(last_file['SCMOC'][6:8])}

    fhours = np.arange(t_range[0], t_range[1], t_gap)

    for ifhour in fhours:
        if (ifhour == fhours[0] ):
            time_all=datetime(y_s['SCMOC'],m_s['SCMOC'],d_s['SCMOC'],h_s['SCMOC'])+timedelta(hours=int(ifhour))
        else:
            time_all=np.append(time_all,datetime(y_s['SCMOC'],m_s['SCMOC'],d_s['SCMOC'],h_s['SCMOC'])+timedelta(hours=int(ifhour)))            

    filenames = [last_file[model]+'.'+str(fhour).zfill(3) for fhour in fhours]
    t2m=utl.get_model_points_gy(dir_rqd[9], filenames, points,allExists=False)
    
    if(name_opt[0] == 'rh2m'):
        rh2m=utl.get_model_points_gy(dir_opt[0], filenames, points,allExists=False)
        Td2m=mpcalc.dewpoint_rh(t2m['data'].values*units('degC'),rh2m['data'].values/100.)
        p_vapor=(rh2m['data'].values/100.)*6.105*(math.e**((17.27*t2m['data'].values/(237.7+t2m['data'].values))))

    if(name_opt[0] == 'Td2m'):
        Td2m=utl.get_model_points_gy(dir_opt[0], filenames, points,allExists=False)        
        rh2m=mpcalc.relative_humidity_from_dewpoint(t2m['data'].values* units('degC'),
                Td2m['data'].values* units('degC'))
        p_vapor=(np.array(rh2m))*6.105*(math.e**((17.27*t2m['data'].values/(237.7+t2m['data'].values))))
        Td2m=np.array(Td2m['data'].values)* units('degC')

    #SN06_ensm=utl.get_model_points_gy(dir_rqd[12], filenames, points,allExists=False)
    '''
    for i in range(0,len(SN06_ensm['forecast_period'])):
        SN06_std=np.std(np.squeeze(SN06_ensm['data'].values[i,:]))
        SN06_mean=np.mean(np.squeeze(SN06_ensm['data'].values[i,:]))
        if(i == 0):
            SN06_01=norm.pdf(0.01, SN06_mean, SN06_std)
            SN06_10=norm.pdf(0.1, SN06_mean, SN06_std)
            SN06_25=norm.pdf(0.25, SN06_mean, SN06_std)
            SN06_50=norm.pdf(0.5, SN06_mean, SN06_std)
            SN06_75=norm.pdf(0.75, SN06_mean, SN06_std)
            SN06_90=norm.pdf(0.9, SN06_mean, SN06_std)
            SN06_99=norm.pdf(0.99, SN06_mean, SN06_std)
        if(i > 0):
            SN06_01=[SN06_01,norm.pdf(0.01, SN06_mean, SN06_std)]
            SN06_10=[SN06_10,norm.pdf(0.1, SN06_mean, SN06_std)]
            SN06_25=[SN06_25,norm.pdf(0.25, SN06_mean, SN06_std)]
            SN06_50=[SN06_50,norm.pdf(0.5, SN06_mean, SN06_std)]
            SN06_75=[SN06_75,norm.pdf(0.75, SN06_mean, SN06_std)]
            SN06_90=[SN06_90,norm.pdf(0.9, SN06_mean, SN06_std)]
            SN06_99=[SN06_99,norm.pdf(0.99, SN06_mean, SN06_std)]

    SN06_ensm_stc={            
        'SN06_01'=SN06_01
        'SN06_10'=SN06_10
        'SN06_25'=SN06_25
        'SN06_50'=SN06_50
        'SN06_75'=SN06_75
        'SN06_90'=SN06_90
        'SN06_99'=SN06_99
        }
    '''
    u10m=utl.get_model_points_gy(dir_rqd[10], filenames, points,allExists=False)
    v10m=utl.get_model_points_gy(dir_rqd[11], filenames, points,allExists=False)
    wsp10m=(u10m['data']**2+v10m['data']**2)**0.5
    AT=1.07*t2m['data'].values+0.2*p_vapor-0.65*wsp10m-2.7
    #https://en.wikipedia.org/wiki/Wind_chill
    TWC=13.12+0.6215*t2m['data'].values-11.37*(wsp10m**0.16)+0.3965*t2m['data'].values*(wsp10m**0.16)

    fhours = np.arange(t_range[0], t_range[1], t_gap)
    filenames = [last_file['SCMOC']+'.'+str(fhour).zfill(3) for fhour in fhours]
    VIS=utl.get_model_points_gy(dir_rqd[6], filenames, points,allExists=False,fill_null=True,Null_value=-0.001)     

    if(last_file['SCMOC'] == last_file[model] and t_range[1] > 72):
        fhours = np.append(np.arange(3,72,3),np.arange(72, (t_range[1]), 6))
        filenames = [last_file[model]+'.'+str(fhour).zfill(3) for fhour in fhours]
        filenames2 = [last_file[model]+'.'+str(fhour).zfill(3) for fhour in fhours]            

    if(last_file['SCMOC'] != last_file[model] and t_range[1] > 60):
        fhours = np.append(np.arange(3,60,3),np.arange(60, (t_range[1]), 6))
        filenames = [last_file[model]+'.'+str(fhour+12).zfill(3) for fhour in fhours]
        filenames2 = [last_file[model]+'.'+str(fhour).zfill(3) for fhour in fhours]

    if(last_file['SCMOC'] != last_file[model] and t_range[1] <= 60):
        fhours = np.arange(t_range[0], t_range[1], t_gap)
        filenames = [last_file[model]+'.'+str(fhour+12).zfill(3) for fhour in fhours]
        filenames2 = [last_file[model]+'.'+str(fhour).zfill(3) for fhour in fhours]

    if(last_file['SCMOC'] == last_file[model] and t_range[1] <= 72):
        fhours = np.arange(t_range[0], t_range[1], t_gap)
        filenames = [last_file[model]+'.'+str(fhour).zfill(3) for fhour in fhours]
        filenames2 = [last_file[model]+'.'+str(fhour).zfill(3) for fhour in fhours]

    SNOD1=utl.get_model_points_gy(dir_rqd[2], filenames2, points,allExists=False)
    SNOD2=utl.get_model_points_gy(dir_rqd[7], filenames2, points,allExists=False)
    SDEN=utl.get_model_points_gy(dir_rqd[3], filenames2, points,allExists=False)
    SN06=utl.get_model_points_gy(dir_rqd[8], filenames2, points,allExists=False)
    u100m=utl.get_model_points_gy(dir_rqd[4], filenames2, points,allExists=False)
    v100m=utl.get_model_points_gy(dir_rqd[5], filenames2, points,allExists=False)
    wsp100m=(u100m['data']**2+v100m['data']**2)**0.5

    if(fhours[-1] < 120):
        gust10m=utl.get_model_points_gy(dir_rqd[0], filenames, points,allExists=False)
    if(fhours[-1] > 120):
        if(last_file['SCMOC'] == last_file[model]):
            fhours = np.arange(0, t_range[1], 6)
            filenames = [last_file[model]+'.'+str(fhour).zfill(3) for fhour in fhours]
        if(last_file['SCMOC'] != last_file[model]):
            fhours = np.arange(0, t_range[1], 6)
            filenames = [last_file[model]+'.'+str(fhour+12).zfill(3) for fhour in fhours]
        gust10m=utl.get_model_points_gy(dir_rqd[1], filenames, points,allExists=False)        
        
    sta_graphics.draw_Station_Snow_Synthetical_Forecast_From_Cassandra(
            TWC=TWC,AT=AT,u10m=u10m,v10m=v10m,u100m=u100m,v100m=v100m,
            gust10m=gust10m,wsp10m=wsp10m,wsp100m=wsp100m,SNOD1=SNOD1,SNOD2=SNOD2,SDEN=SDEN,SN06=SN06,
            draw_VIS=draw_VIS,VIS=VIS,drw_thr=drw_thr,
            time_all=time_all,
            model=model,points=points,
            output_dir=output_dir,extra_info=extra_info)
예제 #24
0
def point_fcst_according_to_3D_field(
        model='ECMWF',
        output_dir=None,
        t_range=[0,60],
        t_gap=3,
        points={'lon':[116.3833], 'lat':[39.9], 'altitude':[1351]},
        initTime=None,obs_ID=54511,day_back=0,
        extra_info={
            'output_head_name':' ',
            'output_tail_name':' ',
            'point_name':' ',
            'drw_thr':True,
            'levels_for_interp':[1000, 950, 925, 900, 850, 800, 700, 600, 500]}
            ):

    try:
        dir_rqd=[utl.Cassandra_dir(data_type='high',data_source=model,var_name='HGT',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='surface',data_source=model,var_name='RAIN'+str(t_gap).zfill(2))]
    except KeyError:
        raise ValueError('Can not find all required directories needed')
    
    #-get all the directories needed
    if(initTime == None):
        initTime = get_latest_initTime(dir_rqd[0][0:-1]+'/850')
        #initTime=utl.filename_day_back_model(day_back=day_back,fhour=0)[0:8]

    directory=dir_rqd[0][0:-1]
    fhours = np.arange(t_range[0], t_range[1], t_gap)
    filenames = [initTime+'.'+str(fhour).zfill(3) for fhour in fhours]
    HGT_4D=get_model_3D_grids(directory=directory,filenames=filenames,levels=extra_info['levels_for_interp'], allExists=False)
    directory=dir_rqd[1][0:-1]
    U_4D=get_model_3D_grids(directory=directory,filenames=filenames,levels=extra_info['levels_for_interp'], allExists=False)
    directory=dir_rqd[2][0:-1]
    V_4D=get_model_3D_grids(directory=directory,filenames=filenames,levels=extra_info['levels_for_interp'], allExists=False)

    directory=dir_rqd[3][0:-1]
    TMP_4D=get_model_3D_grids(directory=directory,filenames=filenames,levels=extra_info['levels_for_interp'], allExists=False)
    
    rn=utl.get_model_points_gy(dir_rqd[4], filenames, points,allExists=False)

    directory=dir_rqd[3][0:-1]
    coords_info_2D=utl.get_model_points_gy(directory+str(extra_info['levels_for_interp'][0])+'/',
                        points=points,filenames=filenames,allExists=False)

    delt_xy=HGT_4D['lon'].values[1]-HGT_4D['lon'].values[0]
    mask = (HGT_4D['lon']<(points['lon']+2*delt_xy))&(HGT_4D['lon']>(points['lon']-2*delt_xy))&(HGT_4D['lat']<(points['lat']+2*delt_xy))&(HGT_4D['lat']>(points['lat']-2*delt_xy))

    HGT_4D_sm=HGT_4D['data'].where(mask,drop=True)
    U_4D_sm=U_4D['data'].where(mask,drop=True)
    V_4D_sm=V_4D['data'].where(mask,drop=True)
    TMP_4D_sm=U_4D['data'].where(mask,drop=True)

    lon_md=np.squeeze(HGT_4D_sm['lon'].values)
    lat_md=np.squeeze(HGT_4D_sm['lat'].values)
    alt_md=np.squeeze(HGT_4D_sm.values*10).flatten()
    time_md=np.squeeze(HGT_4D_sm['forecast_period'].values)

    coords = np.zeros((len(time_md),len(extra_info['levels_for_interp']),len(lat_md),len(lon_md),4))
    coords[...,0]=time_md.reshape((len(time_md),1,1,1))
    coords[...,2] = lat_md.reshape((1,1,len(lat_md),1))
    coords[...,3] = lon_md.reshape((1,1,1,len(lon_md)))
    coords = coords.reshape((alt_md.size,4))
    coords[:,1]=alt_md

    interpolator_U = LinearNDInterpolator(coords,U_4D_sm.values.reshape((U_4D_sm.values.size)),rescale=True)
    interpolator_V = LinearNDInterpolator(coords,V_4D_sm.values.reshape((V_4D_sm.values.size)),rescale=True)
    interpolator_TMP = LinearNDInterpolator(coords,TMP_4D_sm.values.reshape((TMP_4D_sm.values.size)),rescale=True)

    coords2 = np.zeros((len(time_md),1,1,1,4))
    coords2[...,0]=time_md.reshape((len(time_md),1,1,1))
    coords2[...,1]=points['altitude'][0]
    coords2[...,2] = points['lat'][0]
    coords2[...,3] = points['lon'][0]
    coords2 = coords2.reshape((time_md.size,4))

    U_interped=np.squeeze(interpolator_U(coords2))
    V_interped=np.squeeze(interpolator_V(coords2))
    TMP_interped=np.squeeze(interpolator_TMP(coords2))

    U_interped_xr=coords_info_2D.copy()
    U_interped_xr['data'].values=U_interped.reshape(U_interped.size,1,1)
    V_interped_xr=coords_info_2D.copy()
    V_interped_xr['data'].values=V_interped.reshape(V_interped.size,1,1)
    TMP_interped_xr=coords_info_2D.copy()
    TMP_interped_xr['data'].values=TMP_interped.reshape(TMP_interped.size,1,1)
    
    sta_graphics.draw_point_fcst(t2m=TMP_interped_xr,u10m=U_interped_xr,v10m=V_interped_xr,rn=rn,
        model=model,
        output_dir=output_dir,
        points=points,
        extra_info=extra_info
            )        
예제 #25
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)
예제 #26
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)
예제 #27
0
def Time_Crossection_rh_uv_theta_e(
        initTime=None,
        model='ECMWF',
        points={
            'lon': [116.3833],
            'lat': [39.9]
        },
        levels=[1000, 950, 925, 900, 850, 800, 700, 600, 500, 400, 300, 200],
        t_gap=3,
        t_range=[0, 48],
        output_dir=None):

    fhours = np.arange(t_range[0], t_range[1], t_gap)

    # 读数据

    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='')
        ]
    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)
    TMP_2D = TMP_4D.interp(lon=('points', points['lon']),
                           lat=('points', points['lat']))

    filenames = [initTime + '.' + str(fhour).zfill(3) for fhour in fhours]
    u_4D = get_model_3D_grids(directory=data_dir[1][0:-1],
                              filenames=filenames,
                              levels=levels,
                              allExists=False)
    u_2D = u_4D.interp(lon=('points', points['lon']),
                       lat=('points', points['lat']))

    filenames = [initTime + '.' + str(fhour).zfill(3) for fhour in fhours]
    v_4D = get_model_3D_grids(directory=data_dir[2][0:-1],
                              filenames=filenames,
                              levels=levels,
                              allExists=False)
    v_2D = v_4D.interp(lon=('points', points['lon']),
                       lat=('points', points['lat']))

    filenames = [initTime + '.' + str(fhour).zfill(3) for fhour in fhours]
    rh_4D = get_model_3D_grids(directory=data_dir[3][0:-1],
                               filenames=filenames,
                               levels=levels,
                               allExists=False)
    rh_2D = rh_4D.interp(lon=('points', points['lon']),
                         lat=('points', points['lat']))
    rh_2D.attrs['model'] = model
    rh_2D.attrs['points'] = points
    Td_2D = mpcalc.dewpoint_rh(TMP_2D['data'].values * units.celsius,
                               rh_2D['data'].values * units.percent)

    rh, pressure = xr.broadcast(rh_2D['data'], rh_2D['level'])

    Theta_e = mpcalc.equivalent_potential_temperature(
        pressure, TMP_2D['data'].values * units.celsius, Td_2D)

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

    crossection_graphics.draw_Time_Crossection_rh_uv_theta_e(
        rh_2D=rh_2D,
        u_2D=u_2D,
        v_2D=v_2D,
        theta_e_2D=theta_e_2D,
        t_range=t_range,
        output_dir=output_dir)
예제 #28
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)
예제 #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 Crosssection_Wind_Temp_RH(
        initial_time=None,
        fhour=24,
        levels=[1000, 950, 925, 900, 850, 800, 700, 600, 500, 400, 300, 200],
        day_back=0,
        model='ECMWF',
        output_dir=None,
        st_point=[43.5, 111.5],
        ed_point=[33, 125.0],
        map_extent=[70, 140, 15, 55],
        h_pos=[0.125, 0.665, 0.25, 0.2]):

    # micaps data directory
    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 (initial_time != None):
        filename = utl.model_filename(initial_time, 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)
    if rh is None:
        return
    rh = rh.metpy.parse_cf().squeeze()

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

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

    v2 = get_model_3D_grid(directory=data_dir[2][0:-1],
                           filename=filename,
                           levels=levels,
                           allExists=False)
    if v2 is None:
        return
    v2 = v2.metpy.parse_cf().squeeze()

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

    gh = get_model_grid(data_dir[4], filename=filename)

    psfc = get_model_grid(data_dir[5], filename=filename)
    psfc = psfc.metpy.parse_cf().squeeze()

    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)
    #psfc_bdcst=psfc_bdcst.metpy.parse_cf().squeeze()
    if t is None:
        return

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

    #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_psfc=cross.set_coords(('lat', 'lon'))

    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,
        levels=levels,
        map_extent=map_extent,
        model=model,
        output_dir=output_dir)