MATLAB读取nc文件_如何转换mp3文件格式
大家好,又见面了,我是你们的朋友全栈君。
因为课题处理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!')
如果仔细看了上述代码,应该会发现在最后一块中用了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的顺序排下来,包括之后的读取栅格平均值都很有必要!
希望能帮到你!
后记:
写博客的初衷是分享经验,同时是算是自己对思路和代码的整理,方便日后处理数据,应该可以帮到很多人。
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/203605.html原文链接:https://javaforall.cn
相关文章
- python处理xps文件_xps/pdf/png/json转换
- php格式怎么转换为pdf,PHP如何将将word文件转为pdf
- 初识线程-了解wait和sleep的区别以及线程状态转换过程
- EasyDataTransform mac (转换Excel和CSV文件)
- tr - 转换或删除文件中的字符
- ECCV2022 | 生成对抗网络GAN论文汇总(图像转换-图像编辑-图像修复-少样本生成-3D等)
- hive数据类型转换cast_c语言数据类型的转换
- springboot,get传日期格式转换
- 饥荒服务器mod从modoverrides文件自动转换为dedicated_server_mods_setup 文件
- 基于 ArcGIS 的坐标系转换
- 一个批量转换jtl文件的shell详解程序员
- Oracle 时间转换: 一种有效的解决方案(oracle时间转换)
- php实现文件与16进制相互转换详解编程语言
- ABAP – 日期格式转换 & ABAP常用日期处理函数详解编程语言
- Linux 环境下轻松转换文件格式(linux文件转码)
- 文件Linux转换二进制文件:指南(linux转换二进制)
- Linux下三款流行的命令行文件转换工具
- 媒体转换
- 利用Oracle实现多行数据转换为多列数据(oracle多行变多列)
- 从CSV文件到Oracle数据库转换之旅(csv转oracle)
- FME 加速 Oracle 数据转换过程(fme oracle)
- Mysql实现数据转换将一列数据转换为多行数据(mysql 一列转多行)
- Json对象与Json字符串互转(4种转换方式)
- JavaIO文件编码转换实现代码
- 使用JavaScript进行进制转换将字符串转换为十进制