NetCDF数据的标准化处理(一)

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技术与应用”

  • 1
    点赞
  • 24
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值