この降水データは水平分解能0.25度で3時間ごとにデータがある。
このデータをNASA MiradorからOPeNDAPを通して入手する。
以下の例は7月27日0時世界標準時(日本標準時9時)の日本付近のデータをプロットする例である。この日は東シナ海に熱帯低気圧が存在し、それによる雨が見える。
OPeNDAPからはPyNIOを使ってデータを入手する。
関数name_makerはファイルのあるURLはこういう規則だろうと推測して作ったものである。間違いかもしれないので確認すること。
import Nio
import numpy as np
def read_TRMM_3B42(date,lon1,lon2,lat1,lat2):
"""
read TRMM 3B42 3 hourly rainfall from NASA Mirador
usage:
lon,lat,sst=read__TRMM_3B42(date,lon1,lon2,lat1,lat2)
input
date (year,month,day,hour)
lon1,lon2 Western,East bounday
lat1,lat2 South,West bounday
output
lon longitude
lat latitude
rainfall data (mm/hour)
"""
#check
assert date[3] % 3 ==0, "Error, hour must be multiple of 3!!!"
# open OPENDAP
fname=name_maker(date[0],date[1],date[2],date[3])
f = Nio.open_file(fname)
## variable name check
#variables = f.variables.keys()
#print f
#print "variables",variables
# read data
temp=f.variables["DATA_GRANULE.PlanetaryGrid.precipitation"]
#grid
# grid
lon=-179.875+np.arange(temp.shape[1])*0.25
lat=-49.875 +np.arange(temp.shape[2])*0.25
# selection
xrange=np.where(np.logical_and(lon>=lon1,lon<=lon2))
yrange=np.where(np.logical_and(lat>=lat1,lat<=lat2))
#precipitation
x=xrange[0]
y=yrange[0]
precip=(temp[0,x[0]:x[-1]+1,y[0]:y[-1]+1].T).reshape((len(y),len(x)))
# closing
f.close()
return lon[xrange],lat[yrange],precip
############################################
def name_maker(year,month,day,hour):
import scikits.timeseries as ts
#
t=ts.Date('H', year=year,month=month,day=day,hour=hour)
if t.hour==0:
tc=t-1
else:
tc=t
cyear = "%04d" % tc.year
cyear2= "%02d" % (t.year-2000)
cmonth2= "%02d" % t.month
cday2= "%02d" % t.day
shour = str(t.hour)
yd3= "%03d" % tc.day_of_year
#
fname="http://disc2.nascom.nasa.gov/opendap/TRMM_L3//TRMM_3B42//%(cyear)s/%(yd3)s/3B42.%(cyear2)s%(cmonth2)s%(cday2)s.%(shour)s.6A.HDF.Z" %locals()
return fname
############################################
if __name__ == '__main__':
import matplotlib.pyplot as plt
from mpl_toolkits.basemap import Basemap
# example plot
# range
lon1=120.
lon2=145.
lat1=20.
lat2=40.
#date
year=2009
month=7
day=27
hour=0
lon,lat,precip=read_TRMM_3B42(date=(year,month,day,hour),lon1=lon1,lon2=lon2,lat1=lat1,lat2=lat2)
#plot
vmax=int(precip.max())
vmin=int(precip.min())
fig=plt.figure()
ax = fig.add_axes([0.1,0.1,0.8,0.8])
map = Basemap(projection='merc',llcrnrlat=lat1,urcrnrlat=lat2,\
llcrnrlon=lon1,urcrnrlon=lon2,resolution='i')
lons,lats=np.meshgrid(lon[:],lat[:])
x,y=map(lons,lats)
map.drawcoastlines()
map.drawmapboundary()
map.pcolor(x,y,precip,vmin=vmin,vmax=vmax,cmap=plt.cm.Blues)
ti=str(year)+"/"+str(month)+"/"+str(day)+":"+str(hour)+"Z"
plt.title(ti)
# colorbar
pos = ax.get_position()
l, b, w, h = pos.bounds
cax = plt.axes([l+w+0.02, b, 0.03, h]) # setup colorbar axes.
plt.colorbar(cax=cax) # draw colorbar
plt.savefig("TRMM_3B42.png")
plt.show()
参考
NASA Giovanniのサイト
http://disc2.nascom.nasa.gov/Giovanni/tovas/TRMM_V6.3B42.2.shtml
TRMM 3B42 readme
ftp://meso-a.gsfc.nasa.gov/pub/trmmdocs/3B42_3B43_doc.pdf

0 件のコメント:
コメントを投稿