model &CINRAD

# 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
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容