CEReSで配布しているNOAA AVHRR SSTをプロットしてみた。
FTPサイトからデータをダウンロードして、解凍する。
ここでは n1810080316.sst.giを利用する。
(NOAA 18 ,2010年,8月3日,16世界標準時)
以下がスクリプト。
このデータには雲や陸地のマスクはないようだ。
前回はPyNGLでプロットしたが、今回はmatplotlib basemap toolkitを利用した。
matlabのpplot関数に対応する関数を使いたかったからだ(PyNGLにはあるのかな?)。
import numpy as np
import matplotlib.pyplot as plt
def read_CEReS_SST(dir,file,lon1,lon2,lat1,lat2):
"""
read CERes SST
usage:
lon,lat,sst=read_CEReS_SST(dir,file,lon1,lon2,lat1,lat2)
input
dir working dir
file filename
gzipped file is fine.
URL also works
lon1,lon2 Western,East bounday
lat1,lat2 South,West bounday
output
lon longitude
lat latitude
SST sst data (masked array) in C
"""
# read data
ds=np.DataSource(dir)
f=ds.open(file, 'r')
f.seek(80) # skip header
ssttemp=np.frombuffer(f.read(),dtype=">i2",count=6378*5562)
f.close()
# as masked array
sst=ssttemp.reshape((5562,6378))*0.1
sst=np.ma.masked_array(sst[::-1,:],mask=(sst[::-1,:]==0 ))
# grid
lon=100.+np.arange(6378)*0.01097869
lat=9.97971+np.arange(5562)*0.00899322
# selection
xrange=np.logical_and(lon>=lon1,lon<=lon2)
yrange=np.logical_and(lat>=lat1,lat<=lat2)
sst=(sst[yrange,:])[:,xrange]-273.15 # Kelvin to C
return lon[xrange],lat[yrange], sst
############################################
if __name__ == '__main__':
from mpl_toolkits.basemap import Basemap
# example plot
#read data
filename="n1810080316.sst.gi"
lon1=130.
lon2=140.
lat1=30.
lat2=36.
lon,lat,sst=read_CEReS_SST(".",filename,lon1,lon2,lat1,lat2)
#plot
tmax=30.
tmin=20.
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,sst,vmin=tmin,vmax=tmax)
# 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("CEReS_SST.png")
plt.show()

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