栅格时间序列数据theil_sen斜率估计(matlab)

matlab进行theil_sen斜率估计,

将时间序列数据的变化速率赋值到栅格上,最终结果得到一幅变化速率栅格数据

matlab的矩阵运算速度比python快!
注意代码中有一个判断语句,用来确定有效像元,代码中只将大于0的像元参与计算,若需要计算所有像元则删掉下面代码块,或者将阈值改成一个最小值。
if min(data) > 0 %
end

clear
[a, R] = geotiffread('F:\UHI\四种类型城市_5.23\LST_4\shizong3\2001.tif'); % 读取初始年份的遥感图像数据
[m, n] = size(a); 
cd = 2021 - 2001 + 1;  % 计算数据的年份数量
datasum = zeros(m * n, cd) + 0; % 创建用于存储数据的矩阵,并初始化为全零
p = 1; % 初始化计数器
for year = 2001:2021 % 遍历每一年数据
    % 构建当前年份的文件路径
    filename = ['F:\UHI\四种类型城市_5.23\LST_4\shizong3\', int2str(year), '.tif'];
    data = importdata(filename);
    data = reshape(data, m * n, 1); % 将数据从二维矩阵形式转换为一维列向量
    datasum(:, p) = data;
    p = p + 1;
end
result = zeros(m, n); % 创建用于存储结果的矩阵,并初始化为全零
for i = 1:size(datasum, 1) % 遍历每个像素点
    data = datasum(i, :); % 获取当前像素点在不同年份的数据
    if min(data) > 0 % 有效格点判定,我这里有效值在0以上,如果需要将全部像素参与计算则删除该判断代码块,或者改成一个比较小的数值
        valuesum = [];
        % 计算不同年份之间的斜率
        for k1 = 2:cd
            for k2 = 1:(k1 - 1)
                cz = data(k1) - data(k2);
                jl = k1 - k2;
                value = cz / jl;  % 计算斜率
                valuesum = [valuesum; value];
            end
        end 
        value = median(valuesum);% 计算斜率的中位数
        result(i) = value;   % 将斜率赋值给结果矩阵中的对应位置
    end
end
result_matrix = reshape(result, m, n);% 将计算得到的结果矩阵转换为原始图像的二维矩阵形式

% 设置输出结果的文件路径
output_filename = 'F:\UHI\四种类型城市_5.23\LST_4\result\tif\tif_8.9\shizong.tif';

% 将斜率栅格存为 GeoTIFF 格式的文件
geotiffwrite(output_filename, result_matrix, R);

结果

在这里插入图片描述

代码改自:

https://blog.csdn.net/weixin_45024495/article/details/121043230

感谢大家花时间来阅读本文 作者水平有限 有失误之处请大家斧正!

clc; clear; close all;data_folder = 'Z:\2014-2024W\';years = 2014:2024; num_years = length(years);% 数据路径设置[refData, R] = geotiffread(fullfile(data_folder, '2014.tif'));info = geotiffinfo(fullfile(data_folder, '2014.tif'));[m, n] = size(refData);% 读取投影信息 % 预分配存储空间 datasum = nan(m * n, num_years); % 批量读取 TIFF 文件 for p = 1:num_years filename = fullfile(data_folder, sprintf('2014.tif', years(p))); if exist(filename, 'file') data = importdata(filename); data = reshape(data, m * n, 1); datasum(:, p) = data; else error('文件未找到: %s', filename); end end sen_slope = nan(m, n); mk_result = nan(m, n); trend_class = nan(m, n); for i = 1:size(datasum, 1) data = datasum(i, :); if all(isnan(data)) || min(data) <= -1 continue; end % 计算 Theil-Sen 斜率 beta = theil_sen_slope(data, years); sen_slope(i) = beta; % 计算 Mann-Kendall 检验 [h, p, Z] = Mann_Kendall(data); mk_result(i) = Z; % 根据 β 和 Z 值划分趋势等级 trend_class(i) = classify_trend(beta, Z); end % 重新调整为矩阵格式 sen_slope = reshape(sen_slope, m, n); mk_result = reshape(mk_result, m, n); trend_class = reshape(trend_class, m, n); % 导出结果为 GeoTIFF geotiffwrite(fullfile(data_folder, 'Sen_slope.tif'), sen_slope, R, 'GeoKeyDirectoryTag', info.GeoTIFFTags.GeoKeyDirectoryTag); geotiffwrite(fullfile(data_folder, 'MK_result.tif'), mk_result, R, 'GeoKeyDirectoryTag', info.GeoTIFFTags.GeoKeyDirectoryTag); geotiffwrite(fullfile(data_folder, 'Trend_classification.tif'), trend_class, R, 'GeoKeyDirectoryTag', info.GeoTIFFTags.GeoKeyDirectoryTag); function slope = theil_sen_slope(series, years) valid_idx = ~isnan(series); series = series(valid_idx); years = years(valid_idx); if length(series) < 2 slope = NaN; return; end num = length(series); slopes = []; for i = 1:num-1 for j = i+1:num slopes(end+1) = (series(j) - series(i)) / (years(j) -
04-01
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值