matlab将nc数据转换为tif

来源:互联网 发布:餐饮软件开发 编辑:程序博客网 时间:2024/05/17 09:42

直接接入正题,用arcgis直接读取气象数据(.nc)是比较困难的,所以先用matlab将nc数据转换成易于arcgis处理的tif数据。

解决思路:将每个波段转换成一个tif文件。

matlab提供了geotiffwrite供我们直接输出tif数据。

该函数主要用到以下三个参数:

path:输出tif的全路径

Data:数据矩阵

Refference:空间参考信息

源码如下:

clcclear% nc文件根路径ncFileBasePath='G:\';% 输出tif根路径tiffOutFileBasePath='G:\tif\';% 获取该文件夹下所有nc文imageList=dir(strcat(ncFileBasePath,'*.nc'));for fileindex=1:length(imageList)   % 完整文件名   filename=imageList(fileindex).name;   % 不带后缀的文件名   filenameWithoutSufix=filename(1:find(filename=='.')-1);   % nc文件的完整路径   fileFullPath=strcat(ncFileBasePath,filename);   ncinf = ncinfo(fileFullPath);   ETaSets=ncread(fileFullPath,'spei');   SizeInfo=size(ETaSets);        for subsetIndex=1:SizeInfo(3)           disp(subsetIndex);           MonthData=ETaSets(:,:,subsetIndex);           MonthData(isnan(MonthData))=-8888;           tifOutputFullPath=strcat(tiffOutFileBasePath,filenameWithoutSufix,num2str(subsetIndex,'%02d'),'.tif');           MonthData = rot90(MonthData);           Refference=georasterref('RasterSize',size(MonthData),'Latlim',[-89.75 89.75],'Lonlim',[-179.75 179.75]);            Refference.ColumnsStartFrom = 'north';           geotiffwrite(tifOutputFullPath,MonthData,Refference);        endenddisp('成功!');

大家在使用时可能会用到以下几个问题。

1.如何取到我想要的波段信息?

ETaSets=ncread(fileFullPath,'spei');

这里用到ncread函数,可以读取nc数据的某个属性,但每个函数中的属性名可能不一致。我们可以在ncinf中查看。

ncinf = ncinfo(fileFullPath);

在工作区双击ncinf变量,打开variables(变量)窗口

这里写图片描述

我们看到我们想要的变量名为‘spei’

2.Refference的经度范围和纬度范围?

Refference=georasterref('RasterSize',size(MonthData),'Latlim',[-89.75 89.75],'Lonlim',[-179.75 179.75]); 

同样可以在ncinf中查看到

分别双击lon和lat的attribute查看

这里写图片描述
3.用你的代码输出的图像是反转的?
类似下面的情况:

这里写图片描述

可以看到图像发生了一定的偏转,具体原因我也不太清楚,希望有大神指点,但是这种情况可以通过以下 几种方式调节:

将矩阵旋转一定角度:

% 逆时针旋转90°MonthData = rot90(MonthData);
% 上下翻转MonthData = flipud(MonthData)
% 左右翻转MonthData = fliplr(MonthData)

设置Refference的属性:

Refference.ColumnsStartFrom = 'north';Refference.ColumnsStartFrom = 'south';Refference.RowsStartFrom = 'east';Refference.RowsStartFrom = 'west';

经过以上设置就能得到精确的tif图像了

这里写图片描述

以上分析比较浅,有什么错误的地方欢迎指正。

原创粉丝点击