基于 Google Earth Engine 的南京江宁区土地利用分类(K-Means 聚类)

一、引言

其实利用GEE可以做的内容太多了,很多内容换一个区域,换一个时间段就是一篇本科毕业论文(设计),甚至拓展一下硕士也不是不行。本文将详细介绍如何使用 GEE 对南京江宁区的 Landsat 8 地表反射率数据进行 K-Means 聚类分析,实现土地利用分类,并将结果可视化和导出。(后续有机会再给大家详细说一下如何完整的进行毕业论文的大纲和设计,甚至完成一篇十分简单的毕业论文。)

二、代码实现

2.1 定义研究区域

javascript 复制代码
// 定义南京江宁区的研究区域(经纬度范围)
var roi = ee.Geometry.Polygon([
  [
    [118.60, 31.80],  // 西南点
    [118.60, 32.00],  // 西北点
    [118.90, 32.00],  // 东北点
    [118.90, 31.80]   // 东南点
  ]
]);

此代码块通过定义多边形的顶点坐标,确定了南京江宁区的研究区域。

2.2 加载 Landsat 8 地表反射率数据

javascript 复制代码
// 加载Landsat 8地表反射率数据
var landsat = ee.ImageCollection('LANDSAT/LC08/C02/T1_L2')
  .filterDate('2020-01-01', '2020-12-31')  // 时间范围
  .filterBounds(roi)                        // 空间范围
  .median()                                 // 计算中值合成
  .clip(roi);                               // 裁剪到研究区域

这里从 GEE 的影像集合中加载 Landsat 8 的地表反射率数据,通过筛选时间范围和空间范围,然后计算中值合成影像,并将其裁剪到研究区域。

2.3 选择波段并应用缩放因子

javascript 复制代码
// 选择波段并应用缩放因子(Landsat 8地表反射率需缩放)
var bands = ['SR_B2', 'SR_B3', 'SR_B4', 'SR_B5', 'SR_B6', 'SR_B7'];
var scaled = landsat.select(bands)
  .multiply(0.0000275)  // 缩放因子
  .add(-0.2);           // 偏移量

选择了 Landsat 8 的 6 个波段,并对这些波段应用了缩放因子和偏移量,以获得正确的地表反射率值。

2.4 从影像中随机采样训练数据

javascript 复制代码
// 从影像中随机采样训练数据
var training = scaled.sample({
  region: roi,
  scale: 30,      // 分辨率(米)
  numPixels: 5000  // 采样点数
});

从缩放后的影像中随机采样了 5000 个点作为训练数据,采样的分辨率为 30 米。

2.5 训练 K-Means 聚类器

javascript 复制代码
// 训练K-means聚类器(假设分为5类)
var clusterer = ee.Clusterer.wekaKMeans(5).train(training);

使用 Weka 的 K-Means 算法训练聚类器,将数据分为 n类。

2.6 应用聚类器到整个影像

javascript 复制代码
// 应用聚类器到整个影像
var clustered = scaled.cluster(clusterer);

将训练好的聚类器应用到整个缩放后的影像上,得到聚类结果。

2.7 可视化设置

javascript 复制代码
// 可视化设置
Map.centerObject(roi, 10);  // 地图中心设为区域,缩放级别10
Map.addLayer(scaled, {bands: ['SR_B4', 'SR_B3', 'SR_B2'], min: 0, max: 0.3}, 'RGB图像');
Map.addLayer(clustered.randomVisualizer(), {}, '聚类结果');

将地图中心定位到研究区域,并设置缩放级别为 10。添加了原始的 RGB 图像和聚类结果的可视化图层。

2.8 导出结果到 Google Drive

javascript 复制代码
// 可选:导出结果到Google Drive
Export.image.toDrive({
  image: clustered,
  description: 'Jiangning_Cluster',
  scale: 30,
  region: roi,
  maxPixels: 1e13
});

将聚类结果影像导出到 Google Drive,方便后续进一步分析和使用。

三、完整代码:

javascript 复制代码
// 定义南京江宁区的研究区域(经纬度范围)
var roi = ee.Geometry.Polygon([
  [
    [118.60, 31.80],  // 西南点
    [118.60, 32.00],  // 西北点
    [118.90, 32.00],  // 东北点
    [118.90, 31.80]   // 东南点
  ]
]);

// 加载Landsat 8地表反射率数据
var landsat = ee.ImageCollection('LANDSAT/LC08/C02/T1_L2')
  .filterDate('2020-01-01', '2020-12-31')  // 时间范围
  .filterBounds(roi)                        // 空间范围
  .median()                                 // 计算中值合成
  .clip(roi);                               // 裁剪到研究区域

// 选择波段并应用缩放因子(Landsat 8地表反射率需缩放)
var bands = ['SR_B2', 'SR_B3', 'SR_B4', 'SR_B5', 'SR_B6', 'SR_B7'];
var scaled = landsat.select(bands)
  .multiply(0.0000275)  // 缩放因子
  .add(-0.2);           // 偏移量

// 从影像中随机采样训练数据
var training = scaled.sample({
  region: roi,
  scale: 30,      // 分辨率(米)
  numPixels: 5000  // 采样点数
});

// 训练K-means聚类器(假设分为5类)
var clusterer = ee.Clusterer.wekaKMeans(5).train(training);

// 应用聚类器到整个影像
var clustered = scaled.cluster(clusterer);

// 可视化设置
Map.centerObject(roi, 10);  // 地图中心设为区域,缩放级别10
Map.addLayer(scaled, {bands: ['SR_B4', 'SR_B3', 'SR_B2'], min: 0, max: 0.3}, 'RGB图像');
Map.addLayer(clustered.randomVisualizer(), {}, '聚类结果');

// 可选:导出结果到Google Drive
Export.image.toDrive({
  image: clustered,
  description: 'Jiangning_Cluster',
  scale: 30,
  region: roi,
  maxPixels: 1e13
});

四、结果:

3类

12类

大家仔细观察,其实用无监督聚类方法的结果也还可以,尤其对于规则水体。

希望本文对大家有所帮助,欢迎在评论区留言交流!

相关推荐
MoonBit月兔16 分钟前
双周报Vol.70: 运算符重载语义变化、String API 改动、IDE Markdown 格式支持优化...多项更新升级!
ide·算法·哈希算法
How_doyou_do20 分钟前
树状数组底层逻辑探讨 / 模版代码-P3374-P3368
数据结构·算法·树状数组
layneyao27 分钟前
深度强化学习(DRL)实战:从AlphaGo到自动驾驶
人工智能·机器学习·自动驾驶
悲喜自渡72136 分钟前
线性代数(一些别的应该关注的点)
python·线性代数·机器学习
小鹿鹿啊40 分钟前
C语言编程--14.电话号码的字母组合
c语言·开发语言·算法
小O的算法实验室1 小时前
2024年ESWA SCI1区TOP:量子计算蜣螂算法QHDBO,深度解析+性能实测
算法·论文复现·智能算法·智能算法改进
C语言魔术师1 小时前
509. 斐波那契数
算法·动态规划
Wendy_robot1 小时前
【前缀和计算和+哈希表查找次数】Leetcode 560. 和为 K 的子数组
c++·算法·leetcode
o独酌o1 小时前
算法习题-力扣446周赛题解
算法·leetcode
一只鱼^_1 小时前
第十六届蓝桥杯大赛软件赛省赛 C/C++ 大学B组 [京津冀]
c语言·数据结构·c++·算法·贪心算法·蓝桥杯·动态规划