NetCDF数据的标准化处理(一)
我们在业务应用中经常会碰到NetCDF(network Common Data Form)网络通用数据格式,相信大家对这种数据格式也比较熟悉了,它是一种自定义的多维科学数据集,在海洋、气象、环保、地球物理等领域应用非常广泛。
一、NetCDF数据结构
NetCDF数据集包含维度、变量和属性三种描述类型,其中变量存储实际数据,是一个N维数组,维度定义了每个变量的维度信息,属性定义了变量或者数据集本身的辅助信息属性,NetCDF可以对海量网格数据进行高效存储、管理、获取和分发等操作,采用nc文件查看工具Panoply我们可以看到nc数据的结构,如下图所示:
二、ArcGIS对NetCDF的数据管理
对于标准格网的NetCDF数据,可以采用ArcGIS的镶嵌数据集进行入库管理,详细操作见博客“基于ArcGIS镶嵌数据集的环境数据存储与管理”中介绍的方法和流程,如果该nc数据可以被ArcGIS读取,如下图所示,那么在添加了NetCDF文件数据之后,打开"Raster Type Properties"窗口,就能够识别到NetCDF文件中的所有变量,如下图所示
否则,如下图所示就会显示空白,那么这个NetCDF文件是不能直接入镶嵌数据集的,那下边我们来介绍简单结构的NetCDF标准化处理方法。
三、简单的NetCDF标准化处理
因为NetCDF文件的格式不固定,存在很多种不规范的情况,比较常见的是变量命名不规范,如下图所示结构的NetCDF文件,维度west_east、south_north的命名不规范,我们需要将该NetCDF文件进行重写,将变量名称规范为lon、lat。
- 第一步:读取原始NetCDF文件的维度信息
oldNC=Dataset(oldncfilepath,'r',format='NETCDF4')
len_lon=len(oldNC.dimensions["west_east"])
len_lat=len(oldNC.dimensions["south_north"])
len_z=len(oldNC.dimensions["bottom_top"])
len_time=len(oldNC.dimensions["Time"])
- 第二步:创建新NetCDF文件的维度
newNC=Dataset(outnewncfilepath,'w',format='NETCDF4')
newNC.createDimension("lon",len_lon)
newNC.createDimension("lat",len_lat)
newNC.createDimension("z",len_z)
newNC.createDimension("time",len_time)
- 第三步:创建新NetCDF文件的各个变量
var_lon=newNC.createVariable("lon","f8",("lon",))
var_lat=newNC.createVariable("lat","f8",("lat",))
var_z=newNC.createVariable("z","f8",("z",))
var_time=newNC.createVariable("time","f8",("time",))
var_pm25=newNC.createVariable("pm25","f8",("time","z","lat","lon",),fill_value=9.96921E36)
var_pm10=newNC.createVariable("pm10","f8",("time","z","lat","lon",),fill_value=9.96921E36)
var_u10=newNC.createVariable("U10","f8",("time","z","lat","lon",),fill_value=9.96921E36)
var_v10=newNC.createVariable("V10","f8",("time","z","lat","lon",),fill_value=9.96921E36)
- 第四步:定义新NetCDF文件变量的属性信息
var_lon.units="degree_east"
var_lon.standard_name = "longitude";
var_lat.units="degree_north"
var_lat.standard_name = "latitude";
#var_time.units = 'hours since 2015-01-01 00:00:00'
#var_time.calendar = "gregorian"
- 第五步:给新NetCDF文件的变量赋值
var_lon[:]=oldNC.variables["west_east"][:]
var_lat[:]=oldNC.variables["south_north"][:]
var_z[:]=numpy.arange(0,len_z,1)
var_time[:]=numpy.arange(0,len_time,1)
var_pm25[:]=oldNC.variables["PM2_5_DRY"][:]
var_pm10[:]=oldNC.variables["PM10"][:]
var_u10[:]=oldNC.variables["U"][:][:,:,0:len_lat,0:len_lon]
var_v10[:]=oldNC.variables["V"][:][:,:,0:len_lat,0:len_lon]
- 第六步:关闭NetCDF文件
oldNC.close()
newNC.close()
重新生成的标准化NetCDF文件结构如下图所示:
那么现在我们的NetCDF文件就可以顺利入镶嵌数据集了。
上述示例的完整代码已经上传至网盘,链接:https://pan.baidu.com/s/1zSMsgBVOT7RXo4TJrK3n2w
提取码:y4h6,欢迎大家留言,互相交流学习。
想了解ArcGIS最新的技术动态和环保最新的应用,请关注微信公众号“环保GIS技术与应用”