2. Google Earth Engine平台与数据资源入门
Google Earth Engine(GEE)之所以能支撑大范围、长时序的矿区变化检测,核心在于它把“海量遥感数据”和“云端并行计算”放在同一个环境里。要真正用起来,第一步不是写复杂算法,而是理解它的工作界面、核心数据对象,以及如何从公开数据集中准确检索并筛选出矿区需要的影像。本节围绕这三件事展开,目标是让你能独立完成“打开编辑器—认识对象—检索数据—筛选影像”的完整入门链路。
Code Editor界面:代码、地图与任务的三区结构
GEE的Code Editor是一个浏览器端集成开发环境,界面可以理解为三个协同区域。左侧是脚本区,用于编写JavaScript代码,支持保存到个人仓库(Repository)和共享;中间是地图区,默认显示全球底图,代码执行后的图层会叠加其上,支持缩放、图层透明度调整和像素值探查;右侧是控制台与任务区,Console输出打印信息,Tasks管理导出任务,Profiler查看计算耗时。顶部还有搜索框,可直接检索数据集、地物或坐标。
实际使用中有一个关键习惯:每次运行代码后,先看Console是否报错,再看地图图层是否按预期渲染。GEE采用惰性计算,即代码中构造的对象只是“描述”,真正计算发生在print()、Map.addLayer()或导出任务执行时。理解这一点,才能明白为什么有时“代码没报错但地图没变化”——很可能只是没有触发渲染。此外,地图区右上角的图层列表可以单独关闭某个图层,便于对比不同筛选条件下的影像效果。
Image与ImageCollection:GEE的两个核心数据对象
GEE中所有栅格数据都围绕两个对象组织。Image表示单幅影像,由若干波段(band)组成,每个波段是一个二维栅格,附带元数据(如时间、云量、轨道号)。例如一幅Landsat 8影像包含SR_B1至SR_B7等波段。ImageCollection表示影像集合,是一个按时间或空间组织的Image序列,可以理解为“带时间维的影像栈”。矿区时序分析几乎都从ImageCollection出发,再通过筛选、映射(map)和归约(reduce)得到结果。
两个对象常用的操作逻辑不同。对Image,常用select()选波段、clip()裁剪到矿区边界、normalizedDifference()计算指数;对ImageCollection,常用filterDate()按时间筛选、filterBounds()按空间筛选、filter()按元数据条件筛选,再用map()对每幅影像批量处理。下面的SVG梳理了从数据集检索到影像筛选、再到单幅影像处理的对象流转关系,可作为操作时的对照图。
矿区常用公开数据集的检索与筛选
矿区变化检测常用的四类数据集各有特点,检索时需关注不同的元数据字段。Landsat系列(Landsat 8/9的LANDSAT/LC08/C02/T1_L2和LC09)时间跨度长、空间分辨率30米,适合长时序分析,筛选时重点控制CLOUD_COVER和DATE_ACQUIRED。Sentinel-2(COPERNICUS/S2_SR_HARMONIZED)分辨率10米,重访周期约5天,适合精细变化检测,但需注意云量和QA60波段的质量筛选。Sentinel-1(COPERNICUS/S1_GRD)为SAR数据,不受云雨影响,适合多云地区,筛选时要区分instrumentMode(IW模式)和orbitProperties_pass(升轨/降轨)。SRTM(USGS/SRTMGL1_003)为单幅高程数据,主要用于地形校正和坡度分析,直接按矿区边界裁剪即可。
下面是一段可直接在Code Editor中运行的示例代码,演示从检索到筛选的完整过程。示例以某矿区边界mineBoundary为空间范围,参数为教学假设值:
// 1. 定义矿区边界(示例:假设已导入的FeatureCollection)
var mineBoundary = geometry; // 实际使用时替换为矿区矢量边界
// 2. 检索Landsat 8/9地表反射率集合
var landsat = ee.ImageCollection('LANDSAT/LC08/C02/T1_L2')
.merge(ee.ImageCollection('LANDSAT/LC09/C02/T1_L2'))
.filterDate('2015-01-01', '2024-12-31')
.filterBounds(mineBoundary)
.filter(ee.Filter.lt('CLOUD_COVER', 20));
// 3. 检索Sentinel-2并做云量筛选
var s2 = ee.ImageCollection('COPERNICUS/S2_SR_HARMONIZED')
.filterDate('2019-01-01', '2024-12-31')
.filterBounds(mineBoundary)
.filter(ee.Filter.lt('CLOUDY_PIXEL_PERCENTAGE', 10));
// 4. 检索Sentinel-1,区分升降轨
var s1 = ee.ImageCollection('COPERNICUS/S1_GRD')
.filterDate('2020-01-01', '2024-12-31')
.filterBounds(mineBoundary)
.filter(ee.Filter.eq('instrumentMode', 'IW'))
.filter(ee.Filter.eq('orbitProperties_pass', 'DESCENDING'));
// 5. 打印集合大小,判断筛选是否合理
print('Landsat影像数量', landsat.size());
print('Sentinel-2影像数量', s2.size());
print('Sentinel-1影像数量', s1.size());
// 6. 取第一幅影像裁剪到矿区并加载显示
var firstImage = landsat.first().clip(mineBoundary);
Map.centerObject(mineBoundary, 12);
Map.addLayer(firstImage, {bands: ['SR_B4','SR_B3','SR_B2'], min: 0, max: 3000}, 'Landsat真彩色');
运行后,Console会输出各集合的影像数量。这个数字是判断筛选条件是否合理的第一手依据:如果Landsat数量为0,通常是时间范围、空间范围或云量阈值过严;如果数量过大(例如数千幅),说明云量阈值过松或未做空间裁剪,后续处理会变慢。地图区则用于直观检查影像是否覆盖矿区、是否有明显云遮挡。需要强调的是,上述参数均为教学示例,实际矿区应根据当地云雨季节调整时间窗口,例如南方多云矿区可将云量阈值放宽到30%并配合后续去云算法。
print(collection.size())确认数量,再用Map.addLayer(collection.first())快速预览,最后才进入批量处理。这个“先看数量、再看单幅、后做批量”的顺序能显著减少无效计算。理解Image与ImageCollection的分工,是后续所有时序分析的基础:ImageCollection负责“把时间序列组织起来”,Image负责“把单幅影像的波段和指数算清楚”。矿区变化检测中常见的NDVI、NDWI、裸地指数等,都是先对ImageCollection做map()批量计算,再归约为时间序列。掌握本节的对象关系与筛选参数,就具备了进入下一阶段时序分析的操作基础。