基于 GEE 利用 Sentinel-2 数据反演叶绿素与冠层水分含量
目录
1 数据加载与预处理
2 叶绿素含量反演
3 冠层水分反演
4 数据可视化与导出
5 完整代码
6 运行结果
在生态学和环境科学领域,植被的健康状况是评估生态系统稳定性和功能的关键指标之一。而叶绿素含量和冠层水分含量作为反映植被生理状态的重要参数,一直是遥感监测的核心目标。接下来,将通过Google Earth Engine(GEE)平台,分享如何利用Sentinel-2卫星数据反演叶绿素含量和冠层水分含量,并通过代码实现这一过程。
1 数据加载与预处理
在进行生态参数反演之前,需要加载并预处理卫星数据。这里选择了Sentinel-2卫星的“COPERNICUS/S2_SR_HARMONIZED”数据集,它提供了高质量的地表反射率产品,具有10米至60米的空间分辨率,非常适合植被监测。
/******************** 数据加载与预处理 ********************/
var s2 = ee.ImageCollection("COPERNICUS/S2_SR_HARMONIZED")
// 设置时间范围
.filterDate('2023-01-01', '2023-11-30')
// 限定研究区域
.filterBounds(roi)
// 筛选云量小于20%的影像
.filter(ee.Filter.lt('CLOUDY_PIXEL_PERCENTAGE', 20))
// 波段名称标准化
.map(function (img) {
return img.rename([
'B1', 'B2', 'B3', 'B4', 'B5', 'B6', 'B7',
'B8', 'B8A', 'B9', 'B11', 'B12',
'AOT', 'WVP', 'SCL', 'TCI_R', 'TCI_G', 'TCI_B',
'MSK_CLDPRB', 'MSK_SNWPRB', 'QA10', 'QA20', 'QA60',
'MSK_CLASSI_OPAQUE', 'MSK_CLASSI_CIRRUS', 'MSK_CLASSI_SNOW_ICE'
]);
})
// 计算中值合成影像
.median()
// 裁剪至研究区域
.clip(roi);
关键步骤解析:
-
时间范围筛选:通过
filterDate
方法,选择了2023年1月1日至11月30日的数据。您可以根据研究需求调整时间范围。 -
云量筛选:通过
filter
方法结合ee.Filter.lt
,剔除了云量超过20%的影像,以减少云层对分析结果的干扰。 -
波段名称标准化:Sentinel-2数据的波段名称通常以“B04”、“B05”等形式出现。为了方便后续计算,将波段名称统一更正为“B4”、“B5”等。
-
中值合成:通过
median
方法,计算了中值合成影像,以减少噪声和异常值的影响。 -
裁剪至研究区域:使用
clip
方法将影像裁剪至感兴趣区域(roi
),确保分析的精确性。
云掩膜处理:
云层是遥感影像中常见的干扰因素,它会掩盖地表的真实信息。Sentinel-2数据提供了“SCL”(Scene Classification Layer)波段,用于地表分类。其中,值为3的像素表示云中像素,值为8的像素表示云影,值为9的像素表示薄云。可以通过以下代码构建云掩膜:
// 云掩膜(基于SCL分类波段)
var cloudMask = s2.select('SCL').neq(3) // 排除云中像素
.and(s2.select('SCL').neq(8)) // 排除云影
.and(s2.select('SCL').neq(9)); // 排除薄云
var s2Clean = s2.updateMask(cloudMask); // 应用云掩膜
通过neq
和and
操作符,构建了一个无云的掩膜,并将其应用到中值合成影像上,得到了干净无云的影像数据(s2Clean
)。
2 叶绿素含量反演
叶绿素是植物进行光合作用的核心色素,其含量直接反映了植物的生长状况和健康水平。在遥感领域,叶绿素含量可以通过植被反射光谱的特定波段计算得到,采用以下公式进行叶绿素含量反演:
其中:
-
B8A
:865nm波段(近红外增强植被反射) -
B5
:705nm波段 -
B4
:665nm波段
公式 3.2 * (B8A - B5)/(B8A + B5 + 0.15) * sqrt(B8A/B4)
是多个经典指数的合成优化,其中系数可以通过地面实测数据校准获得,这里取3.2。
/******************** 叶绿素含量反演 ********************/
var Cab = s2Clean.expression(
'3.2 * (B8A - B5) / (B8A + B5 + 0.15) * sqrt(B8A/B4)',
{
'B8A': s2Clean.select('B8A'),
'B5': s2Clean.select('B5'),
'B4': s2Clean.select('B4')
}
).rename('Chlorophyll');
通过expression
方法,将公式嵌入代码中,并将结果命名为“Chlorophyll”(叶绿素含量)。
3 冠层水分反演
冠层水分含量是植被生理状态的重要指标之一,它反映了植被在水分胁迫下的适应能力和健康状况。采用以下公式进行冠层水分反演:
/******************** 冠层水分反演 ********************/
var Cw = s2Clean.expression(
'(B11 - B12)/(B11 + B12 + 0.03) * log(B8A)',
{
'B11': s2Clean.select('B11'),
'B12': s2Clean.select('B12'),
'B8A': s2Clean.select('B8A')
}
).rename('CanopyWater');
通过expression
方法,我们将公式嵌入代码中,并将结果命名为“CanopyWater”(冠层水分含量)。
4 数据可视化与导出
完成生态参数反演后,需要将结果可视化并导出。在GEE中,通过Map.addLayer
方法将结果添加到地图上,并通过设置合适的可视化参数(如最小值、最大值和调色板),使结果更加直观易懂。
/******************** 可视化与导出 ********************/
var visCab = {
min: 0,
max: 6,
palette: ['#FFFFCC', '#A1DAB4', '#41B6C4', '#225EA8', '#081D58']
};
var visCw = {
min: -0.2,
max: 0.7,
palette: ['#0000FF', '#00FFFF', '#FFFF00', '#FF0000']
};
Map.addLayer(Cab, visCab, '叶绿素含量(μg/cm²)');
Map.addLayer(Cw, visCw, '冠层水分指数');
// 分项导出设置
Export.image.toDrive({
image: Cab,
description: 'Cab_20m_S2_2023Summer',
folder: 'Sentinel2_EcoParams',
region: roi,
scale: 20,
maxPixels: 1e13
});
Export.image.toDrive({
image: Cw,
description: 'Cw_20m_S2_2023Summer',
folder: 'Sentinel2_EcoParams',
region: roi,
scale: 20,
maxPixels: 1e13
});
关键步骤解析:
-
可视化参数设置:通过
min
、max
和palette
参数,为叶绿素含量和冠层水分含量设置了合适的可视化范围和颜色渐变。 -
导出设置:通过
Export.image.toDrive
方法,将反演结果导出至Google Drive。导出的图像分辨率为20米,与Sentinel-2影像的空间分辨率相匹配。
5 完整代码
Map.centerObject(roi,7)
var styling = {color:"red",fillColor:"00000000"};
Map.addLayer(roi.style(styling),{},"geometry")
/******************** 数据加载与预处理 ********************/
var s2 = ee.ImageCollection("COPERNICUS/S2_SR_HARMONIZED")
.filterDate('2023-01-01', '2023-11-30') // 需修改日期可调整此处
.filterBounds(roi)
.filter(ee.Filter.lt('CLOUDY_PIXEL_PERCENTAGE', 20))
.map(function (img) {
// 波段名称标准化(用户数据实际波段名)
return img.rename([
'B1', 'B2', 'B3', 'B4', 'B5', 'B6', 'B7',
'B8', 'B8A', 'B9', 'B11', 'B12', // 关键修正点:B04→B4,B05→B5
'AOT', 'WVP', 'SCL', 'TCI_R', 'TCI_G', 'TCI_B',
'MSK_CLDPRB', 'MSK_SNWPRB', 'QA10', 'QA20', 'QA60',
'MSK_CLASSI_OPAQUE', 'MSK_CLASSI_CIRRUS', 'MSK_CLASSI_SNOW_ICE'
]);
})
.median()
.clip(roi);
// 云掩膜(基于SCL分类波段)
var cloudMask = s2.select('SCL').neq(3) // 3=云中像素
.and(s2.select('SCL').neq(8)) // 8=云影
.and(s2.select('SCL').neq(9)); // 9=薄云
var s2Clean = s2.updateMask(cloudMask);
/******************** 叶绿素含量反演 ********************/
var Cab = s2Clean.expression(
'3.2 * (B8A - B5) / (B8A + B5 + 0.15) * sqrt(B8A/B4)',
{
'B8A': s2Clean.select('B8A'), // 865nm(原B8A)
'B5': s2Clean.select('B5'), // 705nm(原B05)
'B4': s2Clean.select('B4') // 665nm(原B04)
}
).rename('Chlorophyll');
/******************** 冠层水分反演 ********************/
var Cw = s2Clean.expression(
'(B11 - B12)/(B11 + B12 + 0.03) * log(B8A)',
{
'B11': s2Clean.select('B11'), // 1610nm
'B12': s2Clean.select('B12'), // 2190nm
'B8A': s2Clean.select('B8A') // 近红外增强植被反射
}
).rename('CanopyWater');
/******************** 可视化与导出 ********************/
var visCab = {
min: 0,
max: 6,
palette: ['#FFFFCC', '#A1DAB4', '#41B6C4', '#225EA8', '#081D58']
};
var visCw = {
min: -0.2,
max: 0.7,
palette: ['#0000FF', '#00FFFF', '#FFFF00', '#FF0000']
};
Map.addLayer(Cab, visCab, '叶绿素含量(μg/cm²)');
Map.addLayer(Cw, visCw, '冠层水分指数');
// 分项导出设置
Export.image.toDrive({
image: Cab,
description: 'Cab_20m_S2_2023Summer',
folder: 'Sentinel2_EcoParams',
region: roi,
scale: 20,
maxPixels: 1e13
});
Export.image.toDrive({
image: Cw,
description: 'Cw_20m_S2_2023Summer',
folder: 'Sentinel2_EcoParams',
region: roi,
scale: 20,
maxPixels: 1e13
});
6 运行结果


