直接接入正题,用arcgis直接读取气象数据(.nc)是比较困难的,所以先用matlab将nc数据转换成易于arcgis处理的tif数据。
解决思路:将每个波段转换成一个tif文件。
matlab提供了geotiffwrite供我们直接输出tif数据。
该函数主要用到以下三个参数:
path:输出tif的全路径
Data:数据矩阵
Refference:空间参考信息
源码如下:
clc
clear
% 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);
end
end
disp('成功!');
大家在使用时可能会用到以下几个问题。
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图像了
以上分析比较浅,有什么错误的地方欢迎指正。