第一次打开Google Earth Engine(GEE)准备处理Sentinel-2数据时,我盯着两个相似的数据集名称发愣——COPERNICUS/S2_HARMONIZED(1C级)和COPERNICUS/S2_SR(2A级)。就像站在自动售货机前纠结选可乐还是零度可乐的瞬间,但这次选择的影响要大得多。去年帮某农业科技公司分析玉米田长势时,就因为初始选错了数据集,导致三天的预处理工作白费。本文将用这个真实案例,带你穿透专业术语的迷雾,掌握不同级别数据的核心差异和适用场景。
Sentinel-2卫星拍摄的原始数据需要经过一系列处理才能成为我们看到的影像。1C和2A代表的是不同的处理级别,这就像相机拍摄的RAW格式和JPEG格式的区别——前者保留了更多原始信息,后者则经过了机内优化处理。
1C级数据(Level-1C)提供的是大气层顶部反射率(TOA - Top of Atmosphere)。这意味着:
COPERNICUS/S2_HARMONIZED数据集javascript复制// 获取1C级数据示例
var s2_1c = ee.ImageCollection('COPERNICUS/S2_HARMONIZED')
.filterDate('2023-01-01', '2023-12-31')
.filterBounds(geometry);
2A级数据(Level-2A)则更进一步,通过Sen2Cor算法消除了大气影响,提供地表反射率(BOA - Bottom of Atmosphere)。关键特征包括:
COPERNICUS/S2_SR数据集javascript复制// 获取2A级数据示例
var s2_2a = ee.ImageCollection('COPERNICUS/S2_SR')
.filterDate('2023-01-01', '2023-12-31')
.filterBounds(geometry);
| 特性 | 1C级数据 | 2A级数据 |
|---|---|---|
| 反射率类型 | 大气层顶部(TOA) | 地表反射率(BOA) |
| 大气校正 | 无 | Sen2Cor算法校正 |
| 适用波段 | 所有13个波段 | 除B10外的12个波段 |
| 数据体积 | 较大(保留更多大气信息) | 较小 |
| 典型应用 | 大气研究、辐射传输模型 | 地表变化监测、分类 |
专业提示:2A级数据在2022年前处理基线版本中可能存在反射率偏高问题,建议检查
PROCESSING_BASELINE元数据字段,优先选择04.00及以上版本
去年春季,我们接到一个监测美国爱荷华州玉米田长势的项目。客户要求每周生成NDVI变化曲线,用于指导灌溉和施肥。最初为了快速启动,我选择了1C级数据,结果却遭遇了三个意外问题:
使用1C级数据计算的NDVI出现了不合理的日间波动,同一块农田在连续两天内的NDVI差值高达0.15——这已经超过了农作物正常的日变化范围。
javascript复制// 有问题的NDVI计算(1C级)
function addNDVI_1C(image) {
var ndvi = image.normalizedDifference(['B8', 'B4']).rename('NDVI');
return image.addBands(ndvi);
}
var ndviSeries_1c = s2_1c.map(addNDVI_1C);
问题根源在于:
更严重的是,整个生长季的NDVI曲线呈现"锯齿状"异常,与预期的平滑铃形曲线相去甚远。特别是在6月中旬,数值突然下降,客户差点误判为病虫害爆发。
改用2A级数据后,NDVI计算变得更加稳定:
javascript复制// 改进后的NDVI计算(2A级)
function addNDVI_2A(image) {
var ndvi = image.normalizedDifference(['B8', 'B4']).rename('NDVI');
return image.addBands(ndvi);
}
var ndviSeries_2a = s2_2a.map(addNDVI_2A);
关键改进点:
虽然2A级数据在多数地表监测中表现更好,但1C级数据在特定场景下不可替代:
javascript复制// 气溶胶光学厚度计算示例(需1C级数据)
function calculateAOD(image) {
var blue = image.select('B2');
var aod = blue.expression(
'0.1 * log(blue * 10000) + 0.3', {'blue': blue});
return image.addBands(aod.rename('AOD'));
}
2A级数据缺少B10(短波红外)波段,而该波段在某些应用中至关重要:
根据项目目标选择合适的数据级别,可以参照以下决策流程:
明确分析目标
检查波段需求
评估时间跨度
考虑处理资源
验证数据质量
经验法则:当不确定时,可以先下载少量样本数据,用以下代码快速比较:
javascript复制// 快速对比1C和2A数据 var sample_1c = ee.Image('COPERNICUS/S2_HARMONIZED/20230101T100031_20230101T100026_T32TQM'); var sample_2a = ee.Image('COPERNICUS/S2_SR/20230101T100031_20230101T100026_T32TQM'); Map.addLayer(sample_1c, {bands: ['B4', 'B3', 'B2'], min: 0, max: 3000}, '1C RGB'); Map.addLayer(sample_2a, {bands: ['B4', 'B3', 'B2'], min: 0, max: 3000}, '2A RGB');
在实际项目中,可能需要同时使用两种数据级别。以下是三个实用技巧:
1C级数据默认值范围是0-10000,而2A级是0-1(实际存储也是0-10000)。处理时需统一:
javascript复制// 统一缩放因子处理
function scaleImages(image) {
// 1C级数据除以10000
var scaled = image.divide(10000);
return image.addBands(scaled, null, true);
}
对于长时间序列分析,需注意2022年1月25日的数据格式变化:
javascript复制// 处理新旧1C级数据
var s2_old = ee.ImageCollection('COPERNICUS/S2')
.filterDate('2020-01-01', '2022-01-24');
var s2_new = ee.ImageCollection('COPERNICUS/S2_HARMONIZED')
.filterDate('2022-01-25', '2023-12-31');
var combined = s2_old.merge(s2_new);
建立质量检查点,比如用永久性地物(水泥路面、水体等)验证反射率稳定性:
javascript复制// 数据质量检查函数
function checkWaterReflectance(image) {
var water = image.sample(region=waterBody, scale=10).mean();
return image.set('water_B2', water.get('B2'));
}
在玉米田项目后期,我们开发了一套自动化检查流程,将数据选择时间从原来的2天缩短到2小时。关键是要记住:没有"最好"的数据集,只有"最适合"当前项目需求的数据集。当你在GEE中再次面对1C和2A的选择时,不妨先问自己:我的分析到底需要看到大气层顶部,还是穿透到地表?这个简单的思考往往能帮你避开我们曾经踩过的坑。