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

引言:为什么很多人觉得 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.Image、ee.ImageCollection、ee.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 实战的第一步。