Matlab-处理OMI臭氧廓线数据

文章讲述了在处理OMI卫星的近地层臭氧廓线数据时遇到的困难,包括数据的非典型结构、时间分辨率和空间分布。作者通过插值转换将点数据转化为网格数据,并计算月均值,但最终发现与近地表臭氧数据的时间序列不一致,影响后续分析。
摘要由CSDN通过智能技术生成

前段时间想用近地面的臭氧数据,站点观测数据年限太短,已有的卫星产品中大多是总柱浓度,找到了OMI的廓线数据,用的是近地层(一共18层,选择第1层,认为是近地层)

GES DISC 

 想记录的原因是该数据在处理时对我来讲费大劲了,首先1. 不像一般的nc数据在读取的时候直接通过ncdisp检查变量后输入变量名称即可,该nc数据是树状结构,在师兄的帮忙下用panoply看了一下数据结构

ncdisp下是这样

 

真正读取的时候按照它的结构这样即可读出,就是ncdisp中groups下的结构:

 2.这个数据在时间维度上是23,每天每53分钟一次记录,每次记录的是不同的经纬度下的臭氧数据(感觉有点类似于点数据),每幅文件里行数也不一致,和平常处理的格点数据不一样;采用插值(一天内所有记录)将该数据插为网格数据,再求月均值;

%%%
m=['01';'02';'03';'04';'05';'06';'07';'08';'09';'10';'11';'12'];
[xi,yi]=meshgrid(31:0.1:43,110:0.1:123);

for y=2005:2012

    for j=1:12
        filelist=dir(strcat('OMI-Aura_L2-OMO3PR_',num2str(y),'m',m(j,:),'*.nc4'));
        k=length(filelist);
        ozomm=zeros(131,121);
        index=zeros(131,121);
        for i=1:k
            filename=[filelist(i).name];
            ozo=ncread(filename,'/HDFEOS/SWATHS/O3Profile/Data Fields/O3');
            lat=ncread(filename,'/HDFEOS/SWATHS/O3Profile/Geolocation Fields/Latitude');
            lon=ncread(filename,'/HDFEOS/SWATHS/O3Profile/Geolocation Fields/Longitude');
            s=size(ozo);
            %%%S可能为空,if语句判断
            if length(s)<3
                index=index+zeros(131,121);
                ozomm=ozomm+zeros(131,121);
            else
                ozom=zeros(s(2),s(3));
                for ii=1:size(ozom,1)
                    for jj=1:size(ozom,2)
                        ozom(ii,jj)=ozo(:,ii,jj);
                    end
                end
                %%%插值处理
                ind=find(~isnan(ozom));
                [iii jjj]=ind2sub(size(ozom),ind);
                v=ozom(ind);
                latt=lat(ind);
                lonn=lon(ind);
                ozo2=griddata(latt,lonn,v,xi,yi);
                ozo2(find(isnan(ozo2)==1)) = 0;
                ozo2(find(ozo2<0)) = 0;
                %%%判断空集
                if isempty(ozo2)
                    index=index+zeros(131,121);
                    ozomm=ozomm+zeros(131,121);
                else
                    indd=ozo2~=0;
                    index=index+indd;
                    ozomm=ozomm+ozo2;
                end
            end
            
        end
        % 由于一些天数里部分像元缺失影像,应该除以有值的次数
        ozomm=ozomm./index;
        ozomm(find(isnan(ozomm)==1)) = 0;
        % 创建nc文件并导入经纬度信息
        InPath=strcat('OMI-Aura_L2-OMO3PR_',num2str(y),m(j,:),'.nc');
        nccreate(InPath,'lon','Dimensions',{'x',131});
        nccreate(InPath,'lat','Dimensions',{'y',121});
         % 读取经纬度信息
        lon2=yi(:,1);
        lat2=xi(1,:);
        ncwrite(InPath,'lon',lon2);
        ncwrite(InPath,'lat',lat2);
        % 创建变量并导入计算好的数据
        nccreate(InPath,'ozo',...
                 'Dimensions', {'x',131,'y',121},...
                 'FillValue','disable'); 
        ncwrite(InPath,'ozo',ozomm);
        %%%输出tif
        out='D:\ncc_datas\ideas\ERL\revise_data\o3\omi_o3\2004_2012\tif\';
        OutPath=strcat(out,'OMI-Aura_L3-OMSO2e_',num2str(y),m(j,:),'.tif');
        ozo3=ncread(InPath,'ozo');
        ozommm=rot90(ozo3,1);
        GeoRef = georasterref('Rastersize',size(ozommm),'Lonlim',[double(min(lon2)),double(max(lon2))],'Latlim',[double(min(lat2)),double(max(lat2))]);
        ozo_Tif =OutPath;
        geotiffwrite(ozo_Tif,flip(ozommm),GeoRef);
        
        %%%打印提示
        fprintf(strcat(num2str(y),m(j,:)))

    end


end

 处理完后和近地表臭氧数据集验证时,发现二者时间序列上不一致(坐标轴名称没有更换,实际为臭氧),在后续数值分析时结果不好;

但是还是记录一下这个费劲的过程~~~

 

  • 0
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 13
    评论
MATLAB可以使用插值方法将格点数据插值到站点上。插值是通过已知数据点来预测新位置上未知数据点的一种方法。在MATLAB中,有多种插值方法可供选择,如线性插值、三次样条插值、最近邻插值等。 以线性插值为例,假设我们有一组格点数据,包含经度、纬度和对应的数值。我们想要将这些数据插值到站点上,即给定目标站点的经度和纬度,预测该站点上的数值。 首先,我们需要将格点数据生成为格点网格。可以使用MATLAB中的meshgrid函数生成经度格点矩阵和纬度格点矩阵。 然后,我们可以使用MATLAB中的interp2函数进行插值。interp2函数可以接受格点数据的经度、纬度和数值作为输入,并给定目标站点的经度和纬度,预测该站点上的数值。 下面是一个简单的示例代码: ```matlab % 假设已知的格点数据 lon = [100, 101, 102, 103]; lat = [20, 21, 22, 23]; value = [1, 2, 3, 4]; % 生成格点网格 [lon_grid, lat_grid] = meshgrid(lon, lat); % 目标站点的经度和纬度 target_lon = 101.5; target_lat = 21.5; % 线性插值 interp_value = interp2(lon_grid, lat_grid, value, target_lon, target_lat); disp(interp_value); ``` 运行以上代码,将输出目标站点上的插值结果。 通过使用不同的插值方法和调整参数,我们可以根据具体数据和需求来选择最合适的插值方法,将格点数据插值到站点上,以获得更准确的结果。
评论 13
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值