1. 项目背景与核心价值
最近在整理遥感影像处理的工作流时,发现很多同行都在问同一个问题:如何快速实现大范围土地覆盖分类?传统方法需要下载海量影像、配置本地计算环境,光是数据准备就能耗掉大半个月。而Google Earth Engine(GEE)这个云端地理空间分析平台,正好能解决这些痛点。
我在实际项目中用Sentinel-2(S2)数据做过多次土地分类,总结出一套可直接复用的代码框架。这个方案有三大优势:
- 直接调用GEE云端存储的S2 L2A级数据(大气校正后产品)
- 利用GEE分布式计算能力,处理全国范围影像只需几分钟
- 内置机器学习算法,从特征提取到分类训练全流程自动化
重要提示:使用GEE需要先注册开发者账号(免费),建议使用Chrome浏览器并安装Earth Engine插件
2. 数据准备与预处理
2.1 Sentinel-2数据筛选
在GEE中调用S2数据只需一行代码:
javascript复制var s2 = ee.ImageCollection('COPERNICUS/S2_SR_HARMONIZED');
但实际应用中需要添加多个过滤条件:
javascript复制var filtered = s2
.filterDate('2023-01-01', '2023-12-31') // 时间范围
.filterBounds(geometry) // 空间范围
.filter(ee.Filter.lt('CLOUDY_PIXEL_PERCENTAGE', 20)) // 云量阈值
.select(['B2','B3','B4','B8','B11','B12']); // 波段选择
波段选择经验:
- 必选波段:B4(红)、B8(近红外)用于计算NDVI
- 推荐组合:B11/B12(短波红外)对建筑/水体敏感
- 分辨率匹配:建议统一用20m分辨率波段
2.2 影像合成与增强
多时相影像中值合成能有效去除异常值:
javascript复制var composite = filtered.median()
.clip(geometry);
添加常用指数特征:
javascript复制// NDVI计算
var ndvi = composite.normalizedDifference(['B8','B4']).rename('NDVI');
// NDWI计算
var ndwi = composite.normalizedDifference(['B3','B8']).rename('NDWI');
3. 分类模型构建
3.1 训练样本准备
GEE支持多种样本采集方式:
javascript复制var samples = ee.FeatureCollection([
// 耕地样本
ee.Feature(geometry, {'class': 0}),
// 林地样本
ee.Feature(geometry, {'class': 1}),
// ...其他类型
]);
样本采集技巧:
- 使用GEE内置的全球土地覆盖数据辅助采样
- 每类至少50个样本点(建议100+)
- 通过
stratifiedSample方法保证样本均衡
3.2 分类器训练
随机森林是最稳定的选择:
javascript复制var classifier = ee.Classifier.smileRandomForest(10)
.train({
features: samples,
classProperty: 'class',
inputProperties: ['B2','B3','B4','B8','B11','B12','NDVI','NDWI']
});
参数调优建议:
- 树数量:10-100(复杂度与精度平衡)
- 变量重要性:通过
explain()方法查看各波段贡献度 - 验证集划分:建议30%样本用于验证
4. 分类实施与后处理
4.1 执行分类
javascript复制var classified = composite.addBands([ndvi,ndwi])
.classify(classifier);
4.2 结果优化
javascript复制// 多数滤波去噪
var smoothed = classified.focal_mode({radius: 3});
// 小斑块去除
var cleaned = smoothed.connectedPixelCount(100)
.where(smoothed.lte(50), 0);
5. 常见问题解决方案
5.1 分类精度低
- 现象:验证集OA<80%
- 排查:
- 检查样本代表性(通过
sampleRegions导出样本统计) - 尝试添加纹理特征(GLCM)
- 调整分类器参数(增加树深度)
- 检查样本代表性(通过
5.2 计算内存溢出
- 报错:User memory limit exceeded
- 解决:
javascript复制// 分块处理 Export.image.toAsset({ image: classified, description: 'batch_export', region: geometry, scale: 20, maxPixels: 1e13 });
5.3 时序分类不稳定
- 方案:
- 使用
qualityMosaic替代median - 添加季节性特征(如季度NDVI均值)
- 采用时间序列分类器(如CART)
- 使用
6. 完整代码框架
javascript复制// 1. 数据准备
var s2 = ee.ImageCollection('COPERNICUS/S2_SR_HARMONIZED');
var filtered = s2.filterDate(...).filterBounds(...);
var composite = filtered.median();
// 2. 特征工程
var ndvi = composite.normalizedDifference(['B8','B4']);
var features = composite.addBands([ndvi]);
// 3. 样本与模型
var samples = ee.FeatureCollection(...);
var classifier = ee.Classifier.smileRandomForest(10).train(...);
// 4. 分类与输出
var classified = features.classify(classifier);
Export.image.toDrive(...);
实际部署时发现,用clip替代filterBounds能减少边缘锯齿现象。另外建议将训练好的分类器保存到Asset,方便后续调用:
javascript复制// 保存模型
ee.batch.Export.table.toAsset({
collection: ee.FeatureCollection(classifier),
description: 'model_export',
assetId: 'users/yourname/classifier_model'
});