GEE SCL掩膜高精度 NDVI 提取教程(10 米分辨率 + SCL 掩膜)——免费提供完整代码
🌍 Google Earth Engine (GEE) 教程
获取并使用高精度数据(10米分辨率,经SCL掩膜处理)来生成特定区域、特定年份的Sentinel-2 NDVI年度合成影像。
注意:SCL掩膜版高精度:基于场景分类掩膜,更严格,云去得更干净,但容易漏地物。
一、实验目标
本教程的目标是利用 Google Earth Engine (GEE) 平台,提取指定行政区(以苏州市为例)在 2020–2024 年 的 NDVI(归一化植被指数)年度合成图像,并将结果导出至 Google Drive。
通过学习本教程,你将掌握:
- 如何导入并筛选自定义行政区边界(shapefile)。
- 如何调用 Sentinel-2 Level-2A 表面反射率影像集合。
- 如何进行云与阴影掩膜处理。
- 如何计算 NDVI 指数。
- 如何按年度合成 NDVI 并导出结果。
二、基础知识回顾
1. NDVI 的含义
NDVI (Normalized Difference Vegetation Index) 是一种反映植被覆盖与生长状况的指标,计算公式为:
其中:
- NIR:近红外波段(Sentinel-2 中为 B8,波长约 842 nm)
- RED:红光波段(Sentinel-2 中为 B4,波长约 665 nm)
NDVI 取值范围:
- -1 ~ 0:多为水体、建筑物等非植被地物
- 0 ~ 0.2:稀疏植被或裸地
- 0.2 ~ 0.8:中高密度植被区域
三、数据来源
- 影像数据集:
COPERNICUS/S2_SR(Sentinel-2 Level-2A 表面反射率) - 空间分辨率:10 米
- 时间范围:2020–2024 年
- 研究区边界:用户自上传的江苏省行政区 shapefile 文件(其中包含“苏州市”多边形)
四、操作步骤
步骤 1:导入行政区边界
(①导入上级区域选择所需下级区域②直接导入目标区域)
1. 导入上级区域选择所需下级区域
在 GEE Code Editor 左侧的「Assets」中上传你的 shapefile(包含省、市等行政区边界),上传完成后系统会生成一个资产路径(如:projects/your_project_id/assets/jiangsusheng)


在代码中导入该数据,并筛选出 苏州市 区域:
// 导入江苏省行政区边界
var jiangsusheng = ee.FeatureCollection('projects/your_project_id/assets/jiangsusheng');// 按属性字段筛选出苏州市
var suzhou = jiangsusheng.filter(ee.Filter.eq('市', '苏州市'));// 查看结果
print('苏州市区域:', suzhou);
Map.centerObject(suzhou, 9);
Map.addLayer(suzhou, {color: 'red'}, '苏州市边界');
🔹 注意:
- 代码中的
"市"应替换为你 shapefile 属性表中表示城市名称的字段名。- 如果字段名不同,可先运行
print(jiangsusheng.first())查看字段名称。
2. 直接导入目标区域
导入步骤相同,在代码中导入该数据
// 直接导入苏州市边界
var suzhou = ee.FeatureCollection('projects/your_project_id/assets/suzhoushi');// 查看结果
print('苏州市区域:', suzhou);
Map.centerObject(suzhou, 9);
Map.addLayer(suzhou, {color: 'blue'}, '苏州市边界');
以下最终代码是以上级区域选择下级区域进行演示。
步骤 2:导入 Sentinel-2 数据集
调用 GEE 官方提供的 Sentinel-2 表面反射率数据:
var s2 = ee.ImageCollection('COPERNICUS/S2_SR');
该数据包含多个波段与质量控制信息,其中 “SCL” 波段可用于识别云、阴影、水体、植被等地物类型。该方法分类识别较为精细所以无关物体的白斑存在会较多。
步骤 3:云与阴影掩膜处理
为了减少云和阴影的干扰,需要根据 SCL(Scene Classification Layer)波段筛除无效像元:
function maskS2WithSCL(image) {var scl = image.select('SCL');// 保留植被(4)、裸地(5)、水体(6)var good = scl.eq(4).or(scl.eq(5)).or(scl.eq(6));return image.updateMask(good).copyProperties(image, ['system:time_start']);
}
步骤 4:计算 NDVI 指数
在每景影像中添加一个 NDVI 波段:
function addNDVI(image) {var ndvi = image.normalizedDifference(['B8', 'B4']).rename('NDVI');return image.addBands(ndvi);
}
步骤 5:按年度合成 NDVI
对 2020–2024 年的影像分别进行筛选、掩膜、计算 NDVI,并取年度中位值(median composite):
var visParams = {min: -0.2, max: 0.8,palette: ['FFFFFF','CE7E45','DF923D','F1B555','FCD163','99B718','74A901','66A000','529400','3E8601','207401','056201','004C00','023B01','012E01','011D01']
};for (var year = 2020; year <= 2024; year++) {(function(y) {var start = ee.Date.fromYMD(y, 1, 1);var end = ee.Date.fromYMD(y, 12, 31);var col = s2.filterDate(start, end).filterBounds(suzhou).filter(ee.Filter.lt('CLOUDY_PIXEL_PERCENTAGE', 50)).map(maskS2WithSCL).map(addNDVI).select('NDVI');var ndviMedian = col.median().clip(suzhou);// 显示到地图上Map.addLayer(ndviMedian, visParams, 'NDVI ' + y, y === 2024);// 导出任务Export.image.toDrive({image: ndviMedian,description: 'Suzhou_NDVI_' + y,folder: 'GEE_Suzhou_NDVI',fileNamePrefix: 'Suzhou_NDVI_' + y,region: suzhou.geometry(),scale: 10,crs: 'EPSG:4326',maxPixels: 1e13});})(year);
}
完整代码:
// ===================================================================
// GEE 示例:获取苏州市 2020-2024 年的 Sentinel-2 NDVI 年度合成并导出到 Drive
// 使用导入的江苏省行政区 shapefile
// ===================================================================// ---------------------------
// 1) 导入行政区边界数据
// ---------------------------
// 将下方路径替换成你的资产 ID(从截图看应为)
var jiangsusheng = ee.FeatureCollection('projects/your_project_id/assets/jiangsusheng');// 此处以上级区域中选择下级区域进行演示,从属性字段中筛选出“苏州市”
var suzhou = jiangsusheng.filter(ee.Filter.eq('市', '苏州市'));// 打印查看几何是否正确
print('苏州市区域:', suzhou);
Map.centerObject(suzhou, 9);
Map.addLayer(suzhou, {color: 'red'}, '苏州市边界');// ---------------------------
// 2) Sentinel-2 Level-2A 数据集 (表面反射率)
// ---------------------------
var s2 = ee.ImageCollection('COPERNICUS/S2_SR');// ---------------------------
// 3) 云与阴影掩膜函数(基于 SCL 波段)
// ---------------------------
function maskS2WithSCL(image) {var scl = image.select('SCL');// 仅保留 SCL = 4 (vegetation), 5 (bare), 6 (water)var good = scl.eq(4).or(scl.eq(5)).or(scl.eq(6));return image.updateMask(good).copyProperties(image, ['system:time_start']);
}// ---------------------------
// 4) 计算 NDVI
// ---------------------------
function addNDVI(image) {var ndvi = image.normalizedDifference(['B8', 'B4']).rename('NDVI');return image.addBands(ndvi);
}// ---------------------------
// 5) 循环计算 2020-2024 年 NDVI 年度合成
// ---------------------------
var visParams = {min: -0.2, max: 0.8,palette: ['FFFFFF','CE7E45','DF923D','F1B555','FCD163','99B718','74A901','66A000','529400','3E8601','207401','056201','004C00','023B01','012E01','011D01']
};for (var year = 2020; year <= 2024; year++) {(function(y) {var start = ee.Date.fromYMD(y, 1, 1);var end = ee.Date.fromYMD(y, 12, 31);// 选取苏州市区域内影像var col = s2.filterDate(start, end.advance(1, 'day')).filterBounds(suzhou).filter(ee.Filter.lt('CLOUDY_PIXEL_PERCENTAGE', 50)).map(maskS2WithSCL).map(addNDVI).select('NDVI');var ndviMedian = col.median().clip(suzhou);// 在地图上显示Map.addLayer(ndviMedian, visParams, 'NDVI ' + y, y === 2024 ? true : false);// 导出到 Google DriveExport.image.toDrive({image: ndviMedian,description: 'Suzhou_NDVI_' + y,folder: 'GEE_Suzhou_NDVI',fileNamePrefix: 'Suzhou_NDVI_' + y,region: suzhou.geometry(),scale: 10,crs: 'EPSG:4326',maxPixels: 1e13});})(year);
}// ===================================================================
// 说明:
// 1) suzhou 来源于你上传的 jiangsusheng 矢量资产,确保字段名称为“市”且值为“苏州市”;也可以改为直接导入目标区域
// 2) 每年生成一幅 NDVI 年度合成图像,导出到 Google Drive;
// 3) 导出任务需在右侧 Tasks 面板中点击 “Run” 手动启动;
// 4) 若数据量较大,可以先测试 2020 年单年,确认后再运行循环。
// ===================================================================

五、结果导出说明
-
导出位置:
生成的 NDVI 栅格将被保存到 Google Drive 的GEE_Suzhou_NDVI文件夹中。 -
执行导出任务:
- 在 GEE 右侧「Tasks」面板中,每个年份会出现一个任务。
- 点击 “Run” → 确认参数 → 等待导出完成。
- 导出完成后,可在 Google Drive 查看并下载。
-
导出格式:GeoTIFF (.tif),坐标系为 WGS84 (EPSG:4326),分辨率 10 米。

六、可视化效果
导出前,GEE 地图界面会显示每一年的 NDVI 合成结果,颜色从浅黄到深绿分别表示:
- 浅色:植被稀疏或非植被地表
- 深绿:高密度植被覆盖区

七、常见问题与优化建议
| 问题 | 可能原因 | 解决方案 |
|---|---|---|
| 地图上不显示苏州市边界 | 属性字段名称不匹配 | 检查 shapefile 的属性表,确认城市字段名 |
| 导出任务失败 | 区域范围太大或像元太多 | 可分年份导出,或使用更小研究区 |
| NDVI 结果偏暗 | 云掩膜过严或影像数量不足 | 适当放宽云量阈值(如改为 60%) |
| Drive 文件夹未出现 | Drive 授权或同步延迟 | 检查 GEE Drive 授权状态或稍后刷新 |
如需将 NDVI 栅格进一步在 ArcGIS 或 QGIS 中叠加分析,只需在 Google Drive 下载 .tif 文件后导入即可。

转载吱一声~
