当前位置: 首页 > news >正文

GEE土地利用转移矩阵实战:5分钟搞定CGLS-LC100数据集分析(附完整代码)

GEE土地利用转移矩阵实战:5分钟搞定CGLS-LC100数据集分析(附完整代码)

当我们需要分析某地区10年间森林如何变成农田,或者城市扩张占用了多少湿地时,土地利用转移矩阵就像一台时间机器,能清晰呈现地表变化的来龙去脉。传统GIS软件处理这类分析往往需要下载海量数据,而Google Earth Engine(GEE)的云端计算能力让这一切变得触手可及。本文将手把手带您用CGLS-LC100数据集,在5分钟内完成从数据准备到矩阵生成的全流程。

1. 认识CGLS-LC100数据集

CGLS-LC100是欧盟哥白尼计划推出的100米分辨率全球土地覆盖产品,其核心优势在于:

  • 时间覆盖:2015-2019年逐年数据(Proba-V卫星)和2020年起年度数据(Sentinel-3)

  • 分类体系

    代码类型代码类型
    20灌木丛50稀疏植被
    30草地60裸露地面
    40耕地80水域
  • 数据质量:总体精度超过80%,尤其擅长区分农田与自然植被

提示:在GEE中调用该数据集时,discrete_classification波段存储了上述分类代码,而continuous_classification波段则提供概率信息,适合高级用户使用。

2. 快速搭建分析环境

2.1 初始化GEE工作区

首先在GEE代码编辑器(https://code.earthengine.google.com/)新建脚本,粘贴以下基础配置:

// 定义分析区域(以昆明为例) var roi = ee.Geometry.Rectangle([102.3, 24.8, 103.1, 25.3]); Map.centerObject(roi, 9); // 加载2018和2020年土地覆盖数据 var lc2018 = ee.Image("COPERNICUS/Landcover/100m/Proba-V-C3/Global/2018") .select('discrete_classification') .clip(roi); var lc2020 = ee.Image("COPERNICUS/Landcover/100m/Proba-V-C3/Global/2020") .select('discrete_classification') .clip(roi); // 可视化参数 var visParams = { min: 20, max: 80, palette: ['#ffff64', '#aaf0f0', '#dcf064', '#c8c864'] }; Map.addLayer(lc2018, visParams, '2018土地覆盖');

2.2 数据预处理技巧

处理跨年度数据时常见两个陷阱:

  1. 年度间分类代码不一致:有些年份会新增细分类型
  2. 云遮挡导致的缺失值:需要填充或掩膜处理

用这段代码确保数据一致性:

// 统一分类体系(示例保留共同类别) var commonClasses = [20, 30, 40, 50, 60, 80]; var filterClasses = function(image) { return image.remap(commonClasses, commonClasses) .set('system:time_start', image.get('system:time_start')); };

3. 转移矩阵核心算法解析

3.1 数学原理可视化

转移矩阵本质是一个二维 contingency table,其构建过程可分为三步:

  1. 编码组合:将两期数据合并为唯一编码(前期代码×1000 + 后期代码)
  2. 面积统计:计算每种编码组合的像元面积总和
  3. 矩阵重组:将统计结果按行列格式排列

3.2 关键代码实现

以下是最核心的面积统计模块:

// 生成转移编码图像 var transferCode = lc2018.multiply(1000).add(lc2020); // 计算各编码组合面积(平方公里) var areaStats = ee.Image.pixelArea() .addBands(transferCode) .reduceRegion({ reducer: ee.Reducer.sum().group({ groupField: 1, groupName: 'transfer_code' }), geometry: roi, scale: 100, maxPixels: 1e13 }); // 解析编码为前后期类型 var parseFeatures = function(group) { var code = ee.Number(group.get('transfer_code')); return ee.Feature(null, { 'from': code.divide(1000).int(), 'to': code.mod(1000).int(), 'area_km2': group.get('sum').divide(1e6) }); };

4. 完整工作流与结果导出

4.1 自动化矩阵生成

将上述模块封装成函数,实现一键生成:

function generateMatrix(firstImg, secondImg, scale) { // 获取所有存在的类别 var classes = firstImg.addBands(secondImg) .reduceRegion({ reducer: ee.Reducer.frequencyHistogram(), geometry: roi, scale: scale }) .get('discrete_classification'); // ...(接完整统计代码) // 构建矩阵表格 var headers = ee.List(['from']).cat(classes); var rows = classes.map(function(from) { return ee.List([from]).cat( classes.map(function(to) { return transferDict.get(from.cat('_').cat(to)) || 0; }) ); }); return ee.FeatureCollection(rows.map(function(row) { return ee.Feature(null, ee.Dictionary.fromLists(headers, row)); })); }

4.2 结果导出与美化

导出CSV后,推荐用Python进行可视化:

import seaborn as sns import pandas as pd df = pd.read_csv('transfer_matrix.csv') plt.figure(figsize=(10,8)) sns.heatmap(df.iloc[:,1:], annot=True, fmt=".1f", xticklabels=class_names, yticklabels=class_names) plt.title('Land Use Transition Matrix (km²)')

处理实际项目时,我发现三个实用技巧:

  1. 当研究区较大时,将scale参数调整为500米可显著加快计算
  2. 使用clipToCollection而非clip可以避免几何无效错误
  3. 导出前用.limit(1000)防止超过GEE的导出限制
http://www.jsqmd.com/news/487608/

相关文章:

  • 基于STM32CubeIDE与lwIP的嵌入式网络实战:TCP/UDP组播通信配置详解
  • 人脸识别OOD模型效果展示:不同光照条件下质量分与识别准确率相关性
  • Qwen2.5-72B部署教程:基于vLLM的GPU算力优化与显存压缩技巧
  • .NET开发者集成丹青识画系统实战:C#调用REST API与结果反序列化
  • Pi0 Web界面效果实测:并发用户数压力测试(1/5/10用户响应性能曲线)
  • 胡桃木HIFI蓝牙音箱硬件设计:D类功放与蓝牙SoC协同实践
  • FMD IDE(辉芒微)编译与烧录实战问题解析
  • MT5 Zero-Shot参数组合实验报告:Temperature×Top-P对中文长句改写成功率影响
  • 鲁班猫RK3588板卡实战:手把手教你用移远RG200U模块搞定5G联网(附AT指令大全)
  • 从零到一:IKFast插件配置的通用避坑指南
  • AI的终极试炼场:HLE基准测试如何揭示大模型的真实认知边界
  • extract-video-ppt:重新定义视频幻灯片智能提取技术
  • Cosmos-Reason1-7B基础教程:7B模型在Jetson Orin上的轻量化部署
  • 从零开始理解人工智能:人类智能与机器智能的5大核心差异(附思维导图)
  • Unity Vuforia + ZXing 实现高效二维码识别与交互
  • GTE模型在智能翻译中的应用:提升翻译质量评估准确性
  • Benders分解 vs CCG:两阶段鲁棒优化算法选型指南
  • ESP32 WiFi-AP 模式实战:从零搭建智能设备热点连接方案
  • 具身智能:如何让机器人成为你“信得过”的伙伴?
  • 基于N32G430的USB电压电流表设计与实现
  • Minitab正交试验从入门到精通:5步搞定实验设计与数据分析
  • Matlab散点图进阶:从四维到七维数据的多维度可视化技巧
  • UniApp跨平台应用备案指南:iOS与Android证书获取全流程解析
  • Blender4.3雕刻笔刷实战指南:从基础到进阶
  • DeepSeek-R1-Distill-Qwen-1.5B省钱部署:免费镜像+低配GPU方案
  • Qt QTableWidget表格控件实战:从基础到高级应用
  • WebStorm + Vite + TypeScript + Vue3 项目别名配置全攻略:告别 ‘Cannot find module @/*‘ 错误
  • 揭秘海莲花组织最新攻击手法:如何通过MST文件植入远控木马(附检测方法)
  • 从零搭建ROS2机器人模型:在rviz2中可视化URDF的完整流程
  • 精智(Comfort)触摸屏下载总失败?博途版本与面板映像匹配的避坑指南