超简单制作栅格数据土地利用转移矩阵(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/117791706
def 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 = 2000End_year = 2015Pred_year = 2020Ptrans, 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)
喜欢的同学一键三连呦!
超简单制作栅格数据土地利用转移矩阵(Arcgis和Python实现)相关推荐
- 超简单制作多系统启动U盘教程
超简单制作多系统启动U盘教程 文章目录 超简单制作多系统启动U盘教程 前言 基本配置 配置PE系统 配置其他操作系统 前言 这两天心血来潮,本来想用Win to go做一个windows便携系统, ...
- 超简单制作Win7安装U盘
超简单的话题,给新手看的,老鸟路过,想装windows7的方法可谓是多种多样,你觉得哪种方法方便就用哪种,我觉得还是用U盘来安装最Cool,携带方便而且速度快,微软自己也发布了一款傻瓜型的工具 win ...
- 用U盘或移动硬盘安装Windows7 (超简单制作Win7安装U盘方法)
转载链接:http://www.iplaysoft.com/win7-usb-dvd-download-tool.html 最近很多人想要安装 Windows7 ,下载回去后的ISO镜像文件很多人都是 ...
- html简单盒子代码,CSS3 3D盒子超简单制作
这是我第一次在这里写文章,如果写得不好的话,请大家多多包涵一下. 在XX网学完CSS3之后,然后我懂了一个道理,XX网评论区域存在一个小明梗,这个梗是这样的:1+1=2, 2+2=4,问小明今年多少岁 ...
- WinSetupFromUSB - 超简单制作多合一系统安装启动U盘的工具 (支持Win/PE/Linux启动盘)
很多同学都喜欢将电脑凌乱不堪的系统彻底重装以获得一个"全新的开始",但你会发现如今很多电脑都已经没有光驱了,因此制作一个U盘版的系统安装启动盘备用是非常必要的. 我们之前推荐过 I ...
- WinSetupFromUSB - 超简单制作多合一系统安装启动U盘的工具 (支持Win/PE/Linux启动盘)...
很多同学都喜欢将电脑凌乱不堪的系统彻底重装以获得一个"全新的开始",但你会发现如今很多电脑都已经没有光驱了,因此制作一个U盘版的系统安装启动盘备用是非常必要的. 我们之前推荐过 I ...
- 超简单制作Win7安装U盘方法
很多人想要安装 Windows7 ,下载回去后的ISO镜像文件很多人都是使用 Nero等工具刻录成光盘来安装的.但实际上,不需刻盘安装Win7的方法还是有不少的.例如使用 Daemon Tools 等 ...
- WinSetupFromUSB - 超简单制作多合一系统安装启动U盘的工具
官网 http://www.winsetupfromusb.com WinSetupFromUSB是一款制作从usb磁盘(u盘和移动硬盘)启动安装操作系统的强大工具,支持各种windows.pe.li ...
- Unity3D_(游戏)跳一跳超简单制作过程
跳一跳 工程文件界面 游戏界面 脚本 using DG.Tweening; using System.Collections; using System.Collections.Generic; us ...
- arcgis做土地利用转移矩阵(直接用栅格数据)
提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 本次实验主要使用arcgis的combine工具 如果你已经做好了两张土地利用类型的数据,不需要将栅格转为矢量数据→使用相交 ...
最新文章
- 聊一聊多源最短路径问题(只有5行代码哦)
- ruby中DBI连接MySQL数据库步骤详解
- IT绩效管理消除IT与业务之间的隔阂
- freemarker 学习笔记
- html表单和输入方法,HTML 表单和输入
- Chem 3D模型的参数值更改方法
- CMU计算机学院院长Andrew Moore离职,下一任院长人选未定
- for 循环 与forEach 里面return 的区别
- 盐城计算机考试时间安排,2019盐城中考具体时间安排 什么时候考试
- 【图像计数】基于matlab灰度二值化同类物体简单计数【含Matlab源码 759期】
- Linux一些有用的操作
- canvas实现简单的画图功能
- WatchGuard Firebox X50硬件防火墙
- Windows版GIT的用法
- Codeforces711C 【DP】
- bcd转ascii码 流程图_bcd码转ascii码代码
- 2021-04-21
- 网赚APP的“俄罗斯套娃”游戏
- 啊哈c语言第四章第六节练习1
- 联想V480关闭UEFI安装Win7