Google Earth Engine?云端遥感怎么跑?
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 适合跑哪些遥感任务
在 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 中,影像通常以 Image 和 ImageCollection 的形式存在。单景影像是 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 地图窗口为了快速显示,会根据缩放级别动态取样。预览很快,不代表导出全分辨率影像也会很快。正式导出前,应检查 scale、region、crs 和 maxPixels。
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 学习者和项目工程师的工作方式。