图片摘要
前段时间,我写了一个专栏《联合matlab和Arcgis进行netcdf格式的雪覆盖数据的重新投影栅格》,介绍了如何利用Arcgis实现极地投影的转换。今天,我提供一个matlab重采样的方法实现投影转换。
我们这次使用的数据是北冰洋逐日的海平面高度数据。但是我们发现其是极地投影,非常不利用后续的计算分析。我也在arcgis中尝试过,但是数据存在的区域远远大于实际合理的经纬度范围。如下图。真实际的范围应该是与中间的圆形边界相切。
于是,在matlab中,我们可以首先读取数据,然后得到内部相切的圆形区域。
file = ('dt_arctic_multimission_v1.1_sea_level_20160701_20190429.nc');
ncdisp(file)
lon = ncread(file,'longitude');
lat = ncread(file,'latitude');
sla1 = ncread(file,'sla');
time = ncread(file,'time');
P.lon = lon;P.lat = lat;
P.rg = sla1(:,:,1);
imagesc(P.rg)
%% time convert
dt = datetime((time)*24*3600, 'ConvertFrom', 'epochtime', 'Epoch', '1950-01-01');
[y,m,d] = ymd(dt);
xv = -179.8358:0.25:179.8358;
yv = 50.0012:0.25:89.8417;
[xv1,yv1] = meshgrid(xv,yv);
lon1 = lon(186:535,186:535);
lat1 = lat(186:535,186:535);
lat1(lat1>1000)=0;
lon1(lon1>1000)=0;
xx = reshape(lon1,350*350,1);
yy = reshape(lat1,350*350,1);
接下来是采用内插的方法,得到规则化格网对应的数据。
N = sla1(:,:,1);
N(N>1000)=0;
%% 得到与圆形边界相切的区域
N1 = N(186:535,186:535);
zz = reshape(N1,350*350,1);
out = [xx,yy,zz];
ind = find(out(:,1)==0);
%% 将没有意义的经纬度格网赋值为0
out(ind,:)=[];
out = double(out);
%% 内插处理
fxy = scatteredInterpolant(out(:,1),out(:,2),out(:,3),'natural');
sla(:,:,i) = fxy(xv1,yv1);
将上述极地投影数据转换得到的重采样的结果
欢迎交流学习!