材料:Win10+Python3.8+wgrib/wgrib2
①Grib/Grib2数据转为CSV/NC格式数据
什么是NC格式数据:
NC文件即NetCDF (Network Common Data Form),是一种通用的数据存储格式。广泛用于存储地学、大气科学、海洋科学等一系列多维数据,可封装时间、经度、纬度、降水、温度等多个维度数据,数据结构清晰易读,可以很方便的提取、应用。
说明:
windows下没有api可以直接读grib或者grib2的数据。可以下载wgrib或者wgrib2来读grib数据。wgrib可以读grib1格式(.grb)的数据,wgrib2可以读grib2格式(.grib)的数据。
下载工具:
wgrib,下载地址:ftp://ftp.cpc.ncep.noaa.gov/wd51we/wgrib
wgrib2,下载地址:ftp://ftp.cpc.ncep.noaa.gov/wd51we/wgrib2
嫌下载慢的,直接点这里下载wgrib2(win10-64位),提取码:barb
操作步骤: ①同时按下windows和R键,输入cmd,点击确定;
②输入wgrib2和待处理的数据,依据wgrib相关命令参数查看信息和处理;
这里介绍常用的几个命令:
1.-v0命令查看数据目录 【wgrib2.exe grib2数据 -v0】
wgrib2 grbfile -v0
2.-v命令查看属性【wgrib2.exe grib2数据 -v】
wgrib2 grbfile -v
3.采用匹配的方式,将grib2数据转换为.csv数据;
通过 -v命令查看目录可以看到有一个表示属性的字段“TMP”–温度;
新建一个csv文件以TMP作为字段名,使用 -match命令进行匹配;
存储为.csv格式命令【wgrib2.exe grib2数据 -match ‘TMP’ -csv csv存储路径】
wgrib2 grbfile -match 'TMP' -csv XX.csv
4.将grib2数据转换为.nc数据命令【wgrib2.exe grib2数据 -netcdf nc存储路径】
wgrib2 grbfile -netcdf xx.nc
②NC格式数据转为GeoTiff格式数据
Python处理nc文件需要用到的库:
netCDF4用于读取NC文件;
osgeo的子库gdal和osr,前者用于实现转换和栅格编辑功能,后者可用于确定地理坐标系和地图投影。
Python程序–查看NC文件信息
import netCDF4 as nc
import numpy as np
item = r'C:/Users/T480/Desktop/nc/tmp.nc'#选取一个nc文件路径
data = nc.Dataset(item)
print(data) # 返回data的数据类型,<class 'netCDF4._netCDF4.Dataset'>
print('{:-<100}'.format('----'))
print(data.variables) # 了解变量的基本信息
print('{:-<100}'.format('----'))
for i in data.variables.keys():# 返回data中的变量名称
print(i)
print('{:-<100}'.format('----'))
print(data.variables) # 了解变量的基本信息
print('{:-<100}'.format('----'))
print(data.variables['lon']) # 了解某一变量如“lon”(经度)的基本信息
print('{:-<100}'.format('----'))
Python程序–NC数据转GeoTiff数据
import netCDF4 as nc
import numpy as np
from osgeo import gdal,osr
#读取数据值
item = r'C:/Users/T480/Desktop/nc/tmp.nc'#选取一个nc文件路径
outTif='C:/Users/T480/Desktop/tiff/tmp09.tif'#输出的tif文件路径
data = nc.Dataset(item)
lat= data.variables['latitude'][:]
lon= data.variables['longitude'][:]
time= data.variables['time'][:]
TMP_2maboveground=data.variables['TMP_2maboveground'][0,:,:]#即生成 某天 全纬度、经度范围 图像
TMP_2maboveground=np.asarray(TMP_2maboveground)-273.15#数据类型转换,开尔文温度转为摄氏温度
TMP_2maboveground[np.where(TMP_2maboveground == -33321)] = np.nan #异常值处理
#影像的空间坐标信息
LonMin,LatMax,LonMax,LatMin=[lon.min(),lat.max(),lon.max(),lat.min()]#左上和右下
Lon_Res=(LonMax-LonMin)/(float(len(lon)))
Lat_Res=(LatMax-LatMin)/(float(len(lat)))
#创建tiff影像
TMP_ds=gdal.GetDriverByName('GTiff').Create(outTif,len(lon),len(lat),1,gdal.GDT_Float32)
#设置影像的显示范围
geotransform=(LonMin,Lon_Res,0,LatMax,0,-Lat_Res)
TMP_ds.SetGeoTransform(geotransform)
srs=osr.SpatialReference()
srs.ImportFromEPSG(4326)#定义输出坐标系为WGS84
TMP_ds.SetProjection(srs.ExportToWkt()) #给新建图层赋予投影信息
#这里通常选取的是左上角点的坐标(lonmin,latmax),但通常情况下图像会上下颠倒,原因是NC数据存储时是按照经纬度均从小到大进行存储的,而在创建tiff时是从经度从小到大,维度从大到小进行存储----即,从左下角点开始读取数据,放到左上角点开始存储
#影像翻转,恢复原样
for i in range(len(lat)):
tmp=len(lat)-1-i
for j in range(len(lon)):
TMP_2maboveground01[i,j]=TMP_2maboveground[tmp,j]
#数据写出
TMP_ds.GetRasterBand(1).SetNoDataValue(-9999)
TMP_ds.GetRasterBand(1).WriteArray(TMP_2maboveground01) # 将数据写入内存
TMP_ds.FlushCache() # 将数据写入硬盘
TMP_ds=None