def PV_Div_uv(initial_time=None, fhour=6, day_back=0,model='ECMWF', map_ratio=19/9,zoom_ratio=20,cntr_pnt=[102,34], levels=[1000, 950, 925, 900, 850, 800, 700,600,500,400,300,250,200,100],lvl_ana=250, Global=False, south_China_sea=True,area = '全国',city=False,output_dir=None ): # 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='')] 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 u=get_model_3D_grid(directory=data_dir[1][0:-1],filename=filename,levels=levels, allExists=False) if u is None: return v=get_model_3D_grid(directory=data_dir[2][0:-1],filename=filename,levels=levels, allExists=False) if v is None: return t=get_model_3D_grid(directory=data_dir[3][0:-1],filename=filename,levels=levels, allExists=False) if t is None: return # 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) 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(), 9, 2)*units('degC') 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 = mpcalc.potential_vorticity_baroclinic(thta, pres[:, None, None], uwnd, vwnd, dx[None, :, :], dy[None, :, :], lats[None, :, None] * units('degrees')) div = 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) 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((lons > map_extent[0]-delt_x) & (lons < map_extent[1]+delt_x)) idx_y1 = np.where((lats > map_extent[2]-delt_y) & (lats < map_extent[3]+delt_y)) #- to solve the problem of labels on all the contours init_time = u.coords['forecast_reference_time'].values pv = { 'lon': lons[idx_x1], 'lat': lats[idx_y1], 'data': np.array(pv)[idx_z1,idx_y1[0][0]:(idx_y1[0][-1]+1),idx_x1[0][0]:(idx_x1[0][-1]+1)], 'lev':str(lvl_ana), 'model':model, 'fhour':fhour, 'init_time':init_time} uv = { 'lon': lons[idx_x1], 'lat': lats[idx_y1], 'udata': np.array(uwnd)[idx_z1,idx_y1[0][0]:(idx_y1[0][-1]+1),idx_x1[0][0]:(idx_x1[0][-1]+1)], 'vdata': np.array(vwnd)[idx_z1,idx_y1[0][0]:(idx_y1[0][-1]+1),idx_x1[0][0]:(idx_x1[0][-1]+1)], 'lev':str(lvl_ana)} div = { 'lon': lons[idx_x1], 'lat': lats[idx_y1], 'data': np.array(div)[idx_z1,idx_y1[0][0]:(idx_y1[0][-1]+1),idx_x1[0][0]:(idx_x1[0][-1]+1)], 'lev':str(lvl_ana)} 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)
def gh_rain(initTime=None, fhour=24, day_back=0, model='ECMWF', gh_lev=500, atime=6, 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): # 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) ] 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 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 CMISS 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 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 != '全国'): 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 = (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 = (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) gh = gh.where(mask1, drop=True) gh.attrs['model'] = model gh.attrs['lev'] = gh_lev rain = rain.where(mask2, drop=True) 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)
def cumulated_precip_evo(initTime=None, t_gap=6, t_range=[6, 36], day_back=0, model='ECMWF', 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): 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) for itime in range(1, len(rain['forecast_period'].values)): rain['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) * 1000 # 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 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) rain = rain.where(mask1, drop=True) rain.attrs['model'] = model rain.attrs['t_gap'] = t_gap # draw QPF_graphics.draw_cumulated_precip_evo(rain=rain, map_extent=map_extent, regrid_shape=20, city=city, south_China_sea=south_China_sea, output_dir=output_dir, Global=Global)
def gh_uv_spfh(initTime=None, fhour=6, day_back=0,model='ECMWF', gh_lev=500,uv_lev=850,spfh_lev=850, map_ratio=14/9,zoom_ratio=20,cntr_pnt=[104,34], south_China_sea=True,area =None,city=False,output_dir=None,data_source='MICAPS', Global=False,**kwargs): if(area != None): south_China_sea=False if(data_source=='MICAPS'): # micaps data directory try: data_dir = [utl.Cassandra_dir(data_type='high',data_source=model,var_name='HGT',lvl=gh_lev), utl.Cassandra_dir(data_type='high',data_source=model,var_name='UGRD',lvl=uv_lev), utl.Cassandra_dir(data_type='high',data_source=model,var_name='VGRD',lvl=uv_lev), utl.Cassandra_dir(data_type='high',data_source=model,var_name='SPFH',lvl=spfh_lev), utl.Cassandra_dir(data_type='surface',data_source=model,var_name='PSFC')] except KeyError: raise ValueError('Can not find all directories needed') # get filename if(initTime != None): filename = utl.model_filename(initTime, fhour) else: filename=utl.filename_day_back_model(day_back=day_back,fhour=fhour) # retrieve data from micaps server gh = MICAPS_IO.get_model_grid(data_dir[0], filename=filename) if gh is None: return u = MICAPS_IO.get_model_grid(data_dir[1], filename=filename) if u is None: return v = MICAPS_IO.get_model_grid(data_dir[2], filename=filename) if v is None: return spfh = MICAPS_IO.get_model_grid(data_dir[3], filename=filename) if spfh is None: return psfc = MICAPS_IO.get_model_grid(data_dir[4], filename=filename) if(data_source == 'CIMISS'): # get filename if(initTime != None): filename = utl.model_filename(initTime, fhour,UTC=True) else: filename=utl.filename_day_back_model(day_back=day_back,fhour=fhour,UTC=True) try: # retrieve data from CIMISS server gh=CMISS_IO.cimiss_model_by_time('20'+filename[0:8],valid_time=fhour, data_code=utl.CMISS_data_code(data_source=model,var_name='GPH'), fcst_level=gh_lev, fcst_ele="GPH", units='gpm') if gh is None: return gh['data'].values=gh['data'].values/10. u=CMISS_IO.cimiss_model_by_time('20'+filename[0:8],valid_time=fhour, data_code=utl.CMISS_data_code(data_source=model,var_name='WIU'), fcst_level=uv_lev, fcst_ele="WIU", units='m/s') if u is None: return v=CMISS_IO.cimiss_model_by_time('20'+filename[0:8],valid_time=fhour, data_code=utl.CMISS_data_code(data_source=model,var_name='WIV'), fcst_level=uv_lev, fcst_ele="WIV", units='m/s') if v is None: return spfh=CMISS_IO.cimiss_model_by_time('20'+filename[0:8], valid_time=fhour, data_code=utl.CMISS_data_code(data_source=model,var_name='SHU'), fcst_level=spfh_lev, fcst_ele="SHU", units='kg.kg-1') if spfh is None: return spfh['data'].values=spfh['data'].values*1000 psfc=CMISS_IO.cimiss_model_by_time('20'+filename[0:8], valid_time=fhour, data_code=utl.CMISS_data_code(data_source=model,var_name='PRS'), fcst_level=0, fcst_ele="PRS", units='Pa') psfc['data']=psfc['data']/100. except KeyError: raise ValueError('Can not find all data needed') # prepare data if(area != None): cntr_pnt,zoom_ratio=utl.get_map_area(area_name=area) map_extent=[0,0,0,0] map_extent[0]=cntr_pnt[0]-zoom_ratio*1*map_ratio map_extent[1]=cntr_pnt[0]+zoom_ratio*1*map_ratio map_extent[2]=cntr_pnt[1]-zoom_ratio*1 map_extent[3]=cntr_pnt[1]+zoom_ratio*1 delt_x=(map_extent[1]-map_extent[0])*0.2 delt_y=(map_extent[3]-map_extent[2])*0.1 #+ to solve the problem of labels on all the contours mask1 = (gh['lon'] > map_extent[0]-delt_x) & (gh['lon'] < map_extent[1]+delt_x) & (gh['lat'] > map_extent[2]-delt_y) & (gh['lat'] < map_extent[3]+delt_y) mask2 = (u['lon'] > map_extent[0]-delt_x) & (u['lon'] < map_extent[1]+delt_x) & (u['lat'] > map_extent[2]-delt_y) & (u['lat'] < map_extent[3]+delt_y) mask3 = (spfh['lon'] > map_extent[0]-delt_x) & (spfh['lon'] < map_extent[1]+delt_x) & (spfh['lat'] > map_extent[2]-delt_y) & (spfh['lat'] < map_extent[3]+delt_y) gh=utl.cut_xrdata(map_extent,gh,delt_x=delt_x,delt_y=delt_y) u=utl.cut_xrdata(map_extent, u, delt_x=delt_x, delt_y=delt_y) v=utl.cut_xrdata(map_extent, v, delt_x=delt_x, delt_y=delt_y) spfh=utl.cut_xrdata(map_extent, spfh, delt_x=delt_x, delt_y=delt_y) gh=utl.mask_terrian(gh_lev,psfc,gh) u=utl.mask_terrian(uv_lev,psfc,u) v=utl.mask_terrian(uv_lev,psfc,v) spfh=utl.mask_terrian(spfh_lev,psfc,spfh) #- to solve the problem of labels on all the contours gh=gh.where(mask1,drop=True) gh.attrs['model']=model u=u.where(mask2,drop=True) v=v.where(mask2,drop=True) spfh=spfh.where(mask3,drop=True) uv=xr.merge([u.rename({'data': 'u'}),v.rename({'data': 'v'})]) moisture_graphics.draw_gh_uv_spfh( spfh=spfh, gh=gh, uv=uv, map_extent=map_extent, regrid_shape=20, city=city,south_China_sea=south_China_sea, output_dir=output_dir,Global=Global)
def isentropic_uv(initial_time=None, fhour=6, day_back=0,model='ECMWF', isentlev=310, map_ratio=19/9,zoom_ratio=20,cntr_pnt=[102,34], levels=[1000, 950, 925, 900, 850, 800, 700,600,500,400,300,250,200,100], Global=False, south_China_sea=True,area = '全国',city=False,output_dir=None ): # micaps data directory 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(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 u=get_model_3D_grid(directory=data_dir[1][0:-1],filename=filename,levels=levels, allExists=False) if u is None: return v=get_model_3D_grid(directory=data_dir[2][0:-1],filename=filename,levels=levels, allExists=False) if v is None: return t=get_model_3D_grid(directory=data_dir[3][0:-1],filename=filename,levels=levels, allExists=False) if t is None: return lats = np.squeeze(rh['lat'].values) lons = np.squeeze(rh['lon'].values) pres = np.array(levels)*100 * units('Pa') tmp = t['data'].values.squeeze()*units('degC') uwnd = u['data'].values.squeeze()*units.meter/units.second vwnd = v['data'].values.squeeze()*units.meter/units.second relh = rh['data'].values.squeeze()*units.meter/units.percent isentlev = isentlev * units.kelvin isent_anal = mpcalc.isentropic_interpolation(isentlev, pres, tmp, relh, uwnd, vwnd, axis=0) isentprs, isentrh, isentu, isentv = isent_anal # prepare data if(area != None): cntr_pnt,zoom_ratio=utl.get_map_area(area_name=area) map_extent=[0,0,0,0] map_extent[0]=cntr_pnt[0]-zoom_ratio*1*map_ratio map_extent[1]=cntr_pnt[0]+zoom_ratio*1*map_ratio map_extent[2]=cntr_pnt[1]-zoom_ratio*1 map_extent[3]=cntr_pnt[1]+zoom_ratio*1 delt_x=(map_extent[1]-map_extent[0])*0.2 delt_y=(map_extent[3]-map_extent[2])*0.1 #+ to solve the problem of labels on all the contours idx_x1 = np.where((lons > map_extent[0]-delt_x) & (lons < map_extent[1]+delt_x)) idx_y1 = np.where((lats > map_extent[2]-delt_y) & (lats < map_extent[3]+delt_y)) #- to solve the problem of labels on all the contours init_time = u.coords['forecast_reference_time'].values isentrh = { 'lon': lons[idx_x1], 'lat': lats[idx_y1], 'data': np.array(isentrh)[0,idx_y1[0][0]:(idx_y1[0][-1]+1),idx_x1[0][0]:(idx_x1[0][-1]+1)], 'lev':str(isentlev), 'model':model, 'fhour':fhour, 'init_time':init_time} isentuv = { 'lon': lons[idx_x1], 'lat': lats[idx_y1], 'isentu': np.array(isentu)[0,idx_y1[0][0]:(idx_y1[0][-1]+1),idx_x1[0][0]:(idx_x1[0][-1]+1)], 'isentv': np.array(isentv)[0,idx_y1[0][0]:(idx_y1[0][-1]+1),idx_x1[0][0]:(idx_x1[0][-1]+1)], 'lev':str(isentlev)} isentprs = { 'lon': lons[idx_x1], 'lat': lats[idx_y1], 'data': np.array(isentprs)[0,idx_y1[0][0]:(idx_y1[0][-1]+1),idx_x1[0][0]:(idx_x1[0][-1]+1)], 'lev':str(isentlev)} isentropic_graphics.draw_isentropic_uv( isentrh=isentrh, isentuv=isentuv, isentprs=isentprs, map_extent=map_extent, regrid_shape=20, city=city,south_China_sea=south_China_sea, output_dir=output_dir,Global=Global )
def compare_gh_uv(anaTime=None, anamodel='GRAPES_GFS', fhour=24, model='ECMWF', data_source='MICAPS', gh_lev=500, uv_lev=850, area=None, map_ratio=14 / 9, zoom_ratio=20, cntr_pnt=[104, 34], **products_kwargs): if (area != None): south_China_sea = False # micaps data directory if (data_source == 'MICAPS'): try: data_dir = [ utl.Cassandra_dir(data_type='high', data_source=model, var_name='HGT', lvl=gh_lev), utl.Cassandra_dir(data_type='high', data_source=model, var_name='UGRD', lvl=uv_lev), utl.Cassandra_dir(data_type='high', data_source=model, var_name='VGRD', lvl=uv_lev), utl.Cassandra_dir(data_type='surface', data_source=model, var_name='PSFC') ] except KeyError: raise ValueError('Can not find all directories needed') # get filename if (anaTime == None): anaTime = MICAPS_IO.get_latest_initTime(data_dir[-1]) initTime = (datetime.strptime('20' + anaTime, '%Y%m%d%H') - timedelta(hours=fhour)).strftime("%Y%m%d%H")[2:10] if (anaTime != None): filename_ana = utl.model_filename(anaTime, 0) initTime = (datetime.strptime('20' + anaTime, '%Y%m%d%H') - timedelta(hours=fhour)).strftime("%Y%m%d%H")[2:10] filename_fcst = utl.model_filename(initTime, fhour) # retrieve data from micaps server gh_ana = MICAPS_IO.get_model_grid(data_dir[0], filename=filename_ana) u_ana = MICAPS_IO.get_model_grid(data_dir[1], filename=filename_ana) v_ana = MICAPS_IO.get_model_grid(data_dir[2], filename=filename_ana) psfc_ana = MICAPS_IO.get_model_grid(data_dir[3], filename=filename_ana) gh_fcst = MICAPS_IO.get_model_grid(data_dir[0], filename=filename_fcst) u_fcst = MICAPS_IO.get_model_grid(data_dir[1], filename=filename_fcst) v_fcst = MICAPS_IO.get_model_grid(data_dir[2], filename=filename_fcst) psfc_fcst = MICAPS_IO.get_model_grid(data_dir[3], filename=filename_fcst) if (data_source == 'CIMISS'): # get filename if (anaTime != None): anaTime = utl.model_filename(anaTime, fhour, UTC=True)[0:8] else: anaTime = utl.filename_day_back_model(fhour=fhour, UTC=True)[0:8] initTime = (datetime.strptime('20' + anaTime, '%Y%m%d%H') - timedelta(hours=fhour)).strftime("%Y%m%d%H")[2:10] try: # retrieve data from CIMISS server gh_ana = CMISS_IO.cimiss_model_by_time( '20' + anaTime, valid_time=0, data_code=utl.CMISS_data_code(data_source=model, var_name='GPH'), levattrs={ 'long_name': 'pressure_level', 'units': 'hPa', '_CoordinateAxisType': '-' }, fcst_level=gh_lev, fcst_ele="GPH", units='gpm') gh_ana['data'].values = gh_ana['data'].values / 10. gh_fcst = CMISS_IO.cimiss_model_by_time( '20' + initTime, valid_time=fhour, data_code=utl.CMISS_data_code(data_source=model, var_name='GPH'), levattrs={ 'long_name': 'pressure_level', 'units': 'hPa', '_CoordinateAxisType': '-' }, fcst_level=gh_lev, fcst_ele="GPH", units='gpm') gh_fcst['data'].values = gh_fcst['data'].values / 10. u_ana = CMISS_IO.cimiss_model_by_time( '20' + anaTime, valid_time=0, data_code=utl.CMISS_data_code(data_source=model, var_name='WIU'), levattrs={ 'long_name': 'pressure_level', 'units': 'hPa', '_CoordinateAxisType': '-' }, fcst_level=uv_lev, fcst_ele="WIU", units='m/s') u_fcst = CMISS_IO.cimiss_model_by_time( '20' + initTime, valid_time=fhour, data_code=utl.CMISS_data_code(data_source=model, var_name='WIU'), levattrs={ 'long_name': 'pressure_level', 'units': 'hPa', '_CoordinateAxisType': '-' }, fcst_level=uv_lev, fcst_ele="WIU", units='m/s') v_ana = CMISS_IO.cimiss_model_by_time( '20' + anaTime, valid_time=0, data_code=utl.CMISS_data_code(data_source=model, var_name='WIV'), levattrs={ 'long_name': 'pressure_level', 'units': 'hPa', '_CoordinateAxisType': '-' }, fcst_level=uv_lev, fcst_ele="WIV", units='m/s') v_fcst = CMISS_IO.cimiss_model_by_time( '20' + initTime, valid_time=fhour, data_code=utl.CMISS_data_code(data_source=model, var_name='WIV'), levattrs={ 'long_name': 'pressure_level', 'units': 'hPa', '_CoordinateAxisType': '-' }, fcst_level=uv_lev, fcst_ele="WIV", units='m/s') psfc_ana = CMISS_IO.cimiss_model_by_time( '20' + anaTime, valid_time=0, data_code=utl.CMISS_data_code(data_source=model, var_name='PRS'), levattrs={ 'long_name': 'sea_surface_pressure', 'units': 'hPa', '_CoordinateAxisType': '-' }, fcst_level=0, fcst_ele="PRS", units='Pa') psfc_fcst = CMISS_IO.cimiss_model_by_time( '20' + initTime, valid_time=fhour, data_code=utl.CMISS_data_code(data_source=model, var_name='PRS'), levattrs={ 'long_name': 'sea_surface_pressure', 'units': 'hPa', '_CoordinateAxisType': '-' }, fcst_level=0, fcst_ele="PRS", units='Pa') psfc_ana['data'] = psfc_ana['data'] / 100. psfc_fcst['data'] = psfc_fcst['data'] / 100. except KeyError: raise ValueError('Can not find all data needed') # prepare data if (all([ gh_ana, u_ana, v_ana, psfc_ana, gh_fcst, u_fcst, v_fcst, psfc_fcst ]) is False): print('some data is not avaliable') return if (area != None): cntr_pnt, zoom_ratio = utl.get_map_area(area_name=area) map_extent = [0, 0, 0, 0] map_extent[0] = cntr_pnt[0] - zoom_ratio * 1 * map_ratio map_extent[1] = cntr_pnt[0] + zoom_ratio * 1 * map_ratio map_extent[2] = cntr_pnt[1] - zoom_ratio * 1 map_extent[3] = cntr_pnt[1] + zoom_ratio * 1 gh_ana = utl.cut_xrdata(map_extent, gh_ana) u_ana = utl.cut_xrdata(map_extent, u_ana) v_ana = utl.cut_xrdata(map_extent, v_ana) psfc_ana = utl.cut_xrdata(map_extent, psfc_ana) gh_fcst = utl.cut_xrdata(map_extent, gh_fcst) u_fcst = utl.cut_xrdata(map_extent, u_fcst) v_fcst = utl.cut_xrdata(map_extent, v_fcst) psfc_fcst = utl.cut_xrdata(map_extent, psfc_fcst) u_ana = utl.mask_terrian(uv_lev, psfc_ana, u_ana) v_ana = utl.mask_terrian(uv_lev, psfc_ana, v_ana) gh_ana = utl.mask_terrian(gh_lev, psfc_ana, gh_ana) u_fcst = utl.mask_terrian(uv_lev, psfc_fcst, u_fcst) v_fcst = utl.mask_terrian(uv_lev, psfc_fcst, v_fcst) gh_fcst = utl.mask_terrian(gh_lev, psfc_fcst, gh_fcst) uv_ana = xr.merge( [u_ana.rename({'data': 'u'}), v_ana.rename({'data': 'v'})]) uv_fcst = xr.merge( [u_fcst.rename({'data': 'u'}), v_fcst.rename({'data': 'v'})]) gh_ana.attrs = {'model_name': model} u_ana.attrs = {'model_name': model} v_ana.attrs = {'model_name': model} gh_fcst.attrs = {'model_name': model} u_fcst.attrs = {'model_name': model} v_fcst.attrs = {'model_name': model} vs_ana.draw_compare_gh_uv(gh_ana=gh_ana, uv_ana=uv_ana, gh_fcst=gh_fcst, uv_fcst=uv_fcst, map_extent=map_extent, **products_kwargs)
def gh_rain(initial_time=None, fhour=24, day_back=0, model='ECMWF', gh_lev='500', atime=6, map_ratio=19 / 9, zoom_ratio=20, cntr_pnt=[102, 34], south_China_sea=True, area='全国', city=False, output_dir=None, Global=False): if (area != '全国'): south_China_sea = False # micaps data directory try: data_dir = [ utl.Cassandra_dir(data_type='high', data_source=model, var_name='HGT', lvl=gh_lev), utl.Cassandra_dir(data_type='surface', data_source=model, var_name='RAIN' + '%02d' % atime) ] except KeyError: raise ValueError('Can not find all directories needed') # get filename if (initial_time != None): filename = utl.model_filename(initial_time, fhour) if (atime > 3): filename_gh = utl.model_filename(initial_time, 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 = get_model_grid(data_dir[0], filename=filename_gh) if gh is None: return rain = get_model_grid(data_dir[1], filename=filename) init_time = gh.coords['forecast_reference_time'].values # prepare data if (area != None): cntr_pnt, zoom_ratio = utl.get_map_area(area_name=area) map_extent = [0, 0, 0, 0] map_extent[0] = cntr_pnt[0] - zoom_ratio * 1 * map_ratio map_extent[1] = cntr_pnt[0] + zoom_ratio * 1 * map_ratio map_extent[2] = cntr_pnt[1] - zoom_ratio * 1 map_extent[3] = cntr_pnt[1] + zoom_ratio * 1 delt_x = (map_extent[1] - map_extent[0]) * 0.2 delt_y = (map_extent[3] - map_extent[2]) * 0.1 #+ to solve the problem of labels on all the contours idx_x1 = np.where((gh.coords['lon'].values > map_extent[0] - delt_x) & (gh.coords['lon'].values < map_extent[1] + delt_x)) idx_y1 = np.where((gh.coords['lat'].values > map_extent[2] - delt_y) & (gh.coords['lat'].values < map_extent[3] + delt_y)) idx_x2 = np.where((rain.coords['lon'].values > map_extent[0] - delt_x) & (rain.coords['lon'].values < map_extent[1] + delt_x)) idx_y2 = np.where((rain.coords['lat'].values > map_extent[2] - delt_y) & (rain.coords['lat'].values < map_extent[3] + delt_y)) #- to solve the problem of labels on all the contours gh = { 'lon': gh.coords['lon'].values[idx_x1], 'lat': gh.coords['lat'].values[idx_y1], 'data': gh['data'].values[0, 0, idx_y1[0][0]:(idx_y1[0][-1] + 1), idx_x1[0][0]:(idx_x1[0][-1] + 1)], 'lev': gh_lev, 'model': model, 'fhour': fhour, 'init_time': init_time } rain = { 'lon': rain.coords['lon'].values[idx_x2], 'lat': rain.coords['lat'].values[idx_y2], 'data': copy.deepcopy(rain['data'].values[0, idx_y2[0][0]:(idx_y2[0][-1] + 1), idx_x2[0][0]:(idx_x2[0][-1] + 1)]) } QPF_graphics.draw_gh_rain(rain=rain, gh=gh, atime=atime, map_extent=map_extent, regrid_shape=20, city=city, south_China_sea=south_China_sea, output_dir=output_dir, Global=Global)
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') 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') 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)
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 T2m_mslp_uv10m(initTime=None, fhour=6, day_back=0, model='ECMWF', map_ratio=19 / 9, zoom_ratio=20, cntr_pnt=[102, 34], data_source='MICAPS', south_China_sea=True, area='全国', city=False, output_dir=None, Global=False): # prepare data if (data_source == 'MICAPS'): try: data_dir = [ utl.Cassandra_dir(data_type='surface', data_source=model, var_name='PRMSL'), utl.Cassandra_dir(data_type='surface', data_source=model, var_name='u10m'), utl.Cassandra_dir(data_type='surface', data_source=model, var_name='v10m'), utl.Cassandra_dir(data_type='surface', data_source=model, var_name='T2m') ] except KeyError: raise ValueError('Can not find all directories needed') # get filename if (initTime != None): filename = utl.model_filename(initTime, fhour) else: filename = utl.filename_day_back_model(day_back=day_back, fhour=fhour) # retrieve data from micaps server mslp = MICAPS_IO.get_model_grid(data_dir[0], filename=filename) u10m = MICAPS_IO.get_model_grid(data_dir[1], filename=filename) v10m = MICAPS_IO.get_model_grid(data_dir[2], filename=filename) t2m = 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 CMISS server t2m = CMISS_IO.cimiss_model_by_time('20' + filename[0:8], valid_time=fhour, data_code=utl.CMISS_data_code( data_source=model, var_name='TEF2'), fcst_level=0, fcst_ele="TEF2", units='K') t2m['data'].values = t2m['data'].values - 273.15 u10m = CMISS_IO.cimiss_model_by_time('20' + filename[0:8], valid_time=fhour, data_code=utl.CMISS_data_code( data_source=model, var_name='WIU10'), fcst_level=0, fcst_ele="WIU10", units='m/s') v10m = CMISS_IO.cimiss_model_by_time('20' + filename[0:8], valid_time=fhour, data_code=utl.CMISS_data_code( data_source=model, var_name='WIV10'), fcst_level=0, fcst_ele="WIV10", units='m/s') if (model == 'ECMWF'): mslp = CMISS_IO.cimiss_model_by_time( '20' + filename[0:8], valid_time=fhour, data_code=utl.CMISS_data_code(data_source=model, var_name='GSSP'), levattrs={ 'long_name': 'Mean_sea_level', 'units': 'm', '_CoordinateAxisType': '-' }, fcst_level=0, fcst_ele="GSSP", units='Pa') else: mslp = CMISS_IO.cimiss_model_by_time( '20' + filename[0:8], valid_time=fhour, data_code=utl.CMISS_data_code(data_source=model, var_name='SSP'), levattrs={ 'long_name': 'Mean_sea_level', 'units': 'm', '_CoordinateAxisType': '-' }, fcst_level=0, fcst_ele="SSP", units='Pa') if mslp is None: return mslp['data'] = mslp['data'] / 100. except KeyError: raise ValueError('Can not find all data needed') if (area != None): cntr_pnt, zoom_ratio = utl.get_map_area(area_name=area) if (area != '全国'): south_China_sea = False map_extent = [0, 0, 0, 0] map_extent[0] = cntr_pnt[0] - zoom_ratio * 1 * map_ratio map_extent[1] = cntr_pnt[0] + zoom_ratio * 1 * map_ratio map_extent[2] = cntr_pnt[1] - zoom_ratio * 1 map_extent[3] = cntr_pnt[1] + zoom_ratio * 1 delt_x = (map_extent[1] - map_extent[0]) * 0.2 delt_y = (map_extent[3] - map_extent[2]) * 0.1 #+ to solve the problem of labels on all the contours mask1 = (t2m['lon'] > map_extent[0] - delt_x) & ( t2m['lon'] < map_extent[1] + delt_x) & ( t2m['lat'] > map_extent[2] - delt_y) & (t2m['lat'] < map_extent[3] + delt_y) mask2 = (u10m['lon'] > map_extent[0] - delt_x) & ( u10m['lon'] < map_extent[1] + delt_x) & ( u10m['lat'] > map_extent[2] - delt_y) & (u10m['lat'] < map_extent[3] + delt_y) mask3 = (mslp['lon'] > map_extent[0] - delt_x) & ( mslp['lon'] < map_extent[1] + delt_x) & ( mslp['lat'] > map_extent[2] - delt_y) & (mslp['lat'] < map_extent[3] + delt_y) t2m = t2m.where(mask1, drop=True) t2m.attrs['model'] = model u10m = u10m.where(mask2, drop=True) v10m = v10m.where(mask2, drop=True) uv10m = xr.merge( [u10m.rename({'data': 'u10m'}), v10m.rename({'data': 'v10m'})]) mslp = mslp.where(mask3, drop=True) mslp.attrs['model'] = model # draw elements_graphics.draw_T2m_mslp_uv10m(t2m=t2m, mslp=mslp, uv10m=uv10m, map_extent=map_extent, regrid_shape=20, city=city, south_China_sea=south_China_sea, output_dir=output_dir, Global=Global)
def mslp_gust10m_uv10m(initTime=None, fhour=6, day_back=0, t_gap=3, model='ECMWF', map_ratio=19 / 9, zoom_ratio=20, cntr_pnt=[102, 34], data_source='MICAPS', south_China_sea=True, area='全国', city=False, output_dir=None, Global=False): # micaps data directory if (data_source == 'MICAPS'): try: data_dir = [ utl.Cassandra_dir(data_type='surface', data_source=model, var_name='PRMSL'), utl.Cassandra_dir(data_type='surface', data_source=model, var_name='10M_GUST_' + '%i' % t_gap + 'H'), 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 directories needed') # get filename if (initTime != None): filename = utl.model_filename(initTime, fhour) else: filename = utl.filename_day_back_model(day_back=day_back, fhour=fhour) # retrieve data from micaps server mslp = MICAPS_IO.get_model_grid(data_dir[0], filename=filename) gust = MICAPS_IO.get_model_grid(data_dir[1], filename=filename) u10m = MICAPS_IO.get_model_grid(data_dir[2], filename=filename) v10m = 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: gust = CMISS_IO.cimiss_model_by_time( '20' + filename[0:8], valid_time=fhour, data_code=utl.CMISS_data_code(data_source=model, var_name='GUST10T' + '%i' % t_gap), fcst_level=0, fcst_ele="GUST10T" + '%i' % t_gap, units='m/s') u10m = CMISS_IO.cimiss_model_by_time('20' + filename[0:8], valid_time=fhour, data_code=utl.CMISS_data_code( data_source=model, var_name='WIU10'), fcst_level=0, fcst_ele="WIU10", units='m/s') v10m = CMISS_IO.cimiss_model_by_time('20' + filename[0:8], valid_time=fhour, data_code=utl.CMISS_data_code( data_source=model, var_name='WIV10'), fcst_level=0, fcst_ele="WIV10", units='m/s') if (model == 'ECMWF'): mslp = CMISS_IO.cimiss_model_by_time( '20' + filename[0:8], valid_time=fhour, data_code=utl.CMISS_data_code(data_source=model, var_name='GSSP'), fcst_level=0, fcst_ele="GSSP", units='Pa') else: mslp = CMISS_IO.cimiss_model_by_time( '20' + filename[0:8], valid_time=fhour, data_code=utl.CMISS_data_code(data_source=model, var_name='SSP'), fcst_level=0, fcst_ele="SSP", units='Pa') mslp['data'] = mslp['data'] / 100. except KeyError: raise ValueError('Can not find all data needed') # prepare data if (area != '全国'): cntr_pnt, zoom_ratio = utl.get_map_area(area_name=area) south_China_sea = False map_extent = [0, 0, 0, 0] map_extent[0] = cntr_pnt[0] - zoom_ratio * 1 * map_ratio map_extent[1] = cntr_pnt[0] + zoom_ratio * 1 * map_ratio map_extent[2] = cntr_pnt[1] - zoom_ratio * 1 map_extent[3] = cntr_pnt[1] + zoom_ratio * 1 delt_x = (map_extent[1] - map_extent[0]) * 0.2 delt_y = (map_extent[3] - map_extent[2]) * 0.1 #+ to solve the problem of labels on all the contours mask1 = (gust['lon'] > map_extent[0] - delt_x) & ( gust['lon'] < map_extent[1] + delt_x) & ( gust['lat'] > map_extent[2] - delt_y) & (gust['lat'] < map_extent[3] + delt_y) mask2 = (mslp['lon'] > map_extent[0] - delt_x) & ( mslp['lon'] < map_extent[1] + delt_x) & ( mslp['lat'] > map_extent[2] - delt_y) & (mslp['lat'] < map_extent[3] + delt_y) mask3 = (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) gust = gust.where(mask1, drop=True) gust.attrs['t_gap'] = t_gap mslp = mslp.where(mask2, drop=True) mslp.attrs['model'] = model u10m = u10m.where(mask3, drop=True) v10m = v10m.where(mask2, drop=True) uv10m = xr.merge( [u10m.rename({'data': 'u10m'}), v10m.rename({'data': 'v10m'})]) elements_graphics.draw_mslp_gust10m_uv10m(gust=gust, mslp=mslp, uv10m=uv10m, map_extent=map_extent, regrid_shape=20, city=city, south_China_sea=south_China_sea, output_dir=output_dir, Global=Global)
def T2m_mean24(initTime=None, fhour=24, day_back=0, model='中央气象台中短期指导', map_ratio=19 / 9, zoom_ratio=20, cntr_pnt=[102, 34], data_source='MICAPS', south_China_sea=True, area='全国', city=False, output_dir=None, Global=False): # prepare data if (data_source == 'MICAPS'): data_dir = [ utl.Cassandra_dir(data_type='surface', data_source=model, var_name='T2m') ] fhours = np.arange(fhour - 21, fhour + 1, 3) if (initTime is None): initTime = utl.filename_day_back_model(day_back=day_back, fhour=fhour)[0:8] filenames = [initTime + '.' + str(fhour).zfill(3) for fhour in fhours] T_2m = MICAPS_IO.get_model_grids(data_dir[0], filenames=filenames) Tmean_2m = T_2m.isel(time=[-1]).copy() Tmean_2m['data'].values[0, :, :] = np.mean(T_2m['data'].values, axis=0) if (data_source == 'CIMISS'): # get filename fhours = np.arange(fhour - 18, fhour + 1, 3) if (initTime is None): initTime = utl.filename_day_back_model(day_back=day_back, fhour=fhour, UTC=True)[0:8] T_2m = CMISS_IO.cimiss_model_by_times('20' + initTime, valid_times=fhours, data_code=utl.CMISS_data_code( data_source=model, var_name='TEF2'), fcst_level=0, fcst_ele='TEF2', units='K', allExists=False) T_2m['data'].values = T_2m['data'].values - 273.15 Tmean_2m = T_2m.isel(time=[-1]).copy() Tmean_2m['data'].values[0, :, :] = np.min(T_2m['data'].values, axis=0) # set map extent if (area != '全国'): south_China_sea = False if (area != None): cntr_pnt, zoom_ratio = utl.get_map_area(area_name=area) map_extent = [0, 0, 0, 0] map_extent[0] = cntr_pnt[0] - zoom_ratio * 1 * map_ratio map_extent[1] = cntr_pnt[0] + zoom_ratio * 1 * map_ratio map_extent[2] = cntr_pnt[1] - zoom_ratio * 1 map_extent[3] = cntr_pnt[1] + zoom_ratio * 1 delt_x = (map_extent[1] - map_extent[0]) * 0.2 delt_y = (map_extent[3] - map_extent[2]) * 0.1 #+ to solve the problem of labels on all the contours mask1 = (Tmean_2m['lon'] > map_extent[0] - delt_x) & ( Tmean_2m['lon'] < map_extent[1] + delt_x) & ( Tmean_2m['lat'] > map_extent[2] - delt_y) & ( Tmean_2m['lat'] < map_extent[3] + delt_y) Tmean_2m = Tmean_2m.where(mask1, drop=True) #- to solve the problem of labels on all the contours Tmean_2m.attrs['model'] = model Tmean_2m.attrs['title'] = '2米平均温度' elements_graphics.draw_T_2m(T_2m=Tmean_2m, T_type='T_mean', map_extent=map_extent, regrid_shape=20, city=city, south_China_sea=south_China_sea, output_dir=output_dir, Global=Global)
def T2m_zero_heatwaves(initTime=None, fhour=24, day_back=0, model='中央气象台中短期指导', map_ratio=19 / 9, zoom_ratio=20, cntr_pnt=[102, 34], data_source='MICAPS', south_China_sea=True, area='全国', city=False, output_dir=None, Global=False): # prepare data if (data_source == 'MICAPS'): try: data_dir = [ utl.Cassandra_dir(data_type='surface', data_source=model, var_name='T2m') ] except KeyError: raise ValueError('Can not find all directories needed') if (initTime != None): filename = utl.model_filename(initTime, fhour) else: filename = utl.filename_day_back_model(day_back=day_back, fhour=fhour) T_2m = MICAPS_IO.get_model_grid(data_dir[0], filename=filename) if T_2m is None: return if (data_source == 'CIMISS'): # get filename if (initTime != None): filename = utl.model_filename(initTime, fhour, UTC=True) else: filename = utl.filename_day_back_model(day_back=day_back, fhour=fhour, UTC=True) try: # retrieve data from CMISS server T_2m = CMISS_IO.cimiss_model_by_time('20' + filename[0:8], valid_time=fhour, data_code=utl.CMISS_data_code( data_source=model, var_name='TEF2'), fcst_level=0, fcst_ele='TEF2', units='K') if T_2m is None: return T_2m['data'].values = T_2m['data'].values - 273.15 except KeyError: raise ValueError('Can not find all data needed') # set map extent if (area != '全国'): south_China_sea = False if (area != None): cntr_pnt, zoom_ratio = utl.get_map_area(area_name=area) map_extent = [0, 0, 0, 0] map_extent[0] = cntr_pnt[0] - zoom_ratio * 1 * map_ratio map_extent[1] = cntr_pnt[0] + zoom_ratio * 1 * map_ratio map_extent[2] = cntr_pnt[1] - zoom_ratio * 1 map_extent[3] = cntr_pnt[1] + zoom_ratio * 1 delt_x = (map_extent[1] - map_extent[0]) * 0.2 delt_y = (map_extent[3] - map_extent[2]) * 0.1 #+ to solve the problem of labels on all the contours mask1 = (T_2m['lon'] > map_extent[0] - delt_x) & ( T_2m['lon'] < map_extent[1] + delt_x) & ( T_2m['lat'] > map_extent[2] - delt_y) & (T_2m['lat'] < map_extent[3] + delt_y) T_2m = T_2m.where(mask1, drop=True) #- to solve the problem of labels on all the contours T_2m.attrs['model'] = model T_2m.attrs['title'] = '2米温度' 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)
def T2m_mx24(initTime=None, fhour=24, day_back=0, model='中央气象台中短期指导', map_ratio=19 / 9, zoom_ratio=20, cntr_pnt=[102, 34], data_source='MICAPS', area=None, **kargws): # prepare data if (data_source == 'MICAPS'): try: data_dir = [ utl.Cassandra_dir(data_type='surface', data_source=model, var_name='Tmx_2m') ] if (initTime != None): filename = utl.model_filename(initTime, fhour) else: filename = utl.filename_day_back_model(day_back=day_back, fhour=fhour) Tmx_2m = MICAPS_IO.get_model_grid(data_dir[0], filename=filename) except: try: data_dir = [ utl.Cassandra_dir(data_type='surface', data_source=model, var_name='Tmx3_2m') ] except: data_dir = [ utl.Cassandra_dir(data_type='surface', data_source=model, var_name='T2m') ] fhours = np.arange(fhour - 21, fhour + 1, 3) if (initTime is None): initTime = utl.filename_day_back_model(day_back=day_back, fhour=fhour)[0:8] filenames = [ initTime + '.' + str(fhour).zfill(3) for fhour in fhours ] T_2m = MICAPS_IO.get_model_grids(data_dir[0], filenames=filenames) Tmx_2m = T_2m.isel(time=[-1]).copy() Tmx_2m['data'].values[0, :, :] = np.max(T_2m['data'].values, axis=0) if (data_source == 'CIMISS'): # get filename fhours = np.arange(fhour - 18, fhour + 1, 3) if (initTime is None): initTime = utl.filename_day_back_model(day_back=day_back, fhour=fhour, UTC=True)[0:8] try: # retrieve data from CMISS server T_2m = CMISS_IO.cimiss_model_by_times( '20' + initTime, valid_times=fhours, data_code=utl.CMISS_data_code(data_source=model, var_name='MX2T6'), fcst_level=0, fcst_ele='MX2T6', units='K', allExists=False) except: T_2m = CMISS_IO.cimiss_model_by_times( '20' + initTime, valid_times=fhours, data_code=utl.CMISS_data_code(data_source=model, var_name='TEF2'), fcst_level=0, fcst_ele='TEF2', units='K', allExists=False) if T_2m is None: return T_2m['data'].values = T_2m['data'].values - 273.15 Tmx_2m = T_2m.isel(time=[-1]).copy() Tmx_2m['data'].values[0, :, :] = np.max(T_2m['data'].values, axis=0) # set map extent if (area != '全国'): south_China_sea = False if (area != None): cntr_pnt, zoom_ratio = utl.get_map_area(area_name=area) map_extent = [0, 0, 0, 0] map_extent[0] = cntr_pnt[0] - zoom_ratio * 1 * map_ratio map_extent[1] = cntr_pnt[0] + zoom_ratio * 1 * map_ratio map_extent[2] = cntr_pnt[1] - zoom_ratio * 1 map_extent[3] = cntr_pnt[1] + zoom_ratio * 1 delt_x = (map_extent[1] - map_extent[0]) * 0.2 delt_y = (map_extent[3] - map_extent[2]) * 0.1 #+ to solve the problem of labels on all the contours mask1 = (Tmx_2m['lon'] > map_extent[0] - delt_x) & ( Tmx_2m['lon'] < map_extent[1] + delt_x) & ( Tmx_2m['lat'] > map_extent[2] - delt_y) & (Tmx_2m['lat'] < map_extent[3] + delt_y) Tmx_2m = Tmx_2m.where(mask1, drop=True) #- to solve the problem of labels on all the contours Tmx2 = xr.DataArray(np.squeeze(Tmx_2m['data'].values, axis=0), name='data', coords={ 'time': ('time', [Tmx_2m['time'].values[0]]), 'fhour': ('time', [fhour]), 'lat': ('lat', Tmx_2m['lat'].values), 'lon': ('lon', Tmx_2m['lon'].values) }, dims=('time', 'lat', 'lon'), attrs={ 'model_name': '中央气象台中短期指导', 'var_name': '2米最高温度', 'vhours': 24 }) draw_SCMOC.draw_TMP2(TMP2=Tmx2, map_extent=map_extent, **kargws)
def wind_temp_rn_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, 400, 300, 250, 200, 150 ], map_ratio=19 / 9, zoom_ratio=1, south_China_sea=False, area=None, city=False, output_dir=None, bkgd_type='satellite', data_source='MICAPS', **kwargs): # micaps data directory if (area != None): south_China_sea = False # prepare data if (area != None): 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='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='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 TMP = MICAPS_IO.get_model_3D_grid(directory=data_dir[1][0:-1], filename=filename, levels=levels, allExists=False) if TMP 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]] #maskout area delt_xy = TMP['lon'].values[1] - TMP['lon'].values[0] #+ to solve the problem of labels on all the contours mask1 = (TMP['lon'] > map_extent[0] - delt_xy) & ( TMP['lon'] < map_extent[1] + delt_xy) & ( TMP['lat'] > map_extent[2] - delt_xy) & (TMP['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 TMP = TMP.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(TMP['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_TMP = 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) TMP_sta = interpolator_TMP(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'])) 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'])) 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)]) TMP_sta[np.isnan(TMP_sta)] = np.squeeze( np.array(t2m_2D)[np.isnan(TMP_sta)]) else: wsp_sta[np.isnan(wsp_sta)] = np.squeeze(wsp10m_2D)[np.isnan( wsp_sta)] TMP_sta[np.isnan(TMP_sta)] = np.squeeze( np.array(t2m_2D))[np.isnan(TMP_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)] for ista in range(0, len(wsp10m_sta)): if (wsp10m_sta[ista] > wsp_sm_sta[ista]): wsp_sm_sta[ista] = wsp10m_sta[ista] 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'], 'TMP': np.array(TMP_sta), 'U': np.squeeze(np.array(u_sta)), 'V': np.squeeze(np.array(v_sta)) } fcst_info = gh.coords local_scale_graphics.draw_wind_temp_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=output_dir)
def isentropic_uv(initTime=None, fhour=6, day_back=0, model='ECMWF', data_source='MICAPS', isentlev=310, 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 ], Global=False, south_China_sea=True, area=None, city=False, output_dir=None, **kwargs): # micaps data directory if (data_source == 'MICAPS'): try: data_dir = [ utl.Cassandra_dir(data_type='high', data_source=model, var_name='RH', lvl=''), 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( init_time_str='20' + filename[0:8], valid_time=fhour, data_code=utl.CMISS_data_code(data_source=model, var_name='RHU'), fcst_levels=levels, fcst_ele="RHU", units='%') if rh is None: return u = CMISS_IO.cimiss_model_3D_grid( init_time_str='20' + filename[0:8], valid_time=fhour, data_code=utl.CMISS_data_code(data_source=model, var_name='WIU'), fcst_levels=levels, fcst_ele="WIU", units='m/s') if u is None: return v = CMISS_IO.cimiss_model_3D_grid( init_time_str='20' + filename[0:8], valid_time=fhour, data_code=utl.CMISS_data_code(data_source=model, var_name='WIV'), fcst_levels=levels, fcst_ele="WIV", units='m/s') if v is None: return t = CMISS_IO.cimiss_model_3D_grid( init_time_str='20' + filename[0:8], valid_time=fhour, data_code=utl.CMISS_data_code(data_source=model, var_name='TEM'), fcst_levels=levels, fcst_ele="TEM", units='K') if t is None: return t['data'].values = t['data'].values - 273.15 except KeyError: raise ValueError('Can not find all data needed') lats = np.squeeze(rh['lat'].values) lons = np.squeeze(rh['lon'].values) pres = np.array(levels) * 100 * units('Pa') tmp = t['data'].values.squeeze() * units('degC') uwnd = u['data'].values.squeeze() * units.meter / units.second vwnd = v['data'].values.squeeze() * units.meter / units.second relh = rh['data'].values.squeeze() * units.meter / units.percent isentlev = isentlev * units.kelvin isent_anal = mpcalc.isentropic_interpolation(isentlev, pres, tmp, relh, uwnd, vwnd, axis=0, bottom_up_search=False) isentprs, isentrh, isentu, isentv = isent_anal # prepare data if (area != None): cntr_pnt, zoom_ratio = utl.get_map_area(area_name=area) map_extent = [0, 0, 0, 0] map_extent[0] = cntr_pnt[0] - zoom_ratio * 1 * map_ratio map_extent[1] = cntr_pnt[0] + zoom_ratio * 1 * map_ratio map_extent[2] = cntr_pnt[1] - zoom_ratio * 1 map_extent[3] = cntr_pnt[1] + zoom_ratio * 1 delt_x = (map_extent[1] - map_extent[0]) * 0.2 delt_y = (map_extent[3] - map_extent[2]) * 0.1 idx_x1 = np.where((lons > map_extent[0] - delt_x) & (lons < map_extent[1] + delt_x)) idx_y1 = np.where((lats > map_extent[2] - delt_y) & (lats < map_extent[3] + delt_y)) mask1 = ((t['lon'] > map_extent[0] - delt_x) & (t['lon'] < map_extent[1] + delt_x) & (t['lat'] > map_extent[2] - delt_y) & (t['lat'] < map_extent[3] + delt_y) & (t['level'] == t['level'].values[0])) isentrh1 = t.where(mask1, drop=True) isentrh1['data'].values = [[ np.array(isentrh)[0, idx_y1[0][0]:(idx_y1[0][-1] + 1), idx_x1[0][0]:(idx_x1[0][-1] + 1)] ]] isentrh1.attrs['model'] = model isentrh1 = isentrh1.assign_coords(level=[np.array(isentlev)]) isentu1 = isentrh1.copy() isentu1['data'].values = [[ np.array(isentu)[0, idx_y1[0][0]:(idx_y1[0][-1] + 1), idx_x1[0][0]:(idx_x1[0][-1] + 1)] ]] isentv1 = isentrh1.copy() isentv1['data'].values = [[ np.array(isentv)[0, idx_y1[0][0]:(idx_y1[0][-1] + 1), idx_x1[0][0]:(idx_x1[0][-1] + 1)] ]] isentuv1 = xr.merge([ isentu1.rename({'data': 'isentu'}), isentv1.rename({'data': 'isentv'}) ]) isentprs1 = isentrh1.copy() isentprs1['data'].values = [[ np.array(isentprs)[0, idx_y1[0][0]:(idx_y1[0][-1] + 1), idx_x1[0][0]:(idx_x1[0][-1] + 1)] ]] isentropic_graphics.draw_isentropic_uv(isentrh=isentrh1, isentuv=isentuv1, isentprs=isentprs1, map_extent=map_extent, regrid_shape=20, city=city, south_China_sea=south_China_sea, output_dir=output_dir, Global=Global)
def gh_uv_thetae(initTime=None, fhour=6, day_back=0,model='ECMWF', gh_lev=500,uv_lev=850,th_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): # 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='THETAE',lvl=th_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 thetae = MICAPS_IO.get_model_grid(data_dir[3], filename=filename) if thetae 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 thetae=CMISS_IO.cimiss_model_by_time('20'+filename[0:8],valid_time=fhour, data_code=utl.CMISS_data_code(data_source=model,var_name='PPT'), levattrs={'long_name':'pressure_level', 'units':'hPa', '_CoordinateAxisType':'-'}, fcst_level=th_lev, fcst_ele="PPT", units='K') if thetae is None: return except KeyError: raise ValueError('Can not find all data needed') # set map extent if(area != '全国'): south_China_sea=False if(area != None): cntr_pnt,zoom_ratio=utl.get_map_area(area_name=area) map_extent=[0,0,0,0] map_extent[0]=cntr_pnt[0]-zoom_ratio*1*map_ratio map_extent[1]=cntr_pnt[0]+zoom_ratio*1*map_ratio map_extent[2]=cntr_pnt[1]-zoom_ratio*1 map_extent[3]=cntr_pnt[1]+zoom_ratio*1 delt_x=(map_extent[1]-map_extent[0])*0.2 delt_y=(map_extent[3]-map_extent[2])*0.1 # to solve the problem of labels on all the contours mask1 = (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 = (thetae['lon'] > map_extent[0]-delt_x) & (thetae['lon'] < map_extent[1]+delt_x) & (thetae['lat'] > map_extent[2]-delt_y) & (thetae['lat'] < map_extent[3]+delt_y) 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'})]) thetae=thetae.where(mask3,drop=True) # draw thermal_graphics.draw_gh_uv_thetae( thetae=thetae, 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 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 mslp_rain_snow(initial_time=None, fhour=24, day_back=0, model='ECMWF', atime=6, map_ratio=19 / 9, zoom_ratio=20, cntr_pnt=[102, 34], south_China_sea=True, area='全国', city=False, output_dir=None, Global=False): if (area != '全国'): south_China_sea = False # micaps data directory try: data_dir = [ utl.Cassandra_dir(data_type='surface', data_source=model, var_name='PRMSL'), utl.Cassandra_dir(data_type='surface', data_source=model, var_name='RAIN' + '%02d' % atime), utl.Cassandra_dir(data_type='surface', data_source=model, var_name='SNOW' + '%02d' % atime), ] except KeyError: raise ValueError('Can not find all directories needed') # get filename if (initial_time != None): filename = utl.model_filename(initial_time, fhour) if (atime > 3): filename_mslp = utl.model_filename(initial_time, 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) snow = get_model_grid(data_dir[2], filename=filename) init_time = mslp.coords['forecast_reference_time'].values # prepare data if (area != None): cntr_pnt, zoom_ratio = utl.get_map_area(area_name=area) map_extent = [0, 0, 0, 0] map_extent[0] = cntr_pnt[0] - zoom_ratio * 1 * map_ratio map_extent[1] = cntr_pnt[0] + zoom_ratio * 1 * map_ratio map_extent[2] = cntr_pnt[1] - zoom_ratio * 1 map_extent[3] = cntr_pnt[1] + zoom_ratio * 1 delt_x = (map_extent[1] - map_extent[0]) * 0.2 delt_y = (map_extent[3] - map_extent[2]) * 0.1 #+ to solve the problem of labels on all the contours idx_x1 = np.where((mslp.coords['lon'].values > map_extent[0] - delt_x) & (mslp.coords['lon'].values < map_extent[1] + delt_x)) idx_y1 = np.where((mslp.coords['lat'].values > map_extent[2] - delt_y) & (mslp.coords['lat'].values < map_extent[3] + delt_y)) idx_x2 = np.where((rain.coords['lon'].values > map_extent[0] - delt_x) & (rain.coords['lon'].values < map_extent[1] + delt_x)) idx_y2 = np.where((rain.coords['lat'].values > map_extent[2] - delt_y) & (rain.coords['lat'].values < map_extent[3] + delt_y)) #- to solve the problem of labels on all the contours rain_snow = xr.merge( [rain.rename({'data': 'rain'}), snow.rename({'data': 'snow'})]) mask1 = ((rain_snow['rain'] - rain_snow['snow']) > 0.1) & (rain_snow['snow'] > 0.1) sleet = rain_snow['rain'].where(mask1) mask2 = ((rain_snow['rain'] - rain_snow['snow']) < 0.1) & (rain_snow['snow'] > 0.1) snw = rain_snow['snow'].where(mask2) mask3 = (rain_snow['rain'] > 0.1) & (rain_snow['snow'] < 0.1) rn = rain_snow['rain'].where(mask3) mslp = { 'lon': mslp.coords['lon'].values[idx_x1], 'lat': mslp.coords['lat'].values[idx_y1], 'data': mslp['data'].values[0, idx_y1[0][0]:(idx_y1[0][-1] + 1), idx_x1[0][0]:(idx_x1[0][-1] + 1)], 'model': model, 'fhour': fhour, 'init_time': init_time } rain = { 'lon': rn.coords['lon'].values[idx_x2], 'lat': rn.coords['lat'].values[idx_y2], 'data': rn.values[0, idx_y2[0][0]:(idx_y2[0][-1] + 1), idx_x2[0][0]:(idx_x2[0][-1] + 1)] } snow = { 'lon': snw.coords['lon'].values[idx_x2], 'lat': snw.coords['lat'].values[idx_y2], 'data': snw.values[0, idx_y2[0][0]:(idx_y2[0][-1] + 1), idx_x2[0][0]:(idx_x2[0][-1] + 1)] } sleet = { 'lon': sleet.coords['lon'].values[idx_x2], 'lat': sleet.coords['lat'].values[idx_y2], 'data': sleet.values[0, idx_y2[0][0]:(idx_y2[0][-1] + 1), idx_x2[0][0]:(idx_x2[0][-1] + 1)] } QPF_graphics.draw_mslp_rain_snow(rain=rain, snow=snow, sleet=sleet, mslp=mslp, atime=atime, map_extent=map_extent, regrid_shape=20, city=city, south_China_sea=south_China_sea, output_dir=output_dir, Global=Global)
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='GRAPES_GFS', 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'] = 'GRAPES_GFS' 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)
def Miller_Composite_Chart(initial_time=None, fhour=24, day_back=0, model='GRAPES_GFS', map_ratio=19 / 9, zoom_ratio=20, cntr_pnt=[102, 34], Global=False, south_China_sea=True, area='全国', city=False, output_dir=None): # micaps data directory try: data_dir = [ utl.Cassandra_dir(data_type='high', data_source=model, var_name='RH', lvl='700'), utl.Cassandra_dir(data_type='high', data_source=model, var_name='UGRD', lvl='300'), utl.Cassandra_dir(data_type='high', data_source=model, var_name='VGRD', lvl='300'), utl.Cassandra_dir(data_type='high', data_source=model, var_name='UGRD', lvl='500'), utl.Cassandra_dir(data_type='high', data_source=model, var_name='VGRD', lvl='500'), utl.Cassandra_dir(data_type='high', data_source=model, var_name='UGRD', lvl='850'), utl.Cassandra_dir(data_type='high', data_source=model, var_name='VGRD', lvl='850'), utl.Cassandra_dir(data_type='high', data_source=model, var_name='TMP', lvl='700'), utl.Cassandra_dir(data_type='high', data_source=model, var_name='HGT', lvl='500'), utl.Cassandra_dir(data_type='surface', data_source=model, var_name='BLI'), utl.Cassandra_dir(data_type='surface', data_source=model, var_name='Td2m'), utl.Cassandra_dir(data_type='surface', data_source=model, var_name='PRMSL') ] except KeyError: raise ValueError('Can not find all directories needed') # get filename if (initial_time != None): filename = utl.model_filename(initial_time, fhour) filename2 = utl.model_filename(initial_time, fhour - 12) else: filename = utl.filename_day_back_model(day_back=day_back, fhour=fhour) filename2 = utl.filename_day_back_model(day_back=day_back, fhour=fhour - 12) # retrieve data from micaps server rh_700 = get_model_grid(directory=data_dir[0], filename=filename) if rh_700 is None: return u_300 = get_model_grid(directory=data_dir[1], filename=filename) if u_300 is None: return v_300 = get_model_grid(directory=data_dir[2], filename=filename) if v_300 is None: return u_500 = get_model_grid(directory=data_dir[3], filename=filename) if u_500 is None: return v_500 = get_model_grid(directory=data_dir[4], filename=filename) if v_500 is None: return u_850 = get_model_grid(directory=data_dir[5], filename=filename) if u_850 is None: return v_850 = get_model_grid(directory=data_dir[6], filename=filename) if v_850 is None: return t_700 = get_model_grid(directory=data_dir[7], filename=filename) if t_700 is None: return hgt_500 = get_model_grid(directory=data_dir[8], filename=filename) if hgt_500 is None: return hgt_500_2 = get_model_grid(directory=data_dir[8], filename=filename2) if hgt_500_2 is None: return BLI = get_model_grid(directory=data_dir[9], filename=filename) if BLI is None: return Td2m = get_model_grid(directory=data_dir[10], filename=filename) if Td2m is None: return PRMSL = get_model_grid(directory=data_dir[11], filename=filename) if PRMSL is None: return PRMSL2 = get_model_grid(directory=data_dir[11], filename=filename2) if PRMSL2 is None: return lats = np.squeeze(rh_700['lat'].values) lons = np.squeeze(rh_700['lon'].values) x, y = np.meshgrid(rh_700['lon'], rh_700['lat']) tmp_700 = t_700['data'].values.squeeze() * units('degC') u_300 = (u_300['data'].values.squeeze() * units.meter / units.second).to('kt') v_300 = (v_300['data'].values.squeeze() * units.meter / units.second).to('kt') u_500 = (u_500['data'].values.squeeze() * units.meter / units.second).to('kt') v_500 = (v_500['data'].values.squeeze() * units.meter / units.second).to('kt') u_850 = (u_850['data'].values.squeeze() * units.meter / units.second).to('kt') v_850 = (v_850['data'].values.squeeze() * units.meter / units.second).to('kt') hgt_500 = (hgt_500['data'].values.squeeze()) * 10 / 9.8 * units.meter rh_700 = rh_700['data'].values.squeeze() lifted_index = BLI['data'].values.squeeze() * units.kelvin Td_sfc = Td2m['data'].values.squeeze() * units('degC') dx, dy = mpcalc.lat_lon_grid_deltas(lons, lats) avor_500 = mpcalc.absolute_vorticity(u_500, v_500, dx, dy, y * units.degree) pmsl = PRMSL['data'].values.squeeze() * units('hPa') hgt_500_2 = (hgt_500_2['data'].values.squeeze()) * 10 / 9.8 * units.meter pmsl2 = PRMSL2['data'].values.squeeze() * units('hPa') # 500 hPa CVA vort_adv_500 = mpcalc.advection( avor_500, [u_500.to('m/s'), v_500.to('m/s')], (dx, dy), dim_order='yx') * 1e9 vort_adv_500_smooth = gaussian_filter(vort_adv_500, 4) wspd_300 = gaussian_filter(mpcalc.wind_speed(u_300, v_300), 5) wspd_500 = gaussian_filter(mpcalc.wind_speed(u_500, v_500), 5) wspd_850 = gaussian_filter(mpcalc.wind_speed(u_850, v_850), 5) Td_dep_700 = tmp_700 - mpcalc.dewpoint_rh(tmp_700, rh_700 / 100.) pmsl_change = pmsl - pmsl2 hgt_500_change = hgt_500 - hgt_500_2 mask_500 = ma.masked_less_equal(wspd_500, 0.66 * np.max(wspd_500)).mask u_500[mask_500] = np.nan v_500[mask_500] = np.nan # 300 hPa mask_300 = ma.masked_less_equal(wspd_300, 0.66 * np.max(wspd_300)).mask u_300[mask_300] = np.nan v_300[mask_300] = np.nan # 850 hPa mask_850 = ma.masked_less_equal(wspd_850, 0.66 * np.max(wspd_850)).mask u_850[mask_850] = np.nan v_850[mask_850] = np.nan # prepare data if (area != None): cntr_pnt, zoom_ratio = utl.get_map_area(area_name=area) map_extent = [0, 0, 0, 0] map_extent[0] = cntr_pnt[0] - zoom_ratio * 1 * map_ratio map_extent[1] = cntr_pnt[0] + zoom_ratio * 1 * map_ratio map_extent[2] = cntr_pnt[1] - zoom_ratio * 1 map_extent[3] = cntr_pnt[1] + zoom_ratio * 1 delt_x = (map_extent[1] - map_extent[0]) * 0.2 delt_y = (map_extent[3] - map_extent[2]) * 0.1 #+ to solve the problem of labels on all the contours idx_x1 = np.where((lons > map_extent[0] - delt_x) & (lons < map_extent[1] + delt_x)) idx_y1 = np.where((lats > map_extent[2] - delt_y) & (lats < map_extent[3] + delt_y)) fcst_info = { 'lon': lons, 'lat': lats, 'fhour': fhour, 'model': model, 'init_time': t_700.coords['forecast_reference_time'].values } synthetical_graphics.draw_Miller_Composite_Chart( fcst_info=fcst_info, u_300=u_300, v_300=v_300, u_500=u_500, v_500=v_500, u_850=u_850, v_850=v_850, pmsl_change=pmsl_change, hgt_500_change=hgt_500_change, Td_dep_700=Td_dep_700, Td_sfc=Td_sfc, pmsl=pmsl, lifted_index=lifted_index, vort_adv_500_smooth=vort_adv_500_smooth, map_extent=map_extent, add_china=True, city=False, south_China_sea=True, output_dir=None, Global=False)
import numpy as np import matplotlib as mpl from nmc_met_graphics.cmap.cm import make_cmap import nmc_met_graphics.cmap.cm as cm_collected import nmc_met_map.lib.utility as utl utl.filename_day_back_model(day_back=0.5, fhour=0, UTC=False) a = [5, 10, 15, 20, 25, 30, 35, 40, 50, 60, 70, 80, 90] # Normalize the bin between 0 and 1 (uneven bins are important here) norm = [(float(i) - min(a)) / (max(a) - min(a)) for i in a] # Color tuple for every bin C = np.array([[145, 0, 34], [166, 17, 34], [189, 46, 36], [212, 78, 51], [227, 109, 66], [250, 143, 67], [252, 173, 88], [254, 216, 132], [255, 242, 170], [230, 244, 157], [188, 227, 120], [113, 181, 92], [38, 145, 75], [0, 87, 46]]) # Create a tuple for every color indicating the normalized # position on the colormap and the assigned color. COLORS = [] for i, n in enumerate(norm): COLORS.append((n, np.array(C[i]) / 255.)) # Create the colormap cmap = mpl.colors.LinearSegmentedColormap.from_list("rh", COLORS)
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=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='WVFL',lvl=wvfl_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 wvfl = MICAPS_IO.get_model_grid(data_dir[3], filename=filename) if wvfl 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 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') wvfl['data'].values=wvfl['data'].values*10. if wvfl 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=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) wvfl=utl.cut_xrdata(map_extent, wvfl, 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) wvfl=utl.mask_terrian(wvfl_lev,psfc,wvfl) gh.attrs['model']=model uv=xr.merge([u.rename({'data': 'u'}),v.rename({'data': 'v'})]) 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)
def gh_uv_tmp(initTime=None, fhour=6, day_back=0,model='ECMWF', gh_lev=500,uv_lev=850,tmp_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=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 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=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 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) 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) gh=utl.mask_terrian(gh_lev,psfc,gh) u=utl.mask_terrian(uv_lev,psfc,u) tmp=utl.mask_terrian(tmp_lev,psfc,tmp) gh.attrs['model']=model uv=xr.merge([u.rename({'data': 'u'}),v.rename({'data': 'v'})]) #draw thermal_graphics.draw_gh_uv_tmp( tmp=tmp, 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 gh_uv_thetae(initial_time=None, fhour=6, day_back=0,model='ECMWF', gh_lev='500',uv_lev='850',th_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=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='THETAE',lvl=th_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 thetae = get_model_grid(data_dir[3], filename=filename) if thetae is None: return 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((thetae.coords['lon'].values > map_extent[0]-delt_x) & (thetae.coords['lon'].values < map_extent[1]+delt_x)) idx_y2 = np.where((thetae.coords['lat'].values > map_extent[2]-delt_y) & (thetae.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':uv_lev} thetae = {'lon': thetae.coords['lon'].values[idx_x2], 'lat': thetae.coords['lat'].values[idx_y2], 'data': thetae['data'].values[0,0,idx_y2[0][0]:(idx_y2[0][-1]+1),idx_x2[0][0]:(idx_x2[0][-1]+1)], 'lev':th_lev} thermal_graphics.draw_gh_uv_thetae( thetae=thetae, 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 mslp_rain_snow(initTime=None, fhour=24, day_back=0, model='ECMWF', atime=6, 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): ''' 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 CMISS 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 != '全国'): 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)
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, 400, 300, 250, 200, 150 ], map_ratio=14 / 9, zoom_ratio=1, south_China_sea=False, area=None, city=False, output_dir=None, bkgd_type='satellite', data_source='MICAPS', **kwargs): # micaps data directory if (area != None): south_China_sea = False # prepare data if (area != None): 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 CIMISS 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=output_dir)
def T2m_all_type(initial_time=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(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 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)
def gh_uv_wsp(initial_time=None, fhour=6, day_back=0,model='ECMWF', gh_lev='500',uv_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): """ Analysis 500hPa geopotential height, 850hPa wind barbs, and convective precipitation ratio. :param initial_time: initial time, string or datetime ojbect. like '18042008' or datetime(2018, 4, 20, 8). :param fhour: forecast hour. :param model: model name. :param gh_lev: geopotential height level. :param uv_lev: wind level :param map_extent: [lonmin, lonmax, latmin, latmax], longitude and latitude range. :return: None. """ 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=uv_lev), utl.Cassandra_dir(data_type='high',data_source=model,var_name='VGRD',lvl=uv_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 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((u.coords['lon'].values > map_extent[0]-delt_x) & (u.coords['lon'].values < map_extent[1]+delt_x)) idx_y2 = np.where((u.coords['lat'].values > map_extent[2]-delt_y) & (u.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':uv_lev} wsp = {'lon': u.coords['lon'].values[idx_x2], 'lat': u.coords['lat'].values[idx_y2], 'data': np.squeeze((u['data'].values[0,0,idx_y2[0][0]:(idx_y2[0][-1]+1),idx_x2[0][0]:(idx_x2[0][-1]+1)])**2+ (v['data'].values[0,0,idx_y2[0][0]:(idx_y2[0][-1]+1),idx_x2[0][0]:(idx_x2[0][-1]+1)])**2)**0.5} 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)