MeteoInfo脚本示例:GrADS to netCDF
这里给出一个将GrADS数据文件转为netCDF数据文件的脚本示例程序,其它格式数据转netCDF可以参考:
#-----------------------------------------------------
# Author: Yaqiang Wang
# Date: 2015-3-12
# Purpose: Convert CUACE grads data to netCDF (CUACE/Dust)
# Note: Sample
#-----------------------------------------------------
print 'Loading classes...'
from org.meteoinfo.data import GridData
from org.meteoinfo.data import DataMath
from org.meteoinfo.data.meteodata import MeteoDataInfo
from org.meteoinfo.geoprocess.analysis import ResampleMethods
from org.meteoinfo.data.meteodata.netcdf import NetCDFDataInfo
from org.meteoinfo.projection import ProjectionInfo
from org.meteoinfo.projection import ProjectionNames
from org.meteoinfo.projection import KnownCoordinateSystems
from ucar.nc2 import NetcdfFileWriter
from ucar.nc2 import Attribute
from ucar.ma2 import DataType
from ucar.ma2 import Array
import os.path
import jarray
import datetime
from java.util import Date
from java.text import SimpleDateFormat #Set date
year = 2014
month = 4
day = 23
hour = 0
sdate = datetime.datetime(year, month, day, hour)
print sdate
#Set directory
dataDir = 'U:/data/cuace_dust/dust_example/2014_case'
outDir = dataDir
infn = os.path.join(dataDir, 'dust_post_'+ sdate.strftime('%Y%m%d%H') + '.ctl')
outfn = os.path.join(dataDir, 'WMO_SDS-WAS_Asian_Center_Model_Forecasting_CUACE-Dust_CMA_' \
+ sdate.strftime('%Y-%m-%d') + '.nc')
#Set output X/Y coordinates and projection
toProjInfo = KnownCoordinateSystems.geographic.world.WGS1984
sx = 70.0
xnum = 161
sy = 20
ynum = 71
delta = 0.5
xlist = []
ylist = []
for i in range(0, xnum):
xlist.append(sx + delta * i)
for i in range(0, ynum):
ylist.append(sy + delta * i)
X = jarray.array(xlist, 'd')
Y = jarray.array(ylist, 'd') #Read GrADS data file
print 'Open GrADS data file...'
mdi = MeteoDataInfo()
mdi.openGrADSData(infn)
dataInfo = mdi.getDataInfo()
dataInfo.setBigEndian(True)
fromProjInfo = mdi.getProjectionInfo()
tnum = dataInfo.getTimeNum()
mvalue = dataInfo.getMissingValue() #Set output nc data file
print 'Create output NC file: ' + outfn
ncfile = NetcdfFileWriter.createNew(NetcdfFileWriter.Version.netcdf3, outfn)
#Add dimensions
print 'Add dimensions...'
xDim = ncfile.addDimension(None, 'lon', xnum)
yDim = ncfile.addDimension(None, 'lat', ynum)
tDim = ncfile.addDimension(None, 'time', tnum) #Add global attributes
print 'Add global attributes...'
ncfile.addGroupAttribute(None, Attribute('Conventions', 'CF-1.6'))
ncfile.addGroupAttribute(None, Attribute('Title', 'Sand and dust storm forecasting'))
ncfile.addGroupAttribute(None, Attribute('Model', 'CUACE/Dust'))
ncfile.addGroupAttribute(None, Attribute('Center', 'WMO SDS-WAS Asian Center'))
ncfile.addGroupAttribute(None, Attribute('Agency', 'China Meteorological Administration')) #Add variables
xvar = ncfile.addVariable(None, 'lon', DataType.FLOAT, [xDim])
xvar.addAttribute(Attribute('units', 'degrees_east'))
xvar.addAttribute(Attribute('long_name', 'Longitude'))
xvar.addAttribute(Attribute('standard_name', 'longitude'))
xvar.addAttribute(Attribute('axis', 'X'))
yvar = ncfile.addVariable(None, 'lat', DataType.FLOAT, [yDim])
yvar.addAttribute(Attribute('units', 'degrees_north'))
yvar.addAttribute(Attribute('long_name', 'Latitude'))
yvar.addAttribute(Attribute('standard_name', 'latitude'))
yvar.addAttribute(Attribute('axis', 'Y'))
tvar = ncfile.addVariable(None, 'time', DataType.INT, [tDim])
tvar.addAttribute(Attribute('units', 'hours since 1900-01-01 00:00:0.0'))
tvar.addAttribute(Attribute('long_name', 'Time'))
tvar.addAttribute(Attribute('standart_name', 'time'))
tvar.addAttribute(Attribute('axis', 'T'))
#Data variables
vnames = ['load','con','dry','wet','aod']
varlist = []
var = ncfile.addVariable(None, 'LOAD_DUST', DataType.FLOAT, [tDim, yDim, xDim])
var.addAttribute(Attribute('long_name', 'Dust load'))
var.addAttribute(Attribute('units', 'kg/m2'))
var.addAttribute(Attribute('missing_value', -9999.0))
varlist.append(var)
var = ncfile.addVariable(None, 'SCONC_DUST', DataType.FLOAT, [tDim, yDim, xDim])
var.addAttribute(Attribute('long_name', 'Surface dust concentration'))
var.addAttribute(Attribute('units', 'ug/m3'))
var.addAttribute(Attribute('missing_value', -9999.0))
varlist.append(var)
var = ncfile.addVariable(None, 'DDEPO_DUST', DataType.FLOAT, [tDim, yDim, xDim])
var.addAttribute(Attribute('long_name', '3-hour accumulated dry deposition'))
var.addAttribute(Attribute('units', 'kg/m2'))
var.addAttribute(Attribute('missing_value', -9999.0))
varlist.append(var)
var = ncfile.addVariable(None, 'WDEPO_DUST', DataType.FLOAT, [tDim, yDim, xDim])
var.addAttribute(Attribute('long_name', '3-hour accumulated wet deposition'))
var.addAttribute(Attribute('units', 'kg/m2'))
var.addAttribute(Attribute('missing_value', -9999.0))
varlist.append(var)
var = ncfile.addVariable(None, 'AOD550_DUST', DataType.FLOAT, [tDim, yDim, xDim])
var.addAttribute(Attribute('long_name', 'Dust optical depth at 550nm'))
var.addAttribute(Attribute('units', '-'))
var.addAttribute(Attribute('missing_value', -9999.0))
varlist.append(var) #Write nc file
ncfile.create()
#Write x,y,z,t variables
print 'Write x variable...'
shape = jarray.array([xnum], 'i')
data = Array.factory(DataType.FLOAT, shape)
for i in range(0,xnum):
data.set(i, X[i])
ncfile.write(xvar, data) print 'Write y variable...'
shape = jarray.array([ynum], 'i')
data = Array.factory(DataType.FLOAT, shape)
for i in range(0,ynum):
data.set(i, Y[i])
ncfile.write(yvar, data) print 'Write time variable...'
format = SimpleDateFormat('yyyy-MM-dd')
sdate = format.parse('1900-01-01')
tvalues = dataInfo.getTimeValues(sdate, 'hours')
shape = jarray.array([tnum], 'i')
data = Array.factory(DataType.INT, shape)
for i in range(0,tnum):
data.set(i, tvalues[i])
ncfile.write(tvar, data) #Write data variables
print 'Write data variable...'
for vname, var in zip(vnames, varlist):
for t in range(0, tnum):
print 'Time: ' + str(t + 1)
mdi.setTimeIndex(t)
gData = mdi.getGridData(vname)
ngData = gData.project(fromProjInfo, toProjInfo, X, Y, ResampleMethods.Bilinear)
origin = jarray.array([t, 0, 0], 'i')
ncfile.write(var, origin, NetCDFDataInfo.gridToArray3D(ngData)) #Close nc file
ncfile.flush()
ncfile.close() print 'Finished'
上面转换的netCDF文件绘制模式结果和地面天气现象观测叠加动画图的示例脚本:
# coding=utf-8
#-----------------------------------------------------
# Author: Yaqiang Wang
# Date: 2015-3-13
# Purpose: Read CUACE/Dust netCDF data and MICAPS observation data to plot figures
# Note: Sample
#-----------------------------------------------------
print 'Loading classes...'
from org.meteoinfo.layout import MapLayout
from org.meteoinfo.data import GridData
from org.meteoinfo.data.meteodata import MeteoDataInfo, DrawMeteoData
from org.meteoinfo.legend import LegendScheme
from org.meteoinfo.shape import ShapeTypes
from org.meteoinfo.global.image import AnimatedGifEncoder
import os.path
import jarray
import datetime
import sys
from java.util import Date, Calendar, Locale
from java.text import SimpleDateFormat
from java.awt import Color #Set date
year = 2013
month = 3
day = 1
hour = 0
sdate = datetime.datetime(year, month, day, hour) #sdate = datetime.date.today()
#if len(sys.argv) >= 2:
# sdate = sdate - datetime.timedelta(days=int(sys.argv[1]))
# sdate = sdate + datetime.timedelta(days=1)
print sdate
dformat = SimpleDateFormat('HH dd MMM yyy', Locale.ENGLISH)
dformat1 = SimpleDateFormat('yyMMddHH')
cal = Calendar.getInstance() #Set model
#model = 'CUACE-DUST_CMA'
model = 'ADAM2_KMA' #Set directory
dataDir = 'D:/Working/2015/International/SDS_Asian_Region_Center/Model_Verification'
obsDir = 'U:/data/micaps/2014/plot'
obsDir = 'E:/MetData/micaps'
runDir = dataDir
outDir = os.path.join(dataDir, 'figure')
if not os.path.exists(outDir):
os.mkdir(outDir)
#Set input/output file names
infn = os.path.join(dataDir, 'WMO_SDS-WAS_Asian_Center_Model_Forecasting_' + model + '_' \
+ sdate.strftime('%Y-%m-%d') + '.nc')
projfn = os.path.join(runDir, 'sds_asian.mip') #Plot data
print 'Plot data...'
mapLayout = MapLayout()
mapLayout.loadProjectFile(projfn)
mf = mapLayout.getActiveMapFrame()
title = mapLayout.getTexts().get(2)
legend = mapLayout.getLegends()[0] #---- Set weather list - sand and dust storm
weathers = [6, 7, 8, 9, 30, 31, 32, 33, 34, 35]
#---- Set weather list - sand and dust storm and haze
#weathers = [5, 6, 7, 8, 9, 30, 31, 32, 33, 34, 35] #---- Create MeteoDataInfo object
mdi = MeteoDataInfo()
omdi = MeteoDataInfo() #---- Plot loop
mdi.openNetCDFData(infn)
lsfn = os.path.join(runDir,'dust_conc.lgs')
print 'Read data file: ' + infn
aLS = LegendScheme(ShapeTypes.Polygon)
aLS.importFromXMLFile(lsfn)
tnum = mdi.getDataInfo().getTimeNum()
#tnum = 3
s = 'SCONC_DUST'
giffn = os.path.join(outDir, 'V_' + s + '_' + model + '_' + sdate.strftime('%Y%m%d') + '--loop-.gif')
print giffn
encoder = AnimatedGifEncoder()
encoder.setRepeat(0)
encoder.setDelay(1000)
encoder.start(giffn)
sTime = mdi.getDataInfo().getTimes().get(0)
for t in range(1, tnum):
mdi.setTimeIndex(t)
aTime = mdi.getDataInfo().getTimes().get(t)
cal.setTime(aTime)
cal.add(Calendar.HOUR, 8)
bjTime = cal.getTime()
#---- Open observation weather data
obsfn = os.path.join(obsDir, dformat1.format(bjTime) + '.000')
print obsfn
if not os.path.exists(obsfn):
continue
omdi.openMICAPSData(obsfn)
wData = omdi.getStationData('WeatherNow')
weatherLayer = DrawMeteoData.createWeatherSymbolLayer(wData, weathers, 'Weather')
#for lb in weatherLayer.getLegendScheme().getLegendBreaks():
# lb.setColor(Color.red)
weatherLayer.setAvoidCollision(False)
mf.removeMeteoLayers()
mf.addLayer(weatherLayer)
#---- Get grid data and create a shaded layer
gData = mdi.getGridData(s)
aLayer = DrawMeteoData.createShadedLayer(gData, aLS, 'Forecasting_' + s, 'Data', True)
aLayer.setProjInfo(mdi.getProjectionInfo())
mf.addLayer(aLayer)
mf.moveLayer(aLayer, 0)
#---- Set title
title.setLabelText('Run: ' + dformat.format(sTime) + ' Valid: ' + dformat.format(aTime) \
+ '(H+' + str(t * 3) + ')')
#---- Set legend
legend.setLegendLayer(aLayer)
mapLayout.paintGraphics()
encoder.addFrame(mapLayout.getViewImage())
figurefn = os.path.join(outDir, 'V_' + model + '_' + s + '_' + dformat1.format(aTime) + '.png')
print 'Output figure: ' + figurefn
mapLayout.exportToPicture(figurefn) encoder.finish()
print 'Finished'

MeteoInfo脚本示例:GrADS to netCDF的更多相关文章
- MeteoInfo脚本示例:读取FY3A AOD HDF文件
FY3A卫星有AOD产品数据,HDF格式,这里示例用MeteoInfo脚本程序读取和显示该类数据. 脚本程序如下: #----------------------------------------- ...
- MeteoInfoLab脚本示例:创建netCDF文件(合并文件)
在MeteoInfoLab中增加了创建netCDF文件并写入数据的功能,这里利用合并多个netCDF文件为一个新的netCDF文件为例.1.创建一个可写入的netCDF文件对象(下面用ncfile表示 ...
- MeteoInfoLab脚本示例:Hamawari-8 netCDF data
示例数据:ftp://ftp.bom.gov.au/anon/sample/catalogue/Satellite/IDE00220.201507140300.nc 该数据的分辨率很高(22000*2 ...
- MeteoInfoLab脚本示例:闪电位置图
这个脚本示例读取文本格式的闪电数据,读出每条闪电记录的经纬度和强度,在地图上绘制出每个闪电的位置,并用符号和颜色区分强度正负.数据格式如下:0 2009-06-06 00:01:16.6195722 ...
- MeteoInfoLab脚本示例:FY-3C全球火点HDF数据
FY-3C全球火点HDF数据包含一个FIRES二维变量,第一维是火点数,第二维是一些属性,其中第3.4列分别是火点的纬度和经度.下面的脚本示例读出所有火点经纬度并绘图.脚本程序: #Add data ...
- MeteoInfoLab脚本示例:Trajectory
示例读取HYSPLIT模式输出的气团轨迹数据文件,生成轨迹图层,并显示轨迹各节点的气压图.脚本程序: f = addfile_hytraj('D:/MyProgram/Distribution/jav ...
- MeteoInfoLab脚本示例:站点数据绘制等值线
站点数据绘制等值线需要首先将站点数据插值为格点数据,MeteoInfo中提供了反距离权法(IDW)和cressman两个方法,其中IDW方法可以有插值半径的选项.这里示例读取一个MICAPS第一类数据 ...
- MeteoInfoLab脚本示例:Maskout图形
Maskout通常有两种类型:Maskout图形和Maskout数据.这里是Maskout图形的示例.需要用shaperead读取地图数据形成图层作为Maskout图层(这里是中国的行政区域china ...
- MeteoInfoLab脚本示例:MODIS AOD
MODIS的气溶胶光学厚度(AOD)产品应用很广,数据可以在Giovanni上下载:http://disc.sci.gsfc.nasa.gov/giovanni/overview/index.html ...
随机推荐
- mysql与redis区别
编号 mysql redis 1 类型 关系型数据库 缓存数据库 2 作用 主要用于存放持久化数据,是将数据存储在硬盘中,读取时速度较慢,而且频繁访问也会导致数据库负载过高. 用于存储使用频繁的 ...
- SMBMS
SMBMS(Supermarket Billing Management System ) 目录 SMBMS(Supermarket Billing Management System ) 1. 项目 ...
- IDEA项目左侧目录看不到target
点击如下图所示图标,然后选择Show Excluded Files后即可出现
- 关于input框仿百度/google自动提示的方法
引入jquery-autocomplete文件 链接:https://pan.baidu.com/s/1hW0XBYH8ZgJgMSY1Ce6Pig 密码:tv5b $(function() { $( ...
- python基础:用yagmail模块发邮件
一.yagmail模块安装 网上下载的yagmail模块安装以后,在使用过程中,如果附件有中文,会显示乱码. pip install yagmail-0.10.212-py2.py3-none-any ...
- vue 实现页面跳转
首先,vue项目文件夹如下: components下有两个.vue文件,HelloWorld为创建时自动建立的,login需要自己创建的,login页面效果如下: 首先实现登录按钮的跳转,先对inde ...
- 吴恩达《深度学习》-第一门课 (Neural Networks and Deep Learning)-第二周:(Basics of Neural Network programming)-课程笔记
第二周:神经网络的编程基础 (Basics of Neural Network programming) 2.1.二分类(Binary Classification) 二分类问题的目标就是习得一个分类 ...
- 高可用集群之keepalived+lvs实战
keepalived简介 lvs在我之前的博客<高负载集群实战之lvs负载均衡-技术流ken>中已经进行了详细的介绍和应用,在这里就不再赘述.这篇博文将把lvs与keepalived相结合 ...
- hystrix文档翻译之Dashboard
Dashboard Hystrix Dashboard可以让你实时监控hystrix的metrics信息. 当netflix开始使用dashboard后,运维效率得到了极大的提升,并且极大降低了大多数 ...
- Flutter音频播放--chewie_player的基本使用(二)——样式修改
先贴修改图,只改了部分布局与样式 官方的demo并不十分适合我的需求,从组件进入chewie_player并没有查看到相应的布局,那么直接从chewie的依赖包进入 可以看到以下的目录结构: 我主要修 ...