美文网首页
基于Matlab的栅格水平的转折点提取

基于Matlab的栅格水平的转折点提取

作者: 画长空_yin | 来源:发表于2021-01-21 20:59 被阅读0次

在进行栅格数据长时间序列分析的时候,常常涉及到转折点部分,前后的趋势发生了很大的变化,如何进行提取呢?本文采用分段线性回归模型来进行提取。基本思路是对前后两个序列进行拟合,以残差平方和最小的点作为潜在的转折点,同时评估转折点前后的趋势是否通过显著性检验,如果两边都通过检验,则该潜在转折点为实际转折点,否则不是实际转折点。具体代码如下:

@author yinlichang3064@163.com
[a,R]=geotiffread('F:\校级课题项目\data\屏障带\2002降水.tif');%先导入投影信息
info=geotiffinfo('F:\校级课题项目\data\屏障带\2002降水.tif');
[m,n]=size(a);
begin_year=2000;
end_year=2018;
cd=end_year-begin_year+1;
presum=zeros(m*n,cd);
kk=1;
for year=begin_year:end_year
    filename=strcat('F:\校级课题项目\data\屏障带\',int2str(year),'降水.tif');
    data=importdata(filename);
    data=reshape(data,m*n,1);
    presum(:,kk)=data;
    kk=kk+1;
end
xlcd=5;% 假设最短的趋势年份为5年
BPsum=zeros(m,n);
slope1=zeros(m,n);
slope2=zeros(m,n);
for i=1:m*n
    pre=presum(i,:);
    if min(pre)>0
        res_sum=[];
        p=[];
        slopesum=[];
        for k=xlcd:cd-xlcd
            pre1=pre(1:k)';
            pre2=pre(k:cd)';
            % 
            x1=[ones(size(pre1,1),1),[1:k]'];
            [b1,~,r1,~,stats1] = regress(pre1,x1);
            
            x2=[ones(size(pre2,1),1),[k:cd]'];
            [b2,~,r2,~,stats2] = regress(pre2,x2);
            res=sumsqr(r1)+sumsqr(r2);
            res_sum=[res_sum;res];
            pz=[stats1(3),stats2(3)];
            p=[p;pz];
            slopesum=[slopesum;[b1(2),b2(2)]];
        end
       BP=find(res_sum==min(res_sum));% 找到拟合残差平方和最小的点
       % 进一步检验前后是否通过了显著性检验
       pz=p(BP,:);
       slope=slopesum(BP,:);
       if pz(1)<0.1 && pz(2)<0.1 %以前后显著性p0.1来判断
           BPsum(i)=BP+begin_year+xlcd-2;
           slope1(i)=slope(1);
           slope2(i)=slope(2);
       end
    end
end
result_mulu='D:\';
filename1=[result_mulu,'转折点年份.tif'];
geotiffwrite(filename1,BPsum,R,'GeoKeyDirectoryTag',info.GeoTIFFTags.GeoKeyDirectoryTag);

filename2=[result_mulu,'第一阶段的趋势值.tif'];
geotiffwrite(filename2,slope1,R,'GeoKeyDirectoryTag',info.GeoTIFFTags.GeoKeyDirectoryTag);

filename3=[result_mulu,'第二阶段的趋势值.tif'];
geotiffwrite(filename3,slope2,R,'GeoKeyDirectoryTag',info.GeoTIFFTags.GeoKeyDirectoryTag);

在matlab中运行上述代码即可得到最终的结果,更多需求,请查看个人介绍,后期有许多内容分享在公众号,欢迎大家捧场关注一波

相关文章

网友评论

      本文标题:基于Matlab的栅格水平的转折点提取

      本文链接:https://www.haomeiwen.com/subject/zfzdzktx.html