matlab:如何将ERA5(.nc)批量输出为Geotiff文件?
01 文件格式要求
文件样式形如2m_dewpoint_temperature_2000_01.nc

02 源码
clc
clear
%% 准备
in_dir = 'G:/ERA5/2m_temperature'; % 存储待处理nc文件的路径
out_dir='E:\MyTEMP\ERA5'; % 输出路径
start_year = 2000; % 起始年份
end_year = 2000; % 终止年份
var_wildcard_name = '2m_temperature';
var_name = 't2m'; % 变量名称
[status, msg] = mkdir(out_dir); % 创建目录(存在则不创建)
srs=georefcells([-90 90],[-180 180],[1801 3600],'ColumnsStartFrom','north','RowsStartFrom','west'); % 坐标系信息
%{
georefcells函数用于针对一个规则栅格矩阵(确定的经纬度范围, 具体的行列数),创建一个
地理参考对象.
'ColumnsStartFrom','north' ==> 默认列方向是自北向南
'RowsStartFrom','west' ==> 默认行方向是自西向东
%}
%% 迭代获取变量的栅格矩阵并输出未Geotiff文件
% 检索nc文件
nc_paths = dir(fullfile(in_dir, '*.nc'));
for cur_year = start_year:end_year
for cur_month = 1:1
mdays = eomday(cur_year, cur_month); % 获取当前年当前月份的天数
% 读取当前循环nc文件的变量数组和基本信息
cur_nc_path = fullfile(in_dir, sprintf('%s_%d_%02d.nc', var_wildcard_name, cur_year, cur_month));
vinfo = ncinfo(cur_nc_path, var_name);
[col, row, time] = deal(vinfo.Size(1), vinfo.Size(2), vinfo.Size(3));
time_step = 0; % 用于时间步计数
for cur_day = 1:mdays
for cur_hour = 1:24
time_step = time_step + 1;
var = ncread(cur_nc_path, var_name, [1, 1, time_step], [col, row, 1]);
%{
ncread(nc文件路径, 变量名称, 开始位置, 读取元素数)
[1, 1, time_step], 第一个维度(col)从1开始, 第二个维度(row)也是,
第三个维度(time)从第time_step开始
[col, row, 1], 第一个维度读取的元素数为col, 第二个为row, 第三个说明只读取一个时间点
%}
var = var'; % 转置-行列互换
var = [var(:, 1801:3600), var(:, 1:1800)];
%{
由于经度是0~360,这对应于地理坐标系就是0~180,-180~0
为了保证这与srs的地理参数设置一致(左上角点为-180°W,90°N)
%}
% 输出
cur_out_filename = sprintf('era5_%s_%d%02d%02d_%02d.tif', var_wildcard_name, cur_year, cur_month, cur_day, cur_hour);
cur_out_path = fullfile(out_dir, cur_out_filename);
geotiffwrite(cur_out_path, var, srs);
fprintf('当前处理: %s\n', cur_out_filename);
end
end
end
end
03 部分函数说明
3.1 georefcells函数
georefcells函数会返回一个针对地理坐标中规则像元栅格的默认参考对象。一般与geotiffwrite函数搭配使用(返回值可作为其函数的R参数传入)。
有三种传参方式:
srs = georefcells(latlim,lonlim,rasterSize)
latlim: 表示纬度范围,例如[-90, 90]表示从90°S~90°N;
lonlim: 表示经度范围,例如[0, 180]表示从0°~180°E;
rasterSize: 表示栅格大小,这里指代栅格图像的行列数,例如[1800, 3600]表示1800行3600列;
srs = georefcells(latlim,lonlim,latcellextent,loncellextent)
这里的传参前面latlim,lonlim是一样,但是后面传入参数不一样。
latcellextent: 表示纬度方向(y方向)上单个像元/栅格/单元的表示的范围,实际上就是纬度方向上的像元分辨率;
loncellextent: 表示经度方向(x方向)上单个像元/栅格/单元的表示的范围,实际上就是纬度方向上的像元分辨率;譬如GPM IMERG降水影像的空间分辨率为0.1°×0.1°(经纬度方向上分辨率一致,范围全球),那么这里的就可以传入:
srs = georefcells([-90, 90], [-180, 180],0.1,0.1)
srs = georefcells(latlim,lonlim,___,Name,Value)
除了传入上述必要参数外,还有一些可选参数通过关键字传参,这里包括:
R = georefcells([-90, 90], [-180, 180], 0.1, 0.1,'ColumnsStartFrom','north')
R = georefcells([-90, 90], [-180, 180], 0.1, 0.1,'RowsStartFrom','east')
ColumnsStartFrom表示列方向上是从哪里开始,默认是从北开始,即从北到南,如果栅格矩阵默认最上方是北边那么此处可以不进行关键字传参因为默认上方就是北(north);
RowsStartFrom表示行方向上是从哪里开始,默认是从西开始,即从西到东,如果栅格矩阵默认最左侧是东边那么此处可以不进行关键字传参因为默认左侧就是东(east);
一般情况下,对于目前我所遇到的卫星遥感影像,大部分都是上北下南,左西右东,所以对于RowsStartFrom是需要指定为west.但是也有例外,对于MODIS的部分产品例如OMI/SWATH等产品部分存在南北颠倒即栅格矩阵上方是南极区域下方是北极区域.不过对于这种我一般还是不去更改这个ColumnsStartFrom参数,而是将读取的栅格矩阵进行南北极调换颠倒过来再进行后续操作.
3.2 eomday函数
很简单的一个函数,就是依据传入的年和月计算得到当前年份当前月份下总共有多少天,官方说明即是:返回年份 Y 中指定月份 M 的最后一天(End of month day, eomday);
eomday传参如下:
E = eomday(Y,M)
Y: 表示年份;
M: 表示月份;
3.3 ncinfo函数
获取当前nc文件或者当前nc文件下指定变量/group的基本信息.
有如下三种传参方式:
finfo = ncinfo(source)
vinfo = ncinfo(source,varname)
ginfo = ncinfo(source,groupname)
source:表示nc文件的路径,不指定varname和group参数即返回该nc文件的基本信息;
varname: 表示待查询的变量名称,注意此处变量的名称其实应当是变量在nc文件内的路径,例如t2m变量在group1/group2/t2m下,那么应该传入该路径而不是仅仅传入t2m这个变量名称;
group_name: 表示待查询的group名称,说明与varname基本相似;
3.4 ncread函数
获取当前nc文件指定变量名称的数组.
传参方式主要有下面两种:
vardata = ncread(source,varname)
vardata = ncread(source,varname,start,count)
区别在于:如果你只是单纯想提取出整个变量数组,直接使用第一个传参方式即可;如果你需要提取变量数组中指定区域的部分数组出来,可以使用第二个传参方式(一般是在整个变量数组无法全部加载进电脑内存中,或者你需要针对变量数组中不同部分的小数组进行不同操作例如对于一个shape=(行,列,时间)的数组,或许对于不同时间的栅格矩阵需要单独处理亦或者只需要某一个时间步的栅格矩阵)
source: 表示nc文件的路径;
varname: 表示待读取变量的名称,实际是变量在nc文件中的路径;
start: 表示各个维度上的起始索引,例如对于shape=(行=100,列=200,波段数=3)的三维数组, 我们想要读取第二个波段的栅格矩阵可以设置[1, 1, 2],再配合count参数(下面马上提及)设置为[100, 200, 1]即可;
count: 表示沿每个维度读取的元素数;例如上述例子中需要提取第二个波段的栅格矩阵即从start中第一个维度(行)的索引1(matlab索引从1开始而非0)开始往后读取100个元素,类似地从列维度的索引1开始往后读取200个元素,从波段维度的索引2开始读取一个元素(即只读取一个元素就是第二个波段);
3.5 geotiffwrite函数
传参方式: geotiffwrite(filename,A,R)
filename: 输出Geotiff文件的输出路径;
A: 输出的栅格矩阵,对于灰度图像或者单波段影像要求shape=(行,列);而对于RGB、多波段或者高光谱影像,要求shape=(行,列,波段);
R: 地理参考对象,可以通过前面的georefcells函数构建得到;
本文由mdnice多平台发布
matlab:如何将ERA5(.nc)批量输出为Geotiff文件?的更多相关文章
- 在matlab中将处理结果输出为shp文件
在matlab中读入shp文件很简单,一个函数shaperead就可以了,但输出为shp文件就稍微麻烦一些了.shp文件实际上就是一个struct,因此得到处理结果后,要先将数据变成struct结构, ...
- 将Matlab中的矩阵输出到txt文件
将矩阵输出到txt文件中的方法,遍寻网络,始见真经!!! fid=fopen('C:Documents and Settingscleantotal.ped','wt');%写入文件路径 matrix ...
- Matlab处理数据导出Paraview可读的vtk文件(二)
由于我在用SPH方法仿真时用的是FORTRAN语言,并且没有找到直接输出vtk文件的代码,因此偷懒通过MATLAB转换一下数据. 用到的Matlab子程序可通过一下链接找到. Matlab处理数据导出 ...
- PHP批量清空删除指定文件夹内容
PHP批量清空删除指定文件夹内容: cleancache.php <?php // 清文件缓存 $dirs = array( realpath(dirname(__FILE__) . '/../ ...
- log4j输出日志到文件
输出端Appender Appender用来指定日志信息输出到哪个地方,可以同时指定多个输出目的地.Log4j允许将信息输出到许多不同的输出设备中,一个log信息输出目的地就叫做一个Appender. ...
- shell下批量重命名svn文件的方法
shell下批量重命名svn文件的方法 目标: 将svn目录下所有文件重命名 , 原文件前缀为 ucc_ , 批量改为 xmd_ 用tree看下当前svn目录 ucc_1.c ucc_1.h ucc_ ...
- C#中使用Log4net日志输出到本地文件、Textbox或Listview
网上很多配置log4net的方法,但是排行靠前的 根本就没有说明清除,导致浪费了两个小时来搞清楚如何配置,真是无语,特写此文,给那些刚接触log4net的朋友 1.参考链接:http://blog.s ...
- Linux将Shelll输出写入到文件
&> 以覆盖的方式,写入文件 &>> 将输出追加到文件 将命令的正确输出与错误输出都放入文件. /dev/null,垃圾箱. 将无用输出放入垃圾箱. 命令>& ...
- 将filenames里的每个字符串输出到out文件对象中注意行首的缩进
在Linux上用强大的shell脚本应该也可以完成,可是使用Windows的朋友呢?其实象这样一个简单任务用Python这个强大脚本语言只要几条语句就可以搞定了.个大家知道,要完成这样一个任务根本不用 ...
- [转]Android输出Log到文件
前言:开发中遇到mx4这款机型Eclipse联调不上,logcat看不了,需要输出生成文件查看调试信息.网上搜了下,功能很完善了.startService和过滤输出信息需要自己添加设置,另外注意添加权 ...
随机推荐
- Ubuntu 通过 docker 运行 redis
1.首先拉取redis的镜像 docker pull redis 2.运行redis容器 docker run --name redis -p 6379:6379 -d redis --name re ...
- AtCoder Beginner Contest 341-F
AtCoder Beginner Contest 341-F F - Breakdown Problem 给你一个由 \(N\) 个顶点和 \(M\) 条边组成的简单无向图.每个顶点拥有权重\(W_i ...
- C++学习思维导图
C++思维导图 整个的思维导图大概的架构如下,Xmind.SVG.PDF格式的下载链接都在下面了,如有需要可自取 Xmind文件分享:https://cnblogs-img.oss-cn-hangzh ...
- 在Linux下使用wxWidgets进行跨平台GUI开发
在Linux下使用wxWidgets进行跨平台GUI开发 wxWidgets是一个功能强大的跨平台C++ GUI框架,支持Windows.Linux和macOS等多种平台.本文将详细介绍在Linux系 ...
- vue中使用axios获取到的Promise {<pending>}数据,无法使用的问题
使用axios拿到后端数据后 返回的是 Promise {} 我们可以看到数据是在[[PromiseResult]]这个Object对象中 此时我们是无法获取对象的 解决方法:使用async和awai ...
- C#实现欧姆龙 HostLink 通讯协议库
目录 C#实现欧姆龙 HostLink 通讯协议库 背景介绍 欧姆龙 PLC 内存区域介绍 欧姆龙 PLC 数据类型对应 欧姆龙 PLC 与 PC 的 RS232 接线线序 HostLink通讯报文分 ...
- Redis五-哨兵
目录 哨兵 导读 基本概念 主从复制问题 Redis Sentinel的高可用性 安装和部署 部署数据节点 部署Sentinel节点 Seninel配置优化 sentinel API 实现原理 三个定 ...
- 浅析百万级分布式调度引擎——DAGScheduleX能做什么?
公交车伴随着我们的日常生活已是随处可见,不同路线的公交车根据各自的时间表有序发出,到达站点,接上站台的乘客再缓缓驶向下一站--早高峰会有短区间的加班车,发车间隔也更短,夜半时分的班次则间隔更长.这一切 ...
- 蛟分承影,雁落忘归 —— 袋鼠云一站式全自动化运维管家 ChengYing(承影)正式开源
原文地址: 交流蛟分承影,雁落忘归--袋鼠云一站式全自动化运维管家ChengYing(承影)正式开源 技术交流:30537511(钉钉群) 我们兴奋的向大家宣布一个好消息 DTstackCon新成 ...
- AI应用实战课学习总结(7)聚类算法分析实战
大家好,我是Edison. 最近入坑黄佳老师的<AI应用实战课>,记录下我的学习之旅,也算是总结回顾. 今天是我们的第7站,一起了解下聚类算法基本概念 以及 通过聚类算法辅助用户画像的案例 ...