python netcdf4读取nc格式的气象数据

一、nc格式数据介绍

NetCDF全称为network Common Data Format,中文译法为“网络通用数据格式”,netcdf文件开始的目的是用于存储气象科学中的数据,现在已经成为许多数据采集软件的生成文件的格式。从数学上来说,netcdf存储的数据就是一个多自变量的单值函数。用公式来说就是f(x,y,z,…)=value, 函数的自变量x,y,z等在netcdf中叫做维(dimension)或坐标轴(axix),函数值value在netcdf中叫做变量(Variables).而自变量和函数值在物理学上的一些性质,比如计量单位(量纲)、物理学名称等等在netcdf中就叫属性(Attributes).

二、nc格式数据读取

2.1 查看数据存储内容

import netCDF4 as nc
file = ""
dataset =nc.Dataset(file)
print(dataset.variables.keys())
python netcdf4读取nc格式的气象数据_第1张图片

可以看到这个风场文件里属性有纬度、经度、时间、经向风、纬向风。

2.2 查看属性值

import netCDF4 as nc
file = ""
dataset =nc.Dataset(file)
print(dataset.variables.keys())
#纬度
print(dataset.variables["latitude"][:])
#经度
print(dataset.variables["longitude"][:])
python netcdf4读取nc格式的气象数据_第2张图片
纬度变量 存储的是从左到右数值的纬度信息, 经度变量存储的是从上到下数值的经度信息,需要注意的是nc存储的数据是从上到下纬度依次增加,与实际的地理情况相反,存储成tiff的时候需要将矩阵做上下翻转。

2.4 解析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)

经向风和纬向风解析结果

python netcdf4读取nc格式的气象数据_第3张图片 python netcdf4读取nc格式的气象数据_第4张图片

你可能感兴趣的:(遥感图像处理,nc,python,气象)