MATLAB读取nc文件_如何转换mp3文件格式

MATLAB读取nc文件_如何转换mp3文件格式因为课题处理 30 年的降雨和蒸发的遥感资料 NC 格式 而想要在 Arcgis 中处理要求的是 raster 格式的 所以需要批量转化为 tif 文件 所以在此分享自己改编之后的代码 可以简洁明了的实现这个过程 我所参考和借鉴的文章的链接如下 MATLAB 读取 nc 文件 matlab 批量处理 nc 文件 Matlab 读取气象驱动数据 nc 格式的数据 感谢他们的分享 版本

因为课题处理30年的降雨和蒸发的遥感资料(.NC格式),而想要在Arcgis中处理要求的是raster格式的,所以需要批量转化为tif文件,所以在此分享自己改编之后的代码,可以简洁明了的实现这个过程:

我所参考和借鉴的文章的链接如下:
《 MATLAB读取.nc文件》
《matlab批量处理nc文件》
《Matlab读取气象驱动数据.nc格式的数据》
感谢他们的分享

版本:MATLAB_2018b

clc;
clear;

%% 批读取NC文件的准备工作
datadir = 'G:\Global_P_ET\MSWEP_V2.2\'; %指定批量数据所在的文件夹
filelist = dir([datadir,'*.nc']); %列出所有满足指定类型的文件
% a = filelist(1).name; %查看要读取的文件的编号
% b = filelist(2).name;
k=length(filelist);

for i = 1:k %依次读取并处理

%% 批量读取NC文件
ncFilePath = ['G:\Global_P_ET\MSWEP_V2.2\',filelist(i).name]; %设定NC路径
num = filelist(i).name(1:6); %读取数据编号,以便于保存时以此编号储存tif

%% 读取变量值
lon=ncread(ncFilePath,'lon'); %读取经度信息(范围、精度)
lat=ncread(ncFilePath,'lat'); %读取维度信息
time=ncread(ncFilePath,'time'); %读取时间序列
pre=ncread(ncFilePath,'precipitation');%获取降雨变量数据
sum_pre=sum(pre,3); %此处我是为了求月总降水,所以他人可以不管

%% 展示数据内部结构等信息
% pcolor(lat,lon,sum_pre);
% shading flat; %移除网格线,否则图上一片黑什么都没有
% [x,y]=meshgrid(lon,lat); %根据经纬度信息产生格网,3600列(经度),1800列(纬度)
% phandle=pcolor(x,y,sum_pre'); %显示一个矩阵,其中x,y,sum_pre的行列数必须一致
% shading flat;
% colorbar
% imwrite(sum_pre','...................................','tif')

%% 存为tif格式
data=flipud(sum_pre'); %很重要,这是镜像反转,否则最后的图像的南北朝向是错的
R = georasterref('RasterSize', size(data),'Latlim', [double(min(lat)) double(max(lat))], 'Lonlim', [double(min(lon)) double(max(lon))]);
geotiffwrite(['G:\Global_P_ET\P\',num,'.tif'],data,R);
disp([num,'done'])

end
disp('finish!')

Jetbrains全家桶1年46,售后保障稳定

如果仔细看了上述代码,应该会发现在最后一块中用了flipud函数,这一步镜像反转的作用还可通过下例而知(以下是处理AVHRR蒸发数据):

clc;
clear;
datadir = 'G:\Global_P_ET\ET\AVHRR_Zhang\';%specify the location of folder of batch data
filelist = dir([datadir,'*.nc']); %specify the type of batch data
k = length(filelist);

for i = 1:k
ncFilePath = ['G:\Global_P_ET\ET\AVHRR_Zhang\',filelist(i).name];
num = filelist(i).name(19:22); %record the serial number
lon = ncread(ncFilePath,'LON')'; %read value of longitude
lat = ncread(ncFilePath,'LAT')'; %read value of latitude

evapotranspiration = ncread(ncFilePath,'monthly_ET'); %read variable's value of precipitation

for mon=1:12
data = flipud(permute(evapotranspiration(mon,:,:),[3 2 1])); %since we did dimensionality reduction, the flipud function here is important to do vertical reversal
R = georasterref('RasterSize', size(data),'Latlim', [double(min(lat)) double(max(lat))], 'Lonlim', [double(min(lon)) double(max(lon))]);
if mon<10 %文件命名,yyyymmdd格式,所以要加0
geotiffwrite(['G:\Global_P_ET\ET_1\', num ,'0',num2str(mon) ,'.tif'],data,R);
disp([num,'0',num2str(mon),'done'])
else
geotiffwrite(['G:\Global_P_ET\ET_1\', num ,num2str(mon) ,'.tif'],data,R);
disp([num,num2str(mon),'done'])
end
end
end
disp('finish!')

二者代码的区别及要点如下:

1.在读入文件时可以预先用NASA提供的Panoply读一下NC文件看看各个变量的名字、大小写以及维度,比如第二个代码中变成了二维的’LON’、‘LAT’和’monthly_ET’。如果没有Panoply也可以用以下代码:

% 显示结构
ncdisp(ncFilePath);%显示nc文件的所有结构,以便大概了解里面的内容
ncdisp(ncFilePath,'evap');%显示指定变量的内容,注意一定要是变量variables才可以
ncdisp(ncFilePath,'/','min');%简单显示结构以及定义
ncdisp(ncFilePath,'/','full');%全部显示所有结构和定义信息


% 读取变量值
ncid = netcdf.open(ncFilePath,'NOWRITE'); %打开nc文件返回索引ID
[ndims,nvars,ngglobalatts,unlimdimid] = netcdf.inq(ncid);%获取维数,变量数,全局属性数量,
[varname,xtype,dimids,natts] = netcdf.inqVar(ncid,0); %根据变量索引号获取变量的名称

2.注意数据的维度以及在降维时的旋转问题,这也是为什么要用flipud函数进行矩阵上下翻转的原因,蒸发数据还好,如果是错的看图一下就能分辨出来,降雨数据就要小心再小心!!!

3.在输出命名时,进行判定加 ‘0’ ,这样就能使最后的图像按着yyyymmdd的顺序排下来,包括之后的读取栅格平均值都很有必要!

希望能帮到你!

后记:

写博客的初衷是分享经验,同时是算是自己对思路和代码的整理,方便日后处理数据,应该可以帮到很多人。

编程小号
上一篇 2025-01-18 09:33
下一篇 2025-01-18 09:27

相关推荐

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
如需转载请保留出处:https://bianchenghao.cn/hz/148538.html