在meteoinfo中无法进行nc文件中无投影的解析出图,所以改用python实现(在气象家园反馈后清风大神已经更新3版本,可是实现了)
因为python代码并不是专门学习的,所以是各种查询的方法,此处做下笔记,有大神看到不对的地方多多批评指正
import netCDF4 as nc
import numpy as np
import matplotlib.pyplot as plt
import matplotlib as mpl
from mpl_toolkits.basemap import Basemap
from matplotlib import cm
from datetime import date
from datetime import datetime
from datetime import timedelta
import os
element=''
start='2011-01-01'
end='2011-01-01'
timeType='日'
momthOrSeason='1'
slon='118.5'
elon='126'
slat='38.4'
elat='43.6'
color='yellow,green,red,blue,#8484FF,#008400,#C6C6C6,#00FFFF,#00FF42,#FF8400'
level='10,20,30,40,50,60,70,80,90'
picPath=''
#固定值
wrfoutFolder='E://Pic/wrfout/'
mapPath='E:\\Pic\\map\\'
title='分布图'
arrElementCh=['降水量(mm)','2m相对湿度(%)','2m温度(℃)','10分钟风速(m/s)']
arrElement=['rain','rh2','tc2','ws10']
if timeType!='日':
start=int(start)
end=int(end)
momthOrSeason=int(momthOrSeason)
#根据中文获取对应的字段和标题
for i in range(4):
if (element in arrElementCh[i]):
title=arrElementCh[i]
element=arrElement[i]
#获取时间
fmt = '%Y-%m-%d'
if timeType=='日':
begin=datetime.strptime(start,fmt)
end=datetime.strptime(end,fmt)
if timeType=='月':
begin = date(start,momthOrSeason,1)
end = date(end,momthOrSeason+1,1)-timedelta(days=1)
if timeType=='年':
begin = date(start,1,1)
end = date(end,12,31)
if timeType=='季':
if monthOrSeason==1:#冬
begin = date(int(start)-1,12,1)
end = date(end,2,1)
if monthOrSeason==2:#春
begin = date(start,3,1)
end = date(end,5,31)
if monthOrSeason==3:#夏
begin = date(start,6,1)
enumerated = date(end,8,31)
if monthOrSeason==4:#秋
begin = date(start,9,1)
end = date(end,11,30)
delta=timedelta(days=1)
interval=int((end-begin).days) +1
#获取数据
index=0
data=[]
for i in range(0,interval,1):
time = begin+delta*i
name = time.strftime('%Y-%m-%d')
year=time.strftime('%Y')
filePath=wrfoutFolder+year+'-WRFOUT/wrfout_d02_'+name+'_00_00_00.nc'
#判断文件是否存在
if os.path.exists(filePath):
fileData = nc.Dataset(filePath,'r')
dataElement=fileData.variables[element][:].data
if index==0:
lon=fileData.variables['lon'][:].data
lat=fileData.variables['lat'][:].data
if len(data)==0:
data=dataElement
else:
data = np.append(data,dataElement,axis=0)
index=index+1
#数据求平均
if element=='rain':
data=data.sum(axis=0)
else:
data=data.mean(axis=0)
'''
#测试图例,颜色和值的对应,发现是小于等于
for i in range(81):
for j in range(87):
data[i][j]=1.5
print(data)
'''
#数据求最大值、最小值
#color_max = np.max(data)
#color_min = np.min(data)
#设置字体
plt.rcParams['font.sans-serif'] = ['SimHei'] # 黑体,也可以替换为其他字体 ,支持中文显示
plt.rcParams['axes.unicode_minus'] = False
#添加边界线
m = Basemap(llcrnrlon=slon, urcrnrlon=elon, llcrnrlat=slat, urcrnrlat=elat)
#m=Basemap(projection = 'cyl')
m.readshapefile(mapPath+"liaoningcity", "liaoningcity")
#等级第一个值对应的是第一个颜色
#<=0 是 第一个颜色
color=color.split(',')
level=level.split(',')
c = m.contourf(lon,lat,data,levels=level,colors=color,extend='both')
m.colorbar()
parallels = np.arange(0,90,1)
m.drawparallels(parallels,labels=[True,False,False,False],color='none')
meridians = np.arange(100,130,1)
m.drawmeridians(meridians,labels=[False,False,False,True],color='none')
plt.title(title)
plt.savefig(picPath,dpi=200)