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