GEE数据处理代码不会写?手把手教你GIS数据云端分析(含:完整脚本)

编程与开发
Dr.GIS
wowwwai GIS研习社 · 工具流程与项目排障

如果你正在搜索“GEE数据处理代码不会写?手把手教你GIS数据云端分析(含:完整脚本)”,大概率不是不会点按钮,而是卡在 Google Earth Engine 的 JavaScript 语法、影像筛选、云掩膜、指数计算和结果导出这些关键环节。本文用一个可复现的案例,带你完成一次典型的 GEE数据处理:获取 Sentinel-2 影像、去云、计算 NDVI、按研究区统计并导出结果。

GEE数据处理代码不会写和GEE云端分析流程示意图
GEE数据处理的基本流程:从研究区和影像筛选开始,到指数计算、统计分析和结果导出结束。

引言:为什么很多人觉得 GEE数据处理代码不会写

Google Earth Engine,简称 GEE,是一个面向遥感和 GIS 的云端地理空间分析平台。它最大的优势是不用把大量影像下载到本地,就可以直接调用云端影像库进行分析。

但对很多 GIS 初学者来说,真正的难点不是平台本身,而是代码工作流不熟:不知道影像集合怎么筛选,不知道云掩膜怎么写,不知道 NDVI 结果怎么导出,也不确定脚本运行后是否正确。

本文不讲抽象概念,而是围绕一个常见任务展开:使用 GEE 对指定区域进行 Sentinel-2 影像筛选、云掩膜、NDVI 计算、地图显示和结果导出。如果你会一点 GIS 基础,但还不会写 GEE 脚本,可以直接跟着操作。

背景:本文要解决的 GEE云端分析任务

本文案例的目标是完成一次完整的 GEE云端分析

  • 选择一个研究区。
  • 调用 Sentinel-2 SR Harmonized 地表反射率数据。
  • 按时间、范围、云量筛选影像。
  • 进行云和卷云掩膜。
  • 计算 NDVI 植被指数。
  • 显示真彩色合成图和 NDVI 图层。
  • 统计研究区平均 NDVI。
  • 导出 NDVI 栅格到 Google Drive。

这个任务覆盖了 GEE数据处理 中最常用的几个环节。掌握这个模板后,你可以把 NDVI 替换成 NDWI、NDBI、EVI,也可以把 Sentinel-2 换成 Landsat 或 MODIS。

原理:GEE数据处理脚本到底在做什么

在写脚本之前,先理解三个核心对象。

1. Geometry:研究区范围

Geometry 表示空间范围,可以是点、线、面,也可以是你上传的矢量边界。本文为了方便复现,直接在代码中构造一个矩形研究区。实际项目中,你可以替换为自己的行政区、流域、样地或项目红线。

2. ImageCollection:影像集合

ImageCollection 是一组影像。例如 Sentinel-2 的某个数据集包含大量不同时间、不同轨道、不同覆盖范围的影像。GEE数据处理通常不是直接处理单景影像,而是先对影像集合进行筛选。

常用筛选条件包括:

  • filterBounds:按研究区筛选。
  • filterDate:按日期筛选。
  • filter:按属性筛选,例如云量。
  • map:对集合中每一景影像执行同一个函数,例如云掩膜或指数计算。

3. Image:单幅影像或合成影像

Image 表示一幅栅格影像。我们可以对它做波段运算、裁剪、显示、统计和导出。比如 NDVI 就是利用近红外波段和红光波段计算得到的新影像。

NDVI 的公式为:

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

对于 Sentinel-2,常用波段对应关系是:

  • B8:近红外波段 NIR。
  • B4:红光波段 RED。

步骤:完整 GEE数据处理脚本与操作流程

步骤一:打开 GEE Code Editor

进入 GEE Code Editor 后,新建一个脚本。左侧是资源和脚本管理区,中间是代码编辑区,右侧是控制台和任务导出区,底部或中间区域是地图显示窗口。

如果你是第一次使用 GEE,需要先申请并开通 Earth Engine 访问权限。开通后即可使用 Code Editor 编写 JavaScript 脚本。

步骤二:复制完整脚本

下面这段脚本可以直接复制到 GEE Code Editor 中运行。它完成了研究区设置、Sentinel-2 筛选、云掩膜、NDVI 计算、可视化、区域统计和导出。

// ===============================
// GEE数据处理示例:Sentinel-2 NDVI云端分析
// 作者:Dr.GIS
// 功能:影像筛选、云掩膜、NDVI计算、统计和导出
// ===============================

// 1. 设置研究区
// 这里使用一个矩形区域作为示例,可替换为自己的矢量边界
var roi = ee.Geometry.Rectangle([116.15, 39.75, 116.65, 40.10]);

Map.centerObject(roi, 10);
Map.addLayer(roi, {color: 'red'}, '研究区 ROI');

// 2. 设置时间范围
var startDate = '2023-06-01';
var endDate = '2023-09-30';

// 3. Sentinel-2 SR Harmonized 云掩膜函数
function maskS2clouds(image) {
  // QA60 波段包含云和卷云信息
  var qa = image.select('QA60');

  // bit 10 表示云,bit 11 表示卷云
  var cloudBitMask = 1 << 10;
  var cirrusBitMask = 1 << 11;

  // 两个标记都为0,表示非云区域
  var mask = qa.bitwiseAnd(cloudBitMask).eq(0)
      .and(qa.bitwiseAnd(cirrusBitMask).eq(0));

  // Sentinel-2 SR 数据缩放系数通常为10000
  return image.updateMask(mask)
      .divide(10000)
      .copyProperties(image, ['system:time_start']);
}

// 4. 读取并筛选 Sentinel-2 影像集合
var s2 = ee.ImageCollection('COPERNICUS/S2_SR_HARMONIZED')
  .filterBounds(roi)
  .filterDate(startDate, endDate)
  .filter(ee.Filter.lt('CLOUDY_PIXEL_PERCENTAGE', 30))
  .map(maskS2clouds);

print('筛选后的 Sentinel-2 影像数量', s2.size());

// 5. 生成中位数合成影像并裁剪到研究区
var composite = s2.median().clip(roi);

// 6. 显示真彩色影像
var trueColorVis = {
  bands: ['B4', 'B3', 'B2'],
  min: 0,
  max: 0.3
};

Map.addLayer(composite, trueColorVis, 'Sentinel-2 真彩色合成');

// 7. 计算 NDVI
var ndvi = composite.normalizedDifference(['B8', 'B4']).rename('NDVI');

// 8. 显示 NDVI
var ndviVis = {
  min: -0.2,
  max: 0.8,
  palette: ['blue', 'white', 'green']
};

Map.addLayer(ndvi, ndviVis, 'NDVI');

// 9. 统计研究区平均 NDVI
var meanNdvi = ndvi.reduceRegion({
  reducer: ee.Reducer.mean(),
  geometry: roi,
  scale: 10,
  maxPixels: 1e13
});

print('研究区平均 NDVI', meanNdvi);

// 10. 导出 NDVI 栅格到 Google Drive
Export.image.toDrive({
  image: ndvi,
  description: 'GEE_Sentinel2_NDVI_ROI',
  folder: 'GEE_Export',
  fileNamePrefix: 'sentinel2_ndvi_roi_2023',
  region: roi,
  scale: 10,
  crs: 'EPSG:4326',
  maxPixels: 1e13
});

步骤三:运行脚本并查看地图结果

点击 Code Editor 上方的 Run。运行后你应该能看到三个图层:

  • 研究区 ROI:红色边界,用于确认分析范围是否正确。
  • Sentinel-2 真彩色合成:用于检查影像是否有明显云、缺景或异常色彩。
  • NDVI:植被指数结果,绿色通常表示植被较高,蓝色或白色表示低值或非植被区域。

右侧 Console 中会输出筛选后的影像数量和研究区平均 NDVI。如果影像数量为 0,说明时间、区域或云量条件过于严格,需要调整参数。

步骤四:导出 NDVI 结果

脚本运行后,右侧 Tasks 面板会出现一个导出任务。点击 Run,确认导出参数后提交任务。任务完成后,结果会保存到 Google Drive 的 GEE_Export 文件夹中。

导出的 GeoTIFF 可以继续在 QGIS、ArcGIS Pro 或 Python 中使用。例如,你可以在 QGIS 中加载它,叠加行政边界,进一步做分区统计或制图输出。

常见坑:GEE数据处理代码不会写时最容易错在哪里

1. 影像数量为 0

如果 Console 输出影像数量为 0,常见原因有三个:

  • 研究区坐标写错,范围不在目标区域。
  • 时间范围太短,刚好没有可用影像。
  • 云量阈值太严格,例如设置为 5 以下。

排查时可以先放宽条件,例如把云量阈值改为 50,把时间范围扩展到半年或一年,再逐步收紧。

2. NDVI 显示一片空白

NDVI 空白通常与掩膜、波段名或可视化参数有关。Sentinel-2 中 NDVI 常用 B8 和 B4,如果误写成其他波段,结果可能不符合预期。

此外,如果云掩膜过强,研究区内有效像元太少,也会导致显示区域很少。可以先只显示真彩色合成影像,确认影像本身是否可用。

3. 忘记缩放系数

Sentinel-2 SR 数据的像元值通常需要除以 10000 转成反射率。如果不处理缩放系数,真彩色显示参数和后续指数分析都容易异常。

本文脚本在云掩膜函数中使用了 divide(10000)。如果你换用其他数据集,必须查看数据说明,确认是否需要缩放。

4. 导出时报 maxPixels 错误

大范围导出时,GEE 可能提示像元数量超限。可以通过以下方式处理:

  • 增大 maxPixels
  • 提高 scale,例如从 10 改为 30。
  • 缩小研究区。
  • 分区导出。

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

GEE 中很多对象是服务器端对象,例如 ee.Imageee.ImageCollectionee.Number。它们不能像普通 JavaScript 数字一样直接参与本地运算。

初学者只需要记住:大多数空间计算都交给 GEE 对象和函数处理,调试时使用 print 查看结果,不要频繁使用本地 JavaScript 的循环去处理影像像元。

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

方法 适合场景 优势 限制
GEE 大范围、多时相遥感数据处理 云端计算,内置大量公开影像数据,适合快速分析 需要学习 JavaScript 或 Python API,导出和任务有平台限制
QGIS 本地制图、矢量编辑、中小规模栅格处理 开源免费,插件丰富,适合教学和日常 GIS 工作 大规模遥感时序处理效率受本地硬件限制
ArcGIS Pro 企业级 GIS、制图、空间分析和项目交付 工具链完整,适合规范化生产流程 许可成本较高,大量遥感数据仍需本地存储和计算资源
Python GIS 自动化处理、批量分析、模型开发 灵活,可结合 GeoPandas、Rasterio、GDAL、xarray 等库 环境配置和性能优化门槛较高

如果你的核心任务是大范围、多年份、多景遥感影像处理,GEE数据处理通常更省时间。如果你的任务偏向精细制图、成果整饰和本地数据管理,可以把 GEE 导出的结果放到 QGIS 或 ArcGIS Pro 中继续处理。

检查清单:运行 GEE完整脚本前后要检查什么

运行前检查

  • 研究区坐标是否正确,是否覆盖目标区域。
  • 时间范围是否符合研究目的,例如生长季、汛期或年度统计。
  • 数据集是否选对,例如 Sentinel-2 SR、Landsat Collection 2 或 MODIS。
  • 波段名是否与数据集一致。
  • 云量阈值是否合理。

运行中检查

  • Console 是否有报错信息。
  • 影像数量是否大于 0。
  • 地图图层是否正常显示。
  • 真彩色影像是否存在明显云覆盖或缺景。
  • NDVI 颜色分布是否符合常识。

导出前检查

  • 导出区域 region 是否为研究区。
  • 分辨率 scale 是否符合数据源,例如 Sentinel-2 常用 10 米。
  • 坐标系 crs 是否符合后续软件使用要求。
  • 文件名是否包含区域、指标和时间信息。
  • 大范围导出时是否可能触发 maxPixels 限制。

FAQ:GEE数据处理常见问题

1. GEE数据处理一定要会 JavaScript 吗?

不一定。GEE 也支持 Python API,但 Code Editor 中最常用的是 JavaScript。对于 GIS 初学者,建议先掌握 JavaScript 版的基础模板,因为大多数官方示例和教程都基于 Code Editor。

2. 这段 GEE完整脚本可以直接换成自己的研究区吗?

可以。最简单的方法是修改 ee.Geometry.Rectangle 中的坐标。如果你已经有 Shapefile 或 GeoJSON,可以上传到 GEE Assets,然后用自己的矢量边界替换 roi

3. Sentinel-2 的 NDVI 为什么用 B8 和 B4?

NDVI 需要近红外和红光波段。Sentinel-2 中 B8 是近红外波段,B4 是红光波段,所以可以使用 normalizedDifference(['B8', 'B4']) 计算 NDVI。

4. GEE云端分析结果能不能用于论文或项目?

可以,但需要注意数据源、处理方法和精度说明。建议在论文或报告中写清楚数据集名称、时间范围、云掩膜方法、合成方法、空间分辨率和导出坐标系。

5. 为什么我导出的 NDVI 和地图上看到的不完全一样?

地图显示受到可视化参数影响,例如 min、max 和 palette;导出的 GeoTIFF 保存的是实际 NDVI 数值。两者一个是显示效果,一个是数据结果,不应简单等同。

6. 可以把 NDVI 改成 NDWI 或 NDBI 吗?

可以。你只需要替换指数公式和波段。例如 Sentinel-2 常见 NDWI 可以使用绿光和近红外波段,NDBI 常用短波红外和近红外波段。但不同指数有不同定义,使用前要确认公式和波段。

结论:先掌握一个 GEE数据处理模板,再扩展到更多 GIS 云端分析

学习 GEE 不建议一开始就追求复杂模型。更稳妥的方法是先掌握一个完整模板:研究区、影像集合、筛选、云掩膜、合成、指数计算、统计和导出。

本文提供的脚本已经覆盖了 GEE数据处理的核心流程。你可以先直接运行,再逐步修改研究区、时间范围、数据源和指数公式。只要理解每一步的作用,后续做土地覆盖变化、植被监测、水体提取、城市扩张分析都会更顺手。

对于 GIS 学生、入门工程师和空间数据分析人员来说,GEE云端分析的价值不只是“省去下载数据”,更重要的是把遥感数据处理流程标准化、脚本化和可复现。先把这套完整脚本跑通,就是进入 GEE 实战的第一步。