在MeteoInfoLab中增加了创建netCDF文件并写入数据的功能,这里利用合并多个netCDF文件为一个新的netCDF文件为例。

1、创建一个可写入的netCDF文件对象(下面用ncfile表示),用addfile函数,第一个参数是文件名,第二次参数'c'表示创建新的netCDF文件。
ncfile = addfile(outfn, 'c')

2、添加维(Dimensions),用ncfile的adddim函数,两个参数分别是维名称和维长度。
stn = 26564
stdim = ncfile.adddim('station', stn)

3、添加全局属性,用ncfile的addgroupattr函数,两个参数分别是属性名称和属性值。
ncfile.addgroupattr('Conventions', 'Unidata Observation Dataset v1.0')

4、添加变量,用ncfile的addvar函数,三个参数分别是变量名称、变量数据类型和变量维列表。并给变量添加一些属性用变量对象的addattr函数。
var = ncfile.addvar('streamflow', 'float', [tdim, stdim])
var.addattr('long_name', 'River Flow')
var.addattr('units', 'meter^3 / sec')

5、创建netCDF文件,上面的步骤都是对netCDF文件的设置,完成之后需要create函数表示设置已完成,可以开始写数据了。
ncfile.create()

6、写数据,用ncfile的write函数,参数分别是变量和要写入的数组,origin是各维起点的列表,可以控制写入某个变量的部分数据。如果要写入的数组的维数和变量的维数不一致,需要用reshape函数来确保二者有相同的维数。
ncfile.write(variables[3], flow, origin=origin)

7、关闭netCDF文件,数据写完之后需要关闭netCDF文件。
ncfile.flush()
ncfile.close()

示例脚本程序(合并4个不同时次的netCDF文件为一个新的netCDF文件):

datadir = 'D:/Temp/nc'
outfn = os.path.join(datadir, 'join_file.nc')
#New netCDF file
ncfile = addfile(outfn, 'c')
#Add dimensions
stn = 26564
recdim = ncfile.adddim('recNum', stn)
stdim = ncfile.adddim('station', stn)
iddim = ncfile.adddim('id_len', 11)
tdim = ncfile.adddim('time', 4)
#Add global attributes
ncfile.addgroupattr('Conventions', 'Unidata Observation Dataset v1.0')
ncfile.addgroupattr('cdm_datatype', 'Station')
ncfile.addgroupattr('geospatial_lat_max', '90.0')
ncfile.addgroupattr('geospatial_lat_min', '-90.0')
ncfile.addgroupattr('geospatial_lon_max', '180.0')
ncfile.addgroupattr('geospatial_lon_min', '-180.0')
ncfile.addgroupattr('stationDimension', 'station')
ncfile.addgroupattr('missing_value', -8.9999998E15)
ncfile.addgroupattr('stream_order_output', 1)
#Add variables
variables = []
var = ncfile.addvar('latitude', 'float', [stdim]) #Latitude
var.addattr('long_name', 'station latitude')
var.addattr('units', 'degrees_north')
variables.append(var)
var = ncfile.addvar('longitude', 'float', [stdim]) #Longitude
var.addattr('long_name', 'station longitude')
var.addattr('units', 'degrees_east')
variables.append(var)
var = ncfile.addvar('altitude', 'float', [stdim]) #Altitude
var.addattr('long_name', 'station altitude')
var.addattr('units', 'meters')
variables.append(var)
var = ncfile.addvar('streamflow', 'float', [tdim, stdim]) #Stream flow - Add time dimension
var.addattr('long_name', 'River Flow')
var.addattr('units', 'meter^3 / sec')
variables.append(var)
tvar = ncfile.addvar('time', 'int', [tdim])
tvar.addattr('long_name', 'time')
tvar.addattr('units', 'hours since 1900-01-01 00:00:0.0')
#Creat netCDF file
ncfile.create()
#Write data
stime = datetime.datetime(2015,8,2,0)
etime = datetime.datetime(2015,8,2,3)
st = datetime.datetime(1900,1,1)
fi = 0
while stime <= etime:
print stime
fn = os.path.join(datadir, stime.strftime('%Y%m%d%H') + '00.CHRTOUT_DOMAIN2')
if os.path.exists(fn):
print '\t' + fn
f = addfile(fn)
hours = (stime - st).total_seconds() // 3600
origin = [fi]
ncfile.write(tvar, array([hours]), origin=origin)
if fi == 0:
lat = f['latitude'][:]
ncfile.write(variables[0], lat)
lon = f['longitude'][:]
ncfile.write(variables[1], lon)
alt = f['altitude'][:]
ncfile.write(variables[2], alt)
flow = f['streamflow'][:]
origin = [fi, 0]
shape = [1, stn]
flow = flow.array.reshape(shape)
ncfile.write(variables[3], flow, origin=origin)
fi += 1
stime = stime + datetime.timedelta(hours=1) #close netCDF file
ncfile.flush()
ncfile.close() print 'Finished!'

对合并后的文件绘图:

f = addfile('D:/Temp/nc/join_file.nc')
lon = f['longitude'][:]
lat = f['latitude'][:]
var = f['streamflow']
flow = var[1,:]
axesm()
mlayer = shaperead('D:/Temp/Map/bou2_4p.shp')
geoshow(mlayer)
levs = arange(0, 0.1, 0.005)
layer = scatterm(lon, lat, flow, levs, edge=False)
colorbar(layer)
t = f.gettime(1)
title('River Flow (' + t.strftime('%Y-%m-%d %Hh)'))

MeteoInfoLab脚本示例:创建netCDF文件(合并文件)的更多相关文章

  1. MeteoInfoLab脚本示例:MODIS AOD

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

  2. MeteoInfoLab脚本示例:加载图片和透明图层

    MeteoInfoLab的georead函数提供了读取shape文件.image文件(JPG.PNG等,需要有相应的地理定位文件)文件生成图层的功能(事实上shaperead也是同样的功能,不过函数名 ...

  3. MeteoInfoLab脚本示例:计算垂直螺旋度

    尝试编写MeteoInfoLab脚本计算垂直螺旋度,结果未经验证. 脚本程序: print 'Open data files...' f_uwnd = addfile('D:/Temp/nc/uwnd ...

  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脚本示例:读取远程文件

    利用Unidata netCDF Java库对远程文件的读取能力(OpenDAP, ADDE, THREDDS等),可以读取远程文件并绘图.脚本程序: fn = 'http://monsoondata ...

  7. MeteoInfoLab脚本示例:合并数组

    对于全球数据来说,经度要么是-180 - 180,要么是0 - 360,都会存在边界数据不连续的问题.比如0 - 360的数据,怎么得到 -20 - 30度的连续格点数据就是个问题(跨越了数据的经度边 ...

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

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

  9. MeteoInfoLab脚本示例:Trajectory

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

随机推荐

  1. 【漫话DevOps】Agile,CI/CD,DevOps

    随着DevOps理念的普及与扩散,可能会被一大堆名字概念搞的莫名其妙,理清它们之间的关系可以帮助团队知道DevOps如何落地,改善工作流程. Here's a quick and easy way t ...

  2. oracle之二物化视图

    物化视图 18.1.物化视图作用 1) 物化视图起源于数据仓库,早期的考虑是用于预先计算并保存表连接或聚集等耗时较多的操作的结果,这样,在执行查询时,就可以避免在基表上进行这些耗时的操作,从而快速的得 ...

  3. Git | Git入门,成为项目管理大师(一)

    大家好,周一我们迎来了一个新的专题--git. 写这个专题的初衷有两点,第一点是觉得好像很少有公众号提到git相关的技术,可能是觉得太基础了看不上.但实际上git非常重要,在我们实际的开发工作当中使用 ...

  4. 自定义 NSLog以便发版和调试

    问题 开发中用了大量的 NSLog,但是发布时想取消这些 NSLog 开发中是否经常用过 NSLog(@"%s", __FUNCTION__); 解决问题 新建 ExtendNSL ...

  5. 记一次函数异常(getopt_long)

    前言 以下参考博客以及man手册. getopt_long函数,getopt_long函数包含了getopt函数的功能,并且还可以指定"长参数"(或者说长选项),与getopt函数 ...

  6. JAVA之代理2CGLib

    对于CGLib的代理目前还是知道如何使用,以及理论上它的原理,到源码上的理解还没到位 https://www.jianshu.com/p/9a61af393e41?from=timeline& ...

  7. 使用vue-cli(vue脚手架)快速搭建项目

    vue-cli 是一个官方发布 vue.js 项目脚手架,使用 vue-cli 可以快速创建 vue 项目.这篇文章将会从实操的角度,介绍整个搭建的过程. 1. 避坑前言 其实这次使用vue-cli的 ...

  8. MySQL必知必会(1-12章)

    第一章:了解SQL 数据库基础:(概念) 数据库软件: DBMS(数据库管理系统) 数据库: 通过DBMS创建和操纵的容器: 保存有组织的数据的容器-->通常是一个文件或者一组文件: 表: 某种 ...

  9. spring aop原理和实现

    一.aop是什么 1.AOP面向方面编程基于IoC,是对OOP的有益补充: 2.AOP利用一种称为"横切"的技术,剖解开封装的对象内部,并将那些影响了 多个类的公共行为封装到一个可 ...

  10. list、set、map的区别和联系

    结构特点 List和Set是存储单列数据的集合,Map是存储键值对这样的双列数据的集合: List中存储的数据是有顺序的,并且值允许重复:Map中存储的数据是无序的,它的键是不允许重复的,但是值是允许 ...