GEE实战:用Sentinel-2 2A级数据做地表覆盖分类,完整代码与避坑指南

张开发
2026/4/15 11:58:16 15 分钟阅读

分享文章

GEE实战:用Sentinel-2 2A级数据做地表覆盖分类,完整代码与避坑指南
GEE实战用Sentinel-2 2A级数据做地表覆盖分类完整代码与避坑指南当我们需要监测森林砍伐、城市扩张或农作物生长时地表覆盖分类是最基础也最关键的遥感应用之一。相比传统的1C级数据Sentinel-2的2A级产品经过大气校正反射率更接近地表真实情况特别适合需要精确量化分析的场景。本文将带你从零开始完成一个端到端的地表覆盖分类项目过程中会特别关注那些容易被忽略但影响结果的关键细节。1. 数据准备与预处理1.1 选择合适的数据集在GEE中调用2A级数据非常简单var s2 ee.ImageCollection(COPERNICUS/S2_SR);但直接使用原始数据会遇到几个典型问题云遮挡QA60波段包含云掩膜信息缩放因子反射率值被存储为整数需要除以10000无效值处理后的像素可能包含异常值这里推荐一个经过实战检验的预处理函数function preprocessS2(image) { // 云掩膜 var qa image.select(QA60); var cloudBitMask 1 10; var cirrusBitMask 1 11; var mask qa.bitwiseAnd(cloudBitMask).eq(0) .and(qa.bitwiseAnd(cirrusBitMask).eq(0)); // 应用缩放因子并裁剪有效范围 var scaled image.select(B.*).divide(10000) .updateMask(mask) .clamp(0, 1); // 添加NDVI等常用指数 var ndvi scaled.normalizedDifference([B8, B4]).rename(NDVI); return scaled.addBands(ndvi); }1.2 时空筛选策略合理的筛选条件能显著提高数据质量筛选条件推荐值说明时间范围生长季(6-9月)植被特征明显云量阈值20%平衡数据量与质量太阳高度角30度避免阴影影响空间覆盖研究区≥80%确保完整覆盖实现代码示例var filtered s2.filterDate(2022-06-01, 2022-09-30) .filter(ee.Filter.lt(CLOUDY_PIXEL_PERCENTAGE, 20)) .filterBounds(geometry) .map(preprocessS2);2. 特征工程与样本设计2.1 构建特征集除了原始波段建议添加这些衍生特征光谱指数NDVI植被健康度NDWI水体检测NDBI建筑指数纹理特征GLCM对比度熵值时序特征季度中值季节性变化幅度计算纹理特征的示例function addTexture(image) { var gray image.select(B8).multiply(10000).toInt(); var glcm gray.glcmTexture({size: 3}); return image.addBands(glcm.select(B8_contrast)); }2.2 样本采集技巧样本质量决定分类上限注意类别平衡每类至少100个样本点空间分布均匀覆盖研究区时间一致性与影像日期匹配混合像素避开地类边界创建样本的推荐方式var samples ee.FeatureCollection([ // 森林样本 ee.Feature(geometry, {class: 0}), // 水体样本 ee.Feature(geometry, {class: 1}), // ...其他类别 ]);3. 模型训练与优化3.1 随机森林实现GEE内置的随机森林分类器简单高效var classifier ee.Classifier.smileRandomForest(50) .train({ features: samples, classProperty: class, inputProperties: [B2,B3,B4,B8,NDVI] });关键参数调优建议参数默认值优化范围影响树数量5020-100精度与效率平衡变量数sqrt(特征数)特征数/3防止过拟合节点大小51-10模型复杂度3.2 精度验证方法避免常见的数据泄露问题空间分块验证将研究区划分为网格时间交叉验证使用不同年份数据独立验证集30%样本留作验证精度评估代码var validation classified.sampleRegions({ collection: testSamples, properties: [class], scale: 10 }); var matrix validation.errorMatrix(class, classification); print(总体精度:, matrix.accuracy()); print(Kappa系数:, matrix.kappa());4. 后处理与结果优化4.1 分类结果平滑原始分类常存在椒盐噪声推荐使用众数滤波3x3或5x5窗口形态学操作先腐蚀后膨胀实现示例var smoothed classified.focal_mode(3).rename(smoothed);4.2 不确定性分析识别低置信度区域var probs classified.select(.*probability); var uncertainty probs.reduce(ee.Reducer.max()).subtract(probs.reduce(ee.Reducer.sum()));4.3 结果导出策略批量导出时注意分块处理大区域切分网格压缩优化LZW或DEFLATE元数据添加分类说明导出配置示例Export.image.toDrive({ image: classified, description: LandCover_2022, scale: 10, region: geometry, maxPixels: 1e13, fileFormat: GeoTIFF, formatOptions: { quality: 90 } });5. 典型问题解决方案在实际项目中这些坑我至少各踩过一次DN值异常2022年后1C级数据需要改用S2_HARMONIZED集合内存溢出使用batch()分批处理大数据量投影偏差统一使用EPSG:4326坐标系统季节影响冬季影像可能误判落叶林为裸土一个实用的调试技巧是添加临时可视化Map.addLayer(classified.randomVisualizer(), {}, 临时分类结果);最后分享一个完整的端到端脚本框架// 1. 数据准备 var s2 ee.ImageCollection(COPERNICUS/S2_SR); var filtered s2.filterDate(...).map(preprocessS2); // 2. 样本准备 var samples ee.FeatureCollection([...]); // 3. 模型训练 var classifier ee.Classifier.smileRandomForest(50).train(...); // 4. 分类应用 var composite filtered.median(); var classified composite.classify(classifier); // 5. 后处理 var smoothed classified.focal_mode(3); // 6. 结果导出 Export.image.toDrive(...);

更多文章