def sta_SkewT(model='ECMWF',points={'lon':[116.3833], 'lat':[39.9]}, levels=[1000, 950, 925, 900, 850, 800, 700,600,500,400,300,250,200,150,100], fhour=3,output_dir=None): try: data_dir = [utl.Cassandra_dir(data_type='high',data_source=model,var_name='TMP',lvl=''), utl.Cassandra_dir(data_type='high',data_source=model,var_name='UGRD',lvl=''), utl.Cassandra_dir(data_type='high',data_source=model,var_name='VGRD',lvl=''), utl.Cassandra_dir(data_type='high',data_source=model,var_name='HGT',lvl=''), utl.Cassandra_dir(data_type='high',data_source=model,var_name='RH',lvl='')] except KeyError: raise ValueError('Can not find all directories needed') # # 度数据 initTime = get_latest_initTime(data_dir[0][0:-1]+"850") filename = initTime+'.'+str(fhour).zfill(3) TMP_4D=get_model_3D_grid(directory=data_dir[0][0:-1],filename=filename,levels=levels, allExists=False) TMP_2D=TMP_4D.interp(lon=('points', points['lon']), lat=('points', points['lat'])) u_4D=get_model_3D_grid(directory=data_dir[1][0:-1],filename=filename,levels=levels, allExists=False) u_2D=u_4D.interp(lon=('points', points['lon']), lat=('points', points['lat'])) v_4D=get_model_3D_grid(directory=data_dir[2][0:-1],filename=filename,levels=levels, allExists=False) v_2D=v_4D.interp(lon=('points', points['lon']), lat=('points', points['lat'])) HGT_4D=get_model_3D_grid(directory=data_dir[3][0:-1],filename=filename,levels=levels, allExists=False) HGT_2D=HGT_4D.interp(lon=('points', points['lon']), lat=('points', points['lat'])) HGT_2D.attrs['model']=model HGT_2D.attrs['points']=points RH_4D=get_model_3D_grid(directory=data_dir[4][0:-1],filename=filename,levels=levels, allExists=False) RH_2D=RH_4D.interp(lon=('points', points['lon']), lat=('points', points['lat'])) wind_dir_2D=mpcalc.wind_direction(u_2D['data'].values* units.meter / units.second, v_2D['data'].values* units.meter / units.second) wsp10m_2D=(u_2D['data']**2+v_2D['data']**2)**0.5 Td2m=mpcalc.dewpoint_rh(TMP_2D['data'].values*units('degC'),RH_2D['data'].values/100.) p = np.squeeze(levels) * units.hPa T = np.squeeze(TMP_2D['data'].values) * units.degC Td = np.squeeze(np.array(Td2m)) * units.degC wind_speed = np.squeeze(wsp10m_2D.values) * units.meter wind_dir = np.squeeze(np.array(wind_dir_2D)) * units.degrees u=np.squeeze(u_2D['data'].values)* units.meter v=np.squeeze(v_2D['data'].values)* units.meter fcst_info= xr.DataArray(np.array(u_2D['data'].values), coords=u_2D['data'].coords, dims=u_2D['data'].dims, attrs={'points': points, 'model': model}) sta_graphics.draw_sta_skewT( p=p,T=T,Td=Td,wind_speed=wind_speed,wind_dir=wind_dir,u=u,v=v, fcst_info=fcst_info)
def point_fcst( model='ECMWF', output_dir=None, t_range=[0,60], t_gap=3, points={'lon':[116.3833], 'lat':[39.9], 'altitude':[1351]}, initTime=None,day_back=0, extra_info={ 'output_head_name':' ', 'output_tail_name':' ', 'point_name':' '} ): #+get all the directories needed try: dir_rqd=[utl.Cassandra_dir(data_type='surface',data_source=model,var_name='T2m'), utl.Cassandra_dir(data_type='surface',data_source=model,var_name='u10m'), utl.Cassandra_dir(data_type='surface',data_source=model,var_name='v10m'), utl.Cassandra_dir(data_type='surface',data_source=model,var_name='RAIN'+str(t_gap).zfill(2))] except KeyError: raise ValueError('Can not find all required directories needed') #-get all the directories needed if(initTime == None): initTime = get_latest_initTime(dir_rqd[0]) #initTime=utl.filename_day_back_model(day_back=day_back,fhour=0)[0:8] directory=dir_rqd[0][0:-1] fhours = np.arange(t_range[0], t_range[1], t_gap) filenames = [initTime+'.'+str(fhour).zfill(3) for fhour in fhours] t2m=utl.get_model_points_gy(dir_rqd[0], filenames, points,allExists=False) u10m=utl.get_model_points_gy(dir_rqd[1], filenames, points,allExists=False) v10m=utl.get_model_points_gy(dir_rqd[2], filenames, points,allExists=False) rn=utl.get_model_points_gy(dir_rqd[3], filenames, points,allExists=False) sta_graphics.draw_point_fcst(t2m=t2m,u10m=u10m,v10m=v10m,rn=rn, model=model, output_dir=output_dir, points=points, extra_info=extra_info )
def point_fcst_rn_according_to_3D_field_box_line(output_dir=None, t_range=[6, 60], t_gap=6, points={ 'lon': [116.3833], 'lat': [39.9] }, initTime=None, obs_ID=54511, extra_info={ 'output_head_name': ' ', 'output_tail_name': ' ', 'point_name': ' ', 'drw_thr': True }, **kwargs): try: dir_rqd = utl.Cassandra_dir(data_type='surface', data_source='ECMWF_ENSEMBLE', var_name='RAIN' + str(t_gap).zfill(2) + '_RAW') except KeyError: raise ValueError('Can not find all required directories needed') #-get all the directories needed if (initTime == None): initTime = get_latest_initTime(dir_rqd) #initTime=utl.filename_day_back_model(day_back=day_back,fhour=0)[0:8] if (t_range[1] > 72): fhours = np.append(np.arange(t_range[0], 72, t_gap), np.arange(72, t_range[1], 6)) else: fhours = np.arange(t_range[0], t_range[1], t_gap) filenames = [initTime + '.' + str(fhour).zfill(3) for fhour in fhours] rn = utl.get_model_points_gy(dir_rqd, filenames, points, allExists=False) rn.attrs['model'] = 'ECMWF_ENSEMBLE' Ensemble_graphics.box_line_rn(rn=rn, points=points, extra_info=extra_info, output_dir=output_dir)
def Time_Crossection_rh_uv_Temp( initTime=None, model='ECMWF', points={ 'lon': [116.3833], 'lat': [39.9] }, levels=[1000, 950, 925, 900, 850, 800, 700, 600, 500, 400, 300, 200], t_gap=3, t_range=[0, 48], output_dir=None): fhours = np.arange(t_range[0], t_range[1], t_gap) # 读数据 try: data_dir = [ utl.Cassandra_dir(data_type='high', data_source=model, var_name='TMP', lvl=''), utl.Cassandra_dir(data_type='high', data_source=model, var_name='UGRD', lvl=''), utl.Cassandra_dir(data_type='high', data_source=model, var_name='VGRD', lvl=''), utl.Cassandra_dir(data_type='high', data_source=model, var_name='RH', lvl=''), utl.Cassandra_dir(data_type='surface', data_source=model, var_name='PSFC') ] except KeyError: raise ValueError('Can not find all directories needed') if (initTime == None): initTime = get_latest_initTime(data_dir[0][0:-1] + "850") filenames = [initTime + '.' + str(fhour).zfill(3) for fhour in fhours] TMP_4D = get_model_3D_grids(directory=data_dir[0][0:-1], filenames=filenames, levels=levels, allExists=False) TMP_2D = TMP_4D.interp(lon=('points', points['lon']), lat=('points', points['lat'])) u_4D = get_model_3D_grids(directory=data_dir[1][0:-1], filenames=filenames, levels=levels, allExists=False) u_2D = u_4D.interp(lon=('points', points['lon']), lat=('points', points['lat'])) v_4D = get_model_3D_grids(directory=data_dir[2][0:-1], filenames=filenames, levels=levels, allExists=False) v_2D = v_4D.interp(lon=('points', points['lon']), lat=('points', points['lat'])) rh_4D = get_model_3D_grids(directory=data_dir[3][0:-1], filenames=filenames, levels=levels, allExists=False) rh_2D = rh_4D.interp(lon=('points', points['lon']), lat=('points', points['lat'])) rh_2D.attrs['model'] = model rh_2D.attrs['points'] = points Psfc_3D = get_model_grids(directory=data_dir[4][0:-1], filenames=filenames, allExists=False) Psfc_1D = Psfc_3D.interp(lon=('points', points['lon']), lat=('points', points['lat'])) v_2D2, pressure_2D = xr.broadcast(v_2D['data'], v_2D['level']) v_2D2, Psfc_2D = xr.broadcast(v_2D['data'], Psfc_1D['data']) terrain_2D = pressure_2D - Psfc_2D crossection_graphics.draw_Time_Crossection_rh_uv_Temp( rh_2D=rh_2D, u_2D=u_2D, v_2D=v_2D, TMP_2D=TMP_2D, terrain_2D=terrain_2D, t_range=t_range, model=model, output_dir=output_dir)
def T2m_all_type(initTime=None, fhour=24, day_back=0, model='中央台指导', Var_plot='Tmn_2m', map_ratio=19 / 9, zoom_ratio=20, cntr_pnt=[102, 34], south_China_sea=True, area='全国', city=False, output_dir=None, Global=False): if (area != '全国'): south_China_sea = False # micaps data directory try: data_dir = [ utl.Cassandra_dir(data_type='surface', data_source=model, var_name=Var_plot) ] except KeyError: raise ValueError('Can not find all directories needed') # get filename if (initTime != None): filename = utl.model_filename(initTime, fhour) else: filename = utl.filename_day_back_model(day_back=day_back, fhour=fhour) # retrieve data from micaps server T_2m = get_model_grid(data_dir[0], filename=filename) if T_2m is None: return init_time = T_2m.coords['forecast_reference_time'].values # prepare data if (area != None): cntr_pnt, zoom_ratio = utl.get_map_area(area_name=area) map_extent = [0, 0, 0, 0] map_extent[0] = cntr_pnt[0] - zoom_ratio * 1 * map_ratio map_extent[1] = cntr_pnt[0] + zoom_ratio * 1 * map_ratio map_extent[2] = cntr_pnt[1] - zoom_ratio * 1 map_extent[3] = cntr_pnt[1] + zoom_ratio * 1 delt_x = (map_extent[1] - map_extent[0]) * 0.2 delt_y = (map_extent[3] - map_extent[2]) * 0.1 #+ to solve the problem of labels on all the contours idx_x1 = np.where((T_2m.coords['lon'].values > map_extent[0] - delt_x) & (T_2m.coords['lon'].values < map_extent[1] + delt_x)) idx_y1 = np.where((T_2m.coords['lat'].values > map_extent[2] - delt_y) & (T_2m.coords['lat'].values < map_extent[3] + delt_y)) titles = { 'Tmn_2m': '过去24小时2米最低温度', 'Tmx_2m': '过去24小时2米最高温度', 'T2m': '2米温度' } #- to solve the problem of labels on all the contours T_2m = { 'lon': T_2m.coords['lon'].values[idx_x1], 'lat': T_2m.coords['lat'].values[idx_y1], 'data': T_2m['data'].values[0, 0, idx_y1[0][0]:(idx_y1[0][-1] + 1), idx_x1[0][0]:(idx_x1[0][-1] + 1)], 'model': model, 'fhour': fhour, 'title': titles[Var_plot], 'init_time': init_time } elements_graphics.draw_T_2m(T_2m=T_2m, map_extent=map_extent, regrid_shape=20, city=city, south_China_sea=south_China_sea, output_dir=output_dir, Global=Global)
def point_wind_time_fcst_according_to_3D_wind( model='ECMWF', output_dir=None, t_range=[0,60], t_gap=3, points={'lon':[116.3833], 'lat':[39.9], 'altitude':[1351]}, initTime=None,draw_obs=True,obs_ID=54511,day_back=0, extra_info={ 'output_head_name':' ', 'output_tail_name':' ', 'point_name':' ', 'drw_thr':True, 'levels_for_interp':[1000, 950, 925, 900, 850, 800, 700, 600, 500]} ): #+get all the directories needed try: dir_rqd=[utl.Cassandra_dir(data_type='high',data_source=model,var_name='HGT',lvl=''), utl.Cassandra_dir(data_type='high',data_source=model,var_name='UGRD',lvl=''), utl.Cassandra_dir(data_type='high',data_source=model,var_name='VGRD',lvl='')] except KeyError: raise ValueError('Can not find all required directories needed') #-get all the directories needed if(initTime == None): initTime = get_latest_initTime(dir_rqd[0][0:-1]+'/850') #initTime=utl.filename_day_back_model(day_back=day_back,fhour=0)[0:8] directory=dir_rqd[0][0:-1] fhours = np.arange(t_range[0], t_range[1], t_gap) filenames = [initTime+'.'+str(fhour).zfill(3) for fhour in fhours] HGT_4D=get_model_3D_grids(directory=directory,filenames=filenames,levels=extra_info['levels_for_interp'], allExists=False) directory=dir_rqd[1][0:-1] U_4D=get_model_3D_grids(directory=directory,filenames=filenames,levels=extra_info['levels_for_interp'], allExists=False) directory=dir_rqd[2][0:-1] V_4D=get_model_3D_grids(directory=directory,filenames=filenames,levels=extra_info['levels_for_interp'], allExists=False) #obs if(draw_obs == True): initial_time=pd.to_datetime(str(V_4D['forecast_reference_time'].values)).replace(tzinfo=None).to_pydatetime() sign=0 for ifhour in V_4D['forecast_period'].values: temp=(initial_time+timedelta(hours=ifhour)) filenames_obs=temp.strftime("%Y%m%d%H")+'0000.000' try: obs_data=get_station_data('SURFACE/PLOT/',filename=filenames_obs) except: break if(obs_data is not None): temp=obs_data.where(obs_data['ID']==obs_ID).dropna(how='all') if ((ifhour == V_4D['forecast_period'].values[0]) or ((ifhour > V_4D['forecast_period'].values[0]) and (sign==0))): if(len(temp) > 0): sta_obs_data=obs_data.where(obs_data['ID']==obs_ID).dropna(how='all').reset_index() sign=1 else: if(len(temp) > 0): sta_obs_data=sta_obs_data.append(temp).reset_index() if(obs_data is None): break try: sta_obs_data except: draw_obs=False delt_xy=HGT_4D['lon'].values[1]-HGT_4D['lon'].values[0] mask = (HGT_4D['lon']<(points['lon']+2*delt_xy))&(HGT_4D['lon']>(points['lon']-2*delt_xy))&(HGT_4D['lat']<(points['lat']+2*delt_xy))&(HGT_4D['lat']>(points['lat']-2*delt_xy)) HGT_4D_sm=HGT_4D['data'].where(mask,drop=True) U_4D_sm=U_4D['data'].where(mask,drop=True) V_4D_sm=V_4D['data'].where(mask,drop=True) lon_md=np.squeeze(HGT_4D_sm['lon'].values) lat_md=np.squeeze(HGT_4D_sm['lat'].values) alt_md=np.squeeze(HGT_4D_sm.values*10).flatten() time_md=np.squeeze(HGT_4D_sm['forecast_period'].values) coords = np.zeros((len(time_md),len(extra_info['levels_for_interp']),len(lat_md),len(lon_md),4)) coords[...,0]=time_md.reshape((len(time_md),1,1,1)) coords[...,2] = lat_md.reshape((1,1,len(lat_md),1)) coords[...,3] = lon_md.reshape((1,1,1,len(lon_md))) coords = coords.reshape((alt_md.size,4)) coords[:,1]=alt_md interpolator_U = LinearNDInterpolator(coords,U_4D_sm.values.reshape((U_4D_sm.values.size)),rescale=True) interpolator_V = LinearNDInterpolator(coords,V_4D_sm.values.reshape((V_4D_sm.values.size)),rescale=True) coords2 = np.zeros((len(time_md),1,1,1,4)) coords2[...,0]=time_md.reshape((len(time_md),1,1,1)) coords2[...,1]=points['altitude'][0] coords2[...,2] = points['lat'][0] coords2[...,3] = points['lon'][0] coords2 = coords2.reshape((time_md.size,4)) U_interped=np.squeeze(interpolator_U(coords2)) V_interped=np.squeeze(interpolator_V(coords2)) time_info=HGT_4D_sm.coords sta_graphics.draw_point_wind(U=U_interped,V=V_interped, model=model, output_dir=output_dir, points=points, time_info=time_info, extra_info=extra_info )
def mslp_rain_snow(initTime=None, fhour=24, day_back=0, model='ECMWF', atime=6, data_source='MICAPS', map_ratio=14 / 9, zoom_ratio=20, cntr_pnt=[104, 34], south_China_sea=True, area=None, city=False, output_dir=None, Global=False, **kwargs): ''' issues: 1. CIMISS 上上没有上没有GRAPES-GFS的降雪,所以当data_source='CIMISS',model='GRAPES_GFS'无法出图 ''' # prepare data if (data_source == 'MICAPS'): try: data_dir = [ utl.Cassandra_dir(data_type='surface', data_source=model, var_name='PRMSL'), utl.Cassandra_dir(data_type='surface', data_source=model, var_name='RAIN' + '%02d' % atime), utl.Cassandra_dir(data_type='surface', data_source=model, var_name='SNOW' + '%02d' % atime), ] except KeyError: raise ValueError('Can not find all directories needed') # get filename if (initTime != None): filename = utl.model_filename(initTime, fhour) if (atime > 3): filename_mslp = utl.model_filename(initTime, int(fhour - atime / 2)) else: filename = utl.filename_day_back_model(day_back=day_back, fhour=fhour) if (atime > 3): filename_mslp = utl.filename_day_back_model( day_back=day_back, fhour=int(fhour - atime / 2)) # retrieve data from micaps server mslp = get_model_grid(data_dir[0], filename=filename) if mslp is None: return rain = get_model_grid(data_dir[1], filename=filename) if rain is None: return snow = get_model_grid(data_dir[2], filename=filename) if snow is None: return if (data_source == 'CIMISS'): # get filename if (initTime != None): filename = utl.model_filename(initTime, fhour, UTC=True) if (atime > 3): filename_gh = utl.filename_day_back_model(initTime, fhour=int(fhour - atime / 2), UTC=True) else: filename = utl.filename_day_back_model(day_back=day_back, fhour=fhour, UTC=True) if (atime > 3): filename_gh = utl.filename_day_back_model(day_back=day_back, fhour=int(fhour - atime / 2), UTC=True) try: # retrieve data from CIMISS server if (model == 'ECMWF'): mslp = CMISS_IO.cimiss_model_by_time( '20' + filename[0:8], valid_time=fhour, data_code=utl.CMISS_data_code(data_source=model, var_name='GSSP'), levattrs={ 'long_name': 'Mean_sea_level', 'units': 'm', '_CoordinateAxisType': '-' }, fcst_level=0, fcst_ele="GSSP", units='Pa') else: mslp = CMISS_IO.cimiss_model_by_time( '20' + filename[0:8], valid_time=fhour, data_code=utl.CMISS_data_code(data_source=model, var_name='SSP'), levattrs={ 'long_name': 'Mean_sea_level', 'units': 'm', '_CoordinateAxisType': '-' }, fcst_level=0, fcst_ele="SSP", units='Pa') if mslp is None: return mslp['data'] = mslp['data'] / 100. TPE1 = CMISS_IO.cimiss_model_by_time( '20' + filename[0:8], valid_time=fhour, data_code=utl.CMISS_data_code(data_source=model, var_name='TPE'), levattrs={ 'long_name': 'Height above Ground', 'units': 'm', '_CoordinateAxisType': '-' }, fcst_level=0, fcst_ele="TPE", units='kg*m^-2') if TPE1 is None: return TPE2 = CMISS_IO.cimiss_model_by_time( '20' + filename[0:8], valid_time=fhour - atime, data_code=utl.CMISS_data_code(data_source=model, var_name='TPE'), levattrs={ 'long_name': 'Height above Ground', 'units': 'm', '_CoordinateAxisType': '-' }, fcst_level=0, fcst_ele="TPE", units='kg*m^-2') if TPE2 is None: return TTSP1 = CMISS_IO.cimiss_model_by_time( '20' + filename[0:8], valid_time=fhour, data_code=utl.CMISS_data_code(data_source=model, var_name='TTSP'), levattrs={ 'long_name': 'Height above Ground', 'units': 'm', '_CoordinateAxisType': '-' }, fcst_level=0, fcst_ele="TTSP", units='kg*m^-2') if TTSP1 is None: return TTSP2 = CMISS_IO.cimiss_model_by_time( '20' + filename[0:8], valid_time=fhour - atime, data_code=utl.CMISS_data_code(data_source=model, var_name='TTSP'), levattrs={ 'long_name': 'Height above Ground', 'units': 'm', '_CoordinateAxisType': '-' }, fcst_level=0, fcst_ele="TTSP", units='kg*m^-2') if TTSP2 is None: return except KeyError: raise ValueError('Can not find all data needed') rain = TPE1.copy(deep=True) rain['data'].values = (TPE1['data'].values - TPE2['data'].values) * 1000 snow = TTSP1.copy(deep=True) snow['data'].values = (TTSP1['data'].values - TTSP2['data'].values) * 1000 # set map extent if (area != None): south_China_sea = False if (area != None): cntr_pnt, zoom_ratio = utl.get_map_area(area_name=area) map_extent = [0, 0, 0, 0] map_extent[0] = cntr_pnt[0] - zoom_ratio * 1 * map_ratio map_extent[1] = cntr_pnt[0] + zoom_ratio * 1 * map_ratio map_extent[2] = cntr_pnt[1] - zoom_ratio * 1 map_extent[3] = cntr_pnt[1] + zoom_ratio * 1 delt_x = (map_extent[1] - map_extent[0]) * 0.2 delt_y = (map_extent[3] - map_extent[2]) * 0.1 mask1 = (mslp['lon'] > map_extent[0] - delt_x) & ( mslp['lon'] < map_extent[1] + delt_x) & ( mslp['lat'] > map_extent[2] - delt_y) & (mslp['lat'] < map_extent[3] + delt_y) mask2 = (rain['lon'] > map_extent[0] - delt_x) & ( rain['lon'] < map_extent[1] + delt_x) & ( rain['lat'] > map_extent[2] - delt_y) & (rain['lat'] < map_extent[3] + delt_y) mslp = mslp.where(mask1, drop=True) mslp.attrs['model'] = model rain = rain.where(mask2, drop=True) snow = snow.where(mask2, drop=True) snow.attrs['atime'] = atime rain_snow = xr.merge( [rain.rename({'data': 'rain'}), snow.rename({'data': 'snow'})]) mask1 = ((rain_snow['rain'] - rain_snow['snow']) > 0.1) & (rain_snow['snow'] > 0.1) sleet = rain_snow['rain'].where(mask1) mask2 = ((rain_snow['rain'] - rain_snow['snow']) < 0.1) & (rain_snow['snow'] > 0.1) snw = rain_snow['snow'].where(mask2) mask3 = (rain_snow['rain'] > 0.1) & (rain_snow['snow'] < 0.1) rn = rain_snow['rain'].where(mask3) rn.attrs['atime'] = atime # draw QPF_graphics.draw_mslp_rain_snow(rain=rn, snow=snw, sleet=sleet, mslp=mslp, map_extent=map_extent, regrid_shape=20, city=city, south_China_sea=south_China_sea, output_dir=output_dir, Global=Global)
def point_uv_gust_tmp_rh_rn_fcst(output_dir=None, t_range=[0, 60], t_gap=3, points={ 'lon': [116.3833], 'lat': [39.9], 'altitude': [1351] }, initTime=None, day_back=0, extra_info={ 'output_head_name': ' ', 'output_tail_name': ' ', 'point_name': ' ' }, **kwargs): #+get all the directories needed try: dir_rqd = [ utl.Cassandra_dir(data_type='surface', data_source='中央气象台中短期指导', var_name='T2m'), utl.Cassandra_dir(data_type='surface', data_source='中央气象台中短期指导', var_name='u10m'), utl.Cassandra_dir(data_type='surface', data_source='中央气象台中短期指导', var_name='v10m'), utl.Cassandra_dir(data_type='surface', data_source='中央气象台中短期指导', var_name='rh2m'), utl.Cassandra_dir(data_type='surface', data_source='中央气象台中短期指导', var_name='RAIN' + str(t_gap).zfill(2)), utl.Cassandra_dir(data_type='surface', data_source='OBS', var_name='PLOT_GUST') ] except KeyError: raise ValueError('Can not find all required directories needed') #-get all the directories needed if (initTime == None): initTime = MICAPS_IO.get_latest_initTime(dir_rqd[0]) #initTime=utl.filename_day_back_model(day_back=day_back,fhour=0)[0:8] gust_sta = MICAPS_IO.get_station_data(directory=dir_rqd[5], dropna=True, cache=False) datetime_sta = pd.to_datetime(str( gust_sta.time[0])).replace(tzinfo=None).to_pydatetime() datetime_model_initTime = datetime.strptime('20' + initTime, '%Y%m%d%H') u10_his_md = [] v10_his_md = [] wsp_his_sta_point = [] model_filenames_his = None for iinit in range(0, 240, 12): for ifhour in range(0, 87, 3): for iobs in range(0, 168, 1): initTime_his = datetime_model_initTime - timedelta(hours=iinit) validTime_his = initTime_his + timedelta(hours=ifhour) staTime_his = datetime_sta - timedelta(hours=iobs) if (staTime_his == validTime_his): model_filename_his = initTime_his.strftime( '%Y%m%d%H')[2:10] + '.' + str(ifhour).zfill(3) sta_filename_his = validTime_his.strftime( '%Y%m%d%H') + '0000.000' data_md1 = MICAPS_IO.get_model_grid( dir_rqd[1], filename=model_filename_his) if (data_md1 is None): continue data_md2 = MICAPS_IO.get_model_grid( dir_rqd[1], filename=model_filename_his) if (data_md2 is None): continue data_sta = MICAPS_IO.get_station_data( directory=dir_rqd[5], filename=sta_filename_his, dropna=True, cache=True) if (data_sta is None): continue u10_his_md.append(data_md1) v10_his_md.append(data_md2) wsp_his_sta_interp = utl.sta_to_point_interpolation( points=points, sta=data_sta, var_name='Gust_speed') wsp_his_sta_point.append(wsp_his_sta_interp[:]) u10_his_md = xr.concat(u10_his_md, dim='time') v10_his_md = xr.concat(v10_his_md, dim='time') wsp_his_md = (u10_his_md**2 + v10_his_md**2)**0.5 wsp_his_md_point = wsp_his_md.interp(lon=('points', points['lon']), lat=('points', points['lat'])) model = LinearRegression(copy_X=True, fit_intercept=True, n_jobs=1, normalize=False) x = np.squeeze(wsp_his_md_point['data'].values).reshape(-1, 1) y = np.squeeze(wsp_his_sta_point).reshape(-1, 1) model.fit(x, y) if (model.coef_ < 0.2): f2 = np.polyfit(np.squeeze(x), np.squeeze(y), 2) model2 = np.poly1d(f2) fhours = np.arange(t_range[0], t_range[1], t_gap) filenames = [initTime + '.' + str(fhour).zfill(3) for fhour in fhours] t2m = utl.get_model_points_gy(dir_rqd[0], filenames, points, allExists=False) u10m = utl.get_model_points_gy(dir_rqd[1], filenames, points, allExists=False) v10m = utl.get_model_points_gy(dir_rqd[2], filenames, points, allExists=False) rh = utl.get_model_points_gy(dir_rqd[3], filenames, points, allExists=False) rn = utl.get_model_points_gy(dir_rqd[4], filenames, points, allExists=False) gust10m_predict = u10m.copy() if (model.coef_ > 0.2): gust10m_predict['data'].values = np.squeeze( model.predict( np.squeeze((u10m['data'].values**2 + v10m['data'].values**2)**0.5).reshape(-1, 1))).reshape( -1, 1, 1) else: gust10m_predict['data'].values = np.squeeze( model2( np.squeeze((u10m['data'].values**2 + v10m['data'].values**2)**0.5))).reshape(-1, 1, 1) sta_graphics.draw_point_uv_tmp_rh_rn_gust_fcst(t2m=t2m, u10m=u10m, v10m=v10m, rh=rh, rn=rn, gust=gust10m_predict, model='中央气象台中短期指导', output_dir=output_dir, points=points, extra_info=extra_info)
def Station_Synthetical_Forecast_From_Cassandra( model='ECMWF', output_dir=None, t_range=[0,84], t_gap=3, points={'lon':[116.3833], 'lat':[39.9]}, initTime=None, draw_VIS=True,drw_thr=False, extra_info={ 'output_head_name':' ', 'output_tail_name':' ', 'point_name':' '} ): #+get all the directories needed try: dir_rqd=[ "ECMWF_HR/10_METRE_WIND_GUST_IN_THE_LAST_3_HOURS/", "ECMWF_HR/10_METRE_WIND_GUST_IN_THE_LAST_6_HOURS/", "ECMWF_HR/TCDC/", "ECMWF_HR/LCDC/", "ECMWF_HR/UGRD_100M/", "ECMWF_HR/VGRD_100M/", "NWFD_SCMOC/VIS/", utl.Cassandra_dir( data_type='surface',data_source=model,var_name='RAIN03'), utl.Cassandra_dir( data_type='surface',data_source=model,var_name='RAIN06'), utl.Cassandra_dir( data_type='surface',data_source=model,var_name='T2m'), utl.Cassandra_dir( data_type='surface',data_source=model,var_name='u10m'), utl.Cassandra_dir( data_type='surface',data_source=model,var_name='v10m'), ] except KeyError: raise ValueError('Can not find all required directories needed') try: dir_opt=[ utl.Cassandra_dir( data_type='surface',data_source=model,var_name='Td2m') ] name_opt=['Td2m'] except: dir_opt=[ utl.Cassandra_dir(data_type='surface',data_source=model,var_name='rh2m') ] name_opt=['rh2m'] #+get all the directories needed if(initTime == None): last_file={model:get_latest_initTime(dir_rqd[0]), 'SCMOC':get_latest_initTime(dir_rqd[6]), } else: last_file={model:initTime[0], 'SCMOC':initTime[1], } y_s={model:int('20'+last_file[model][0:2]), 'SCMOC':int('20'+last_file['SCMOC'][0:2])} m_s={model:int(last_file[model][2:4]), 'SCMOC':int(last_file['SCMOC'][2:4])} d_s={model:int(last_file[model][4:6]), 'SCMOC':int(last_file['SCMOC'][4:6])} h_s={model:int(last_file[model][6:8]), 'SCMOC':int(last_file['SCMOC'][6:8])} fhours = np.arange(t_range[0], t_range[1], t_gap) for ifhour in fhours: if (ifhour == fhours[0] ): time_all=datetime(y_s['SCMOC'],m_s['SCMOC'],d_s['SCMOC'],h_s['SCMOC'])+timedelta(hours=int(ifhour)) else: time_all=np.append(time_all,datetime(y_s['SCMOC'],m_s['SCMOC'],d_s['SCMOC'],h_s['SCMOC'])+timedelta(hours=int(ifhour))) filenames = [last_file[model]+'.'+str(fhour).zfill(3) for fhour in fhours] t2m=utl.get_model_points_gy(dir_rqd[9], filenames, points,allExists=False) if(name_opt[0] == 'rh2m'): rh2m=utl.get_model_points_gy(dir_opt[0], filenames, points,allExists=False) Td2m=mpcalc.dewpoint_rh(t2m['data'].values*units('degC'),rh2m['data'].values/100.) p_vapor=(rh2m['data'].values/100.)*6.105*(math.e**((17.27*t2m['data'].values/(237.7+t2m['data'].values)))) if(name_opt[0] == 'Td2m'): Td2m=utl.get_model_points_gy(dir_opt[0], filenames, points,allExists=False) rh2m=mpcalc.relative_humidity_from_dewpoint(t2m['data'].values* units('degC'), Td2m['data'].values* units('degC')) p_vapor=(np.array(rh2m))*6.105*(math.e**((17.27*t2m['data'].values/(237.7+t2m['data'].values)))) Td2m=np.array(Td2m['data'].values)* units('degC') u10m=utl.get_model_points_gy(dir_rqd[10], filenames, points,allExists=False) v10m=utl.get_model_points_gy(dir_rqd[11], filenames, points,allExists=False) wsp10m=(u10m['data']**2+v10m['data']**2)**0.5 AT=1.07*t2m['data'].values+0.2*p_vapor-0.65*wsp10m-2.7 if((t_range[1]) > 72): fhours = np.arange(6, t_range[1], 6) filenames = [last_file[model]+'.'+str(fhour).zfill(3) for fhour in fhours] r03=utl.get_model_points_gy(dir_rqd[8], filenames, points,allExists=False) else: r03=utl.get_model_points_gy(dir_rqd[7], filenames, points,allExists=False) fhours = np.arange(t_range[0], t_range[1], t_gap) filenames = [last_file['SCMOC']+'.'+str(fhour).zfill(3) for fhour in fhours] VIS=utl.get_model_points_gy(dir_rqd[6], filenames, points,allExists=False,fill_null=True,Null_value=-0.001) if(last_file['SCMOC'] == last_file[model] and t_range[1] > 72): fhours = np.append(np.arange(3,72,3),np.arange(72, (t_range[1]), 6)) filenames = [last_file[model]+'.'+str(fhour).zfill(3) for fhour in fhours] filenames2 = [last_file[model]+'.'+str(fhour).zfill(3) for fhour in fhours] if(last_file['SCMOC'] != last_file[model] and t_range[1] > 60): fhours = np.append(np.arange(3,60,3),np.arange(60, (t_range[1]), 6)) filenames = [last_file[model]+'.'+str(fhour+12).zfill(3) for fhour in fhours] filenames2 = [last_file[model]+'.'+str(fhour).zfill(3) for fhour in fhours] if(last_file['SCMOC'] != last_file[model] and t_range[1] <= 60): fhours = np.arange(t_range[0], t_range[1], t_gap) filenames = [last_file[model]+'.'+str(fhour+12).zfill(3) for fhour in fhours] filenames2 = [last_file[model]+'.'+str(fhour).zfill(3) for fhour in fhours] if(last_file['SCMOC'] == last_file[model] and t_range[1] <= 72): fhours = np.arange(t_range[0], t_range[1], t_gap) filenames = [last_file[model]+'.'+str(fhour).zfill(3) for fhour in fhours] filenames2 = [last_file[model]+'.'+str(fhour).zfill(3) for fhour in fhours] TCDC=utl.get_model_points_gy(dir_rqd[2], filenames2, points,allExists=False) LCDC=utl.get_model_points_gy(dir_rqd[3], filenames2, points,allExists=False) u100m=utl.get_model_points_gy(dir_rqd[4], filenames2, points,allExists=False) v100m=utl.get_model_points_gy(dir_rqd[5], filenames2, points,allExists=False) wsp100m=(u100m['data']**2+v100m['data']**2)**0.5 if(fhours[-1] < 120): gust10m=utl.get_model_points_gy(dir_rqd[0], filenames, points,allExists=False) if(fhours[-1] > 120): if(last_file['SCMOC'] == last_file[model]): fhours = np.arange(0, t_range[1], 6) filenames = [last_file[model]+'.'+str(fhour).zfill(3) for fhour in fhours] if(last_file['SCMOC'] != last_file[model]): fhours = np.arange(0, t_range[1], 6) filenames = [last_file[model]+'.'+str(fhour+12).zfill(3) for fhour in fhours] gust10m=utl.get_model_points_gy(dir_rqd[1], filenames, points,allExists=False) sta_graphics.draw_Station_Synthetical_Forecast_From_Cassandra( t2m=t2m,Td2m=Td2m,AT=AT,u10m=u10m,v10m=v10m,u100m=u100m,v100m=v100m, gust10m=gust10m,wsp10m=wsp10m,wsp100m=wsp100m,r03=r03,TCDC=TCDC,LCDC=LCDC, draw_VIS=draw_VIS,VIS=VIS,drw_thr=drw_thr, time_all=time_all, model=model,points=points, output_dir=output_dir,extra_info=extra_info)
def gh_uv_r6(initTime=None, fhour=6, day_back=0, model='ECMWF', gh_lev=500, uv_lev=850, map_ratio=14 / 9, zoom_ratio=20, cntr_pnt=[104, 34], south_China_sea=True, area=None, city=False, output_dir=None, data_source='MICAPS', Global=False, **kwargs): if (area != None): south_China_sea = False # micaps data directory if (data_source == 'MICAPS'): try: data_dir = [ utl.Cassandra_dir(data_type='high', data_source=model, var_name='HGT', lvl=gh_lev), utl.Cassandra_dir(data_type='high', data_source=model, var_name='UGRD', lvl=uv_lev), utl.Cassandra_dir(data_type='high', data_source=model, var_name='VGRD', lvl=uv_lev), utl.Cassandra_dir(data_type='surface', data_source=model, var_name='RAIN06'), utl.Cassandra_dir(data_type='surface', data_source=model, var_name='PSFC') ] except KeyError: raise ValueError('Can not find all directories needed') # get filename if (initTime != None): filename = utl.model_filename(initTime, fhour) else: filename = utl.filename_day_back_model(day_back=day_back, fhour=fhour) # retrieve data from micaps server gh = MICAPS_IO.get_model_grid(data_dir[0], filename=filename) if gh is None: return u = MICAPS_IO.get_model_grid(data_dir[1], filename=filename) if u is None: return v = MICAPS_IO.get_model_grid(data_dir[2], filename=filename) if v is None: return r6 = MICAPS_IO.get_model_grid(data_dir[3], filename=filename) if r6 is None: return psfc = MICAPS_IO.get_model_grid(data_dir[4], filename=filename) if (data_source == 'CIMISS'): # get filename if (initTime != None): filename = utl.model_filename(initTime, fhour, UTC=True) else: filename = utl.filename_day_back_model(day_back=day_back, fhour=fhour, UTC=True) try: # retrieve data from CIMISS server gh = CMISS_IO.cimiss_model_by_time( '20' + filename[0:8], valid_time=fhour, data_code=utl.CMISS_data_code(data_source=model, var_name='GPH'), levattrs={ 'long_name': 'pressure_level', 'units': 'hPa', '_CoordinateAxisType': '-' }, fcst_level=gh_lev, fcst_ele="GPH", units='gpm') if gh is None: return gh['data'].values = gh['data'].values / 10. u = CMISS_IO.cimiss_model_by_time( '20' + filename[0:8], valid_time=fhour, data_code=utl.CMISS_data_code(data_source=model, var_name='WIU'), levattrs={ 'long_name': 'pressure_level', 'units': 'hPa', '_CoordinateAxisType': '-' }, fcst_level=uv_lev, fcst_ele="WIU", units='m/s') if u is None: return v = CMISS_IO.cimiss_model_by_time( '20' + filename[0:8], valid_time=fhour, data_code=utl.CMISS_data_code(data_source=model, var_name='WIV'), levattrs={ 'long_name': 'pressure_level', 'units': 'hPa', '_CoordinateAxisType': '-' }, fcst_level=uv_lev, fcst_ele="WIV", units='m/s') if v is None: return TPE1 = CMISS_IO.cimiss_model_by_time('20' + filename[0:8], valid_time=fhour, data_code=utl.CMISS_data_code( data_source=model, var_name='TPE'), fcst_level=0, fcst_ele="TPE", units='kg*m^-2') if TPE1 is None: return TPE2 = CMISS_IO.cimiss_model_by_time('20' + filename[0:8], valid_time=fhour - 6, data_code=utl.CMISS_data_code( data_source=model, var_name='TPE'), fcst_level=0, fcst_ele="TPE", units='kg*m^-2') if TPE2 is None: return psfc = CMISS_IO.cimiss_model_by_time('20' + filename[0:8], valid_time=fhour, data_code=utl.CMISS_data_code( data_source=model, var_name='PRS'), fcst_level=0, fcst_ele="PRS", units='Pa') psfc['data'] = psfc['data'] / 100. except KeyError: raise ValueError('Can not find all data needed') r6 = TPE1.copy(deep=True) r6['data'].values = TPE1['data'].values - TPE2['data'].values # prepare data if (area != None): cntr_pnt, zoom_ratio = utl.get_map_area(area_name=area) map_extent = [0, 0, 0, 0] map_extent[0] = cntr_pnt[0] - zoom_ratio * 1 * map_ratio map_extent[1] = cntr_pnt[0] + zoom_ratio * 1 * map_ratio map_extent[2] = cntr_pnt[1] - zoom_ratio * 1 map_extent[3] = cntr_pnt[1] + zoom_ratio * 1 delt_x = (map_extent[1] - map_extent[0]) * 0.2 delt_y = (map_extent[3] - map_extent[2]) * 0.1 gh = utl.cut_xrdata(map_extent, gh, delt_x=delt_x, delt_y=delt_y) u = utl.cut_xrdata(map_extent, u, delt_x=delt_x, delt_y=delt_y) v = utl.cut_xrdata(map_extent, v, delt_x=delt_x, delt_y=delt_y) r6 = utl.cut_xrdata(map_extent, r6, delt_x=delt_x, delt_y=delt_y) gh = utl.mask_terrian(gh_lev, psfc, gh) u = utl.mask_terrian(uv_lev, psfc, u) v = utl.mask_terrian(uv_lev, psfc, v) gh.attrs['model'] = model uv = xr.merge([u.rename({'data': 'u'}), v.rename({'data': 'v'})]) synoptic_graphics.draw_gh_uv_r6(r6=r6, gh=gh, uv=uv, map_extent=map_extent, regrid_shape=20, city=city, south_China_sea=south_China_sea, output_dir=output_dir, Global=Global)
def dT2m_mean24(initTime=None, fhour=48, day_back=0, map_ratio=19 / 9, zoom_ratio=20, cntr_pnt=[102, 34], south_China_sea=True, area='全国', city=False, output_dir=None, Global=False): data_dir = [ utl.Cassandra_dir(data_type='surface', data_source='ECMWF', var_name='T2m') ] fhours1 = np.arange(fhour - 21, fhour + 1, 3) if (initTime is None): initTime = utl.filename_day_back_model(day_back=day_back, fhour=fhour)[0:8] filenames1 = [initTime + '.' + str(fhour).zfill(3) for fhour in fhours1] if (fhour >= 48): fhours2 = np.arange(fhour - 21 - 24, fhour + 1 - 24, 3) filenames2 = [ initTime + '.' + str(fhour).zfill(3) for fhour in fhours2 ] if (fhour >= 36 and fhour < 48): fhours2 = np.arange(fhour - 21 + 12 - 24, fhour + 1 + 12 - 24, 3) initTime2 = (datetime.strptime('20' + initTime, '%Y%m%d%H') - timedelta(hours=12)).strftime('%Y%m%d%H')[2:10] filenames2 = [ initTime2 + '.' + str(fhour).zfill(3) for fhour in fhours2 ] if (fhour >= 24 and fhour < 36): fhours2 = np.arange(fhour - 21 + 24 - 24, fhour + 1 + 24 - 24, 3) initTime2 = (datetime.strptime('20' + initTime, '%Y%m%d%H') - timedelta(hours=24)).strftime('%Y%m%d%H')[2:10] filenames2 = [ initTime2 + '.' + str(fhour).zfill(3) for fhour in fhours2 ] if (fhour < 24): print('fhour should > 24') return # prepare data T_2m1 = MICAPS_IO.get_model_grids(data_dir[0], filenames=filenames1) Tmn_2m1 = T_2m1.isel(time=[-1]).copy() Tmn_2m1['data'].values[0, :, :] = np.mean(T_2m1['data'].values, axis=0) T_2m2 = MICAPS_IO.get_model_grids(data_dir[0], filenames=filenames2) Tmn_2m2 = T_2m2.isel(time=[-1]).copy() Tmn_2m2['data'].values[0, :, :] = np.mean(T_2m2['data'].values, axis=0) dTmn_2m = Tmn_2m1.copy() dTmn_2m['data'].values = Tmn_2m1['data'].values - Tmn_2m2['data'].values # set map extent if (area != '全国'): south_China_sea = False if (area != None): cntr_pnt, zoom_ratio = utl.get_map_area(area_name=area) map_extent = [0, 0, 0, 0] map_extent[0] = cntr_pnt[0] - zoom_ratio * 1 * map_ratio map_extent[1] = cntr_pnt[0] + zoom_ratio * 1 * map_ratio map_extent[2] = cntr_pnt[1] - zoom_ratio * 1 map_extent[3] = cntr_pnt[1] + zoom_ratio * 1 delt_x = (map_extent[1] - map_extent[0]) * 0.2 delt_y = (map_extent[3] - map_extent[2]) * 0.1 #+ to solve the problem of labels on all the contours mask1 = (dTmn_2m['lon'] > map_extent[0] - delt_x) & ( dTmn_2m['lon'] < map_extent[1] + delt_x) & ( dTmn_2m['lat'] > map_extent[2] - delt_y) & (dTmn_2m['lat'] < map_extent[3] + delt_y) dTmn_2m = dTmn_2m.where(mask1, drop=True) #- to solve the problem of labels on all the contours dTmn_2m.attrs['model'] = 'ECMWF' dTmn_2m.attrs['title'] = '2米最低温度24小时变温' elements_graphics.draw_dT_2m(dT_2m=dTmn_2m, T_type='dT2m_meann', map_extent=map_extent, regrid_shape=20, city=city, south_China_sea=south_China_sea, output_dir=output_dir, Global=Global)
def periodmean_gh_uv_pwat_ulj(initTimes=None, fhours=[0], day_back=0, model='ECMWF', gh_lev=500, uv_lev=850, ulj_lev=200, map_ratio=14 / 9, zoom_ratio=20, cntr_pnt=[104, 34], south_China_sea=True, area=None, city=False, output_dir=None, data_source='MICAPS', Global=False, **kwargs): if (area != None): south_China_sea = False # micaps data directory if (data_source == 'MICAPS'): try: data_dir = [ utl.Cassandra_dir(data_type='high', data_source=model, var_name='HGT', lvl=gh_lev), utl.Cassandra_dir(data_type='high', data_source=model, var_name='UGRD', lvl=uv_lev), utl.Cassandra_dir(data_type='high', data_source=model, var_name='VGRD', lvl=uv_lev), utl.Cassandra_dir(data_type='high', data_source=model, var_name='UGRD', lvl=ulj_lev), utl.Cassandra_dir(data_type='high', data_source=model, var_name='VGRD', lvl=ulj_lev), utl.Cassandra_dir(data_type='surface', data_source=model, var_name='TCWV'), utl.Cassandra_dir(data_type='surface', data_source=model, var_name='PSFC') ] except KeyError: raise ValueError('Can not find all directories needed') filenames = [] # get filename if (initTimes != None): for initTime in initTimes: for fhour in fhours: filenames.append(utl.model_filename(initTime, fhour)) else: filenames = utl.filename_day_back_model(day_back=day_back, fhour=fhour) # retrieve data from micaps server gh = MICAPS_IO.get_model_grids(data_dir[0], filenames=filenames) u = MICAPS_IO.get_model_grids(data_dir[1], filenames=filenames) v = MICAPS_IO.get_model_grids(data_dir[2], filenames=filenames) u2 = MICAPS_IO.get_model_grids(data_dir[3], filenames=filenames) v2 = MICAPS_IO.get_model_grids(data_dir[4], filenames=filenames) pwat = MICAPS_IO.get_model_grids(data_dir[5], filenames=filenames) psfc = MICAPS_IO.get_model_grids(data_dir[6], filenames=filenames) if (data_source == 'CIMISS'): # get filename filenames = [] if (initTimes != None): for initTime in initTimes: for fhour in fhours: filenames.append( '20' + utl.model_filename(initTime, fhour, UTC=True)) else: filenames = utl.filename_day_back_model(day_back=day_back, fhour=fhour, UTC=True) try: # retrieve data from CIMISS server gh = utl.cimiss_model_ana_grids(data_code=utl.CMISS_data_code( data_source=model, var_name='GPH'), filenames=filenames, fcst_level=gh_lev, fcst_ele="GPH", units='gpm') gh['data'].values = gh['data'].values / 10. u = utl.cimiss_model_ana_grids(data_code=utl.CMISS_data_code( data_source=model, var_name='WIU'), filenames=filenames, fcst_level=uv_lev, fcst_ele="WIU", units='m/s') v = utl.cimiss_model_ana_grids(data_code=utl.CMISS_data_code( data_source=model, var_name='WIV'), filenames=filenames, fcst_level=uv_lev, fcst_ele="WIV", units='m/s') u2 = utl.cimiss_model_ana_grids(data_code=utl.CMISS_data_code( data_source=model, var_name='WIU'), filenames=filenames, fcst_level=ulj_lev, fcst_ele="WIU", units='m/s') v2 = utl.cimiss_model_ana_grids(data_code=utl.CMISS_data_code( data_source=model, var_name='WIV'), filenames=filenames, fcst_level=ulj_lev, fcst_ele="WIV", units='m/s') if (model == 'ECMWF'): pwat = utl.cimiss_model_ana_grids( data_code=utl.CMISS_data_code(data_source=model, var_name='TCWV'), filenames=filenames, fcst_level=0, fcst_ele="TCWV", units='kg m-2') else: pwat = utl.cimiss_model_ana_grids( data_code=utl.CMISS_data_code(data_source=model, var_name='TIWV'), filenames=filenames, fcst_level=0, fcst_ele="TIWV", units='kg m-2') psfc = utl.cimiss_model_ana_grids(data_code=utl.CMISS_data_code( data_source=model, var_name='PRS'), filenames=filenames, fcst_level=0, fcst_ele="PRS", units='Pa') psfc['data'] = psfc['data'] / 100. except KeyError: raise ValueError('Can not find all data needed') # prepare data if (area != None): cntr_pnt, zoom_ratio = utl.get_map_area(area_name=area) map_extent, delt_x, delt_y = utl.get_map_extent(cntr_pnt=cntr_pnt, zoom_ratio=zoom_ratio, map_ratio=map_ratio) gh = utl.cut_xrdata(map_extent, gh, delt_x=delt_x, delt_y=delt_y) u = utl.cut_xrdata(map_extent, u, delt_x=delt_x, delt_y=delt_y) v = utl.cut_xrdata(map_extent, v, delt_x=delt_x, delt_y=delt_y) u2 = utl.cut_xrdata(map_extent, u2, delt_x=delt_x, delt_y=delt_y) v2 = utl.cut_xrdata(map_extent, v2, delt_x=delt_x, delt_y=delt_y) pwat = utl.cut_xrdata(map_extent, pwat, delt_x=delt_x, delt_y=delt_y) gh = utl.mask_terrian(gh_lev, psfc, gh) u = utl.mask_terrian(uv_lev, psfc, u) v = utl.mask_terrian(uv_lev, psfc, v) u2 = utl.mask_terrian(ulj_lev, psfc, u2) v2 = utl.mask_terrian(ulj_lev, psfc, v2) uv = xr.merge([u.rename({'data': 'u'}), v.rename({'data': 'v'})]) ulj = mpcalc.wind_speed(u2['data'].values * units('m/s'), v2['data'].values * units('m/s')) ulj_xr = u2.copy(deep=True) ulj_xr['data'].values = ulj.magnitude pwat_mean = pwat.mean('time') gh_mean = gh.mean('time') ulj_mean = ulj_xr.mean('time') uv_mean = uv.mean('time') gh_mean.attrs['model'] = model gh_mean.attrs['st_time'] = gh['time'].values[0] gh_mean.attrs['ed_time'] = gh['time'].values[-1] synoptic_graphics.draw_gh_uv_pwat_ulj(pwat=pwat_mean, gh=gh_mean, uv=uv_mean, ulj=ulj_mean, map_extent=map_extent, regrid_shape=20, city=city, south_China_sea=south_China_sea, output_dir=output_dir)
def gh_uv_wsp(initTime=None, fhour=6, day_back=0, model='ECMWF', gh_lev=500, uv_lev=850, map_ratio=14 / 9, zoom_ratio=20, cntr_pnt=[104, 34], south_China_sea=True, area=None, city=False, output_dir=None, data_source='MICAPS', Global=False, **kwargs): if (area != None): south_China_sea = False # micaps data directory if (data_source == 'MICAPS'): try: data_dir = [ utl.Cassandra_dir(data_type='high', data_source=model, var_name='HGT', lvl=gh_lev), utl.Cassandra_dir(data_type='high', data_source=model, var_name='UGRD', lvl=uv_lev), utl.Cassandra_dir(data_type='high', data_source=model, var_name='VGRD', lvl=uv_lev), utl.Cassandra_dir(data_type='surface', data_source=model, var_name='PSFC') ] except KeyError: raise ValueError('Can not find all directories needed') # get filename print(initTime) if (initTime != None): filename = utl.model_filename(initTime, fhour) else: filename = utl.filename_day_back_model(day_back=day_back, fhour=fhour) # retrieve data from micaps server gh = MICAPS_IO.get_model_grid(data_dir[0], filename=filename) if gh is None: return u = MICAPS_IO.get_model_grid(data_dir[1], filename=filename) if u is None: return v = MICAPS_IO.get_model_grid(data_dir[2], filename=filename) if v is None: return psfc = MICAPS_IO.get_model_grid(data_dir[3], filename=filename) if (data_source == 'CIMISS'): # get filename if (initTime != None): filename = utl.model_filename(initTime, fhour, UTC=True) else: filename = utl.filename_day_back_model(day_back=day_back, fhour=fhour, UTC=True) try: # retrieve data from CIMISS server gh = CMISS_IO.cimiss_model_by_time( '20' + filename[0:8], valid_time=fhour, data_code=utl.CMISS_data_code(data_source=model, var_name='GPH'), levattrs={ 'long_name': 'pressure_level', 'units': 'hPa', '_CoordinateAxisType': '-' }, fcst_level=gh_lev, fcst_ele="GPH", units='gpm') if gh is None: return gh['data'].values = gh['data'].values / 10. u = CMISS_IO.cimiss_model_by_time( '20' + filename[0:8], valid_time=fhour, data_code=utl.CMISS_data_code(data_source=model, var_name='WIU'), levattrs={ 'long_name': 'pressure_level', 'units': 'hPa', '_CoordinateAxisType': '-' }, fcst_level=uv_lev, fcst_ele="WIU", units='m/s') if u is None: return v = CMISS_IO.cimiss_model_by_time( '20' + filename[0:8], valid_time=fhour, data_code=utl.CMISS_data_code(data_source=model, var_name='WIV'), levattrs={ 'long_name': 'pressure_level', 'units': 'hPa', '_CoordinateAxisType': '-' }, fcst_level=uv_lev, fcst_ele="WIV", units='m/s') if v is None: return psfc = CMISS_IO.cimiss_model_by_time('20' + filename[0:8], valid_time=fhour, data_code=utl.CMISS_data_code( data_source=model, var_name='PRS'), fcst_level=0, fcst_ele="PRS", units='Pa') psfc['data'] = psfc['data'] / 100. except KeyError: raise ValueError('Can not find all data needed') # prepare data if (area != None): cntr_pnt, zoom_ratio = utl.get_map_area(area_name=area) map_extent, delt_x, delt_y = utl.get_map_extent(cntr_pnt, zoom_ratio, map_ratio) gh = utl.mask_terrian(gh_lev, psfc, gh) u = utl.mask_terrian(uv_lev, psfc, u) v = utl.mask_terrian(uv_lev, psfc, v) #+ to solve the problem of labels on all the contours gh = utl.cut_xrdata(map_extent, gh, delt_x=delt_x, delt_y=delt_y) u = utl.cut_xrdata(map_extent, u, delt_x=delt_x, delt_y=delt_y) v = utl.cut_xrdata(map_extent, v, delt_x=delt_x, delt_y=delt_y) #- to solve the problem of labels on all the contours uv = xr.merge([u.rename({'data': 'u'}), v.rename({'data': 'v'})]) wsp = (u['data']**2 + v['data']**2)**0.5 gh.attrs['model'] = model synoptic_graphics.draw_gh_uv_wsp(wsp=wsp, gh=gh, uv=uv, map_extent=map_extent, regrid_shape=20, city=city, south_China_sea=south_China_sea, output_dir=output_dir, Global=Global)
def gh_uv_VVEL(initial_time=None, fhour=6, day_back=0, model='ECMWF', gh_lev='500', uvw_lev='850', map_ratio=19 / 9, zoom_ratio=20, cntr_pnt=[102, 34], south_China_sea=True, area='全国', city=False, output_dir=None, Global=False): if (area != '全国'): south_China_sea = False # micaps data directory try: data_dir = [ utl.Cassandra_dir(data_type='high', data_source=model, var_name='HGT', lvl=gh_lev), utl.Cassandra_dir(data_type='high', data_source=model, var_name='UGRD', lvl=uvw_lev), utl.Cassandra_dir(data_type='high', data_source=model, var_name='VGRD', lvl=uvw_lev), utl.Cassandra_dir(data_type='high', data_source=model, var_name='VVEL', lvl=uvw_lev) ] except KeyError: raise ValueError('Can not find all directories needed') # get filename if (initial_time != None): filename = utl.model_filename(initial_time, fhour) else: filename = utl.filename_day_back_model(day_back=day_back, fhour=fhour) # retrieve data from micaps server gh = get_model_grid(data_dir[0], filename=filename) if gh is None: return u = get_model_grid(data_dir[1], filename=filename) if u is None: return v = get_model_grid(data_dir[2], filename=filename) if v is None: return w = get_model_grid(data_dir[3], filename=filename) init_time = gh.coords['forecast_reference_time'].values # prepare data if (area != None): cntr_pnt, zoom_ratio = utl.get_map_area(area_name=area) map_extent = [0, 0, 0, 0] map_extent[0] = cntr_pnt[0] - zoom_ratio * 1 * map_ratio map_extent[1] = cntr_pnt[0] + zoom_ratio * 1 * map_ratio map_extent[2] = cntr_pnt[1] - zoom_ratio * 1 map_extent[3] = cntr_pnt[1] + zoom_ratio * 1 delt_x = (map_extent[1] - map_extent[0]) * 0.2 delt_y = (map_extent[3] - map_extent[2]) * 0.1 #+ to solve the problem of labels on all the contours idx_x1 = np.where((gh.coords['lon'].values > map_extent[0] - delt_x) & (gh.coords['lon'].values < map_extent[1] + delt_x)) idx_y1 = np.where((gh.coords['lat'].values > map_extent[2] - delt_y) & (gh.coords['lat'].values < map_extent[3] + delt_y)) idx_x2 = np.where((w.coords['lon'].values > map_extent[0] - delt_x) & (w.coords['lon'].values < map_extent[1] + delt_x)) idx_y2 = np.where((w.coords['lat'].values > map_extent[2] - delt_y) & (w.coords['lat'].values < map_extent[3] + delt_y)) #- to solve the problem of labels on all the contours gh = { 'lon': gh.coords['lon'].values[idx_x1], 'lat': gh.coords['lat'].values[idx_y1], 'data': gh['data'].values[0, 0, idx_y1[0][0]:(idx_y1[0][-1] + 1), idx_x1[0][0]:(idx_x1[0][-1] + 1)], 'lev': gh_lev, 'model': model, 'fhour': fhour, 'init_time': init_time } uv = { 'lon': u.coords['lon'].values[idx_x1], 'lat': u.coords['lat'].values[idx_y1], 'udata': u['data'].values[0, 0, idx_y1[0][0]:(idx_y1[0][-1] + 1), idx_x1[0][0]:(idx_x1[0][-1] + 1)], 'vdata': v['data'].values[0, 0, idx_y1[0][0]:(idx_y1[0][-1] + 1), idx_x1[0][0]:(idx_x1[0][-1] + 1)], 'lev': uvw_lev } VVEL = { 'lon': w.coords['lon'].values[idx_x2], 'lat': w.coords['lat'].values[idx_y2], 'data': np.squeeze(w['data'].values[0, 0, idx_y2[0][0]:(idx_y2[0][-1] + 1), idx_x2[0][0]:(idx_x2[0][-1] + 1)]), 'lev': uvw_lev } dynamic_graphics.draw_gh_uv_VVEL(VVEL=VVEL, gh=gh, uv=uv, map_extent=map_extent, regrid_shape=20, city=city, south_China_sea=south_China_sea, output_dir=output_dir, Global=Global)
def cumulated_precip(initTime=None, t_gap=6, t_range=[6, 36], day_back=0, model='ECMWF', data_source='MICAPS', map_ratio=14 / 9, zoom_ratio=20, cntr_pnt=[104, 34], south_China_sea=True, area=None, city=False, output_dir=None, Global=False, **kwargs): fhours = np.arange(t_range[0], t_range[1] + 1, t_gap) # prepare data if (data_source == 'MICAPS'): try: data_dir = [ utl.Cassandra_dir(data_type='surface', data_source=model, var_name='RAIN' + '%02d' % t_gap) ] except KeyError: raise ValueError('Can not find all directories needed') if (initTime == None): initTime = MICAPS_IO.get_latest_initTime(data_dir[0]) filenames = [initTime + '.' + str(fhour).zfill(3) for fhour in fhours] # retrieve data from micaps server rain = MICAPS_IO.get_model_grids(data_dir[0], filenames=filenames) rain2 = rain.sum('time') if (data_source == 'CIMISS'): if (initTime != None): filename = utl.model_filename(initTime, 0, UTC=True) else: filename = utl.filename_day_back_model(day_back=0, fhour=0, UTC=True) try: TPE1 = CMISS_IO.cimiss_model_by_time('20' + filename[0:8], valid_time=fhours[0], data_code=utl.CMISS_data_code( data_source=model, var_name='TPE'), fcst_level=0, fcst_ele="TPE", units='kg*m^-2') if TPE1 is None: return TPE2 = CMISS_IO.cimiss_model_by_time('20' + filename[0:8], valid_time=fhours[-1], data_code=utl.CMISS_data_code( data_source=model, var_name='TPE'), fcst_level=0, fcst_ele="TPE", units='kg*m^-2') if TPE2 is None: return except KeyError: raise ValueError('Can not find all data needed') rain = TPE1.copy(deep=True) rain['data'].values = (TPE2['data'].values - TPE1['data'].values) rain2 = rain.sum('time') # set map extent if (area != None): south_China_sea = False if (area != None): cntr_pnt, zoom_ratio = utl.get_map_area(area_name=area) else: map_extent = [0, 0, 0, 0] map_extent[0] = cntr_pnt[0] - zoom_ratio * 1 * map_ratio map_extent[1] = cntr_pnt[0] + zoom_ratio * 1 * map_ratio map_extent[2] = cntr_pnt[1] - zoom_ratio * 1 map_extent[3] = cntr_pnt[1] + zoom_ratio * 1 delt_x = (map_extent[1] - map_extent[0]) * 0.2 delt_y = (map_extent[3] - map_extent[2]) * 0.1 rain = utl.cut_xrdata(map_extent=map_extent, xr_input=rain, delt_y=delt_y, delt_x=delt_x) rain2.attrs['model'] = model rain2.attrs['t_gap'] = t_gap rain2.attrs['initTime'] = datetime.strptime(initTime, '%y%m%d%H') rain2.attrs['fhour1'] = fhours[0] rain2.attrs['fhour2'] = fhours[-1] # draw QPF_graphics.draw_cumulated_precip(rain=rain2, map_extent=map_extent, city=city, south_China_sea=south_China_sea, output_dir=output_dir, Global=Global)
def cumulated_precip_evo(initTime=None, t_gap=6, t_range=[6, 36], day_back=0, model='ECMWF', data_source='MICAPS', map_ratio=14 / 9, zoom_ratio=20, cntr_pnt=[104, 34], south_China_sea=True, area=None, city=False, output_dir=None, Global=False, **kwargs): fhours = np.arange(t_range[0], t_range[1] + 1, t_gap) # prepare data if (data_source == 'MICAPS'): try: data_dir = [ utl.Cassandra_dir(data_type='surface', data_source=model, var_name='RAIN' + '%02d' % t_gap) ] except KeyError: raise ValueError('Can not find all directories needed') if (initTime == None): initTime = MICAPS_IO.get_latest_initTime(data_dir[0]) filenames = [initTime + '.' + str(fhour).zfill(3) for fhour in fhours] # retrieve data from micaps server rain = MICAPS_IO.get_model_grids(data_dir[0], filenames=filenames) rain2 = rain.copy(deep=True) for itime in range(1, len(rain['forecast_period'].values)): rain2['data'].values[itime, :, :] = np.sum( rain['data'].values[0:itime + 1, :, :], axis=0) if (data_source == 'CIMISS'): if (initTime != None): filename = utl.model_filename(initTime, 0, UTC=True) else: filename = utl.filename_day_back_model(day_back=0, fhour=0, UTC=True) try: TPE1 = CMISS_IO.cimiss_model_by_times( '20' + filename[0:8], valid_times=fhours, data_code=utl.CMISS_data_code(data_source=model, var_name='TPE'), levattrs={ 'long_name': 'Height above Ground', 'units': 'm', '_CoordinateAxisType': '-' }, fcst_level=0, fcst_ele="TPE", units='kg*m^-2') except KeyError: raise ValueError('Can not find all data needed') rain = TPE1.copy(deep=True) rain['data'].values = (TPE1['data'].values) # set map extent if (area != None): south_China_sea = False if (area != None): cntr_pnt, zoom_ratio = utl.get_map_area(area_name=area) else: map_extent = [0, 0, 0, 0] map_extent[0] = cntr_pnt[0] - zoom_ratio * 1 * map_ratio map_extent[1] = cntr_pnt[0] + zoom_ratio * 1 * map_ratio map_extent[2] = cntr_pnt[1] - zoom_ratio * 1 map_extent[3] = cntr_pnt[1] + zoom_ratio * 1 delt_x = (map_extent[1] - map_extent[0]) * 0.2 delt_y = (map_extent[3] - map_extent[2]) * 0.1 mask1 = (rain['lon'] > map_extent[0] - delt_x) & ( rain['lon'] < map_extent[1] + delt_x) & ( rain['lat'] > map_extent[2] - delt_y) & (rain['lat'] < map_extent[3] + delt_y) rain2 = rain2.where(mask1, drop=True) rain2.attrs['model'] = model rain2.attrs['t_gap'] = t_gap # draw QPF_graphics.draw_cumulated_precip_evo(rain=rain2, map_extent=map_extent, regrid_shape=20, city=city, south_China_sea=south_China_sea, output_dir=output_dir, Global=Global)
def mslp_gust10m(initTime=None, fhour=6, day_back=0, model='ECMWF', map_ratio=19 / 9, zoom_ratio=20, cntr_pnt=[102, 34], south_China_sea=True, area='全国', city=False, output_dir=None, Global=False): if (area != '全国'): south_China_sea = False # micaps data directory try: data_dir = [ utl.Cassandra_dir(data_type='surface', data_source=model, var_name='PRMSL'), utl.Cassandra_dir(data_type='surface', data_source=model, var_name='10M_GUST_6H') ] except KeyError: raise ValueError('Can not find all directories needed') # get filename if (initTime != None): filename = utl.model_filename(initTime, fhour) else: filename = utl.filename_day_back_model(day_back=day_back, fhour=fhour) # retrieve data from micaps server mslp = get_model_grid(data_dir[0], filename=filename) if mslp is None: return gust = get_model_grid(data_dir[1], filename=filename) if gust is None: return init_time = mslp.coords['forecast_reference_time'].values # prepare data if (area != None): cntr_pnt, zoom_ratio = utl.get_map_area(area_name=area) map_extent = [0, 0, 0, 0] map_extent[0] = cntr_pnt[0] - zoom_ratio * 1 * map_ratio map_extent[1] = cntr_pnt[0] + zoom_ratio * 1 * map_ratio map_extent[2] = cntr_pnt[1] - zoom_ratio * 1 map_extent[3] = cntr_pnt[1] + zoom_ratio * 1 delt_x = (map_extent[1] - map_extent[0]) * 0.2 delt_y = (map_extent[3] - map_extent[2]) * 0.1 #+ to solve the problem of labels on all the contours mask1 = ((mslp['lon'] > (map_extent[0] - delt_x)) & (mslp['lon'] < (map_extent[1] + delt_x)) & (mslp['lat'] > (map_extent[2] - delt_y)) & (mslp['lat'] < (map_extent[3] + delt_y))) mask2 = ((mslp['lon'] > (map_extent[0] - delt_x)) & (mslp['lon'] < (map_extent[1] + delt_x))) mask3 = ((mslp['lat'] > (map_extent[2] - delt_y)) & (mslp['lat'] < (map_extent[3] + delt_y))) #- to solve the problem of labels on all the contours mslp = { 'lon': mslp.coords['lon'].where(mask2, drop=True).values, 'lat': mslp.coords['lat'].where(mask3, drop=True).values, 'data': np.squeeze(mslp['data'].where(mask1, drop=True).values), 'model': model, 'fhour': fhour, 'init_time': init_time } gust = { 'lon': gust.coords['lon'].where(mask2, drop=True).values, 'lat': gust.coords['lat'].where(mask3, drop=True).values, 'data': np.squeeze(gust['data'].where(mask1, drop=True).values), } elements_graphics.draw_mslp_gust10m(gust=gust, mslp=mslp, map_extent=map_extent, regrid_shape=20, city=city, south_China_sea=south_China_sea, output_dir=output_dir, Global=Global)
def PV_Div_uv(initTime=None, fhour=6, day_back=0, model='ECMWF', map_ratio=14 / 9, zoom_ratio=20, cntr_pnt=[104, 34], levels=[ 1000, 950, 925, 900, 850, 800, 700, 600, 500, 400, 300, 250, 200, 100 ], lvl_ana=250, Global=False, south_China_sea=True, area=None, city=False, output_dir=None, data_source='MICAPS', **kwargs): # micaps data directory if (area != None): south_China_sea = False # micaps data directory if (data_source == 'MICAPS'): try: data_dir = [ utl.Cassandra_dir(data_type='high', data_source=model, var_name='RH', lvl=''), utl.Cassandra_dir(data_type='high', data_source=model, var_name='UGRD', lvl=''), utl.Cassandra_dir(data_type='high', data_source=model, var_name='VGRD', lvl=''), utl.Cassandra_dir(data_type='high', data_source=model, var_name='TMP', lvl=''), utl.Cassandra_dir(data_type='high', data_source=model, var_name='HGT', lvl='') ] except KeyError: raise ValueError('Can not find all directories needed') # get filename if (initTime != None): filename = utl.model_filename(initTime, fhour) else: filename = utl.filename_day_back_model(day_back=day_back, fhour=fhour) # retrieve data from micaps server rh = MICAPS_IO.get_model_3D_grid(directory=data_dir[0][0:-1], filename=filename, levels=levels, allExists=False) if rh is None: return u = MICAPS_IO.get_model_3D_grid(directory=data_dir[1][0:-1], filename=filename, levels=levels, allExists=False) if u is None: return v = MICAPS_IO.get_model_3D_grid(directory=data_dir[2][0:-1], filename=filename, levels=levels, allExists=False) if v is None: return t = MICAPS_IO.get_model_3D_grid(directory=data_dir[3][0:-1], filename=filename, levels=levels, allExists=False) if t is None: return if (data_source == 'CIMISS'): # get filename if (initTime != None): filename = utl.model_filename(initTime, fhour, UTC=True) else: filename = utl.filename_day_back_model(day_back=day_back, fhour=fhour, UTC=True) try: # retrieve data from CIMISS server rh = CMISS_IO.cimiss_model_3D_grid( data_code=utl.CMISS_data_code(data_source=model, var_name='RHU'), init_time_str='20' + filename[0:8], valid_time=fhour, fcst_levels=levels, fcst_ele="RHU", units='%') if rh is None: return u = CMISS_IO.cimiss_model_3D_grid( data_code=utl.CMISS_data_code(data_source=model, var_name='WIU'), init_time_str='20' + filename[0:8], valid_time=fhour, fcst_levels=levels, fcst_ele="WIU", units='m/s') if u is None: return v = CMISS_IO.cimiss_model_3D_grid( data_code=utl.CMISS_data_code(data_source=model, var_name='WIV'), init_time_str='20' + filename[0:8], valid_time=fhour, fcst_levels=levels, fcst_ele="WIV", units='m/s') if v is None: return t = CMISS_IO.cimiss_model_3D_grid( data_code=utl.CMISS_data_code(data_source=model, var_name='TEM'), init_time_str='20' + filename[0:8], valid_time=fhour, fcst_levels=levels, fcst_ele="TEM", units='K') if t is None: return t['data'].values = t['data'].values - 273.15 t['data'].attrs['units'] = 'C' except KeyError: raise ValueError('Can not find all data needed') if (area != None): cntr_pnt, zoom_ratio = utl.get_map_area(area_name=area) map_extent = [0, 0, 0, 0] map_extent[0] = cntr_pnt[0] - zoom_ratio * 1 * map_ratio map_extent[1] = cntr_pnt[0] + zoom_ratio * 1 * map_ratio map_extent[2] = cntr_pnt[1] - zoom_ratio * 1 map_extent[3] = cntr_pnt[1] + zoom_ratio * 1 delt_x = (map_extent[1] - map_extent[0]) * 0.2 delt_y = (map_extent[3] - map_extent[2]) * 0.1 #+ to solve the problem of labels on all the contours mask1 = (rh['lon'] > map_extent[0] - delt_x) & (rh['lon'] < map_extent[1] + delt_x) & ( rh['lat'] > map_extent[2] - delt_y) & (rh['lat'] < map_extent[3] + delt_y) mask2 = (u['lon'] > map_extent[0] - delt_x) & (u['lon'] < map_extent[1] + delt_x) & ( u['lat'] > map_extent[2] - delt_y) & (u['lat'] < map_extent[3] + delt_y) mask3 = (t['lon'] > map_extent[0] - delt_x) & (t['lon'] < map_extent[1] + delt_x) & ( t['lat'] > map_extent[2] - delt_y) & (t['lat'] < map_extent[3] + delt_y) #- to solve the problem of labels on all the contours rh = rh.where(mask1, drop=True) u = u.where(mask2, drop=True) v = v.where(mask2, drop=True) t = t.where(mask3, drop=True) uv = xr.merge([u.rename({'data': 'u'}), v.rename({'data': 'v'})]) lats = np.squeeze(rh['lat'].values) lons = np.squeeze(rh['lon'].values) pres = np.array(levels) * 100 * units('Pa') tmpk = mpcalc.smooth_n_point( (t['data'].values.squeeze() + 273.15), 9, 2) * units('kelvin') thta = mpcalc.potential_temperature(pres[:, None, None], tmpk) uwnd = mpcalc.smooth_n_point(u['data'].values.squeeze(), 9, 2) * units.meter / units.second vwnd = mpcalc.smooth_n_point(v['data'].values.squeeze(), 9, 2) * units.meter / units.second dx, dy = mpcalc.lat_lon_grid_deltas(lons, lats) # Comput the PV on all isobaric surfaces pv_raw = mpcalc.potential_vorticity_baroclinic( thta, pres[:, None, None], uwnd, vwnd, dx[None, :, :], dy[None, :, :], lats[None, :, None] * units('degrees')) div_raw = mpcalc.divergence(uwnd, vwnd, dx[None, :, :], dy[None, :, :], dim_order='yx') # prepare data idx_z1 = list(pres.m).index(((lvl_ana * units('hPa')).to(pres.units)).m) pv = rh.copy(deep=True) pv['data'].values = np.array(pv_raw).reshape( np.append(1, np.array(pv_raw).shape)) pv['data'].attrs['units'] = str(pv_raw.units) pv.attrs['model'] = model pv = pv.where(pv['level'] == lvl_ana, drop=True) div = u.copy(deep=True) div['data'].values = np.array(div_raw).reshape( np.append(1, np.array(div_raw).shape)) div['data'].attrs['units'] = str(div_raw.units) div = div.where(div['level'] == lvl_ana, drop=True) uv = uv.where(uv['level'] == lvl_ana, drop=True) synoptic_graphics.draw_PV_Div_uv(pv=pv, uv=uv, div=div, map_extent=map_extent, regrid_shape=20, city=city, south_China_sea=south_China_sea, output_dir=output_dir, Global=Global)
def low_level_wind(initTime=None, fhour=6, day_back=0, model='ECMWF', wind_level='100m', map_ratio=19 / 9, zoom_ratio=20, cntr_pnt=[102, 34], south_China_sea=True, area='全国', city=False, output_dir=None, Global=False): if (area != '全国'): south_China_sea = False # micaps data directory try: data_dir = [ utl.Cassandra_dir(data_type='surface', data_source=model, var_name='u' + wind_level), utl.Cassandra_dir(data_type='surface', data_source=model, var_name='v' + wind_level) ] except KeyError: raise ValueError('Can not find all directories needed') # get filename if (initTime != None): filename = utl.model_filename(initTime, fhour) else: filename = utl.filename_day_back_model(day_back=day_back, fhour=fhour) # retrieve data from micaps server u10m = get_model_grid(data_dir[0], filename=filename) if u10m is None: return v10m = get_model_grid(data_dir[1], filename=filename) if v10m is None: return init_time = v10m.coords['forecast_reference_time'].values # prepare data if (area != None): cntr_pnt, zoom_ratio = utl.get_map_area(area_name=area) map_extent = [0, 0, 0, 0] map_extent[0] = cntr_pnt[0] - zoom_ratio * 1 * map_ratio map_extent[1] = cntr_pnt[0] + zoom_ratio * 1 * map_ratio map_extent[2] = cntr_pnt[1] - zoom_ratio * 1 map_extent[3] = cntr_pnt[1] + zoom_ratio * 1 delt_x = (map_extent[1] - map_extent[0]) * 0.2 delt_y = (map_extent[3] - map_extent[2]) * 0.1 #+ to solve the problem of labels on all the contours mask1 = ((u10m['lon'] > (map_extent[0] - delt_x)) & (u10m['lon'] < (map_extent[1] + delt_x)) & (u10m['lat'] > (map_extent[2] - delt_y)) & (u10m['lat'] < (map_extent[3] + delt_y))) mask2 = ((u10m['lon'] > (map_extent[0] - delt_x)) & (u10m['lon'] < (map_extent[1] + delt_x))) mask3 = ((u10m['lat'] > (map_extent[2] - delt_y)) & (u10m['lat'] < (map_extent[3] + delt_y))) #- to solve the problem of labels on all the contours uv10m = { 'lon': u10m.coords['lon'].where(mask2, drop=True).values, 'lat': u10m.coords['lat'].where(mask3, drop=True).values, 'lev': wind_level, 'udata': np.squeeze(u10m['data'].where(mask1, drop=True).values), 'vdata': np.squeeze(v10m['data'].where(mask1, drop=True).values), 'model': model, 'fhour': fhour, 'init_time': init_time } wsp10m = { 'lon': u10m.coords['lon'].where(mask2, drop=True).values, 'lat': u10m.coords['lat'].where(mask3, drop=True).values, 'data': ((uv10m['udata'])**2 + (uv10m['vdata'])**2)**0.5 } elements_graphics.draw_low_level_wind(uv=uv10m, wsp=wsp10m, map_extent=map_extent, regrid_shape=20, city=city, south_China_sea=south_China_sea, output_dir=output_dir, Global=Global)
def dT2m_mx24(initTime=None, fhour=48, map_ratio=19/9,zoom_ratio=20,cntr_pnt=[102,34],area=None,south_China_sea=True, **kargws): data_dir = [utl.Cassandra_dir(data_type='surface',data_source='中央气象台中短期指导',var_name='Tmx_2m')] fhours1 = np.arange(fhour-24, fhour+1, 24) if(initTime is None): initTime=utl.filename_day_back_model(day_back=day_back,fhour=fhour)[0:8] filename1 = initTime+'.'+str(fhour).zfill(3) if(fhour >= 48): fhour2 = fhour-24 filename2 = initTime+'.'+str(fhour2).zfill(3) if(fhour >=36 and fhour < 48): fhour2 = fhour-12 initTime2=(datetime.strptime('20'+initTime,'%Y%m%d%H')-timedelta(hours=12)).strftime('%Y%m%d%H')[2:10] filename2=initTime2+'.'+str(fhour2).zfill(3) if(fhour >=24 and fhour < 36): fhour2 = fhour initTime2=(datetime.strptime('20'+initTime,'%Y%m%d%H')-timedelta(hours=24)).strftime('%Y%m%d%H')[2:10] filename2=initTime2+'.'+str(fhour2).zfill(3) if(fhour < 24): print('fhour should > 24') return # prepare data T_2m1 = MICAPS_IO.get_model_grid(data_dir[0], filename=filename1) T_2m2 = MICAPS_IO.get_model_grid(data_dir[0], filename=filename2) dTmx_2m=T_2m1.copy() dTmx_2m['data'].values=T_2m1['data'].values-T_2m2['data'].values # set map extent if(area != '全国'): south_China_sea=False if(area != None): cntr_pnt,zoom_ratio=utl.get_map_area(area_name=area) map_extent=[0,0,0,0] map_extent[0]=cntr_pnt[0]-zoom_ratio*1*map_ratio map_extent[1]=cntr_pnt[0]+zoom_ratio*1*map_ratio map_extent[2]=cntr_pnt[1]-zoom_ratio*1 map_extent[3]=cntr_pnt[1]+zoom_ratio*1 delt_x=(map_extent[1]-map_extent[0])*0.2 delt_y=(map_extent[3]-map_extent[2])*0.1 #+ to solve the problem of labels on all the contours mask1 = (dTmx_2m['lon'] > map_extent[0]-delt_x) & (dTmx_2m['lon'] < map_extent[1]+delt_x) & (dTmx_2m['lat'] > map_extent[2]-delt_y) & (dTmx_2m['lat'] < map_extent[3]+delt_y) dTmx_2m=dTmx_2m.where(mask1,drop=True) #- to solve the problem of labels on all the contours dTmx2=xr.DataArray(np.squeeze(dTmx_2m['data'].values,axis=0),name='data', coords={'time':('time',[dTmx_2m['time'].values[0]]), 'fhour':('time',[fhour]), 'lat':('lat',dTmx_2m['lat'].values), 'lon':('lon',dTmx_2m['lon'].values) }, dims=('time','lat','lon'), attrs={'model_name':'中央气象台中短期指导', 'var_name':'2米最高温度24小时变温', 'vhours':24}) draw_SCMOC.draw_dT2m(dTmx2,map_extent=map_extent,south_China_sea=south_China_sea,**kargws)
def point_uv_ecgust_tmp_rh_rn_fcst(output_dir=None, t_range=[0, 60], t_gap=3, points={ 'lon': [116.3833], 'lat': [39.9], 'altitude': [1351] }, initTime=None, day_back=0, extra_info={ 'output_head_name': ' ', 'output_tail_name': ' ', 'point_name': ' ' }, **kwargs): #+get all the directories needed try: dir_rqd = [ utl.Cassandra_dir(data_type='surface', data_source='中央气象台中短期指导', var_name='T2m'), utl.Cassandra_dir(data_type='surface', data_source='中央气象台中短期指导', var_name='u10m'), utl.Cassandra_dir(data_type='surface', data_source='中央气象台中短期指导', var_name='v10m'), utl.Cassandra_dir(data_type='surface', data_source='中央气象台中短期指导', var_name='rh2m'), utl.Cassandra_dir(data_type='surface', data_source='中央气象台中短期指导', var_name='RAIN' + str(t_gap).zfill(2)), utl.Cassandra_dir(data_type='surface', data_source='ECMWF', var_name='10M_GUST_3H') ] except KeyError: raise ValueError('Can not find all required directories needed') #-get all the directories needed if (initTime == None): initTime = MICAPS_IO.get_latest_initTime(dir_rqd[0]) initTime2 = MICAPS_IO.get_latest_initTime(dir_rqd[-1]) #initTime=utl.filename_day_back_model(day_back=day_back,fhour=0)[0:8] fhours = np.arange(t_range[0], t_range[1], t_gap) fhours2 = np.arange(t_range[0], t_range[1] + 12, t_gap) filenames = [initTime + '.' + str(fhour).zfill(3) for fhour in fhours] filenames2 = [initTime2 + '.' + str(fhour).zfill(3) for fhour in fhours2] t2m = utl.get_model_points_gy(dir_rqd[0], filenames, points, allExists=False) u10m = utl.get_model_points_gy(dir_rqd[1], filenames, points, allExists=False) v10m = utl.get_model_points_gy(dir_rqd[2], filenames, points, allExists=False) rh = utl.get_model_points_gy(dir_rqd[3], filenames, points, allExists=False) rn = utl.get_model_points_gy(dir_rqd[4], filenames, points, allExists=False) gust = utl.get_model_points_gy(dir_rqd[5], filenames2, points, allExists=False) sta_graphics.draw_point_uv_tmp_rh_rn_gust_fcst(t2m=t2m, u10m=u10m, v10m=v10m, rh=rh, rn=rn, gust=gust, model='中央气象台中短期指导', output_dir=output_dir, points=points, extra_info=extra_info)
def Crosssection_Wind_Theta_e_Qv( initial_time=None, fhour=24, levels=[1000, 950, 925, 900, 850, 800, 700, 600, 500, 400, 300, 200], day_back=0, model='ECMWF', output_dir=None, st_point=[20, 120.0], ed_point=[50, 130.0], map_extent=[70, 140, 15, 55], h_pos=[0.125, 0.665, 0.25, 0.2]): # micaps data directory try: data_dir = [ utl.Cassandra_dir(data_type='high', data_source=model, var_name='RH', lvl=''), utl.Cassandra_dir(data_type='high', data_source=model, var_name='UGRD', lvl=''), utl.Cassandra_dir(data_type='high', data_source=model, var_name='VGRD', lvl=''), utl.Cassandra_dir(data_type='high', data_source=model, var_name='TMP', lvl=''), utl.Cassandra_dir(data_type='high', data_source=model, var_name='HGT', lvl='500') ] except KeyError: raise ValueError('Can not find all directories needed') # get filename if (initial_time != None): filename = utl.model_filename(initial_time, fhour) else: filename = utl.filename_day_back_model(day_back=day_back, fhour=fhour) # retrieve data from micaps server rh = get_model_3D_grid(directory=data_dir[0][0:-1], filename=filename, levels=levels, allExists=False) if rh is None: return rh = rh.metpy.parse_cf().squeeze() u = get_model_3D_grid(directory=data_dir[1][0:-1], filename=filename, levels=levels, allExists=False) if u is None: return u = u.metpy.parse_cf().squeeze() v = get_model_3D_grid(directory=data_dir[2][0:-1], filename=filename, levels=levels, allExists=False) if v is None: return v = v.metpy.parse_cf().squeeze() v2 = get_model_3D_grid(directory=data_dir[2][0:-1], filename=filename, levels=levels, allExists=False) if v2 is None: return v2 = v2.metpy.parse_cf().squeeze() t = get_model_3D_grid(directory=data_dir[3][0:-1], filename=filename, levels=levels, allExists=False) if t is None: return t = t.metpy.parse_cf().squeeze() gh = get_model_grid(data_dir[4], filename=filename) if t is None: return resolution = u['lon'][1] - u['lon'][0] x, y = np.meshgrid(u['lon'], u['lat']) dx, dy = mpcalc.lat_lon_grid_deltas(u['lon'], u['lat']) for ilvl in levels: u2d = u.sel(level=ilvl) #u2d['data'].attrs['units']=units.meter/units.second v2d = v.sel(level=ilvl) #v2d['data'].attrs['units']=units.meter/units.second absv2d = mpcalc.absolute_vorticity( u2d['data'].values * units.meter / units.second, v2d['data'].values * units.meter / units.second, dx, dy, y * units.degree) if (ilvl == levels[0]): absv3d = v2 absv3d['data'].loc[dict(level=ilvl)] = np.array(absv2d) else: absv3d['data'].loc[dict(level=ilvl)] = np.array(absv2d) absv3d['data'].attrs['units'] = absv2d.units #rh=rh.rename(dict(lat='latitude',lon='longitude')) cross = cross_section(rh, st_point, ed_point) cross_rh = cross.set_coords(('lat', 'lon')) cross = cross_section(u, st_point, ed_point) cross_u = cross.set_coords(('lat', 'lon')) cross = cross_section(v, st_point, ed_point) cross_v = cross.set_coords(('lat', 'lon')) cross_u['data'].attrs['units'] = units.meter / units.second cross_v['data'].attrs['units'] = units.meter / units.second cross_u['t_wind'], cross_v['n_wind'] = mpcalc.cross_section_components( cross_u['data'], cross_v['data']) cross = cross_section(t, st_point, ed_point) cross_t = cross.set_coords(('lat', 'lon')) cross = cross_section(absv3d, st_point, ed_point) cross_Td = mpcalc.dewpoint_rh(cross_t['data'].values * units.celsius, cross_rh['data'].values * units.percent) rh, pressure = xr.broadcast(cross_rh['data'], cross_t['level']) Qv = mpcalc.specific_humidity_from_dewpoint(cross_Td, pressure) cross_Qv = xr.DataArray(np.array(Qv) * 1000., coords=cross_rh['data'].coords, dims=cross_rh['data'].dims, attrs={'units': units('g/kg')}) Theta_e = mpcalc.equivalent_potential_temperature( pressure, cross_t['data'].values * units.celsius, cross_Td) cross_Theta_e = xr.DataArray(np.array(Theta_e), coords=cross_rh['data'].coords, dims=cross_rh['data'].dims, attrs={'units': Theta_e.units}) crossection_graphics.draw_Crosssection_Wind_Theta_e_Qv( cross_Qv=cross_Qv, cross_Theta_e=cross_Theta_e, cross_u=cross_u, cross_v=cross_v, gh=gh, h_pos=h_pos, st_point=st_point, ed_point=ed_point, levels=levels, map_extent=map_extent, output_dir=output_dir)
def Station_Snow_Synthetical_Forecast_From_Cassandra( model='ECMWF', output_dir=None, t_range=[0,84], t_gap=3, points={'lon':[116.3833], 'lat':[39.9]}, initTime=None, draw_VIS=True,drw_thr=False, extra_info={ 'output_head_name':' ', 'output_tail_name':' ', 'point_name':' '} ): #+get all the directories needed try: dir_rqd=[ "ECMWF_HR/10_METRE_WIND_GUST_IN_THE_LAST_3_HOURS/", "ECMWF_HR/10_METRE_WIND_GUST_IN_THE_LAST_6_HOURS/", "ECMWF_HR/SNOD/", "ECMWF_HR/SDEN/", "ECMWF_HR/UGRD_100M/", "ECMWF_HR/VGRD_100M/", "NWFD_SCMOC/VIS/", "NCEP_GFS_HR/SNOD/", "ECMWF_HR/SNOW06/", utl.Cassandra_dir( data_type='surface',data_source=model,var_name='T2m'), utl.Cassandra_dir( data_type='surface',data_source=model,var_name='u10m'), utl.Cassandra_dir( data_type='surface',data_source=model,var_name='v10m'), 'ECMWF_ENSEMBLE/RAW/SNOW06/' ] except KeyError: raise ValueError('Can not find all required directories needed') try: dir_opt=[ utl.Cassandra_dir( data_type='surface',data_source=model,var_name='Td2m') ] name_opt=['Td2m'] except: dir_opt=[ utl.Cassandra_dir(data_type='surface',data_source=model,var_name='rh2m') ] name_opt=['rh2m'] #+get all the directories needed if(initTime == None): last_file={model:get_latest_initTime(dir_rqd[0]), 'SCMOC':get_latest_initTime(dir_rqd[6]), } else: last_file={model:initTime[0], 'SCMOC':initTime[1], } y_s={model:int('20'+last_file[model][0:2]), 'SCMOC':int('20'+last_file['SCMOC'][0:2])} m_s={model:int(last_file[model][2:4]), 'SCMOC':int(last_file['SCMOC'][2:4])} d_s={model:int(last_file[model][4:6]), 'SCMOC':int(last_file['SCMOC'][4:6])} h_s={model:int(last_file[model][6:8]), 'SCMOC':int(last_file['SCMOC'][6:8])} fhours = np.arange(t_range[0], t_range[1], t_gap) for ifhour in fhours: if (ifhour == fhours[0] ): time_all=datetime(y_s['SCMOC'],m_s['SCMOC'],d_s['SCMOC'],h_s['SCMOC'])+timedelta(hours=int(ifhour)) else: time_all=np.append(time_all,datetime(y_s['SCMOC'],m_s['SCMOC'],d_s['SCMOC'],h_s['SCMOC'])+timedelta(hours=int(ifhour))) filenames = [last_file[model]+'.'+str(fhour).zfill(3) for fhour in fhours] t2m=utl.get_model_points_gy(dir_rqd[9], filenames, points,allExists=False) if(name_opt[0] == 'rh2m'): rh2m=utl.get_model_points_gy(dir_opt[0], filenames, points,allExists=False) Td2m=mpcalc.dewpoint_rh(t2m['data'].values*units('degC'),rh2m['data'].values/100.) p_vapor=(rh2m['data'].values/100.)*6.105*(math.e**((17.27*t2m['data'].values/(237.7+t2m['data'].values)))) if(name_opt[0] == 'Td2m'): Td2m=utl.get_model_points_gy(dir_opt[0], filenames, points,allExists=False) rh2m=mpcalc.relative_humidity_from_dewpoint(t2m['data'].values* units('degC'), Td2m['data'].values* units('degC')) p_vapor=(np.array(rh2m))*6.105*(math.e**((17.27*t2m['data'].values/(237.7+t2m['data'].values)))) Td2m=np.array(Td2m['data'].values)* units('degC') #SN06_ensm=utl.get_model_points_gy(dir_rqd[12], filenames, points,allExists=False) ''' for i in range(0,len(SN06_ensm['forecast_period'])): SN06_std=np.std(np.squeeze(SN06_ensm['data'].values[i,:])) SN06_mean=np.mean(np.squeeze(SN06_ensm['data'].values[i,:])) if(i == 0): SN06_01=norm.pdf(0.01, SN06_mean, SN06_std) SN06_10=norm.pdf(0.1, SN06_mean, SN06_std) SN06_25=norm.pdf(0.25, SN06_mean, SN06_std) SN06_50=norm.pdf(0.5, SN06_mean, SN06_std) SN06_75=norm.pdf(0.75, SN06_mean, SN06_std) SN06_90=norm.pdf(0.9, SN06_mean, SN06_std) SN06_99=norm.pdf(0.99, SN06_mean, SN06_std) if(i > 0): SN06_01=[SN06_01,norm.pdf(0.01, SN06_mean, SN06_std)] SN06_10=[SN06_10,norm.pdf(0.1, SN06_mean, SN06_std)] SN06_25=[SN06_25,norm.pdf(0.25, SN06_mean, SN06_std)] SN06_50=[SN06_50,norm.pdf(0.5, SN06_mean, SN06_std)] SN06_75=[SN06_75,norm.pdf(0.75, SN06_mean, SN06_std)] SN06_90=[SN06_90,norm.pdf(0.9, SN06_mean, SN06_std)] SN06_99=[SN06_99,norm.pdf(0.99, SN06_mean, SN06_std)] SN06_ensm_stc={ 'SN06_01'=SN06_01 'SN06_10'=SN06_10 'SN06_25'=SN06_25 'SN06_50'=SN06_50 'SN06_75'=SN06_75 'SN06_90'=SN06_90 'SN06_99'=SN06_99 } ''' u10m=utl.get_model_points_gy(dir_rqd[10], filenames, points,allExists=False) v10m=utl.get_model_points_gy(dir_rqd[11], filenames, points,allExists=False) wsp10m=(u10m['data']**2+v10m['data']**2)**0.5 AT=1.07*t2m['data'].values+0.2*p_vapor-0.65*wsp10m-2.7 #https://en.wikipedia.org/wiki/Wind_chill TWC=13.12+0.6215*t2m['data'].values-11.37*(wsp10m**0.16)+0.3965*t2m['data'].values*(wsp10m**0.16) fhours = np.arange(t_range[0], t_range[1], t_gap) filenames = [last_file['SCMOC']+'.'+str(fhour).zfill(3) for fhour in fhours] VIS=utl.get_model_points_gy(dir_rqd[6], filenames, points,allExists=False,fill_null=True,Null_value=-0.001) if(last_file['SCMOC'] == last_file[model] and t_range[1] > 72): fhours = np.append(np.arange(3,72,3),np.arange(72, (t_range[1]), 6)) filenames = [last_file[model]+'.'+str(fhour).zfill(3) for fhour in fhours] filenames2 = [last_file[model]+'.'+str(fhour).zfill(3) for fhour in fhours] if(last_file['SCMOC'] != last_file[model] and t_range[1] > 60): fhours = np.append(np.arange(3,60,3),np.arange(60, (t_range[1]), 6)) filenames = [last_file[model]+'.'+str(fhour+12).zfill(3) for fhour in fhours] filenames2 = [last_file[model]+'.'+str(fhour).zfill(3) for fhour in fhours] if(last_file['SCMOC'] != last_file[model] and t_range[1] <= 60): fhours = np.arange(t_range[0], t_range[1], t_gap) filenames = [last_file[model]+'.'+str(fhour+12).zfill(3) for fhour in fhours] filenames2 = [last_file[model]+'.'+str(fhour).zfill(3) for fhour in fhours] if(last_file['SCMOC'] == last_file[model] and t_range[1] <= 72): fhours = np.arange(t_range[0], t_range[1], t_gap) filenames = [last_file[model]+'.'+str(fhour).zfill(3) for fhour in fhours] filenames2 = [last_file[model]+'.'+str(fhour).zfill(3) for fhour in fhours] SNOD1=utl.get_model_points_gy(dir_rqd[2], filenames2, points,allExists=False) SNOD2=utl.get_model_points_gy(dir_rqd[7], filenames2, points,allExists=False) SDEN=utl.get_model_points_gy(dir_rqd[3], filenames2, points,allExists=False) SN06=utl.get_model_points_gy(dir_rqd[8], filenames2, points,allExists=False) u100m=utl.get_model_points_gy(dir_rqd[4], filenames2, points,allExists=False) v100m=utl.get_model_points_gy(dir_rqd[5], filenames2, points,allExists=False) wsp100m=(u100m['data']**2+v100m['data']**2)**0.5 if(fhours[-1] < 120): gust10m=utl.get_model_points_gy(dir_rqd[0], filenames, points,allExists=False) if(fhours[-1] > 120): if(last_file['SCMOC'] == last_file[model]): fhours = np.arange(0, t_range[1], 6) filenames = [last_file[model]+'.'+str(fhour).zfill(3) for fhour in fhours] if(last_file['SCMOC'] != last_file[model]): fhours = np.arange(0, t_range[1], 6) filenames = [last_file[model]+'.'+str(fhour+12).zfill(3) for fhour in fhours] gust10m=utl.get_model_points_gy(dir_rqd[1], filenames, points,allExists=False) sta_graphics.draw_Station_Snow_Synthetical_Forecast_From_Cassandra( TWC=TWC,AT=AT,u10m=u10m,v10m=v10m,u100m=u100m,v100m=v100m, gust10m=gust10m,wsp10m=wsp10m,wsp100m=wsp100m,SNOD1=SNOD1,SNOD2=SNOD2,SDEN=SDEN,SN06=SN06, draw_VIS=draw_VIS,VIS=VIS,drw_thr=drw_thr, time_all=time_all, model=model,points=points, output_dir=output_dir,extra_info=extra_info)
def point_fcst_according_to_3D_field( model='ECMWF', output_dir=None, t_range=[0,60], t_gap=3, points={'lon':[116.3833], 'lat':[39.9], 'altitude':[1351]}, initTime=None,obs_ID=54511,day_back=0, extra_info={ 'output_head_name':' ', 'output_tail_name':' ', 'point_name':' ', 'drw_thr':True, 'levels_for_interp':[1000, 950, 925, 900, 850, 800, 700, 600, 500]} ): try: dir_rqd=[utl.Cassandra_dir(data_type='high',data_source=model,var_name='HGT',lvl=''), utl.Cassandra_dir(data_type='high',data_source=model,var_name='UGRD',lvl=''), utl.Cassandra_dir(data_type='high',data_source=model,var_name='VGRD',lvl=''), utl.Cassandra_dir(data_type='high',data_source=model,var_name='TMP',lvl=''), utl.Cassandra_dir(data_type='surface',data_source=model,var_name='RAIN'+str(t_gap).zfill(2))] except KeyError: raise ValueError('Can not find all required directories needed') #-get all the directories needed if(initTime == None): initTime = get_latest_initTime(dir_rqd[0][0:-1]+'/850') #initTime=utl.filename_day_back_model(day_back=day_back,fhour=0)[0:8] directory=dir_rqd[0][0:-1] fhours = np.arange(t_range[0], t_range[1], t_gap) filenames = [initTime+'.'+str(fhour).zfill(3) for fhour in fhours] HGT_4D=get_model_3D_grids(directory=directory,filenames=filenames,levels=extra_info['levels_for_interp'], allExists=False) directory=dir_rqd[1][0:-1] U_4D=get_model_3D_grids(directory=directory,filenames=filenames,levels=extra_info['levels_for_interp'], allExists=False) directory=dir_rqd[2][0:-1] V_4D=get_model_3D_grids(directory=directory,filenames=filenames,levels=extra_info['levels_for_interp'], allExists=False) directory=dir_rqd[3][0:-1] TMP_4D=get_model_3D_grids(directory=directory,filenames=filenames,levels=extra_info['levels_for_interp'], allExists=False) rn=utl.get_model_points_gy(dir_rqd[4], filenames, points,allExists=False) directory=dir_rqd[3][0:-1] coords_info_2D=utl.get_model_points_gy(directory+str(extra_info['levels_for_interp'][0])+'/', points=points,filenames=filenames,allExists=False) delt_xy=HGT_4D['lon'].values[1]-HGT_4D['lon'].values[0] mask = (HGT_4D['lon']<(points['lon']+2*delt_xy))&(HGT_4D['lon']>(points['lon']-2*delt_xy))&(HGT_4D['lat']<(points['lat']+2*delt_xy))&(HGT_4D['lat']>(points['lat']-2*delt_xy)) HGT_4D_sm=HGT_4D['data'].where(mask,drop=True) U_4D_sm=U_4D['data'].where(mask,drop=True) V_4D_sm=V_4D['data'].where(mask,drop=True) TMP_4D_sm=U_4D['data'].where(mask,drop=True) lon_md=np.squeeze(HGT_4D_sm['lon'].values) lat_md=np.squeeze(HGT_4D_sm['lat'].values) alt_md=np.squeeze(HGT_4D_sm.values*10).flatten() time_md=np.squeeze(HGT_4D_sm['forecast_period'].values) coords = np.zeros((len(time_md),len(extra_info['levels_for_interp']),len(lat_md),len(lon_md),4)) coords[...,0]=time_md.reshape((len(time_md),1,1,1)) coords[...,2] = lat_md.reshape((1,1,len(lat_md),1)) coords[...,3] = lon_md.reshape((1,1,1,len(lon_md))) coords = coords.reshape((alt_md.size,4)) coords[:,1]=alt_md interpolator_U = LinearNDInterpolator(coords,U_4D_sm.values.reshape((U_4D_sm.values.size)),rescale=True) interpolator_V = LinearNDInterpolator(coords,V_4D_sm.values.reshape((V_4D_sm.values.size)),rescale=True) interpolator_TMP = LinearNDInterpolator(coords,TMP_4D_sm.values.reshape((TMP_4D_sm.values.size)),rescale=True) coords2 = np.zeros((len(time_md),1,1,1,4)) coords2[...,0]=time_md.reshape((len(time_md),1,1,1)) coords2[...,1]=points['altitude'][0] coords2[...,2] = points['lat'][0] coords2[...,3] = points['lon'][0] coords2 = coords2.reshape((time_md.size,4)) U_interped=np.squeeze(interpolator_U(coords2)) V_interped=np.squeeze(interpolator_V(coords2)) TMP_interped=np.squeeze(interpolator_TMP(coords2)) U_interped_xr=coords_info_2D.copy() U_interped_xr['data'].values=U_interped.reshape(U_interped.size,1,1) V_interped_xr=coords_info_2D.copy() V_interped_xr['data'].values=V_interped.reshape(V_interped.size,1,1) TMP_interped_xr=coords_info_2D.copy() TMP_interped_xr['data'].values=TMP_interped.reshape(TMP_interped.size,1,1) sta_graphics.draw_point_fcst(t2m=TMP_interped_xr,u10m=U_interped_xr,v10m=V_interped_xr,rn=rn, model=model, output_dir=output_dir, points=points, extra_info=extra_info )
def wind_rh_according_to_4D_data( initTime=None, fhour=6, day_back=0, model='ECMWF', sta_fcs={ 'lon': [101.82, 101.32, 101.84, 102.23, 102.2681], 'lat': [28.35, 27.91, 28.32, 27.82, 27.8492], 'altitude': [3600, 3034.62, 3240, 1669, 1941.5], 'name': ['健美乡', '项脚乡', '\n锦屏镇', '\n马道镇', 'S9005 '] }, draw_zd=True, levels=[1000, 950, 925, 900, 850, 800, 700, 600, 500], map_ratio=19 / 9, zoom_ratio=1, south_China_sea=False, area='全国', city=False, output_dir=None, bkgd_type='satellite', data_source='MICAPS'): # micaps data directory if (area != '全国'): south_China_sea = False # prepare data if (area != '全国'): cntr_pnt, zoom_ratio = utl.get_map_area(area_name=area) cntr_pnt = np.append(np.mean(sta_fcs['lon']), np.mean(sta_fcs['lat'])) map_extent = [0, 0, 0, 0] map_extent[0] = cntr_pnt[0] - zoom_ratio * 1 * map_ratio map_extent[1] = cntr_pnt[0] + zoom_ratio * 1 * map_ratio map_extent[2] = cntr_pnt[1] - zoom_ratio * 1 map_extent[3] = cntr_pnt[1] + zoom_ratio * 1 bkgd_level = utl.cal_background_zoom_ratio(zoom_ratio) # micaps data directory if (data_source == 'MICAPS'): try: data_dir = [ utl.Cassandra_dir(data_type='high', data_source=model, var_name='HGT', lvl=''), utl.Cassandra_dir(data_type='high', data_source=model, var_name='RH', lvl=''), utl.Cassandra_dir(data_type='high', data_source=model, var_name='UGRD', lvl=''), utl.Cassandra_dir(data_type='high', data_source=model, var_name='VGRD', lvl=''), utl.Cassandra_dir(data_type='surface', data_source=model, var_name='u10m'), utl.Cassandra_dir(data_type='surface', data_source=model, var_name='v10m'), utl.Cassandra_dir(data_type='surface', data_source=model, var_name='Td2m'), utl.Cassandra_dir(data_type='surface', data_source=model, var_name='T2m') ] except KeyError: raise ValueError('Can not find all directories needed') # get filename if (initTime != None): filename = utl.model_filename(initTime, fhour) else: filename = utl.filename_day_back_model(day_back=day_back, fhour=fhour) initTime = filename[0:8] # retrieve data from micaps server gh = MICAPS_IO.get_model_3D_grid(directory=data_dir[0][0:-1], filename=filename, levels=levels) if (gh is None): return gh['data'].values = gh['data'].values * 10 rh = MICAPS_IO.get_model_3D_grid(directory=data_dir[1][0:-1], filename=filename, levels=levels, allExists=False) if rh is None: return u = MICAPS_IO.get_model_3D_grid(directory=data_dir[2][0:-1], filename=filename, levels=levels, allExists=False) if u is None: return v = MICAPS_IO.get_model_3D_grid(directory=data_dir[3][0:-1], filename=filename, levels=levels, allExists=False) if v is None: return u10m = MICAPS_IO.get_model_grid(directory=data_dir[4], filename=filename) if u10m is None: return v10m = MICAPS_IO.get_model_grid(directory=data_dir[5], filename=filename) if v10m is None: return td2m = MICAPS_IO.get_model_grid(directory=data_dir[6], filename=filename) if td2m is None: return t2m = MICAPS_IO.get_model_grid(directory=data_dir[7], filename=filename) if t2m is None: return if (draw_zd == True): validtime = (datetime.strptime('20' + initTime, '%Y%m%d%H') + timedelta(hours=fhour)).strftime("%Y%m%d%H") directory_obs = utl.Cassandra_dir(data_type='surface', data_source='OBS', var_name='PLOT_ALL') try: zd_sta = MICAPS_IO.get_station_data(filename=validtime + '0000.000', directory=directory_obs, dropna=True, cache=False) obs_valid = True except: zd_sta = MICAPS_IO.get_station_data(directory=directory_obs, dropna=True, cache=False) obs_valid = False zd_lon = zd_sta['lon'].values zd_lat = zd_sta['lat'].values zd_alt = zd_sta['Alt'].values zd_u, zd_v = mpcalc.wind_components( zd_sta['Wind_speed_2m_avg'].values * units('m/s'), zd_sta['Wind_angle_2m_avg'].values * units.deg) idx_zd = np.where((zd_lon > map_extent[0]) & (zd_lon < map_extent[1]) & (zd_lat > map_extent[2]) & (zd_lat < map_extent[3])) zd_sm_lon = zd_lon[idx_zd[0]] zd_sm_lat = zd_lat[idx_zd[0]] zd_sm_alt = zd_alt[idx_zd[0]] zd_sm_u = zd_u[idx_zd[0]] zd_sm_v = zd_v[idx_zd[0]] if (data_source == 'CIMISS'): # get filename if (initTime != None): filename = utl.model_filename(initTime, fhour, UTC=True) else: filename = utl.filename_day_back_model(day_back=day_back, fhour=fhour, UTC=True) try: # retrieve data from CMISS server gh = CIMISS_IO.cimiss_model_3D_grid( data_code=utl.CMISS_data_code(data_source=model, var_name='GPH'), init_time_str='20' + filename[0:8], valid_time=fhour, levattrs={ 'long_name': 'pressure_level', 'units': 'hPa', '_CoordinateAxisType': '-' }, fcst_levels=levels, fcst_ele="GPH", units='gpm') if gh is None: return rh = CIMISS_IO.cimiss_model_3D_grid( data_code=utl.CMISS_data_code(data_source=model, var_name='RHU'), init_time_str='20' + filename[0:8], valid_time=fhour, levattrs={ 'long_name': 'pressure_level', 'units': 'hPa', '_CoordinateAxisType': '-' }, fcst_levels=levels, fcst_ele="RHU", units='%') if rh is None: return u = CIMISS_IO.cimiss_model_3D_grid( data_code=utl.CMISS_data_code(data_source=model, var_name='WIU'), init_time_str='20' + filename[0:8], valid_time=fhour, levattrs={ 'long_name': 'pressure_level', 'units': 'hPa', '_CoordinateAxisType': '-' }, fcst_levels=levels, fcst_ele="WIU", units='m/s') if u is None: return v = CIMISS_IO.cimiss_model_3D_grid( data_code=utl.CMISS_data_code(data_source=model, var_name='WIV'), init_time_str='20' + filename[0:8], valid_time=fhour, levattrs={ 'long_name': 'pressure_level', 'units': 'hPa', '_CoordinateAxisType': '-' }, fcst_levels=levels, fcst_ele="WIV", units='m/s') if v is None: return if (model == 'ECMWF'): td2m = CIMISS_IO.cimiss_model_by_time( '20' + filename[0:8], valid_time=fhour, data_code=utl.CMISS_data_code(data_source=model, var_name='DPT'), levattrs={ 'long_name': 'height_above_ground', 'units': 'm', '_CoordinateAxisType': '-' }, fcst_level=0, fcst_ele="DPT", units='K') if td2m is None: return t2m = CIMISS_IO.cimiss_model_by_time( '20' + filename[0:8], valid_time=fhour, data_code=utl.CMISS_data_code(data_source=model, var_name='TEF2'), levattrs={ 'long_name': 'height_above_ground', 'units': 'm', '_CoordinateAxisType': '-' }, fcst_level=0, fcst_ele="TEF2", units='K') if t2m is None: return v10m = CIMISS_IO.cimiss_model_by_time( '20' + filename[0:8], valid_time=fhour, data_code=utl.CMISS_data_code(data_source=model, var_name='WIV10'), levattrs={ 'long_name': 'height_above_ground', 'units': 'm', '_CoordinateAxisType': '-' }, fcst_level=0, fcst_ele="WIV10", units='m/s') if v10m is None: return u10m = CIMISS_IO.cimiss_model_by_time( '20' + filename[0:8], valid_time=fhour, data_code=utl.CMISS_data_code(data_source=model, var_name='WIU10'), levattrs={ 'long_name': 'height_above_ground', 'units': 'm', '_CoordinateAxisType': '-' }, fcst_level=0, fcst_ele="WIU10", units='m/s') if u10m is None: return if (model == 'GRAPES_GFS'): rh2m = CIMISS_IO.cimiss_model_by_time( '20' + filename[0:8], valid_time=fhour, data_code=utl.CMISS_data_code(data_source=model, var_name='RHF2'), levattrs={ 'long_name': 'height_above_ground', 'units': 'm', '_CoordinateAxisType': '-' }, fcst_level=2, fcst_ele="RHF2", units='%') if rh2m is None: return v10m = CIMISS_IO.cimiss_model_by_time( '20' + filename[0:8], valid_time=fhour, data_code=utl.CMISS_data_code(data_source=model, var_name='WIV10'), levattrs={ 'long_name': 'height_above_ground', 'units': 'm', '_CoordinateAxisType': '-' }, fcst_level=10, fcst_ele="WIV10", units='m/s') if v10m is None: return u10m = CIMISS_IO.cimiss_model_by_time( '20' + filename[0:8], valid_time=fhour, data_code=utl.CMISS_data_code(data_source=model, var_name='WIU10'), levattrs={ 'long_name': 'height_above_ground', 'units': 'm', '_CoordinateAxisType': '-' }, fcst_level=10, fcst_ele="WIU10", units='m/s') if u10m is None: return except KeyError: raise ValueError('Can not find all data needed') if (draw_zd == True): if (initTime == None): initTime1 = CIMISS_IO.cimiss_get_obs_latest_time( data_code="SURF_CHN_MUL_HOR") initTime = (datetime.strptime('20' + initTime1, '%Y%m%d%H') - timedelta(days=day_back)).strftime("%Y%m%d%H")[2:] validtime = (datetime.strptime('20' + initTime, '%Y%m%d%H') + timedelta(hours=fhour)).strftime("%Y%m%d%H") data_code = utl.CMISS_data_code(data_source='OBS', var_name='PLOT_sfc') zd_sta = CIMISS_IO.cimiss_obs_by_time( times=validtime + '0000', data_code=data_code, sta_levels="011,012,013,014", elements= "Station_Id_C,Station_Id_d,lat,lon,Alti,TEM,WIN_D_Avg_2mi,WIN_S_Avg_2mi,RHU" ) obs_valid = True if (zd_sta is None): CIMISS_IO.cimiss_get_obs_latest_time(data_code=data_code, latestTime=6) zd_sta = CIMISS_IO.cimiss_obs_by_time(directory=directory_obs, dropna=True, cache=False) obs_valid = False zd_lon = zd_sta['lon'].values zd_lat = zd_sta['lat'].values zd_alt = zd_sta['Alti'].values zd_u, zd_v = mpcalc.wind_components( zd_sta['WIN_S_Avg_2mi'].values * units('m/s'), zd_sta['WIN_D_Avg_2mi'].values * units.deg) idx_zd = np.where((zd_lon > map_extent[0]) & (zd_lon < map_extent[1]) & (zd_lat > map_extent[2]) & (zd_lat < map_extent[3]) & (zd_sta['WIN_S_Avg_2mi'].values < 1000)) zd_sm_lon = zd_lon[idx_zd[0]] zd_sm_lat = zd_lat[idx_zd[0]] zd_sm_alt = zd_alt[idx_zd[0]] zd_sm_u = zd_u[idx_zd[0]] zd_sm_v = zd_v[idx_zd[0]] #maskout area delt_xy = rh['lon'].values[1] - rh['lon'].values[0] #+ to solve the problem of labels on all the contours mask1 = (rh['lon'] > map_extent[0] - delt_xy) & ( rh['lon'] < map_extent[1] + delt_xy) & ( rh['lat'] > map_extent[2] - delt_xy) & (rh['lat'] < map_extent[3] + delt_xy) mask2 = (u10m['lon'] > map_extent[0] - delt_xy) & ( u10m['lon'] < map_extent[1] + delt_xy) & ( u10m['lat'] > map_extent[2] - delt_xy) & (u10m['lat'] < map_extent[3] + delt_xy) #- to solve the problem of labels on all the contours rh = rh.where(mask1, drop=True) u = u.where(mask1, drop=True) v = v.where(mask1, drop=True) gh = gh.where(mask1, drop=True) u10m = u10m.where(mask2, drop=True) v10m = v10m.where(mask2, drop=True) #prepare interpolator Ex1 = np.squeeze(u['data'].values).flatten() Ey1 = np.squeeze(v['data'].values).flatten() Ez1 = np.squeeze(rh['data'].values).flatten() z = (np.squeeze(gh['data'].values)).flatten() coords = np.zeros((np.size(levels), u['lat'].size, u['lon'].size, 3)) coords[..., 1] = u['lat'].values.reshape((1, u['lat'].size, 1)) coords[..., 2] = u['lon'].values.reshape((1, 1, u['lon'].size)) coords = coords.reshape((Ex1.size, 3)) coords[:, 0] = z interpolator_U = LinearNDInterpolator(coords, Ex1, rescale=True) interpolator_V = LinearNDInterpolator(coords, Ey1, rescale=True) interpolator_RH = LinearNDInterpolator(coords, Ez1, rescale=True) #process sta_fcs 10m wind coords2 = np.zeros((np.size(sta_fcs['lon']), 3)) coords2[:, 0] = sta_fcs['altitude'] coords2[:, 1] = sta_fcs['lat'] coords2[:, 2] = sta_fcs['lon'] u_sta = interpolator_U(coords2) v_sta = interpolator_V(coords2) RH_sta = interpolator_RH(coords2) wsp_sta = (u_sta**2 + v_sta**2)**0.5 u10m_2D = u10m.interp(lon=('points', sta_fcs['lon']), lat=('points', sta_fcs['lat'])) v10m_2D = v10m.interp(lon=('points', sta_fcs['lon']), lat=('points', sta_fcs['lat'])) if (model == 'GRAPES_GFS' and data_source == 'CIMISS'): rh2m_2D = rh2m.interp(lon=('points', sta_fcs['lon']), lat=('points', sta_fcs['lat']))['data'].values else: td2m_2D = td2m.interp(lon=('points', sta_fcs['lon']), lat=('points', sta_fcs['lat'])) t2m_2D = t2m.interp(lon=('points', sta_fcs['lon']), lat=('points', sta_fcs['lat'])) if (data_source == 'MICAPS'): rh2m_2D = mpcalc.relative_humidity_from_dewpoint( t2m_2D['data'].values * units('degC'), td2m_2D['data'].values * units('degC')) * 100 else: rh2m_2D = mpcalc.relative_humidity_from_dewpoint( t2m_2D['data'].values * units('kelvin'), td2m_2D['data'].values * units('kelvin')) * 100 wsp10m_2D = (u10m_2D['data'].values**2 + v10m_2D['data'].values**2)**0.5 winddir10m = mpcalc.wind_direction(u10m_2D['data'].values * units('m/s'), v10m_2D['data'].values * units('m/s')) if (np.isnan(wsp_sta).any()): if (wsp_sta.size == 1): wsp_sta[np.isnan(wsp_sta)] = np.squeeze( wsp10m_2D[np.isnan(wsp_sta)]) RH_sta[np.isnan(RH_sta)] = np.squeeze( np.array(rh2m_2D)[np.isnan(RH_sta)]) else: wsp_sta[np.isnan(wsp_sta)] = np.squeeze(wsp10m_2D)[np.isnan( wsp_sta)] RH_sta[np.isnan(RH_sta)] = np.squeeze( np.array(rh2m_2D))[np.isnan(RH_sta)] u_sta, v_sta = mpcalc.wind_components(wsp_sta * units('m/s'), winddir10m) #process zd_sta 10m wind zd_fcst_obs = None if (draw_zd is True): coords3 = np.zeros((np.size(zd_sm_alt), 3)) coords3[:, 0] = zd_sm_alt coords3[:, 1] = zd_sm_lat coords3[:, 2] = zd_sm_lon u_sm_sta = interpolator_U(coords3) v_sm_sta = interpolator_V(coords3) wsp_sm_sta = (u_sm_sta**2 + v_sm_sta**2)**0.5 u10m_sm = u10m.interp(lon=('points', zd_sm_lon), lat=('points', zd_sm_lat)) v10m_sm = v10m.interp(lon=('points', zd_sm_lon), lat=('points', zd_sm_lat)) wsp10m_sta = np.squeeze( (u10m_sm['data'].values**2 + v10m_sm['data'].values**2)**0.5) winddir10m_sm = mpcalc.wind_direction( u10m_sm['data'].values * units('m/s'), v10m_sm['data'].values * units('m/s')) if (np.isnan(wsp_sm_sta).any()): wsp_sm_sta[np.isnan(wsp_sm_sta)] = wsp10m_sta[np.isnan(wsp_sm_sta)] u_sm_sta, v_sm_sta = mpcalc.wind_components(wsp_sm_sta * units('m/s'), winddir10m_sm) zd_fcst_obs = { 'lon': zd_sm_lon, 'lat': zd_sm_lat, 'altitude': zd_sm_alt, 'U': np.squeeze(np.array(u_sm_sta)), 'V': np.squeeze(np.array(v_sm_sta)), 'obs_valid': obs_valid, 'U_obs': np.squeeze(np.array(zd_sm_u)), 'V_obs': np.squeeze(np.array(zd_sm_v)) } #prepare for graphics sta_fcs_fcst = { 'lon': sta_fcs['lon'], 'lat': sta_fcs['lat'], 'altitude': sta_fcs['altitude'], 'name': sta_fcs['name'], 'RH': np.array(RH_sta), 'U': np.squeeze(np.array(u_sta)), 'V': np.squeeze(np.array(v_sta)) } fcst_info = gh.coords local_scale_graphics.draw_wind_rh_according_to_4D_data( sta_fcs_fcst=sta_fcs_fcst, zd_fcst_obs=zd_fcst_obs, fcst_info=fcst_info, map_extent=map_extent, draw_zd=draw_zd, bkgd_type=bkgd_type, bkgd_level=bkgd_level, output_dir=None)
def low_level_wind(initTime=None, fhour=6, day_back=0, model='ECMWF', wind_level='100m', data_source='MICAPS', map_ratio=19 / 9, zoom_ratio=20, cntr_pnt=[102, 34], south_China_sea=True, area='全国', city=False, output_dir=None, Global=False): # micaps data directory if (data_source == 'MICAPS'): try: data_dir = [ utl.Cassandra_dir(data_type='surface', data_source=model, var_name='u' + wind_level), utl.Cassandra_dir(data_type='surface', data_source=model, var_name='v' + wind_level) ] except KeyError: raise ValueError('Can not find all directories needed') # get filename if (initTime != None): filename = utl.model_filename(initTime, fhour) else: filename = utl.filename_day_back_model(day_back=day_back, fhour=fhour) # retrieve data from micaps server u10m = MICAPS_IO.get_model_grid(data_dir[0], filename=filename) if u10m is None: return v10m = MICAPS_IO.get_model_grid(data_dir[1], filename=filename) if v10m is None: return init_time = v10m.coords['forecast_reference_time'].values # prepare data if (area != None): cntr_pnt, zoom_ratio = utl.get_map_area(area_name=area) if (area != '全国'): south_China_sea = False if (data_source == 'CIMISS'): # get filename if (initTime != None): filename = utl.model_filename(initTime, fhour, UTC=True) else: filename = utl.filename_day_back_model(day_back=day_back, fhour=fhour, UTC=True) try: # retrieve data from CMISS server u10m = CMISS_IO.cimiss_model_by_time( '20' + filename[0:8], valid_time=fhour, data_code=utl.CMISS_data_code(data_source=model, var_name='WIU' + wind_level[0:-1]), fcst_level=0, fcst_ele="WIU" + wind_level[0:-1], units='m*s-1') if u10m is None: return v10m = CMISS_IO.cimiss_model_by_time( '20' + filename[0:8], valid_time=fhour, data_code=utl.CMISS_data_code(data_source=model, var_name='WIV' + wind_level[0:-1]), fcst_level=0, fcst_ele="WIV" + wind_level[0:-1], units='m*s-1') if v10m is None: return except KeyError: raise ValueError('Can not find all data needed') map_extent = [0, 0, 0, 0] map_extent[0] = cntr_pnt[0] - zoom_ratio * 1 * map_ratio map_extent[1] = cntr_pnt[0] + zoom_ratio * 1 * map_ratio map_extent[2] = cntr_pnt[1] - zoom_ratio * 1 map_extent[3] = cntr_pnt[1] + zoom_ratio * 1 delt_x = (map_extent[1] - map_extent[0]) * 0.2 delt_y = (map_extent[3] - map_extent[2]) * 0.1 #+ to solve the problem of labels on all the contours mask1 = (v10m['lon'] > map_extent[0] - delt_x) & ( v10m['lon'] < map_extent[1] + delt_x) & ( v10m['lat'] > map_extent[2] - delt_y) & (v10m['lat'] < map_extent[3] + delt_y) u10m = u10m.where(mask1, drop=True) v10m = v10m.where(mask1, drop=True) uv = xr.merge([u10m.rename({'data': 'u'}), v10m.rename({'data': 'v'})]) uv.attrs['model'] = model uv.attrs['level'] = wind_level elements_graphics.draw_low_level_wind(uv=uv, map_extent=map_extent, regrid_shape=20, city=city, south_China_sea=south_China_sea, output_dir=output_dir, Global=Global)
def Time_Crossection_rh_uv_theta_e( initTime=None, model='ECMWF', points={ 'lon': [116.3833], 'lat': [39.9] }, levels=[1000, 950, 925, 900, 850, 800, 700, 600, 500, 400, 300, 200], t_gap=3, t_range=[0, 48], output_dir=None): fhours = np.arange(t_range[0], t_range[1], t_gap) # 读数据 try: data_dir = [ utl.Cassandra_dir(data_type='high', data_source=model, var_name='TMP', lvl=''), utl.Cassandra_dir(data_type='high', data_source=model, var_name='UGRD', lvl=''), utl.Cassandra_dir(data_type='high', data_source=model, var_name='VGRD', lvl=''), utl.Cassandra_dir(data_type='high', data_source=model, var_name='RH', lvl='') ] except KeyError: raise ValueError('Can not find all directories needed') if (initTime == None): initTime = get_latest_initTime(data_dir[0][0:-1] + "850") filenames = [initTime + '.' + str(fhour).zfill(3) for fhour in fhours] TMP_4D = get_model_3D_grids(directory=data_dir[0][0:-1], filenames=filenames, levels=levels, allExists=False) TMP_2D = TMP_4D.interp(lon=('points', points['lon']), lat=('points', points['lat'])) filenames = [initTime + '.' + str(fhour).zfill(3) for fhour in fhours] u_4D = get_model_3D_grids(directory=data_dir[1][0:-1], filenames=filenames, levels=levels, allExists=False) u_2D = u_4D.interp(lon=('points', points['lon']), lat=('points', points['lat'])) filenames = [initTime + '.' + str(fhour).zfill(3) for fhour in fhours] v_4D = get_model_3D_grids(directory=data_dir[2][0:-1], filenames=filenames, levels=levels, allExists=False) v_2D = v_4D.interp(lon=('points', points['lon']), lat=('points', points['lat'])) filenames = [initTime + '.' + str(fhour).zfill(3) for fhour in fhours] rh_4D = get_model_3D_grids(directory=data_dir[3][0:-1], filenames=filenames, levels=levels, allExists=False) rh_2D = rh_4D.interp(lon=('points', points['lon']), lat=('points', points['lat'])) rh_2D.attrs['model'] = model rh_2D.attrs['points'] = points Td_2D = mpcalc.dewpoint_rh(TMP_2D['data'].values * units.celsius, rh_2D['data'].values * units.percent) rh, pressure = xr.broadcast(rh_2D['data'], rh_2D['level']) Theta_e = mpcalc.equivalent_potential_temperature( pressure, TMP_2D['data'].values * units.celsius, Td_2D) theta_e_2D = xr.DataArray(np.array(Theta_e), coords=rh_2D['data'].coords, dims=rh_2D['data'].dims, attrs={'units': Theta_e.units}) crossection_graphics.draw_Time_Crossection_rh_uv_theta_e( rh_2D=rh_2D, u_2D=u_2D, v_2D=v_2D, theta_e_2D=theta_e_2D, t_range=t_range, output_dir=output_dir)
def gh_rain(initTime=None, fhour=24, day_back=0, model='ECMWF', gh_lev=500, atime=6, data_source='MICAPS', map_ratio=14 / 9, zoom_ratio=20, cntr_pnt=[104, 34], south_China_sea=True, area=None, city=False, output_dir=None, Global=False, **kwargs): # prepare data if (data_source == 'MICAPS'): try: data_dir = [ utl.Cassandra_dir(data_type='high', data_source=model, var_name='HGT', lvl=str(gh_lev)), utl.Cassandra_dir(data_type='surface', data_source=model, var_name='RAIN' + '%02d' % atime), utl.Cassandra_dir(data_type='surface', data_source=model, var_name='PSFC') ] except KeyError: raise ValueError('Can not find all directories needed') # get filename if (initTime != None): filename = utl.model_filename(initTime, fhour) if (atime > 3): filename_gh = utl.model_filename(initTime, int(fhour - atime / 2)) else: filename = utl.filename_day_back_model(day_back=day_back, fhour=fhour) if (atime > 3): filename_gh = utl.filename_day_back_model(day_back=day_back, fhour=int(fhour - atime / 2)) # retrieve data from micaps server gh = MICAPS_IO.get_model_grid(data_dir[0], filename=filename_gh) if gh is None: return rain = MICAPS_IO.get_model_grid(data_dir[1], filename=filename) if rain is None: return psfc = MICAPS_IO.get_model_grid(data_dir[2], filename=filename) if (data_source == 'CIMISS'): # get filename if (initTime != None): filename = utl.model_filename(initTime, fhour, UTC=True) if (atime > 3): filename_gh = utl.model_filename(initTime, fhour=int(fhour - atime / 2), UTC=True) else: filename = utl.filename_day_back_model(day_back=day_back, fhour=fhour, UTC=True) if (atime > 3): filename_gh = utl.filename_day_back_model(day_back=day_back, fhour=int(fhour - atime / 2), UTC=True) try: # retrieve data from CIMISS server gh = CMISS_IO.cimiss_model_by_time( '20' + filename_gh[0:8], valid_time=fhour, data_code=utl.CMISS_data_code(data_source=model, var_name='GPH'), levattrs={ 'long_name': 'pressure_level', 'units': 'hPa', '_CoordinateAxisType': '-' }, fcst_level=gh_lev, fcst_ele="GPH", units='gpm') if gh is None: return gh['data'].values = gh['data'].values / 10. TPE1 = CMISS_IO.cimiss_model_by_time( '20' + filename[0:8], valid_time=fhour, data_code=utl.CMISS_data_code(data_source=model, var_name='TPE'), levattrs={ 'long_name': 'Height above Ground', 'units': 'm', '_CoordinateAxisType': '-' }, fcst_level=0, fcst_ele="TPE", units='kg*m^-2') if TPE1 is None: return TPE2 = CMISS_IO.cimiss_model_by_time( '20' + filename[0:8], valid_time=fhour - atime, data_code=utl.CMISS_data_code(data_source=model, var_name='TPE'), levattrs={ 'long_name': 'Height above Ground', 'units': 'm', '_CoordinateAxisType': '-' }, fcst_level=0, fcst_ele="TPE", units='kg*m^-2') if TPE2 is None: return psfc = CMISS_IO.cimiss_model_by_time('20' + filename[0:8], valid_time=fhour, data_code=utl.CMISS_data_code( data_source=model, var_name='PRS'), fcst_level=0, fcst_ele="PRS", units='Pa') psfc['data'] = psfc['data'] / 100. except KeyError: raise ValueError('Can not find all data needed') rain = TPE1.copy(deep=True) rain['data'].values = TPE1['data'].values - TPE2['data'].values # set map extent if (area != None): south_China_sea = False if (area != None): cntr_pnt, zoom_ratio = utl.get_map_area(area_name=area) map_extent = [0, 0, 0, 0] map_extent[0] = cntr_pnt[0] - zoom_ratio * 1 * map_ratio map_extent[1] = cntr_pnt[0] + zoom_ratio * 1 * map_ratio map_extent[2] = cntr_pnt[1] - zoom_ratio * 1 map_extent[3] = cntr_pnt[1] + zoom_ratio * 1 delt_x = (map_extent[1] - map_extent[0]) * 0.2 delt_y = (map_extent[3] - map_extent[2]) * 0.1 gh = utl.cut_xrdata(map_extent, gh, delt_x=delt_x, delt_y=delt_y) rain = utl.cut_xrdata(map_extent, rain, delt_x=delt_x, delt_y=delt_y) gh = utl.mask_terrian(gh_lev, psfc, gh) gh.attrs['model'] = model gh.attrs['lev'] = gh_lev rain.attrs['atime'] = atime # draw QPF_graphics.draw_gh_rain(rain=rain, gh=gh, map_extent=map_extent, regrid_shape=20, city=city, south_China_sea=south_China_sea, output_dir=output_dir, Global=Global)
def gh_uv_wvfl(initTime=None, fhour=6, day_back=0,model='GRAPES_GFS', gh_lev=500,uv_lev=850,wvfl_lev=850, map_ratio=19/9,zoom_ratio=20,cntr_pnt=[102,34], south_China_sea=True,area = '全国',city=False,output_dir=None,data_source='MICAPS', Global=False): if(area != '全国'): south_China_sea=False # micaps data directory if(data_source =='MICAPS'): try: data_dir = [utl.Cassandra_dir(data_type='high',data_source=model,var_name='HGT',lvl=gh_lev), utl.Cassandra_dir(data_type='high',data_source=model,var_name='UGRD',lvl=uv_lev), utl.Cassandra_dir(data_type='high',data_source=model,var_name='VGRD',lvl=uv_lev), utl.Cassandra_dir(data_type='high',data_source=model,var_name='WVFL',lvl=wvfl_lev) ] except KeyError: raise ValueError('Can not find all directories needed') # get filename if(initTime != None): filename = utl.model_filename(initTime, fhour) else: filename=utl.filename_day_back_model(day_back=day_back,fhour=fhour) # retrieve data from micaps server gh = MICAPS_IO.get_model_grid(data_dir[0], filename=filename) if gh is None: return u = MICAPS_IO.get_model_grid(data_dir[1], filename=filename) if u is None: return v = MICAPS_IO.get_model_grid(data_dir[2], filename=filename) if v is None: return wvfl = MICAPS_IO.get_model_grid(data_dir[3], filename=filename) if wvfl is None: return if(data_source =='CIMISS'): # get filename if(initTime != None): filename = utl.model_filename(initTime, fhour,UTC=True) else: filename=utl.filename_day_back_model(day_back=day_back,fhour=fhour,UTC=True) try: # retrieve data from CMISS server gh=CMISS_IO.cimiss_model_by_time('20'+filename[0:8],valid_time=fhour, data_code=utl.CMISS_data_code(data_source=model,var_name='GPH'), levattrs={'long_name':'pressure_level', 'units':'hPa', '_CoordinateAxisType':'-'}, fcst_level=gh_lev, fcst_ele="GPH", units='gpm') if gh is None: return gh['data'].values=gh['data'].values/10. u=CMISS_IO.cimiss_model_by_time('20'+filename[0:8],valid_time=fhour, data_code=utl.CMISS_data_code(data_source=model,var_name='WIU'), levattrs={'long_name':'pressure_level', 'units':'hPa', '_CoordinateAxisType':'-'}, fcst_level=uv_lev, fcst_ele="WIU", units='m/s') if u is None: return v=CMISS_IO.cimiss_model_by_time('20'+filename[0:8],valid_time=fhour, data_code=utl.CMISS_data_code(data_source=model,var_name='WIV'), levattrs={'long_name':'pressure_level', 'units':'hPa', '_CoordinateAxisType':'-'}, fcst_level=uv_lev, fcst_ele="WIV", units='m/s') if v is None: return wvfl=CMISS_IO.cimiss_model_by_time('20'+filename[0:8],valid_time=fhour, data_code=utl.CMISS_data_code(data_source=model,var_name='MOFU'), levattrs={'long_name':'pressure_level', 'units':'hPa', '_CoordinateAxisType':'-'}, fcst_level=wvfl_lev, fcst_ele="MOFU", units='10^-1*g/cm*hPa*s') if wvfl is None: return except KeyError: raise ValueError('Can not find all data needed') # prepare data if(area != None): cntr_pnt,zoom_ratio=utl.get_map_area(area_name=area) map_extent=[0,0,0,0] map_extent[0]=cntr_pnt[0]-zoom_ratio*1*map_ratio map_extent[1]=cntr_pnt[0]+zoom_ratio*1*map_ratio map_extent[2]=cntr_pnt[1]-zoom_ratio*1 map_extent[3]=cntr_pnt[1]+zoom_ratio*1 delt_x=(map_extent[1]-map_extent[0])*0.2 delt_y=(map_extent[3]-map_extent[2])*0.1 #+ to solve the problem of labels on all the contours mask1 = (gh['lon'] > map_extent[0]-delt_x) & (gh['lon'] < map_extent[1]+delt_x) & (gh['lat'] > map_extent[2]-delt_y) & (gh['lat'] < map_extent[3]+delt_y) mask2 = (u['lon'] > map_extent[0]-delt_x) & (u['lon'] < map_extent[1]+delt_x) & (u['lat'] > map_extent[2]-delt_y) & (u['lat'] < map_extent[3]+delt_y) mask3 = (wvfl['lon'] > map_extent[0]-delt_x) & (u['lon'] < map_extent[1]+delt_x) & (u['lat'] > map_extent[2]-delt_y) & (u['lat'] < map_extent[3]+delt_y) #- to solve the problem of labels on all the contours gh=gh.where(mask1,drop=True) gh.attrs['model']=model u=u.where(mask2,drop=True) v=v.where(mask2,drop=True) uv=xr.merge([u.rename({'data': 'u'}),v.rename({'data': 'v'})]) wvfl=v.where(wvfl,drop=True) moisture_graphics.draw_gh_uv_wvfl( wvfl=wvfl, gh=gh, uv=uv, map_extent=map_extent, regrid_shape=20, city=city,south_China_sea=south_China_sea, output_dir=output_dir,Global=Global)
def Crosssection_Wind_Temp_RH( initial_time=None, fhour=24, levels=[1000, 950, 925, 900, 850, 800, 700, 600, 500, 400, 300, 200], day_back=0, model='ECMWF', output_dir=None, st_point=[43.5, 111.5], ed_point=[33, 125.0], map_extent=[70, 140, 15, 55], h_pos=[0.125, 0.665, 0.25, 0.2]): # micaps data directory try: data_dir = [ utl.Cassandra_dir(data_type='high', data_source=model, var_name='RH', lvl=''), utl.Cassandra_dir(data_type='high', data_source=model, var_name='UGRD', lvl=''), utl.Cassandra_dir(data_type='high', data_source=model, var_name='VGRD', lvl=''), utl.Cassandra_dir(data_type='high', data_source=model, var_name='TMP', lvl=''), utl.Cassandra_dir(data_type='high', data_source=model, var_name='HGT', lvl='500'), utl.Cassandra_dir(data_type='surface', data_source=model, var_name='PSFC') ] except KeyError: raise ValueError('Can not find all directories needed') # get filename if (initial_time != None): filename = utl.model_filename(initial_time, fhour) else: filename = utl.filename_day_back_model(day_back=day_back, fhour=fhour) # retrieve data from micaps server rh = get_model_3D_grid(directory=data_dir[0][0:-1], filename=filename, levels=levels, allExists=False) if rh is None: return rh = rh.metpy.parse_cf().squeeze() u = get_model_3D_grid(directory=data_dir[1][0:-1], filename=filename, levels=levels, allExists=False) if u is None: return u = u.metpy.parse_cf().squeeze() v = get_model_3D_grid(directory=data_dir[2][0:-1], filename=filename, levels=levels, allExists=False) if v is None: return v = v.metpy.parse_cf().squeeze() v2 = get_model_3D_grid(directory=data_dir[2][0:-1], filename=filename, levels=levels, allExists=False) if v2 is None: return v2 = v2.metpy.parse_cf().squeeze() t = get_model_3D_grid(directory=data_dir[3][0:-1], filename=filename, levels=levels, allExists=False) if t is None: return t = t.metpy.parse_cf().squeeze() gh = get_model_grid(data_dir[4], filename=filename) psfc = get_model_grid(data_dir[5], filename=filename) psfc = psfc.metpy.parse_cf().squeeze() mask1 = ((psfc['lon'] >= t['lon'].values.min()) & (psfc['lon'] <= t['lon'].values.max()) & (psfc['lat'] >= t['lat'].values.min()) & (psfc['lat'] <= t['lat'].values.max())) t2, psfc_bdcst = xr.broadcast(t['data'], psfc['data'].where(mask1, drop=True)) mask2 = (psfc_bdcst > -10000) psfc_bdcst = psfc_bdcst.where(mask2, drop=True) #psfc_bdcst=psfc_bdcst.metpy.parse_cf().squeeze() if t is None: return resolution = u['lon'][1] - u['lon'][0] x, y = np.meshgrid(u['lon'], u['lat']) dx, dy = mpcalc.lat_lon_grid_deltas(u['lon'], u['lat']) #rh=rh.rename(dict(lat='latitude',lon='longitude')) cross = cross_section(rh, st_point, ed_point) cross_rh = cross.set_coords(('lat', 'lon')) cross = cross_section(u, st_point, ed_point) cross_u = cross.set_coords(('lat', 'lon')) cross = cross_section(v, st_point, ed_point) cross_v = cross.set_coords(('lat', 'lon')) cross_psfc = cross_section(psfc_bdcst, st_point, ed_point) #cross_psfc=cross.set_coords(('lat', 'lon')) cross_u['data'].attrs['units'] = units.meter / units.second cross_v['data'].attrs['units'] = units.meter / units.second cross_u['t_wind'], cross_v['n_wind'] = mpcalc.cross_section_components( cross_u['data'], cross_v['data']) cross = cross_section(t, st_point, ed_point) cross_Temp = cross.set_coords(('lat', 'lon')) cross_Td = mpcalc.dewpoint_rh(cross_Temp['data'].values * units.celsius, cross_rh['data'].values * units.percent) rh, pressure = xr.broadcast(cross_rh['data'], cross_Temp['level']) cross_terrain = pressure - cross_psfc crossection_graphics.draw_Crosssection_Wind_Temp_RH( cross_rh=cross_rh, cross_Temp=cross_Temp, cross_u=cross_u, cross_v=cross_v, cross_terrain=cross_terrain, gh=gh, h_pos=h_pos, st_point=st_point, ed_point=ed_point, levels=levels, map_extent=map_extent, model=model, output_dir=output_dir)