示例#1
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)
示例#2
0
def TMP850_extreme_uv(initTime=None, fhour=6, day_back=0,model='ECMWF',
    uv_lev=850,tmp_lev=850,
    map_ratio=13/9,zoom_ratio=20,cntr_pnt=[102,34],
    south_China_sea=True,area =None,city=False,output_dir=None,data_source='MICAPS',
    Global=False,**kwargs):

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

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

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

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

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

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

            psfc=CMISS_IO.cimiss_model_by_time('20'+filename[0:8], valid_time=fhour,
                        data_code=utl.CMISS_data_code(data_source=model,var_name='PRS'),
                        fcst_level=0, fcst_ele="PRS", units='Pa')
            psfc['data']=psfc['data']/100.
        except KeyError:
            raise ValueError('Can not find all data needed')                
# set map extent
    tmp_extr=utl.get_var_extr(tmp+273.15,Var_name='t850')

    if(area != None):
        south_China_sea=False

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

    map_extent,delt_x,delt_y=utl.get_map_extent(cntr_pnt,zoom_ratio,map_ratio)
    tmp['data'].values=gaussian_filter(tmp['data'].values,5)
    u=utl.mask_terrian(uv_lev,psfc,u)
    v=utl.mask_terrian(uv_lev,psfc,v)
    tmp=utl.mask_terrian(tmp_lev,psfc,tmp)
    tmp_extr=utl.mask_terrian(tmp_lev,psfc,tmp_extr)
#to solve the problem of labels on all the contours
    tmp=utl.cut_xrdata(map_extent,tmp,delt_x=delt_x,delt_y=delt_y)
    u=utl.cut_xrdata(map_extent,u,delt_x=delt_x,delt_y=delt_y)
    v=utl.cut_xrdata(map_extent,v,delt_x=delt_x,delt_y=delt_y)
    tmp_extr=utl.cut_xrdata(map_extent,tmp_extr,delt_x=delt_x,delt_y=delt_y)

    tmp.attrs['model']=model
    uv=xr.merge([u.rename({'data': 'u'}),v.rename({'data': 'v'})])
#draw
    thermal_graphics.draw_gh_uv_tmp_extr(
        tmp=tmp, tmp_extr=tmp_extr, uv=uv,
        map_extent=map_extent, regrid_shape=20,
        city=city,south_China_sea=south_China_sea,
        output_dir=output_dir,Global=Global)
示例#3
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)
示例#4
0
def tmp_evo(initTime=None,
            tmp_lev=850,
            t_gap=6,
            t_range=[6, 36],
            model='ECMWF',
            data_source='MICAPS',
            map_ratio=14 / 9,
            zoom_ratio=20,
            cntr_pnt=[104, 34],
            south_China_sea=True,
            area=None,
            **kwargs):

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

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

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

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

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

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

    if (area != None):
        cntr_pnt, zoom_ratio = utl.get_map_area(area_name=area)
    map_extent, delt_x, delt_y = utl.get_map_extent(cntr_pnt, zoom_ratio,
                                                    map_ratio)
    tmp = utl.cut_xrdata(map_extent, tmp, delt_x=delt_x, delt_y=delt_y)
    tmp = tmp.rolling({'lon': 3, 'lat': 3}).mean()
    psfc = utl.cut_xrdata(map_extent, psfc, delt_x=delt_x, delt_y=delt_y)
    tmp = utl.mask_terrian(tmp_lev, psfc, tmp)
    tmp.attrs['model'] = model
    coldwave_graphics.draw_tmp_evo(tmp=tmp,
                                   map_extent=map_extent,
                                   south_China_sea=south_China_sea,
                                   **kwargs)
示例#5
0
def gh_uv_tadv(initTime=None, fhour=6, day_back=0,model='ECMWF',
    gh_lev=500,uv_lev=850,
    map_ratio=14/9,zoom_ratio=20,cntr_pnt=[104,34],
    south_China_sea=True,area =None,city=False,output_dir=None,data_source='MICAPS',
    Global=False,**kwargs):

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

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

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

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

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

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

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

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

    map_extent,delt_x,delt_y=utl.get_map_extent(cntr_pnt=cntr_pnt,zoom_ratio=zoom_ratio,map_ratio=map_ratio)

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

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

#draw
    thermal_graphics.draw_gh_uv_tadv(
        tadv=tadv_xr, gh=gh, uv=uv,
        map_extent=map_extent, regrid_shape=20,
        city=city,south_China_sea=south_China_sea,
        output_dir=output_dir,Global=Global)        
示例#6
0
def cu_rain(initTime=None,
            atime=6,
            data_source='MICAPS',
            map_ratio=14 / 9,
            zoom_ratio=20,
            cntr_pnt=[104, 34],
            south_China_sea=True,
            area=None,
            city=False,
            output_dir=None,
            **kwargs):

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

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

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

    if (data_source == 'CIMISS'):
        # get filename
        if (initTime == None):
            initTime = (datetime.now() -
                        timedelta(hours=2 + 8)).strftime('%y%m%d%H')
        filenames = []
        for ihour in range(0, atime):
            filenames.append((datetime.strptime(initTime, '%y%m%d%H') -
                              timedelta(hours=ihour)).strftime('%Y%m%d%H') +
                             '0000')
        try:
            # retrieve data from CIMISS server
            rain = CIMISS_IO.cimiss_analysis_by_times(
                times_str=filenames,
                fcst_ele='PRE',
                data_code=utl.CMISS_data_code(data_source='CLDAS',
                                              var_name='PRE'),
            )
            if rain is None:
                return
            rain = rain.rename({'PRE': 'data'})
        except KeyError:
            raise ValueError('Can not find all data needed')

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

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

    map_extent, delt_x, delt_y = utl.get_map_extent(cntr_pnt=cntr_pnt,
                                                    zoom_ratio=zoom_ratio,
                                                    map_ratio=map_ratio)
    rain = utl.cut_xrdata(map_extent, rain, delt_x=delt_x, delt_y=delt_y)
    rain['data'].values[rain['data'].values == 9999.] = np.nan
    cu_rain = rain.sum('time')
    cu_rain.attrs['obs_time'] = datetime.strptime(initTime, '%y%m%d%H')
    cu_rain.attrs['model'] = 'CLDAS'
    cu_rain.attrs['atime'] = atime
    cu_rain.attrs['var_name'] = '累积降水'
    # draw
    QPF_graphics.draw_obs_cu_rain(rain=cu_rain,
                                  map_extent=map_extent,
                                  regrid_shape=20,
                                  city=city,
                                  south_China_sea=south_China_sea,
                                  output_dir=output_dir)
示例#7
0
def gh_uv_VVEL(initTime=None,
               fhour=6,
               day_back=0,
               model='ECMWF',
               gh_lev=500,
               uvw_lev=850,
               map_ratio=19 / 9,
               zoom_ratio=20,
               cntr_pnt=[102, 34],
               south_China_sea=True,
               area='全国',
               city=False,
               output_dir=None,
               data_source='MICAPS',
               Global=False):

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

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

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

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

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

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

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

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

    if (data_source == 'CIMISS'):

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

        # retrieve data from CMISS server
        try:
            gh = CMISS_IO.cimiss_model_by_time(
                '20' + filename[0:8],
                valid_time=fhour,
                data_code=utl.CMISS_data_code(data_source=model,
                                              var_name='GPH'),
                levattrs={
                    'long_name': 'pressure_level',
                    'units': 'hPa',
                    '_CoordinateAxisType': '-'
                },
                fcst_level=gh_lev,
                fcst_ele="GPH",
                units='gpm')
            if gh is None:
                return
            gh['data'].values = gh['data'].values / 10.

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

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

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

            psfc = CMISS_IO.cimiss_model_by_time('20' + filename[0:8],
                                                 valid_time=fhour,
                                                 data_code=utl.CMISS_data_code(
                                                     data_source=model,
                                                     var_name='PRS'),
                                                 fcst_level=0,
                                                 fcst_ele="PRS",
                                                 units='Pa')
            psfc['data'] = psfc['data'] / 100.
        except KeyError:
            raise ValueError('Can not find all data needed')
    # prepare data

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

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

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

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

    delt_x = (map_extent[1] - map_extent[0]) * 0.2
    delt_y = (map_extent[3] - map_extent[2]) * 0.1
    gh = utl.cut_xrdata(map_extent, gh, delt_x=delt_x, delt_y=delt_y)
    u = utl.cut_xrdata(map_extent, u, delt_x=delt_x, delt_y=delt_y)
    v = utl.cut_xrdata(map_extent, v, delt_x=delt_x, delt_y=delt_y)
    VVEL = utl.cut_xrdata(map_extent, w, delt_x=delt_x, delt_y=delt_y)

    gh.attrs['model'] = model

    VVEL.attrs['units'] = '0.01Pa.s-1'
    uv = xr.merge([u.rename({'data': 'u'}), v.rename({'data': 'v'})])
    #- to solve the problem of labels on all the contours
    dynamic_graphics.draw_gh_uv_VVEL(VVEL=VVEL,
                                     gh=gh,
                                     uv=uv,
                                     map_extent=map_extent,
                                     regrid_shape=20,
                                     city=city,
                                     south_China_sea=south_China_sea,
                                     output_dir=output_dir,
                                     Global=Global)
示例#8
0
def mean24_rh2m_wind10m(initTime=None,
                        fhour=360,
                        model='中央气象台智能网格延伸期预报',
                        map_ratio=14 / 9,
                        zoom_ratio=20,
                        cntr_pnt=[104, 34],
                        data_source='MICAPS',
                        south_China_sea=True,
                        area=None,
                        city=False,
                        output_dir=None,
                        **kwargs):

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

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

        rh2m = MICAPS_IO.get_model_grid(data_dir[0], filename=filename)
        wind10m = MICAPS_IO.get_model_grid(data_dir[1], filename=filename)


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

    if (area != None):
        cntr_pnt, zoom_ratio = utl.get_map_area(area_name=area)
    map_extent, delt_x, delt_y = utl.get_map_extent(cntr_pnt=cntr_pnt,
                                                    zoom_ratio=zoom_ratio,
                                                    map_ratio=map_ratio)
    rh2m = utl.cut_xrdata(map_extent, rh2m, delt_x=delt_x, delt_y=delt_y)
    wind10m = utl.cut_xrdata(map_extent, wind10m, delt_x=delt_x, delt_y=delt_y)

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

    rh2m.attrs['model'] = model
    rh2m.attrs['title'] = '过去24小时平均2米相对湿度及10米风'
    u, v = mpcalc.wind_components(wind10m['speed'].values * units('m/s'),
                                  wind10m['angle'].values * units('degree'))
    u10m = rh2m.copy(deep=True)
    v10m = rh2m.copy(deep=True)
    u10m['data'].values = u.magnitude
    v10m['data'].values = v.magnitude
    uv10m = xr.merge(
        [u10m.rename({'data': 'u10m'}),
         v10m.rename({'data': 'v10m'})])
    elements_graphics.draw_rh2m_wind10m(
        rh2m,
        uv10m,  #T_type='T_mn',
        map_extent=map_extent,
        regrid_shape=20,
        city=city,
        south_China_sea=south_China_sea,
        output_dir=output_dir)
示例#9
0
def fg_uv_tmp(initTime=None, fhour=6, day_back=0,model='ECMWF',
    fg_lev=500,
    map_ratio=16/9,zoom_ratio=20,cntr_pnt=[102,34],
    south_China_sea=True,area = None,city=False,output_dir=None,data_source='MICAPS',
    **kwargs):

    if(area != None):
        south_China_sea=False

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

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

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

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

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

            psfc=CMISS_IO.cimiss_model_by_time('20'+filename[0:8], valid_time=fhour,
                        data_code=utl.CMISS_data_code(data_source=model,var_name='PRS'),
                        fcst_level=0, fcst_ele="PRS", units='Pa')
            psfc['data']=psfc['data']/100.
        except KeyError:
            raise ValueError('Can not find all data needed')

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

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

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

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

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

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

    if(area != None):
        south_China_sea=False

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

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

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

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

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

            psfc=CMISS_IO.cimiss_model_by_time('20'+filename[0:8], valid_time=fhour,
                        data_code=utl.CMISS_data_code(data_source=model,var_name='PRS'),
                        fcst_level=0, fcst_ele="PRS", units='Pa')
            psfc['data']=psfc['data']/100.
        except KeyError:
            raise ValueError('Can not find all data needed')
    # prepare data

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

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

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

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

    div_xr.attrs['units']='s$^{-1}$'
    uv=xr.merge([u.rename({'data': 'u'}),v.rename({'data': 'v'})])
#- to solve the problem of labels on all the contours
    dynamic_graphics.draw_gh_uv_div(
        div=div_xr, gh=gh, uv=uv,
        map_extent=map_extent, regrid_shape=20,
        city=city,south_China_sea=south_China_sea,
        output_dir=output_dir)