第一次接触Google Earth Engine(GEE)时,面对满屏的JavaScript代码和陌生的API文档,我和大多数初学者一样感到无从下手。直到发现遥感生态指数(RSEI)这个既能评估环境质量又适合练手的项目,才真正打开了GEE的大门。本文将带你用最简单的步骤,避开我踩过的所有坑,快速生成专业级的生态评估结果。
访问GEE官网注册开发者账号(需谷歌账号),通过审核后即可使用代码编辑器。首次登录建议:
注意:免费账号有计算资源限制,复杂运算建议分区域或分时段处理
RSEI通过主成分分析(PCA)整合四个关键生态参数:
| 指标类型 | 计算方式 | 生态意义 | 数据源 |
|---|---|---|---|
| 绿度(NDVI) | (NIR-Red)/(NIR+Red) | 植被覆盖状况 | Landsat B4/B5 |
| 湿度(Wet) | 波段线性组合 | 地表水分含量 | Landsat多波段 |
| 热度(LST) | 地表温度反演 | 热环境状况 | MODIS温度产品 |
| 干度(NDBSI) | (IBI+SI)/2 | 建筑与裸土分布 | Landsat多波段 |
在代码编辑器左上角地图框选区域后,自动生成几何对象代码。更精准的做法是:
javascript复制// 推荐使用GIS软件导出GeoJSON坐标粘贴替换
var roi = ee.Geometry.Polygon(
[[[经度1,纬度1],
[经度2,纬度2],
[经度3,纬度3]]]);
Map.centerObject(roi, 10); // 数字代表缩放级别
常见报错解决:
Geometry coordinates out of bounds → 检查坐标顺序是否为经度,纬度Invalid geometry → 使用roi = roi.buffer(0)修复拓扑错误Landsat影像处理包含三个核心环节:
javascript复制function removeCloud(image) {
var qa = image.select('QA_PIXEL'); // Landsat9使用新波段名
var cloudBitMask = 1 << 3;
var shadowBitMask = 1 << 4;
var mask = qa.bitwiseAnd(cloudBitMask).eq(0)
.and(qa.bitwiseAnd(shadowBitMask).eq(0));
return image.updateMask(mask);
}
javascript复制var collection = ee.ImageCollection('LANDSAT/LC08/C02/T1_L2')
.filterDate('2020-01-01', '2020-12-31')
.filter(ee.Filter.calendarRange(6, 9, 'month')) // 只选夏季影像
.filterBounds(roi)
.map(removeCloud);
javascript复制var composite = collection.median()
.clip(roi)
.normalizedDifference(['SR_B5', 'SR_B4']); // 直接计算NDVI
原始论文的Wet指数系数适用于特定区域,建议根据本地数据调整:
javascript复制var Wet = image.expression(
'0.151*B + 0.197*G + 0.328*R + 0.341*NIR - 0.711*SWIR1 - 0.457*SWIR2', {
'B': image.select('SR_B2'),
'G': image.select('SR_B3'),
'R': image.select('SR_B4'),
'NIR': image.select('SR_B5'),
'SWIR1': image.select('SR_B6'),
'SWIR2': image.select('SR_B7')
}).rename('WET');
当MODIS分辨率不足时,可采用Landsat地表温度反演:
javascript复制var lst = image.expression(
'(TIRS1 * 0.0003342 + 0.1) * 10 - 273.15', {
'TIRS1': image.select('ST_B10')
}).rename('LST');
javascript复制var pcaResults = ee.Image.cat([
ndvi, ndbsi, wet, lst
]).reduceRegion({
reducer: ee.Reducer.pca({
mean: true,
unitVariance: true
}),
geometry: roi,
scale: 1000,
maxPixels: 1e13
});
var pcImage = ee.Image.cat([
ndvi, ndbsi, wet, lst
]).subtract(pcaResults.get('mean'))
.matrixMultiply(pcaResults.get('rotation'));
javascript复制var visParams = {
min: -1,
max: 1,
palette: ['red', 'yellow', 'green']
};
Map.addLayer(pcImage.select('pc1'), visParams, 'PC1');
// 导出结果到Google Drive
Export.image.toDrive({
image: pcImage.select('pc1'),
description: 'RSEI_Export',
scale: 30,
region: roi,
maxPixels: 1e13
});
实际项目中,发现三个最容易出错的环节:研究区坐标格式错误、波段名称版本混淆、PCA前未做归一化处理。建议每次只运行一个代码块,使用print()输出中间结果验证。当遇到Computed value is too large错误时,尝试减小研究区范围或降低分辨率。