这里给出一个将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的更多相关文章

  1. MeteoInfo脚本示例:读取FY3A AOD HDF文件

    FY3A卫星有AOD产品数据,HDF格式,这里示例用MeteoInfo脚本程序读取和显示该类数据. 脚本程序如下: #----------------------------------------- ...

  2. MeteoInfoLab脚本示例:创建netCDF文件(合并文件)

    在MeteoInfoLab中增加了创建netCDF文件并写入数据的功能,这里利用合并多个netCDF文件为一个新的netCDF文件为例.1.创建一个可写入的netCDF文件对象(下面用ncfile表示 ...

  3. MeteoInfoLab脚本示例:Hamawari-8 netCDF data

    示例数据:ftp://ftp.bom.gov.au/anon/sample/catalogue/Satellite/IDE00220.201507140300.nc 该数据的分辨率很高(22000*2 ...

  4. MeteoInfoLab脚本示例:闪电位置图

    这个脚本示例读取文本格式的闪电数据,读出每条闪电记录的经纬度和强度,在地图上绘制出每个闪电的位置,并用符号和颜色区分强度正负.数据格式如下:0 2009-06-06 00:01:16.6195722 ...

  5. MeteoInfoLab脚本示例:FY-3C全球火点HDF数据

    FY-3C全球火点HDF数据包含一个FIRES二维变量,第一维是火点数,第二维是一些属性,其中第3.4列分别是火点的纬度和经度.下面的脚本示例读出所有火点经纬度并绘图.脚本程序: #Add data ...

  6. MeteoInfoLab脚本示例:Trajectory

    示例读取HYSPLIT模式输出的气团轨迹数据文件,生成轨迹图层,并显示轨迹各节点的气压图.脚本程序: f = addfile_hytraj('D:/MyProgram/Distribution/jav ...

  7. MeteoInfoLab脚本示例:站点数据绘制等值线

    站点数据绘制等值线需要首先将站点数据插值为格点数据,MeteoInfo中提供了反距离权法(IDW)和cressman两个方法,其中IDW方法可以有插值半径的选项.这里示例读取一个MICAPS第一类数据 ...

  8. MeteoInfoLab脚本示例:Maskout图形

    Maskout通常有两种类型:Maskout图形和Maskout数据.这里是Maskout图形的示例.需要用shaperead读取地图数据形成图层作为Maskout图层(这里是中国的行政区域china ...

  9. MeteoInfoLab脚本示例:MODIS AOD

    MODIS的气溶胶光学厚度(AOD)产品应用很广,数据可以在Giovanni上下载:http://disc.sci.gsfc.nasa.gov/giovanni/overview/index.html ...

随机推荐

  1. 转载:MYSQL数据库三表联查的SQL优化过程

    地址:https://database.51cto.com/art/202002/609803.htm 作者用了三张有设计缺陷的表做例子,使得优化效果空前,优化手段仅为拨乱反正和加索引,此行可为一哂.

  2. TouchAction实现连续滑动设置手势密码

    首先使用工具获取到元素坐标位置,可以看到起始位置是[144,462],终点位置是[576,894] 分析: 该图形可以横竖划分六等分 那么第一个圆中心点的坐标: x=144+(576-144)/6 y ...

  3. Ruby探微初步

    我的导师,曾经对我说过,常规编程语言大抵不过顺序.条件.循环 接下来以Ruby为例,简单说说 控制语句 控制语句能让程序在某种条件下,改变执行顺序,或者只执行某一部分. 控制语句的分类 控制语句大致可 ...

  4. 分布式文件系统之MogileFS的安装使用

    一.简介 MogileFS是一个开源的分布式文件存储系统,由LiveJournal旗下的Danga Interactive公司开发:它主要由三部分组成,第一部分是server端,server端主要包括 ...

  5. 深入理解python语言

    2008年,安卓操作系统诞生:PC时代向移动时代转换 互联网,视窗 2017/5/27柯洁最终0:3AlphaGo 计算机技术的演进过程 不同编程语言的设计初心和适用对象 C语言核心解决的是性能问题, ...

  6. maven使用心得

    1.一个项目下创建module,需要在project的pom下加入module,这个工程的pom <?xml version="1.0" encoding="UTF ...

  7. Netty之ChannelOption的各种参数

    ChannelOption.SO_BACKLOG, 1024 BACKLOG用于构造服务端套接字ServerSocket对象,标识当服务器请求处理线程全满时,用于临时存放已完成三次握手的请求的队列的最 ...

  8. 《Head First 设计模式》:状态模式

    正文 一.定义 状态模式允许对象在内部状态改变时改变它的行为,对象看起来好像修改了它的类. 要点: 状态模式允许一个对象基于内部状态而拥有不同的行为. 状态模式将状态封装成为独立的类,并将动作委托到代 ...

  9. session深入探讨

    简介 session(会话),其实是一个容易让人误解的词.它总跟web系统的会话挂钩,利用session,javaweb项目实现了登录状态的控制.坊间流传,关闭浏览器,就是关闭了web系统的会话. 其 ...

  10. 刷题[RCTF 2019]Nextphp

    前置知识 一些关于php7.4版本需知: 1.FFI扩展:ffi.cdef 其中还有这样一段话 如果ffi.cdef没有第二个参数,会在全局查找,第一个参数所声明的符号.意思就是其在不传入第二个参数时 ...