PRO Sentinel2_Resample_Bands ; 初始化 ENVI, /RESTORE_BASE_SAVE_FILES ENVI_BATCH_INIT COMPILE_OPT IDL2 e = ENVI() e = ENVI(/HEADLESS) ; +-----------------------------------------------------------------------------+ ; | Sentinel-2 L2A 波段提取与重采样工具 | ; | 功能:提取不透水面分析所需波段,统一分辨率至10m,并保存到新文件夹 | ; | 输入:SAFE格式的L2A数据(10m/20m/60m波段) | ; | 输出:所有10m分辨率的波段文件(GeoTIFF格式) | ; +-----------------------------------------------------------------------------+ ; Sentinel-2 SAFE 结构下的 IMG_DATA 路径 base_path = 'D:\Desktop_file\S2C_MSIL2A_20250420T024611_N0511_R132_T50SPG_20250420T061913.SAFE\S2C_MSIL2A_20250420T024611_N0511_R132_T50SPG_20250420T061913.SAFE\GRANULE\L2A_T50SPG_A003248_20250420T025114\IMG_DATA\' ; 输出路径 out_dir = 'D:\Desktop_file\Sentinel2_10m_Bands\' IF ~FILE_TEST(out_dir, /DIRECTORY) THEN FILE_MKDIR, out_dir ; 波段定义 bands_10m = ['B02', 'B03', 'B04', 'B08']
时间: 2025-05-21 11:31:12 浏览: 31
### 使用IDL和ENVI处理Sentinel-2 L2A数据并提取波段
以下是一个详细的解决方案,展示如何利用IDL和ENVI API 来读取 Sentinel-2 L2A 数据中的指定波段(B02, B03, B04, B08),对其进行重采样至10米分辨率,并最终保存为 GeoTIFF 文件。
#### 解决方案概述
由于 Sentinel-2 的 SAFE 格式文件较为复杂,直接通过 ENVI 5.3 可能无法完全支持其最新的格式。因此,建议采用 ENVI 和 IDL 结合的方式进行操作。以下是具体的实现步骤:
1. **加载SENTINEL-2 L2A数据**:使用 `ENVIRasterFromMSIProduct` 函数来加载 SAFE 格式的 MSI 产品。
2. **选择所需波段**:从加载的栅格中选取所需的波段(B02, B03, B04, B08)。
3. **重采样到统一分辨率**:将所有选定波段重采样到相同的高分辨率(即10米)。
4. **保存为GeoTIFF**:最后将结果保存为标准的 GeoTIFF 文件。
#### 实现代码
下面是一份完整的代码示例,展示了上述流程的具体实现方式:
```idl
PRO Process_Sentinel_L2A_Data
; 初始化ENVI应用实例
COMPILE_OPT IDL2
e = ENVI()
; 输入SAFE目录路径
input_dir = DIALOG_DIRECTORY(/GET, TITLE='Select the SENTINEL-2 L2A SAFE Directory')
; 创建一个来自MSI产品的栅格对象
raster_msi = ENVIRasterFromMSIProduct(input_dir)
; 提取感兴趣的波段索引 (B02=蓝光, B03=绿光, B04=红光, B08=近红外)
band_names = ['B02', 'B03', 'B04', 'B08']
bands_of_interest = []
FOR i = 0, N_ELEMENTS(band_names)-1 DO BEGIN
band_index = WHERE(STRUPCASE(raster_msi.BAND_NAMES) EQ STRUPCASE(band_names[i]), count)
IF count GT 0 THEN bands_of_interest = [bands_of_interest, band_index[0]]
ENDFOREACH
; 子集化栅格以仅包含所选波段
subset_raster = raster_msi.SUBSET(BANDS=bands_of_interest)
; 设定目标分辨率为10米
target_res_x = 10d
target_res_y = -10d
; 对每个波段执行重采样
resampled_bands = LIST()
FOR j = 0, N_ELEMENTS(subset_raster.BANDS)-1 DO BEGIN
current_band = subset_raster.GetBand(j)
; 计算当前带宽的比例因子
scale_factor_x = ABS(target_res_x / current_band.SAMPLE_DIMENSION.SPACING_X)
scale_factor_y = ABS(target_res_y / current_band.LINE_DIMENSION.SPACING_Y)
; 应用双线性插值法进行重采样
resampled_band = current_band.Resample(FUNCTION_NAME='Bilinear', SCALE_FACTOR=[scale_factor_x, scale_factor_y])
resampled_bands.Add(resampled_band)
ENDFOREACH
; 合并所有重采样的波段成为一个新的栅格
combined_raster = ENVICreateRaster(e, DATA_TYPE=subtype_uint16, SPATIAL_REF=resampled_bands[0].SPATIAL_REF, $
DIMENSIONS=[NINT((resampled_bands[0].DIMENSIONS[0]*scale_factor_x)), $
NINT((resampled_bands[0].DIMENSIONS[1]*scale_factor_y))], $
NUMBER_OF_BANDS=N_ELEMENTS(resampled_bands))
FOR k = 0, N_ELEMENTS(resampled_bands)-1 DO BEGIN
combined_raster.SetData, resampled_bands[k].GetData(), BAND=k
ENDFOREACH
; 指定输出文件位置
output_file = DIALOG_PICKFILE(TITLE='Save As...', FILTER=['*.tif'], STYLE=1)
; 将组合后的栅格导出为GeoTIFF
combined_raster.Export(output_file, EXPORT_FORMAT='GEOTIFF')
END
```
#### 关键点解析
- **ENVIRasterFromMSIProduct**: 此函数专门用于加载 Sentinel-2 MSI 产品,它会自动识别并配置好所有的元数据信息[^1]。
- **SUBSET方法**: 允许我们根据需求筛选特定波段,从而减少不必要的计算负担[^1]。
- **Resample方法**: 支持多种算法来进行空间重采样,默认提供了最邻近、双线性和立方卷积三种选项。
- **Export方法**: 方便快捷地把处理好的数据导出成各种常用地理空间格式之一——这里选择了GeoTIFF。
---
###
阅读全文
相关推荐














