Google Earth Engine?云端遥感怎么跑?

GIS基础理论
Dr.GIS
wowwwai GIS研习社 · 工具流程与项目排障

Google Earth Engine?云端遥感怎么跑? 这个问题通常出现在第一次接触遥感批处理的同学或 GIS 工程师身上:本地电脑跑不动 Landsat、Sentinel-2 或 MODIS 数据,下载影像又慢,于是想知道能不能直接在云端完成筛选、去云、指数计算、统计和导出。答案是可以,但前提是你要理解 Google Earth Engine 的数据组织、计算方式和常见限制。

引言:为什么要用 Google Earth Engine 跑云端遥感

传统遥感处理流程通常是先下载影像,再用 ENVI、ArcGIS Pro、QGIS、Python 或 GDAL 在本地处理。这个流程适合小范围、少量影像,但一旦遇到多年序列、大区域、多景影像合成,本地处理就会很容易卡在三个地方:数据下载、磁盘存储和计算时间。

Google Earth Engine,通常简称 GEE,是一个面向地理空间分析的云端平台。它内置了大量遥感影像和地理数据集,用户可以通过 JavaScript 或 Python API 在云端调用数据、编写处理逻辑,并将结果导出为 GeoTIFF、表格或在线地图图层。

对 GIS 读者来说,GEE 最适合解决这类问题:

  • 不想下载大量 Sentinel-2、Landsat 或 MODIS 原始影像。
  • 需要快速计算 NDVI、NDWI、NDBI 等遥感指数。
  • 需要做多时相影像合成、年度变化分析或区域统计。
  • 本地电脑配置一般,但希望处理较大范围的遥感数据。
  • 需要把结果导出到 QGIS、ArcGIS Pro 或 WebGIS 项目中继续使用。
Google Earth Engine云端遥感处理流程和GEE遥感指数计算示意图
Google Earth Engine 云端遥感的典型流程:选数据、设范围、去云、计算指数、统计分析、导出结果。

背景:Google Earth Engine 适合跑哪些遥感任务

在 GIS 项目中,GEE 的优势不是替代所有桌面 GIS 软件,而是把“海量遥感数据读取与批量计算”这部分搬到云端。你仍然可以把最终成果下载到本地,在 QGIS 或 ArcGIS Pro 中制图、检查投影、叠加矢量边界和出图。

常见的 GEE 云端遥感任务包括:

  • 影像筛选:按时间、空间范围、云量、传感器筛选影像。
  • 影像合成:对多景影像做中值合成、均值合成、最大 NDVI 合成。
  • 遥感指数计算:计算 NDVI、NDWI、NDBI、EVI 等指数。
  • 土地覆盖分析:基于分类产品或训练样本进行监督分类。
  • 区域统计:按行政区、流域、网格或样区统计均值、面积、最大值和最小值。
  • 变化检测:对比不同时期影像或指数,分析植被、水体、建设用地变化。
  • 结果导出:导出 GeoTIFF、CSV、Shapefile 兼容表格或 Asset 数据。

如果你的任务只是打开一景影像、裁剪一个小范围、简单调色,本地 QGIS 或 ArcGIS Pro 已经足够。如果你要处理一个城市十年的 Sentinel-2 影像,GEE 的效率和数据获取便利性会明显更适合。

原理:GEE 云端遥感怎么跑

理解 Google Earth Engine 云端遥感,关键要抓住三个概念:数据集合、延迟计算和服务器端对象。

1. 数据集合:不是下载文件,而是调用数据集

在 GEE 中,影像通常以 ImageImageCollection 的形式存在。单景影像是 Image,多景影像集合是 ImageCollection。例如 Sentinel-2 表面反射率数据就是一个影像集合,你可以按时间、区域和云量过滤它。

这和本地 GIS 最大的区别是:你通常不需要先把所有影像下载到电脑,而是在代码中引用数据集 ID,让 GEE 在云端完成读取和筛选。

2. 延迟计算:写代码不等于马上计算

GEE 采用延迟计算机制。你在脚本中写的过滤、裁剪、波段运算、合成等操作,很多时候只是构建了一个计算流程。只有当你把结果显示到地图、打印统计结果,或执行导出任务时,系统才会真正开始计算。

这也是很多新手困惑的地方:代码看起来已经运行了,但导出任务还需要在 Tasks 面板中手动启动;地图预览快,不代表全分辨率导出也一定快。

3. 服务器端对象:不要用本地 Python 思维直接套

GEE 中的 ee.Image、ee.FeatureCollection、ee.Number、ee.List 等对象主要在服务器端计算。你不能把它们完全当成本地 JavaScript 数组或 Python 列表使用。需要客户端取值时,通常要谨慎使用 evaluate 或 getInfo。

实用理解:GEE 不是“远程桌面版 GIS 软件”,而是“用代码描述遥感计算流程,让云端服务器执行”。

步骤:用 Google Earth Engine 计算 Sentinel-2 NDVI

下面用一个最常见的例子说明 GEE 遥感指数计算流程:在指定区域内筛选 Sentinel-2 影像,进行简单去云,计算 NDVI,并导出 GeoTIFF。这个流程适合初学者理解 Google Earth Engine 云端遥感怎么跑。

步骤 1:准备研究区

最简单的方法是在 GEE Code Editor 左侧的 Geometry 工具中手动画一个多边形,命名为 roi。如果你有行政区边界、项目区红线或样区矢量,也可以上传为 Asset 后调用。

研究区需要注意两点:

  • 范围不要一开始就画得过大,建议先用小区域测试代码。
  • 边界坐标应尽量准确,避免因为投影或坐标系错误导致影像裁剪位置不对。

步骤 2:筛选 Sentinel-2 影像

以下代码适用于 GEE JavaScript Code Editor。它按研究区、时间范围和云量筛选 Sentinel-2 表面反射率影像。

var roi = geometry;

Map.centerObject(roi, 10);

var s2 = ee.ImageCollection('COPERNICUS/S2_SR_HARMONIZED')
  .filterBounds(roi)
  .filterDate('2023-06-01', '2023-09-30')
  .filter(ee.Filter.lt('CLOUDY_PIXEL_PERCENTAGE', 20));

print('Sentinel-2 image count:', s2.size());

这里的 COPERNICUS/S2_SR_HARMONIZED 是 Sentinel-2 表面反射率数据集。表面反射率数据通常比顶层大气反射率更适合地表指数计算。

步骤 3:编写简单去云函数

Sentinel-2 数据包含质量波段和场景分类信息。为了让初学者先跑通流程,可以使用 SCL 场景分类波段做基础掩膜,去掉云、云影等像元。

function maskS2Clouds(image) {
  var scl = image.select('SCL');

  var mask = scl.neq(3)
    .and(scl.neq(8))
    .and(scl.neq(9))
    .and(scl.neq(10))
    .and(scl.neq(11));

  return image.updateMask(mask)
    .divide(10000)
    .copyProperties(image, ['system:time_start']);
}

var s2Masked = s2.map(maskS2Clouds);

这段代码中,SCL 是场景分类波段。不同数值代表云影、云、中高概率云、卷云、雪等类别。通过掩膜可以减少云对 NDVI 结果的影响。

步骤 4:计算 NDVI

NDVI 的公式是:

NDVI = (NIR - Red) / (NIR + Red)

在 Sentinel-2 中,近红外波段通常使用 B8,红光波段使用 B4。GEE 提供了 normalizedDifference 方法,可以直接计算归一化差值指数。

function addNDVI(image) {
  var ndvi = image.normalizedDifference(['B8', 'B4']).rename('NDVI');
  return image.addBands(ndvi);
}

var s2Ndvi = s2Masked.map(addNDVI);

var ndviComposite = s2Ndvi.select('NDVI')
  .median()
  .clip(roi);

这里使用 median 做中值合成,可以在一定程度上减少异常像元影响。对于植被长势分析,中值合成是一个常见且稳健的选择。

步骤 5:显示 NDVI 结果

把 NDVI 添加到地图窗口,检查研究区位置、云掩膜效果和指数范围是否合理。

var ndviVis = {
  min: 0,
  max: 0.8,
  palette: ['white', 'yellow', 'green']
};

Map.addLayer(ndviComposite, ndviVis, 'Sentinel-2 NDVI Composite');

如果植被区域显示为绿色,裸地或建设用地偏浅,水体通常 NDVI 较低或为负值,说明结果大体合理。若整幅图颜色异常,需要检查波段、缩放系数、云掩膜和时间范围。

步骤 6:统计研究区 NDVI 均值

除了显示地图,很多 GIS 项目还需要输出统计值。下面的代码可以计算研究区内 NDVI 均值。

var meanNdvi = ndviComposite.reduceRegion({
  reducer: ee.Reducer.mean(),
  geometry: roi,
  scale: 10,
  maxPixels: 1e13
});

print('Mean NDVI:', meanNdvi);

scale 表示统计分辨率,Sentinel-2 常用 10 米。范围较大时,统计会更耗时;如果只是快速预览,可以先用 30 米或 100 米测试。

步骤 7:导出 GeoTIFF 到 Google Drive

GEE 计算完成后,可以把结果导出为 GeoTIFF,再下载到本地,在 QGIS 或 ArcGIS Pro 中继续分析和制图。

Export.image.toDrive({
  image: ndviComposite,
  description: 's2_ndvi_2023_composite',
  folder: 'GEE_exports',
  fileNamePrefix: 's2_ndvi_2023_composite',
  region: roi,
  scale: 10,
  crs: 'EPSG:4326',
  maxPixels: 1e13
});

执行代码后,右侧 Tasks 面板会出现导出任务。你需要点击 Run,确认导出参数后任务才会真正开始。

常见坑:GEE 遥感处理最容易错在哪里

1. 只筛云量,不做像元级去云

CLOUDY_PIXEL_PERCENTAGE 是整景影像的云量属性,不代表研究区内一定无云。比如整景云量 10%,但云刚好覆盖你的研究区,NDVI 仍然会异常。因此,筛云量只是第一步,最好再结合 SCL、QA 波段或云概率数据做像元级去云。

2. 忘记反射率缩放系数

很多遥感数据的原始像元值不是 0 到 1 的真实反射率,而是经过缩放的整数值。Sentinel-2 表面反射率常见处理是除以 10000。如果不处理缩放系数,部分指数计算可能仍然形式上能跑,但后续阈值判断、统计解释会出问题。

3. 把地图预览当成最终精度

GEE 地图窗口为了快速显示,会根据缩放级别动态取样。预览很快,不代表导出全分辨率影像也会很快。正式导出前,应检查 scaleregioncrsmaxPixels

4. 研究区过大导致导出失败

如果一次导出一个省、多年逐月影像或超高分辨率结果,任务可能运行很久甚至失败。建议按年份、行政区、网格或瓦片分批导出。

5. 混用客户端和服务器端对象

初学者常把 ee.List 当作 JavaScript 数组,把 ee.Number 当作普通数字,这会导致类型错误。简单判断方法是:凡是以 ee. 开头创建的对象,大多需要用 GEE 的服务器端方法处理。

6. 忽略坐标系和分辨率

导出 GeoTIFF 后,如果要和本地矢量、DEM、土地利用数据叠加,应检查坐标系、像元大小和范围。尤其是在面积统计、分区统计和栅格叠加时,不同投影会影响结果解释。

方法比较:GEE、QGIS、ArcGIS Pro 和 Python 怎么选

方法 适合场景 优势 限制
Google Earth Engine 大范围、多时相、批量遥感分析 数据丰富,不必大量下载,云端计算方便 需要写代码,导出任务有配额和任务限制
QGIS 本地制图、裁剪、检查、插件处理 开源免费,适合结果检查和地图制作 处理海量遥感数据时依赖本地硬件
ArcGIS Pro 企业 GIS、制图、空间分析和影像管理 工具链完整,适合规范化项目流程 软件授权和本地资源成本较高
Python GIS 自动化脚本、批处理、模型集成 灵活,可结合 Rasterio、GeoPandas、GDAL、Xarray 需要配置环境和管理本地数据

一个实用组合是:用 GEE 做遥感数据筛选、合成和指数计算;用 QGIS 或 ArcGIS Pro 检查结果、叠加本地数据和出图;用 Python 做后续批处理或模型分析。这样既能利用云端数据和算力,也能保留桌面 GIS 的制图与数据管理优势。

检查清单:跑 GEE 云端遥感前先确认这些参数

  • 研究区:边界是否正确,是否过大,是否存在坐标偏移。
  • 数据集:是否选择了合适的传感器和处理级别,例如 Sentinel-2 表面反射率。
  • 时间范围:是否符合研究目标,例如生长季、枯水期、年度合成。
  • 云处理:是否同时考虑影像级云量和像元级云掩膜。
  • 波段选择:NDVI 是否使用近红外和红光波段,NDWI 是否使用正确的绿光和近红外或短波红外组合。
  • 缩放系数:反射率数据是否需要除以 10000 或应用数据说明中的比例因子。
  • 合成方法:使用 median、mean、max 还是 qualityMosaic,是否符合业务含义。
  • 统计尺度:scale 是否与数据分辨率和分析精度匹配。
  • 导出参数:是否设置了 region、scale、crs、fileNamePrefix 和 maxPixels。
  • 结果验证:是否在 QGIS 或 ArcGIS Pro 中检查坐标系、范围、像元值和可视化效果。

FAQ:Google Earth Engine 云端遥感常见问题

1. Google Earth Engine 需要安装软件吗?

如果使用 GEE Code Editor,通常只需要浏览器即可编写和运行 JavaScript 脚本。若使用 Python API,则需要在本地或云端 Python 环境中安装 earthengine-api,并完成账号认证。

2. GEE 可以直接替代 QGIS 或 ArcGIS Pro 吗?

不建议这样理解。GEE 更擅长云端遥感数据处理和大规模计算,QGIS 与 ArcGIS Pro 更擅长本地数据管理、精细制图、人工检查和复杂 GIS 项目组织。实际项目中经常是组合使用。

3. 为什么我的 GEE 导出任务很慢?

常见原因包括研究区太大、分辨率太高、时间序列太长、计算链过于复杂,或者同时提交任务过多。可以先缩小研究区测试,再按区域或时间分批导出。

4. GEE 计算 NDVI 一定要去云吗?

建议去云。云、云影、雪和薄云会明显影响 NDVI。即使已经按云量筛选影像,也应该尽量做像元级掩膜,否则局部区域的指数结果可能不可靠。

5. GEE 导出的 GeoTIFF 能在 QGIS 中打开吗?

可以。通过 Export.image.toDrive 导出的 GeoTIFF 通常可以在 QGIS、ArcGIS Pro、ENVI 和 Python Rasterio 中打开。打开后建议检查坐标系、像元大小、NoData 和数值范围。

6. Google Earth Engine 适合做土地利用分类吗?

适合入门和中等规模分类任务。GEE 支持随机森林等常见分类器,也支持样本训练、分类、精度评价和结果导出。但分类质量仍取决于样本质量、特征选择、时间范围和验证方法。

7. 为什么代码能显示地图,但导出时报错?

地图显示通常是低分辨率动态预览,而导出会按你指定的 region、scale 和 crs 生成完整栅格。如果导出范围太大、像元数过多或数据类型不合适,就可能报错。可以先降低分辨率或缩小范围测试。

结论:先跑通小流程,再扩展到真实项目

Google Earth Engine 云端遥感的核心思路是:在云端调用遥感数据集,用代码描述筛选、去云、指数计算、合成、统计和导出流程。它特别适合处理多时相、大范围和批量遥感任务。

初学者不要一开始就做全国多年序列分析。更稳妥的做法是先选一个小研究区,跑通 Sentinel-2 NDVI 计算流程,确认影像筛选、云掩膜、指数结果和导出参数都正确,再逐步扩展到更大范围和更复杂任务。

如果你已经熟悉 QGIS 或 ArcGIS Pro,可以把 GEE 理解为云端遥感预处理和批量计算平台。用 GEE 处理数据,用桌面 GIS 检查和制图,这通常是最适合 GIS 学习者和项目工程师的工作方式。