Matlab 对nc文件进行处理

发布于:2024-04-24 ⋅ 阅读:(20) ⋅ 点赞:(0)

1.介绍nc文件
NetCDF全称为network Common Data Format,中文译法为“网络通用数据格式”;netcdf文件开始的目的是用于存储气象科学中的数据,现在已经成为许多数据采集软件的生成文件的格式。

•从数学上来说,netcdf存储的数据就是一个多自变量的单值函数。用公式来说就是f(x,y,z,…)=value;
•函数的自变量x,y,z等在netcdf中叫做维(dimension) 
•函数值value在netcdf中叫做变量(Variables)

一个Netcdf文件的结构包括以下对象:
•变量(Variables) :变量对应着真实的物理数据。
•维(dimension):一个维对应着函数中的某个自变量,或者说函数图象中的一个坐标轴,在线性代数中就是一个N维向量的一个分量。
•属性(Attribute) :属性对变量值和维的具体物理含义的注释或者说解释。

2. 对nc数据处理的心得
主要是需要将 nc 数据转为带有地理坐标系的 Geotif 文件,可以很方便的用 matlab 或者 python 完成单个或者批处理的转换,随后,利用感兴趣区的shapefile文件对 tif 文件进行裁剪从而达到提取数据的目的,裁剪我还未在matlab中实现过,批量裁剪有多种方法,我使用过Arcgis pro的模型构建器、python的库有GDAL、Arcpy等。更喜欢使用模型构建器,鼠标点点的事哈哈。

 3.实操

先补充一下matlab中矩阵坐标系,如下图,坐标原点在左上角,这对于我们使用permute函数(这函数我认为是第一难)至关重要

clc;clear;
files = ls('temp_ITPCAS-CMFD_V0106_B-01_01yr_010deg_1979-2015.nc');

ncdisp(files)
temp = ncread(files,'temp');
lon = ncread(files,'lon');
lat = ncread(files,'lat');

data = permute(temp,[2,1,3]);

R = georasterref('RasterSize',size(data(:,:,1)),'Latlim',[min(lat) max(lat)],'Lonlim',[min(lon) max(lon)]);
geotiffwrite('test.tif',data(:,:,1),R,'CoordRefSysCode',4326);

 逐行解析:

ncdisp(files)

 查看nc文件的基本信息,会在命令行窗口返回如下结构

A.维度:700行*400列*37页

B.变量有:lon 经度、lat 纬度、 time 时间(实际是37年)、temp 温度(我们需要的,前三个都是维度的说明)

C.可以看到数据是以 经度*纬度*year存储的,但实际中应该是 纬度*经度*year存储,使用pearmute函数!!!

temp = ncread(files,'temp');
lon = ncread(files,'lon');
lat = ncread(files,'lat');

data = permute(temp,[2,1,3]);

ncread函数,读取 nc 文件中 的temp变量、lon变量、lat变量,最后利用permute转成纬度*经度*year的形式。

R = georasterref('RasterSize',size(data(:,:,1)),'Latlim',[min(lat) max(lat)],'Lonlim',[min(lon) max(lon)]);
geotiffwrite('test.tif',data(:,:,1),R,'CoordRefSysCode',4326);

只将data(:,:,1),第一年写入了tif,R是参考系的意思。如果要将37年全写成tif,则可加个for循环,读者可自行尝试,会产生37个tif文件。

最后在Arcgis Pro中打开test.tif的效果如下:

最后想裁剪哪里就用一下模型构建器(批量)