NetCDF全称为network Common Data Format,中文译法为“网络通用数据格式”,netcdf文件开始的目的是用于存储气象科学中的数据,现在已经成为许多数据采集软件的生成文件的格式。从数学上来说,netcdf存储的数据就是一个多自变量的单值函数。用公式来说就是f(x,y,z,…)=value, 函数的自变量x,y,z等在netcdf中叫做维(dimension)或坐标轴(axix),函数值value在netcdf中叫做变量(Variables).而自变量和函数值在物理学上的一些性质,比如计量单位(量纲)、物理学名称等等在netcdf中就叫属性(Attributes).
import netCDF4 as nc
file = ""
dataset =nc.Dataset(file)
print(dataset.variables.keys())
可以看到这个风场文件里属性有纬度、经度、时间、经向风、纬向风。
import netCDF4 as nc
file = ""
dataset =nc.Dataset(file)
print(dataset.variables.keys())
#纬度
print(dataset.variables["latitude"][:])
#经度
print(dataset.variables["longitude"][:])
纬度变量 存储的是从左到右数值的纬度信息, 经度变量存储的是从上到下数值的经度信息,需要注意的是nc存储的数据是从上到下纬度依次增加,与实际的地理情况相反,存储成tiff的时候需要将矩阵做上下翻转。
#!usr/bin/env python
# -*- coding: utf-8 -*-
"""
@Author :
@Email :
@Time : 2019/12/4 16:45
@File : weather.py
@Software: PyCharm
"""
import os
import gdal,osr
import netCDF4 as nc
def extract_nc(nc_file):
dataset = nc.Dataset(nc_file)
print(dataset.variables.keys())
lat = dataset.variables["latitude"][:]
lon = dataset.variables["longitude"][:]
wind_u = dataset.variables["windu"][0,:,:][::-1]
wind_v = dataset.variables["windv"][0,:,:][::-1]
max_lat = lat[-1]
min_lon = lon[0]
rows,cols =wind_u.shape
#构造geotransform 0.5是根据latitude和longitude判断的
geo =(min_lon,0.5,0,max_lat,0,-0.5)
#构造projection
src_srs = osr.SpatialReference()
src_srs.ImportFromEPSG(4326)
src_srs_wkt = src_srs.ExportToWkt()
return wind_u,wind_v,geo,src_srs_wkt,rows,cols
def write_tiff(tiff_file,geo,proj,rows,cols,data_array):
driver = gdal.GetDriverByName("Gtiff")
outdataset = driver.Create(tiff_file,cols,rows,1,gdal.GDT_Float32)
outdataset.SetGeoTransform(geo)
outdataset.SetProjection(proj)
band = outdataset.GetRasterBand(1)
band.WriteArray(data_array)
def nc_to_tif(nc_file,output_dir):
nc_file_name = os.path.basename(nc_file)
output_file_name = os.path.join(output_dir,nc_file_name)
wind_u_file = output_file_name.replace(".nc", ".windu.tif")
wind_v_file = output_file_name.replace(".nc", ".windv.tif")
wind_u, wind_v, geo, proj,rows,cols=extract_nc(nc_file)
write_tiff(wind_u_file,geo,proj,rows,cols,wind_u)
write_tiff(wind_v_file,geo,proj,rows,cols,wind_v)
if __name__ == '__main__':
#风场数据
wind_file = r"D:\result\wind\gfs.wind.forecast.2019112717.nc"
#解析结果存储路径
tiff_dir = r"D:\result"
nc_to_tif(wind_file,tiff_dir)