目录
[(一)最终 RSEI 计算](#(一)最终 RSEI 计算)
[1. 直方图](#1. 直方图)
[2. 地图显示](#2. 地图显示)

若觉得代码对您的研究 / 项目有帮助,欢迎点击打赏支持!需要完整代码的朋友,打赏后可在后台私信(复制文章标题发给我),我会尽快发您完整可运行代码,感谢支持!
本代码基于 Google Earth Engine(GEE)平台,利用 Landsat 8 卫星影像数据,通过遥感生态指数(RSEI) 实现对特定区域 2020 年生态环境质量的综合评价。核心逻辑是:筛选关键生态指标(植被、湿度、温度、建筑裸土),经数据预处理、主成分分析(PCA)提取核心评价维度,最终生成 0-1 区间的 RSEI 指数(值越高,生态质量越好)。
一、全局配置与基础设置
(一)核心参数定义
javascript
var scale = 1000; // 分析尺度(单位:米)
var year = 2020; // 目标分析年份
var roi = table; // 研究区域(需提前导入矢量边界数据)
Map.centerObject(roi, 8); // 地图定位到研究区,缩放级别8
- scale:空间分辨率,1000 米意味着影像将重采样到 1000 米网格,平衡计算效率与精度。
- roi :研究区域边界,需在 GEE 中提前上传矢量文件(如 Shapefile)并命名为
table。 - Map.centerObject:GEE 地图交互函数,自动定位到研究区并设置初始缩放级别。
(二)波段映射配置
javascript
var srcBands = ["SR_B2", "SR_B3", "SR_B4", "SR_B5", "SR_B6", "SR_B7", "ST_B10"];
var toBands = ["Blue", "Green", "Red", "NIR", "SWIR1", "SWIR2", "LST"];
映射 Landsat 8 卫星原始波段到通用名称:
- 光学波段:蓝(SR_B2)、绿(SR_B3)、红(SR_B4)、近红外(SR_B5)、短波红外 1(SR_B6)、短波红外 2(SR_B7)
- 热红外波段:地表温度(ST_B10),后续将转换为摄氏度。
二、数据预处理函数
(一)云掩膜函数(maskclouds)
功能:去除影像中的云及云阴影,保证数据有效性。
javascript
var maskclouds = function(img) {
var cloudShadowBitMask = 1 << 4; // 云阴影位掩码(第4位)
var cloudsBitMask = 1 << 3; // 云位掩码(第3位)
var qa = img.select("QA_PIXEL"); // 质量评估波段(Landsat 8的QA_PIXEL波段记录像素质量)
var mask = qa.bitwiseAnd(cloudShadowBitMask).eq(0)
.and(qa.bitwiseAnd(cloudsBitMask).eq(0)); // 无云且无云阴影的像素保留
return img.addBands(img.updateMask(mask), null, true);
};
- 原理:Landsat 8 的 QA_PIXEL 波段为 16 位整数,每一位代表特定质量信息(如是否为云、云阴影),通过位运算筛选出 "干净" 像素。
- 效果:掩膜后影像仅保留无云、无云阴影的有效区域。
(二)比例因子应用(applyScaleFactors)
功能:将卫星原始 DN 值(数字量化值)转换为物理意义明确的地表参数。
javascript
var applyScaleFactors = function(image) {
// 光学波段:转换为地表反射率(范围0-1)
var opticalBands = image.select('SR_B.').multiply(0.0000275).add(-0.2);
// 热红外波段:转换为地表温度(摄氏度)
var thermalBands = image.select('ST_B.*').multiply(0.00341802).add(149.0).subtract(273.15);
return image.addBands(opticalBands, null, true).addBands(thermalBands, null, true);
};
- 光学波段:Landsat 8 的 SR(地表反射率)产品需通过官方比例因子(0.0000275)和偏移量(-0.2)转换为真实反射率。
- 热红外波段:先转换为辐射亮度,再转换为开尔文温度,最后减去 273.15 得到摄氏度。
三、生态指标计算
(一)归一化植被指数(NDVI)
功能:反映植被覆盖度和生长状况(值越高,植被越茂盛)。
javascript
var NDVI = function(image) {
return image.addBands(
image.normalizedDifference(["NIR", "Red"]).rename("NDVI")
);
};
- 公式 :
NDVI = (NIR - Red) / (NIR + Red) - 逻辑:近红外波段(NIR)对植被敏感(植被反射强),红光波段(Red)对植被吸收强,两者差值可突出植被信息。
- 范围:-1~1,负值多为水体,0 左右为裸土 / 建筑,正值为植被(越接近 1 植被越好)。
(二)湿度分量(WET)
功能:反映地表湿度状况(值越高,湿度越大,生态条件越好)。
javascript
var WET = function(image) {
var WET = image.expression(
'Blue*0.1511 + Green*0.1973 + Red*0.3283 + NIR*0.3407 + SWIR1*(-0.7117) + SWIR2*(-0.4559)',
{
'Blue': image.select('Blue'), 'Green': image.select('Green'),
'Red': image.select('Red'), 'NIR': image.select('NIR'),
'SWIR1': image.select('SWIR1'), 'SWIR2': image.select('SWIR2')
}
).rename('WET');
return image.addBands(WET);
};
- 原理:基于缨帽变换(Tasseled Cap Transformation),通过多波段线性组合提取湿度信息。
- 系数意义:蓝、绿、红、近红外波段系数为正(这些波段对水分敏感),短波红外波段系数为负(水分对短波红外吸收强)。
(三)归一化建筑裸土指数(NDBSI)
功能:反映建筑用地和裸土的占比(值越高,建筑 / 裸土越多,生态质量越差)。
javascript
var NDBSI = function(image) {
// 裸土指数(SI)
var SI = image.expression(
'((SWIR1 + Red) - (NIR + Blue)) / ((SWIR1 + Red) + (NIR + Blue))', {...});
// 建筑指数(IBI)
var IBI = image.expression(
'(2*SWIR1/(SWIR1+NIR) - (NIR/(NIR+Red) + Green/(Green+SWIR1))) / ' +
'(2*SWIR1/(SWIR1+NIR) + (NIR/(NIR+Red) + Green/(Green+SWIR1)))', {...});
// NDBSI = (SI + IBI)/2
var NDBSI = SI.add(IBI).divide(2).rename('NDBSI');
return image.addBands(NDBSI);
};
- 裸土指数(SI):通过短波红外 + 红光与近红外 + 蓝光的差值,突出裸土信息。
- 建筑指数(IBI):结合短波红外与近红外、红光、绿光的比值,突出建筑用地信息。
- 逻辑:SI 和 IBI 均为高值代表生态质量差,两者平均后得到综合指标 NDBSI。
(四)地表温度(LST)
- 来源 :直接通过
applyScaleFactors函数从 Landsat 8 的 ST_B10 波段转换得到,无需额外编写计算函数。 - 意义:温度越高,热环境越差,生态质量越低(与 RSEI 呈负相关)。
四、数据标准化与主成分分析
(一)影像归一化(img_norm)
功能:将所有指标值统一到 0-1 区间,消除量纲差异(如 NDVI 为 - 1~1,LST 为 20~40℃),为 PCA 做准备。
javascript
var img_norm = function(image) {
var minMax = image.reduceRegion({
reducer: ee.Reducer.minMax(), // 计算每个波段的最小值和最大值
geometry: roi,
scale: scale,
maxPixels: 10e13 // 避免像素数量超限
});
// 对每个波段执行归一化:(原值 - 最小值) / (最大值 - 最小值)
var image_norm = ee.ImageCollection.fromImages(
image.bandNames().map(function(name) {
var band = image.select(name);
var min = ee.Number(minMax.get(name.cat('_min')));
var max = ee.Number(minMax.get(name.cat('_max')));
return band.subtract(min).divide(max.subtract(min));
})
).toBands().rename(image.bandNames());
return image_norm;
};
关键:基于研究区(roi)的全局最小值和最大值进行归一化,确保所有指标在同一尺度下可比。
(二)主成分分析(getPAC)
功能:将 4 个生态指标(NDVI、WET、LST、NDBSI)降维,提取第一主成分(PC1)作为初始 RSEI,实现生态质量的综合评价。核心步骤:
- 数据中心化:每个指标减去其均值,消除量纲影响。
- 协方差矩阵计算:反映指标间的相关性(如 NDVI 与 WET 可能正相关,NDVI 与 NDBSI 可能负相关)。
- 特征值与特征向量分解:
- 特征值:反映主成分的方差贡献(特征值越大,该主成分包含的信息越多)。
- 特征向量:反映各指标对主成分的贡献权重。
- 主成分方向调整(RSEI 核心逻辑):
- 理论依据:RSEI 要求 "生态正向指标(NDVI、WET)权重为正,生态负向指标(LST、NDBSI)权重为负"。
- 调整方式:取 NDVI、WET 特征向量的绝对值(保证正向贡献),取 LST、NDBSI 特征向量绝对值的负值(保证负向贡献)。
- 主成分计算:通过矩阵乘法得到 4 个主成分(PC1~PC4),PC1 包含原始数据的主要信息(方差贡献率最高)。
五、水体掩膜与影像合成
(一)水体掩膜
功能:去除研究区中的永久水体和季节性水体,避免水体对生态指标计算的干扰(如水体 NDVI 为负,会影响 RSEI 结果)。
javascript
var water = ee.ImageCollection('JRC/GSW1_4/YearlyHistory')
.filterDate(year + '-01-01', year + '-12-31').first();
var mask = water.eq(2).add(water.eq(3)).unmask().eq(0).clip(roi);
- 数据来源:JRC 全球地表水数据集(GSW1_4),该数据集将地表分为 "永久水体(2)""季节性水体(3)" 等类型。
- 逻辑:掩膜掉水体(值为 2 和 3 的区域),仅保留非水体区域(值为 0)。
(二)影像合成
功能:将全年影像按指标取中值,得到年度综合影像(减少单期影像的噪声和云残留影响)。
javascript
var imageCol = ee.ImageCollection("LANDSAT/LC08/C02/T1_L2")
.filterBounds(roi) // 空间过滤:仅保留研究区范围内的影像
.filterDate(year + '-01-01', year + '-12-31') // 时间过滤:2020年
.map(maskclouds) // 云掩膜
.map(applyScaleFactors) // 比例因子转换
.select(srcBands, toBands) // 波段重命名
.map(NDVI) // 计算NDVI
.map(WET) // 计算WET
.map(NDBSI); // 计算NDBSI
// 取中值合成并应用水体掩膜
var image = imageCol.select(['NDVI', 'WET', 'LST', 'NDBSI']).median().updateMask(mask).clip(roi);
中值合成优势:相比均值,更能抵抗异常值(如未完全掩膜的云、噪声像素)的影响,更能反映年度平均状况。
六、结果生成与可视化
(一)最终 RSEI 计算
javascript
var image_norm = img_norm(image); // 指标归一化
var PCA = getPAC(image_norm); // 主成分分析
var RSEI_0 = PCA.select("PC1"); // 提取PC1作为初始RSEI
var RSEI = img_norm(RSEI_0); // 对初始RSEI归一化到0-1
最终 RSEI 范围 :0~1,0 代表生态质量最差,1 代表生态质量最优。
(二)结果可视化
1. 直方图
javascript
var Histogram = ui.Chart.image.histogram({
image: RSEI,
region: roi,
scale: scale,
maxPixels: 1e10
});
print('Histogram of RSEI', Histogram);
功能:展示 RSEI 值的分布情况,可直观判断研究区生态质量的整体水平(如峰值偏向 1 则整体生态较好,偏向 0 则整体较差)。
2. 地图显示
javascript
var visParam = {
min: 0,
max: 1,
palette: ['C2523C', 'F2B60E', '77ED00', '1BAA7D', '0B2C7A'] // 红→黄→绿→深绿→蓝(差→好)
};
Map.addLayer(RSEI, visParam, 'RSEI');
颜色逻辑:从红色(生态差)到蓝色(生态优)渐变,可在 GEE 地图界面直观查看不同区域的生态质量空间分布。
七、核心逻辑总结
- 数据输入:Landsat 8 卫星影像(光学 + 热红外波段)、研究区矢量边界。
- 预处理:云掩膜→比例因子转换→水体掩膜→年度中值合成,保证数据质量。
- 指标计算:构建 4 个生态指标(NDVI:植被、WET:湿度、LST:温度、NDBSI:建筑裸土),全面反映生态状况。
- 综合评价:指标归一化→主成分分析(PCA 降维)→调整主成分方向→RSEI 归一化,得到综合生态质量指数。
- 结果输出:直方图(统计分布)+ 地图可视化(空间分布),支持生态质量的定性与定量分析。
八、运行结果
控制台输出的相关信息
遥感生态指数(RSEI)计算结果可视化
直方图
若觉得代码对您的研究 / 项目有帮助,欢迎点击打赏支持!需要完整代码的朋友,打赏后可在后台私信(复制文章标题发给我),我会尽快发您完整可运行代码,感谢支持!