Sentinel-1 算法

Sentinel-1 是哥白尼计划下的一个由欧盟资助、由欧洲航天局 (ESA) 执行的空间任务。哨兵 1 号可收集多种极化和分辨率的 C 频段合成孔径雷达 (SAR) 图像。由于雷达数据需要使用多种专用算法才能获得校准过且经过正射校正的图像,因此本文档介绍了如何在 Earth Engine 中预处理 Sentinel-1 数据。

Sentinel-1 数据是在上升轨道和下降轨道期间使用多种不同的仪器配置、分辨率和波段组合收集的。由于这种异质性,通常需要先将数据过滤为同质子集,然后才能开始处理。下文的元数据和过滤部分概述了此流程。

元数据和过滤

如需创建 Sentinel-1 数据的均匀子集,通常需要使用元数据属性过滤集合。用于过滤的常见元数据字段包括以下属性:

  1. transmitterReceiverPolarisation:['VV']、['HH']、['VV', 'VH'] 或 ['HH', 'HV']
  2. instrumentMode:'IW'(干涉宽幅)、'EW'(超宽幅)或 'SM'(条状图)。如需了解详情,请参阅此参考文档
  3. orbitProperties_pass:'ASCENDING' 或 'DESCENDING'
  4. resolution_meters:10、25 或 40
  5. resolution:“M”(中)或“H”(高)。如需了解详情,请参阅此参考文档

以下代码会按 transmitterReceiverPolarisationinstrumentModeorbitProperties_pass 属性过滤 Sentinel-1 集合,然后为地图中显示的多个观测组合计算复合图,以演示这些特征对数据的影响。

// Load the Sentinel-1 ImageCollection, filter to Jun-Sep 2020 observations.
var sentinel1 = ee.ImageCollection('COPERNICUS/S1_GRD')
                    .filterDate('2020-06-01', '2020-10-01');

// Filter the Sentinel-1 collection by metadata properties.
var vvVhIw = sentinel1
  // Filter to get images with VV and VH dual polarization.
  .filter(ee.Filter.listContains('transmitterReceiverPolarisation', 'VV'))
  .filter(ee.Filter.listContains('transmitterReceiverPolarisation', 'VH'))
  // Filter to get images collected in interferometric wide swath mode.
  .filter(ee.Filter.eq('instrumentMode', 'IW'));

// Separate ascending and descending orbit images into distinct collections.
var vvVhIwAsc = vvVhIw.filter(
  ee.Filter.eq('orbitProperties_pass', 'ASCENDING'));
var vvVhIwDesc = vvVhIw.filter(
  ee.Filter.eq('orbitProperties_pass', 'DESCENDING'));

// Calculate temporal means for various observations to use for visualization.
// Mean VH ascending.
var vhIwAscMean = vvVhIwAsc.select('VH').mean();
// Mean VH descending.
var vhIwDescMean = vvVhIwDesc.select('VH').mean();
// Mean VV for combined ascending and descending image collections.
var vvIwAscDescMean = vvVhIwAsc.merge(vvVhIwDesc).select('VV').mean();
// Mean VH for combined ascending and descending image collections.
var vhIwAscDescMean = vvVhIwAsc.merge(vvVhIwDesc).select('VH').mean();

// Display the temporal means for various observations, compare them.
Map.addLayer(vvIwAscDescMean, {min: -12, max: -4}, 'vvIwAscDescMean');
Map.addLayer(vhIwAscDescMean, {min: -18, max: -10}, 'vhIwAscDescMean');
Map.addLayer(vhIwAscMean, {min: -18, max: -10}, 'vhIwAscMean');
Map.addLayer(vhIwDescMean, {min: -18, max: -10}, 'vhIwDescMean');
Map.setCenter(-73.8719, 4.512, 9);  // Bogota, Colombia

如需了解 Python API 以及如何使用 geemap 进行交互式开发,请参阅 Python 环境页面。

import ee
import geemap.core as geemap
# Load the Sentinel-1 ImageCollection, filter to Jun-Sep 2020 observations.
sentinel_1 = ee.ImageCollection('COPERNICUS/S1_GRD').filterDate(
    '2020-06-01', '2020-10-01'
)

# Filter the Sentinel-1 collection by metadata properties.
vv_vh_iw = (
    sentinel_1.filter(
        # Filter to get images with VV and VH dual polarization.
        ee.Filter.listContains('transmitterReceiverPolarisation', 'VV')
    )
    .filter(ee.Filter.listContains('transmitterReceiverPolarisation', 'VH'))
    .filter(
        # Filter to get images collected in interferometric wide swath mode.
        ee.Filter.eq('instrumentMode', 'IW')
    )
)

# Separate ascending and descending orbit images into distinct collections.
vv_vh_iw_asc = vv_vh_iw.filter(
    ee.Filter.eq('orbitProperties_pass', 'ASCENDING')
)
vv_vh_iw_desc = vv_vh_iw.filter(
    ee.Filter.eq('orbitProperties_pass', 'DESCENDING')
)

# Calculate temporal means for various observations to use for visualization.
# Mean VH ascending.
vh_iw_asc_mean = vv_vh_iw_asc.select('VH').mean()
# Mean VH descending.
vh_iw_desc_mean = vv_vh_iw_desc.select('VH').mean()
# Mean VV for combined ascending and descending image collections.
vv_iw_asc_desc_mean = vv_vh_iw_asc.merge(vv_vh_iw_desc).select('VV').mean()
# Mean VH for combined ascending and descending image collections.
vh_iw_asc_desc_mean = vv_vh_iw_asc.merge(vv_vh_iw_desc).select('VH').mean()

# Display the temporal means for various observations, compare them.
m = geemap.Map()
m.add_layer(vv_iw_asc_desc_mean, {'min': -12, 'max': -4}, 'vv_iw_asc_desc_mean')
m.add_layer(
    vh_iw_asc_desc_mean, {'min': -18, 'max': -10}, 'vh_iw_asc_desc_mean'
)
m.add_layer(vh_iw_asc_mean, {'min': -18, 'max': -10}, 'vh_iw_asc_mean')
m.add_layer(vh_iw_desc_mean, {'min': -18, 'max': -10}, 'vh_iw_desc_mean')
m.set_center(-73.8719, 4.512, 9)  # Bogota, Colombia
m

Sentinel-1 预处理

Earth Engine 'COPERNICUS/S1_GRD' Sentinel-1 ImageCollection 中的图像由处理为分贝 (dB) 的反射率系数 (σ°) 的 Level-1 地面距离检测 (GRD) 场景组成。回波系数表示每单位地面面积的目标回波面积(雷达截面面积)。由于它可以相差几个数量级,因此会按 10*log10σ° 的公式转换为 dB。它用于衡量辐射的地形是否会优先将入射的微波辐射散射到远离 SAR 传感器的位置 (dB < 0),还是朝向 SAR 传感器的位置 (dB > 0)。这种散射行为取决于地形的物理特性,主要是地形元素的几何图形及其电磁特性。

Earth Engine 使用以下预处理步骤(由 Sentinel-1 Toolbox 实现)来推导每个像素的反射率系数:

  1. 应用轨道文件
    • 使用重建的轨道文件(如果无法使用重建的轨道文件,则使用精确的轨道文件)更新轨道元数据。
  2. GRD 边界噪声去除
    • 移除场景边缘上的低强度噪声和无效数据。 (截至 2018 年 1 月 12 日)
  3. 热噪声消除
    • 移除子扫描区域中的叠加噪声,以帮助减少多扫描区域采集模式下场景的子扫描区域之间的不连续性。 (此操作不适用于 2015 年 7 月之前生成的图片)
  4. 应用辐射校准值
    • 使用 GRD 元数据中的传感器校准参数计算反射强度。
  5. 地形校正(正射校正)
    • 使用 SRTM 30 米 DEMASTER DEM(适用于高纬度 [大于 60° 或小于 -60°])将数据从不考虑地形的地面范围几何图形转换为 σ°。

数据集备注

  • 由于山坡上存在伪影,因此未应用射电地形平坦化。
  • 无单位的回波系数会转换为 dB,如上所述。
  • 目前无法提取 Sentinel-1 SLC 数据,因为 Earth Engine 不支持包含复杂值的图片,因为在进行金字塔处理期间无法对这些图片求平均值,而不会丢失相位信息。
  • 系统不会提取 GRD SM 资产,因为 S1 工具箱中的边缘噪声去除操作中的 computeNoiseScalingFactor() 函数不支持 SM 模式。