超简单制作栅格数据土地利用转移矩阵(Arcgis和Python实现)

由于大面积矢量数据难以快速进行数学计算,使用栅格数据一样能达到同样的结果。
数据:GLobeland 30
预处理:数据预处理在Arcgis和Python2.7平台上完成,包括批量投影转换、批量处理无效值、批量图幅拼接和掩膜提取。为便于精确计算面积,投影转换选用Albers等积投影,WGS-1984地理坐标系。
数据要求:是适用于面积计算的等积投影坐标系
数据属性如下图(可以不加type,光有代码一样):
在这里插入图片描述

步骤1:打开Spatial Analyst工具-局部分析-合并在这里插入图片描述
选中要处理的不同年份的栅格(注意:30m分辨率的大面积数据跑起来还是较慢,要耐心等待)
在这里插入图片描述
结果如下图:
转换结果在属性表可查
在这里插入图片描述
2.导出属性表
在这里插入图片描述
点击导出,导出txt文件

在这里插入图片描述
3.表内分析
首先将txt文件转到表中
在这里插入图片描述注意点逗号
在这里插入图片描述
做运算单位为平方千米:栅格分辨率×栅格分辨率/1000000。下拉改变格式
在这里插入图片描述
选中三列,插入数据透视表
在这里插入图片描述
右下方选项行是起始年份,列是目标年份,值为面积。
在这里插入图片描述
结果如下图所示(将类型代码替换为类型即可)
在这里插入图片描述
4.结果分析
黄色部分:2000-2020年(类型50:湿地)土地利用类型无变化的面积38932.38。
大红部分:2000-2020年有75556.26面积的(类型30:草地)转化为湿地。
玫红色部分(最下面一行):2020年各土地利用类型面积。
紫色部分:2000年各土地利用类型面积。

python实现

# -*- coding: utf-8 -*-
import os
import sys
import numpy as np
from sklearn.metrics import confusion_matrix
from osgeo import gdal
# reference: https://blog.csdn.net/sinat_35763722/article/details/117791706def read_tif(path):
    g = gdal.Open(path)
    b = g.GetRasterBand(1)
    data = b.ReadAsArray(0, 0)
    return data
​
# 转移矩阵计算函数
def transition_matrix(Start_LUCC_image, End_LUCC_image):
    # 读取影像矩阵
    Start_LUCC_image = read_tif(Start_LUCC_image)
    End_LUCC_image = read_tif(End_LUCC_image)
    # 重排列数组。flatten是numpy.ndarray.flatten的一个函数,即返回一个一维数组。
    lucc_start_array = np.asarray(Start_LUCC_image).flatten()
    lucc_end_array = np.asarray(End_LUCC_image).flatten()
    # 构建混淆矩阵
    transition_area = confusion_matrix(lucc_start_array, lucc_end_array)
    # 提取有效区域(去除空值),得到土地利用面积转移矩阵
    trans_matr = transition_area[:len(transition_area) - 1, :len(transition_area) - 1]
    print("transition_matrix:", "\n", trans_matr)
    return trans_matr
​
# 马尔科夫预测
def markov(trans_matr, Start_year, End_year, Pred_year):
    sum_Start_year = trans_matr.sum(axis=1)  # 按行求各地类和
    sum_End_year = trans_matr.sum(axis=0)  # 按列求各地类和
    whole_area = trans_matr.sum()  # 计算总栅格数
    P_End_year = sum_End_year / trans_matr.sum()  # 计算初始状态矩阵
    # 计算一阶转移概率矩阵
    Ptrans0 = np.empty(trans_matr.shape)
    for i in range(len(sum_Start_year)):
        Ptrans0[i] = trans_matr[i] / sum_Start_year[i]
    # 计算转移概率矩阵
    n = int((Pred_year - End_year) / (End_year - Start_year))
    print(n)
    E = np.identity(len(sum_Start_year))
    for i in range(n):
        E = np.dot(E, Ptrans0)
    Ptrans = E
    # 计算预测年份状态矩阵
    P_Pred_year = np.dot(P_End_year, Ptrans)
    # 计算预测年份各地类面积
    Pred_year_area = np.array(np.around(P_Pred_year * whole_area), dtype=int)
    np.set_printoptions(formatter={'float': '{: 0.6f}'.format})
    print("转移概率矩阵:", "\n", np.around(Ptrans, decimals=6))
    print("预测年份状态矩阵:", "\n", np.around(P_Pred_year, decimals=6))
    print("预测年份各地类面积:", Pred_year, "年\n", Pred_year_area)
    return Ptrans, P_Pred_year, Pred_year_area
​
# 保存计算结果
def Save(Pred_year, Ptrans, P_Pred_year, Pred_year_area):
    outpath = r"G:\21_能量与三北防护林\2-data\statistic\model_out_semi-humid" + str(Pred_year) + ".txt"
    with open(outpath, 'w') as f:  # 写入numpy.ndarray数据
        f.write('%d' % Pred_year)
        f.write(":\n")
        f.write("转移概率矩阵:\n")
        np.savetxt(f, np.round(Ptrans, 6), delimiter="\t", fmt="%.6f")
        f.write("预测年份状态矩阵:\n")
        np.savetxt(f, np.round(P_Pred_year, 6), delimiter="\t", fmt="%.6f")
        f.write("预测年份各地类面积:\n")
        np.savetxt(f, Pred_year_area, delimiter="\t", fmt="%s")
    f.close()  # 关闭
​
​
if __name__ == '__main__':
​
    lucc_st_img = r'G:\21_能量与三北防护林\2-data\land_use_CIC\TNSP_region\semi-humid\1992.tif' # 开始年份
    lucc_ed_img = r'G:\21_能量与三北防护林\2-data\land_use_CIC\TNSP_region\semi-humid\2015.tif' # 结束年份
    trans_matr = transition_matrix(lucc_st_img, lucc_ed_img)
    print(trans_matr)
    Start_year = 2000
    End_year = 2015
    Pred_year = 2020
    Ptrans, P_Pred_year, Pred_year_area = markov(trans_matr, Start_year, End_year, Pred_year)
    Save(Pred_year, Ptrans, P_Pred_year, Pred_year_area)

喜欢的同学一键三连呦!
在这里插入图片描述

土地利用转移矩阵是一个描述地表覆盖变化的矩阵,它可以用来预测未来的土地利用变化趋势。在Python中,可以使用numpy库来处理矩阵运算。 首先,我们需要初始化一个土地利用转移矩阵。假设我们有4种土地利用类型(A、B、C、D),那么一个简单转移矩阵可以这样定义: ``` import numpy as np # 定义土地利用类型 land_use_types = ['A', 'B', 'C', 'D'] # 定义转移矩阵,每一行表示从一个土地利用类型转移到其他土地利用类型的概率 trans_matrix = np.array([ [0.4, 0.3, 0.2, 0.1], [0.2, 0.4, 0.3, 0.1], [0.1, 0.2, 0.4, 0.3], [0.1, 0.1, 0.2, 0.6] ]) ``` 上面的矩阵定义了四个土地利用类型之间的转移概率。例如,第一行表示从类型A转移到其他类型的概率分别为0.4、0.3、0.20.1。 接下来,我们可以使用矩阵乘法来计算未来的土地利用变化。假设当前的土地利用类型分布为[0.3, 0.2, 0.4, 0.1],那么下一时刻的土地利用类型分布可以这样计算: ``` # 定义当前的土地利用类型分布 current_land_use = np.array([0.3, 0.2, 0.4, 0.1]) # 计算下一时刻的土地利用类型分布 next_land_use = np.dot(current_land_use, trans_matrix) print(next_land_use) ``` 输出结果为: ``` [0.24 0.26 0.29 0.21] ``` 这表示在下一时刻,土地利用类型A、B、C、D的分布分别为0.24、0.26、0.290.21。我们可以继续使用这种方法计算未来的土地利用变化。
评论 8
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值