这里给出一个将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. 教会舍友玩 Git (再也不用担心他的学习)

    舍友长大想当程序员,我和他爷爷奶奶都可高兴了,写他最喜欢的喜之郎牌Git文章,学完以后,再也不用担心舍友的学习了(狗头)哪里不会写哪里 ~~~ 一 先来聊一聊 太多东西属于,总在用,但是一直都没整理的 ...

  2. linux中root用户查看所有用户的历史操作命令

    转载https://blog.csdn.net/qq_27786919/article/details/91353351 1.创建用户审计文件存放目录和审计日志文件 :mkdir -p /var/lo ...

  3. [Java核心技术]第九章-集合(Java集合框架、具体的集合、映射)

    9.1Java集合框架 一些有的没的 可以使用接口类型存放集合的引用.一旦改变了想法,只需要在调用构造函数的地方做一处修改. add方法用于向集合添加元素,如果添加元素确实改变了集合就返回true. ...

  4. 关于java for循环常见练习题

    使用for循环方式计算2+4+6+…+100的值 package day02; /** * 使用for循环方式计算2+4+6+…+100的值 * @author mu * */ public clas ...

  5. java学习(九) —— java中的File文件操作及IO流概述

    前言 流是干什么的:为了永久性的保存数据. IO流用来处理设备之间的数据传输(上传和下载文件) java对数据的操作是通过流的方式. java用于操作流的对象都在IO包中. java IO系统的学习, ...

  6. 2.Strom-入门案例

  7. 005.操作系统及Linux系统,虚拟机的作用和发展历史

    操作系统及其作用 操作系统发展史 Linux系统 虚拟机 操作系统 操作系统 操作系统的作用 不同领域的主流操作系统 操作系统(Operation System,OS) 操作系统作为接口的示意图 没有 ...

  8. linux内存分配与回收

    前言 之前在实习时,听了 OOM 的分享之后,就对 Linux 内核内存管理充满兴趣,但是这块知识非常庞大,没有一定积累,不敢写下,担心误人子弟,所以经过一个一段时间的积累,对内核内存有一定了解之后, ...

  9. pwnable.kr-shellshock-witeup

    思路是:发现文件执行没什么好反馈显示结果的,于是看文件和权限,通过bash文件猜测可能存在破壳漏洞(CVE-2014-6271)漏洞,于是利用它并结合文件权限成功获得flag. 通过scp下载文件至本 ...

  10. 嘿!Mybatis

    简介 什么是Mybatis MyBatis 是一款优秀的持久层框架 它支持自定义 SQL.存储过程以及高级映射. MyBatis 免除了几乎所有的 JDBC 代码以及设置参数和获取结果集的工作. My ...