model &CINRAD

作者: 榴莲气象 | 来源:发表于2019-01-10 23:00 被阅读0次
# coding: utf-8
import cinrad
import os
import numpy as np
import matplotlib as mpl
import matplotlib.pyplot as plt
import matplotlib.ticker as mticker
from matplotlib.colorbar import ColorbarBase
import cartopy.crs as ccrs
import cartopy.feature as cfeature
from cartopy.io import shapereader
from cartopy.mpl.ticker import LongitudeFormatter, LatitudeFormatter
from cartopy.mpl.gridliner import LONGITUDE_FORMATTER, LATITUDE_FORMATTER
from netCDF4 import Dataset
from wrf import (to_np, getvar, smooth2d, get_cartopy, cartopy_xlim,
                 cartopy_ylim, latlon_coords)
from metpy.interpolate import (interpolate_to_grid, remove_nan_observations,
                               remove_repeat_coordinates)
from scipy.interpolate import griddata

def search(s, path=os.path.abspath('.')):
    for z in os.listdir(path):
        if os.path.isdir(path + os.path.sep + z):# os.path.sep
            path2 = os.path.join(path, z) #;os.path.join()
            search(s, path2)
        elif os.path.isfile(path + os.path.sep + z): 
            if s in z:
                filenames.append(os.path.join(path, z))
def plotMapdiff(var,var1,extent=None):
    
    proj = ccrs.PlateCarree(central_longitude=118)
    fig, ax = plt.subplots(figsize=(8.0, 8.0),subplot_kw=dict(projection=proj))
    #plt.subplots_adjust(left=0.05,right=0.95,top=0.90,bottom=0.05,wspace=0.15,hspace=0.05)
    #fig.set_facecolor('w')
    plt.style.use('seaborn-bright')
    lon, lat, var = var.lon, var.lat, var.data
    vara=var.reshape(-1)
    lata=lat.reshape(-1)
    lona=lon.reshape(-1)
    xp0, yp0, _ = proj.transform_points(ccrs.Geodetic(), lona, lata).T
    #print(var11.T.shape)
    gridx0, gridy0, dbz0 = interpolate_to_grid(xp0, yp0,vara, interp_type='linear',hres=0.01)

    lat1, lon1 = latlon_coords(var1)
    lat11=to_np(lat1)
    lon11=to_np(lon1)
    var11=to_np(var1)
    var111=var11.reshape(-1)
    lat111=lat11.reshape(-1)
    lon111=lon11.reshape(-1)
    xp, yp, _ = proj.transform_points(ccrs.Geodetic(), lon111, lat111).T
    gridx1, gridy1, dbz1 = interpolate_to_grid(xp, yp,var111, interp_type='linear',hres=0.01)
    points1=gridx1.reshape(-1)
    points2=gridy1.reshape(-1)
    points=(points1,points2)
    dbz11=dbz1.reshape(-1)
    #Zoom in
    dbz = griddata(points, dbz11, (gridx0,gridy0), method='nearest')
    diff=dbz0-dbz
    diff = np.ma.masked_where(np.isnan(diff), diff)
    
    #ax.background_patch.set_fill(False)
    if not extent:
        x_min, x_max, y_min, y_max = lon.min(), lon.max(), lat.min(), lat.max()
    else:
        x_min, x_max, y_min, y_max = extent[0], extent[1], extent[2], extent[3]
    ax.set_extent([x_min, x_max, y_min, y_max], ccrs.PlateCarree())
    #Add map features
    root = os.path.join("/public/home/hysplit/software/anaconda3/lib/python3.6/site-packages/cinrad-1.2-py3.6.egg/cinrad", 'shapefile')
    flist = [os.path.join(root, i) for i in ['County.shp', 'City.shp', 'Province.shp']]
    shps = [shapereader.Reader(i).geometries() for i in flist]
    line_colors = ['lightgrey', 'grey', 'black']
    ax.add_geometries(shps[0], ccrs.PlateCarree(), edgecolor=line_colors[0], facecolor='None', zorder=1, linewidth=0.5)
    ax.add_geometries(shps[1], ccrs.PlateCarree(), edgecolor=line_colors[1], facecolor='None', zorder=1, linewidth=0.7)
    ax.add_geometries(shps[2], ccrs.PlateCarree(), edgecolor=line_colors[2], facecolor='None', zorder=1, linewidth=1)
    #ax.coastlines(resolution='10m', color=line_colors[2], zorder=1, linewidth=1)
 
    levels = np.arange(-30,35,5)
    print(levels)
    #norm = mpl.colors.Normalize(vmin=0, vmax=70)
    ct=ax.contourf(gridx0, gridy0, diff,levels=levels,  extend='both',cmap="coolwarm")
    #ax.set_title("obs_Reflectivity(dBZ)", {"fontsize" : 20}) 
    #Add lat/lon gridlines every 20° to the map
    gl= ax.gridlines(draw_labels=True,linewidth=2, color='gray', alpha=0.5, linestyle='--') 
    gl.xlabels_top = False
    gl.xlabels_bottom = False
    gl.ylabels_right = False
    gl.ylabels_left = False
    gl.xlocator = mticker.FixedLocator([118,118.5,119,119.5,120])
    gl.ylocator = mticker.FixedLocator([31,31.5,32,32.5,33])
    #'''
    gl.xformatter = LONGITUDE_FORMATTER
    gl.yformatter = LATITUDE_FORMATTER
    gl.xlabel_style = {'size': 15}#, 'weight': 'bold'}#'color': 'gray'}
    gl.ylabel_style = {'size': 15}
    #cax = fig.add_axes([1.01, 0.75, 0.02, 0.2])
    cb = plt.colorbar(ct,extendfrac=1/10,extendrect=True,shrink=0.6,pad=0.1,orientation='horizontal')#extendrect=True
    
    #cb.ax.tick_params(labelsize=15) 
    #cb.set_ticklabels(levels)
    #plt.clabel(ct,levels, inline=True, fmt='%1i', fontsize=16)
    #fig.text(0.5, -0.04, 'Latitude', ha='center',fontsize=20)
    #fig.text(-0.02, 0.35, 'Longitude', va='center', rotation='vertical',fontsize=20)
    #'''
# Add titles
    #ax.set_title("model_Reflectivity(dBZ)", {"fontsize" : 20})
    
    return fig

def get_model(filename,i=1):
    f = Dataset(filename)
    dbz = getvar(f, "mdbz")
    return dbz

def get_diff(filename,filename1):
    f = Dataset(filename)
    f1 = Dataset(filename1)
    dbz = getvar(f, "mdbz")
    dbz1 = getvar(f1, "mdbz")
    diff = dbz-dbz1
    return diff
def get_obs(filename):
    f = cinrad.io.CinradReader(filename)
    rl = [f.get_data(i, 200, 'REF') for i in f.angleindex_r]
    cr = cinrad.easycalc.quick_cr(rl) #计算组合反射率
    cr.name = 'Nanjing'
    print(cr)
    return cr

filenames=[]
search('case_d04', '.')
filenames=sorted(filenames)#;防止顺序不对
filenames0=filenames[0:3]
print(filenames0)
filenames1=filenames[3:6]
print(filenames1)
filenames2=filenames[6:9]
print(filenames2)
filenames3=filenames[9:12]
print(filenames3)
filename_obs=['Z_RADR_I_Z9250_20170609230400_O_DOR_SA_CAP.bin','Z_RADR_I_Z9250_20170610045300_O_DOR_SA_CAP.bin','Z_RADR_I_Z9250_20170610080400_O_DOR_SA_CAP.bin']
crsobs=[get_obs(filename) for filename in filename_obs]
crsmod=[get_model(filename) for filename in filenames0]
NUM=['P','Q','R']
for i in range(0,3):
    plotMapdiff(crsobs[i],crsmod[i],extent=[118,119.55,31.25,32.7])
    plt.text(118.05,32.60,NUM[i],color='k',fontsize=30,
         horizontalalignment='left',
         transform=ccrs.Geodetic())
    #plt.show()
    plt.savefig(NUM[i]+"b.png",dpi=600,bbox_inches="tight")
crsmod=[get_model(filename) for filename in filenames1]
NUM=['S','T','U']
for i in range(0,3):

    plotMapdiff(crsobs[i],crsmod[i],extent=[118,119.55,31.25,32.7])
    plt.text(118.05,32.60,NUM[i],color='k',fontsize=30,
         horizontalalignment='left',
         transform=ccrs.Geodetic())
    #plt.show()
    plt.savefig(NUM[i]+"a.png",dpi=600,bbox_inches="tight")
crsmod=[get_model(filename) for filename in filenames2]
NUM=['V','W','X']
for i in range(0,3):

    plotMapdiff(crsobs[i],crsmod[i],extent=[118,119.55,31.25,32.7])
    plt.text(118.05,32.60,NUM[i],color='k',fontsize=30,
         horizontalalignment='left',
         transform=ccrs.Geodetic())
    #plt.show()
    plt.savefig(NUM[i]+"a.png",dpi=600,bbox_inches="tight")

crsmod=[get_model(filename) for filename in filenames3]
NUM=['Y','Z','&']
for i in range(0,3):

    plotMapdiff(crsobs[i],crsmod[i],extent=[118,119.55,31.25,32.7])
    plt.text(118.05,32.60,NUM[i],color='k',fontsize=30,
         horizontalalignment='left',
         transform=ccrs.Geodetic())
    #plt.show()
    plt.savefig(NUM[i]+"a.png",dpi=600,bbox_inches="tight")
diff

相关文章

网友评论

    本文标题:model &CINRAD

    本文链接:https://www.haomeiwen.com/subject/cinzrqtx.html