仅用于记录,有一定的容错率
一、The second version of the Max-Planck Aerosol climatology (MACv2):第二版马克斯-普朗克气溶胶气候学
马克斯・普朗克研究所的气溶胶气候学(MAC)通过每月全球(1×1 度)的气溶胶光学和微物理特性场来定义。其核心聚焦于中可见光谱区(550 纳米)大气柱气溶胶的光学特性,这些特性的确定依托过去二十年可靠的地面观测数据。然而,鉴于观测数据在空间分布上较为稀疏,为构建时空完整的场,便引入了全球 “自下而上” 建模所提供的空间背景信息 。
在 MAC 的构建过程中,有一个关键步骤为 “合并过程”。在此过程里,会依据地面太阳光度计所统计的月数据,对全球建模生成的月度地图予以调整。所采用的光度测定数据来源可靠,涵盖了 AERONET 网络中 CIMEL 仪器经质量保证的直接太阳衰减和天空辐射样本(Holben 等人,1998,2001 ),以及 MAN 海洋气溶胶网络里手持式 MICROTOPS 仪器的太阳衰减样本(Smirnov 等人,2009,2011) 。
相较于初始的 MACv1 版本(Kinne 等,2013) ,MACv2 实现了多项重大升级 :
(1) MACv2 纳入了更新的 AERONET 数据,因此中心参考年份从 2000 年移至 2005 年;
(2) 现在考虑了海洋上空的 MAN 数据;
(3) 采用了新的区域数据合并程序;
(4) 仅合并绝对属性(例如,使用 AAOD 而非 SSA);
(5) 使用预定义的气溶胶类型来分配局部成分混合物,以实现更一致的光谱相关性;
(6) 引入了新的(更小的)人为成分。
——以上机翻内容来自文章(有容错率,仅参考或者阅读文章总结):The MACv2 aerosol climatology(https://doi.org/10.1080/16000889.2019.1623639)
二、MAC V2.0/V3.0 数据下载地址
**采用FileZilla下载,主要用于下载气溶胶参数信息,以及不同类型气溶胶的参数信息:
**
主机:ftp-projects.zmaw.de
ftp://ftp-projects.zmaw.de/aerocom/climatology/
主要下载信息请查看每一个文件内的readme-示例:README-2018-550nm
MACv2 climatology (2018)
1x1 global, monthly
AOD/SSA/ASY at 550nm
--------------------
gt_a_00550nm.nc anthropogenic (today - '2005')
gt_c_00550nm.nc coarse (no annual changes)
gt_f_00550nm.nc fine-mode (today - '2005')
gt_n_00550nm.nc natural (no annual changes)
gt_p_00550nm.nc pre-industrial ('1850' lamarque 2010)
gt_t_00550nm.nc total (today - '2005')
component AOD at 550nm
----------------------
gt_aodBC_550.nc soot (BC)
gt_aodCA_550.nc carbon (BC+OC)
gt_aodCO_550.nc coarse-mode (DU+SS)
gt_aodDU_550.nc mineral dust (DU)
gt_aodFI_550.nc fine-mode (SU+OC+BC)
gt_aodOB_550.nc OC shelled BC
gt_aodOC_550.nc organic matter (OC)
gt_aodSS_550.nc sea-salt (SS)
gt_aodSU_550.nc non-absorbing fine-mode (SU)
gt_aodTO_550.nc total (DU+SS+SU+OC+BC)
AOD at 550, fraction by size-mode
---------------------------------
gt_cf_0550nm.nc coarse-mode fraction (r>500nm)
gt_ff_0550nm.nc fine-mode fraction (r<500nm)
AAOD at 550nm (absorption AOD)
------------------------------
gt_ca_0550nm.nc coarse-mode AAOD
gt_fa_0550nm.nc fine-mode AAOD
gt_ta_0550nm.nc total AAOD
component mass
--------------
gt_masBC_550.nc as for comp.AOD
gt_masCA_550.nc
gt_masCO_550.nc
gt_masDU_550.nc
gt_masFI_550.nc
gt_masOB_550.nc
gt_masOC_550.nc
gt_masSS_550.nc
gt_masSU_550.nc
gt_masTO_550.nc
mass extinction efficiency
--------------------------
gt_meeBC_550.nc as for comp.AOD
gt_meeCA_550.nc
gt_meeCO_550.nc
gt_meeDU_550.nc
gt_meeFI_550.nc
gt_meeOB_550.nc
gt_meeOC_550.nc
gt_meeSS_550.nc
gt_meeSU_550.nc
gt_meeTO_550.nc
三、MATLAB读取代码示例:
查看nc内的信息的示例代码:
%% 读取MACA v2气候数据集中的单次散射反照率(SSA)及相关变量
% 作者:小小程序猿
% 日期:2025-06-24
clear;clc
%% 定义文件路径
nc_file = 'G:\MAC-AOD\z001test\macv3_2022\total_30bands\MACv3_tot_b30_2006.nc';
output_dir = 'G:\MAC-AOD\z001test\data\mat_files\macv3_2022\tif_files_clip2006'; % 保存MAT文件的目录
%% 创建输出目录(如果不存在)
if ~exist(output_dir, 'dir')
mkdir(output_dir);
fprintf('创建输出目录: %s\n', output_dir);
end
%% 检查NC文件是否存在
if ~exist(nc_file, 'file')
error('指定的NC文件不存在: %s', nc_file);
end
%% 获取文件元数据
try
nc_info = ncinfo(nc_file);
fprintf('成功获取NC文件元数据: %s\n', nc_file);
% 显示文件基本信息
fprintf('文件格式: %s\n', nc_info.Format);
fprintf('全局属性: %d个\n', length(nc_info.Attributes));
fprintf('变量数量: %d个\n', length(nc_info.Variables));
catch e
error('获取NC文件元数据失败: %s', e.message);
end
%% 获取所有变量名
var_names = {nc_info.Variables.Name}';
fprintf('文件包含以下变量:\n');
disp(var_names);
%% 以下的内容可以不获取,使用上面的代码进行查看即可!!!
%% 逐个读取变量并保存为单独的MAT文件
for i = 1:length(var_names)
var_name = var_names{i};
try
% 读取变量数据
var_data = ncread(nc_file, var_name);
% 获取变量维度信息
var_dims = nc_info.Variables(i).Dimensions;
dim_names = {var_dims.Name}';
% dim_sizes = [var_dims.Size]';
% 显示详细维度信息
fprintf('\n变量: %s\n', var_name);
fprintf(' 数据大小: %s\n', mat2str(size(var_data)));
fprintf(' 维度信息:\n');
% 获取并显示每个维度的单位和坐标值
for d = 1:length(dim_names)
dim_name = dim_names{d};
% dim_size = dim_sizes(d);
% 尝试获取维度变量的单位
dim_units = '';
try
dim_var = ncinfo(nc_file, dim_name);
if isfield(dim_var, 'Attributes')
for a = 1:length(dim_var.Attributes)
if strcmpi(dim_var.Attributes(a).Name, 'units')
dim_units = dim_var.Attributes(a).Value;
break;
end
end
end
catch
% 忽略错误
end
% 尝试获取维度的坐标值
dim_values = [];
try
dim_values = ncread(nc_file, dim_name);
% 只显示前5个和后5个值(如果有)
if dim_size > 10
dim_values_str = [sprintf('%.3f, ', dim_values(1:5)), '..., ', sprintf('%.3f', dim_values(end-4:end))];
else
dim_values_str = sprintf('%.3f, ', dim_values);
dim_values_str = dim_values_str(1:end-2); % 移除最后一个逗号和空格
end
catch
dim_values_str = '无法获取坐标值';
end
% 显示维度信息
if ~isempty(dim_units)
fprintf(' %-15s: 大小=%d, 单位=%s, 坐标值=[%s]\n', dim_name, dim_units, dim_values_str);
else
fprintf(' %-15s: 大小=%d, 坐标值=[%s]\n', dim_name, dim_values_str);
end
end
% 构建输出文件名
mat_file = fullfile(output_dir, [var_name, '.mat']);
% 保存为MAT文件
save(mat_file, 'var_data', '-v7.3'); % 使用-v7.3支持大文件
% 显示进度
fprintf('[%d/%d] 已保存变量: %s -> %s\n', i, length(var_names), var_name, mat_file);
catch e
warning('处理变量 %s 失败: %s', var_name, e.message);
end
end
%% 保存全局属性信息
try
global_att_file = fullfile(output_dir, 'global_attributes.mat');
global_att = struct();
for i = 1:length(nc_info.Attributes)
att_name = nc_info.Attributes(i).Name;
att_value = nc_info.Attributes(i).Value;
global_att.(att_name) = att_value;
end
save(global_att_file, 'global_att');
fprintf('已保存全局属性信息: %s\n', global_att_file);
catch e
warning('保存全局属性失败: %s', e.message);
end
%% 显示保存结果摘要
mat_files = dir(fullfile(output_dir, '*.mat'));
fprintf('\n共保存 %d 个MAT文件到目录: %s\n', length(mat_files), output_dir);
从上述代码可以查看nc的全局信息,然后获取自己所需要的代码;
目前的AI写代码很普遍,也可以将数据打印出来的信息输入给AI辅助写代码,效果也是可以的!!!
属性的保存也可以不需要,直接获取变量的属性就可。
结果可视化:
简单的读取示例,非30波段的代码,仅是一年数据量的读取;30波段的代码可以根据参数信息,选择对应的波段;
% 设置路径
% 设置路径
clear; clc
ncfile = 'G:\MAC-AOD\z001test\data\gt_t_00550nm.nc';
outdir = 'G:\MAC-AOD\z001test\data\tif_files_clip3';
if ~exist(outdir, 'dir')
mkdir(outdir);
end
% 读取经纬度并转换为 double 类型
lon = double(ncread(ncfile, 'lon'));
lat = double(ncread(ncfile, 'lat'));
% 判断纬度是否升序,反转处理
if lat(1) < lat(end)
lat = flip(lat);
flip_lat = true;
else
flip_lat = false;
end
% 裁剪区域范围
% lat_range = [18, 45];
% lon_range = [100, 125];
lat_range = [18, 45];
lon_range = [100, 125];
% 创建严格 1x1 度整数经纬度网格(无小数误差)
lon_target = 100:1:125;
lat_target = 45:-1:18; % 从北到南
[lon_grid, lat_grid] = meshgrid(lon_target, lat_target);
% 明确指定 RasterSize(确保 1x1 度分辨率)
nLon = numel(lon_target);
nLat = numel(lat_target);
R = georasterref('RasterSize', [nLat, nLon], ...
'LatitudeLimits', [min(lat_target), max(lat_target)], ...
'LongitudeLimits', [min(lon_target), max(lon_target)], ...
'RasterInterpretation', 'cells', ...
'ColumnsStartFrom', 'north'); % ? 删除无效参数 RowsStartFrom
% 变量列表
vars = {'aod_ann', 'aod', 'ssa_ann', 'ssa', 'asy_ann', 'asy'};
for i = 1:length(vars)
varname = vars{i};
fprintf('正在处理变量: %s\n', varname);
data = ncread(ncfile, varname);
% 获取原始网格并构建原始坐标网格
[lon_orig, lat_orig] = meshgrid(lon, lat);
if flip_lat
lat_orig = flip(lat_orig, 1);
end
if ndims(data) == 2
% 2D插值
if flip_lat
data = flip(data, 2);
end
data_interp = interp2(lon_orig, lat_orig, data', lon_grid, lat_grid, 'linear');
filename = fullfile(outdir, [varname, '_clip_1deg.tif']);
fprintf(' -> 写入: %s\n', filename);
geotiffwrite(filename, data_interp, R, 'CoordRefSysCode', 'EPSG:4326');
elseif ndims(data) == 3
% 3D插值并逐月保存
for t = 1:size(data, 3)
slice = data(:, :, t);
if flip_lat
slice = flip(slice, 2);
end
slice_interp = interp2(lon_orig, lat_orig, slice', lon_grid, lat_grid, 'linear');
filename = fullfile(outdir, sprintf('%s_month%02d_clip_1deg.tif', varname, t));
fprintf(' -> 写入: %s\n', filename);
geotiffwrite(filename, slice_interp, R, 'CoordRefSysCode', 'EPSG:4326');
end
end
end
fprintf('\n全部变量已重采样为精确 1x1 度并保存为 GeoTIFF:%s\n', outdir);
结果可是化:进行了裁剪后的结果
到此!!!
后续会继续处理,重采样到自己需要的分辨率等,不一定会再次给出教程,只是在初识该类型数据时,简单记录一下!!!
再会!!!