Algoritmos do Sentinel-1

A Sentinel-1 é uma missão espacial financiada pela União Europeia e realizada pela Agência Espacial Europeia (ESA, na sigla em inglês) no âmbito do programa Copernicus. O Sentinel-1 coleta imagens de radar de abertura sintética (SAR, na sigla em inglês) de banda C com várias polarizações e resoluções. Como os dados de radar exigem vários algoritmos especializados para obter imagens ortorretificadas e calibradas, este documento descreve o pré-processamento dos dados do Sentinel-1 no Earth Engine.

Os dados do Sentinel-1 são coletados com várias configurações de instrumentos, resoluções e combinações de bandas diferentes durante as órbitas ascendentes e descendentes. Devido a essa heterogeneidade, geralmente é necessário filtrar os dados para um subconjunto homogêneo antes de iniciar o processamento. Esse processo é descrito abaixo na seção Metadados e filtragem.

Metadados e filtragem

Para criar um subconjunto homogêneo de dados do Sentinel-1, geralmente é necessário filtrar a coleção usando propriedades de metadados. Os campos de metadados comuns usados para filtragem incluem estas propriedades:

  1. transmitterReceiverPolarisation: ['VV'], ['HH'], ['VV', 'VH'] ou ['HH', 'HV']
  2. instrumentMode: "IW" (faixa larga interferométrica), "EW" (faixa extra larga) ou "SM" (mapa de faixa). Consulte esta referência para mais detalhes.
  3. orbitProperties_pass: "ASCENDING" ou "DESCENDING"
  4. resolution_meters: 10, 25 ou 40
  5. resolution: "M" (médio) ou "H" (alto). Consulte esta referência para mais detalhes.

O código a seguir filtra a coleção Sentinel-1 por propriedades transmitterReceiverPolarisation, instrumentMode e orbitProperties_pass e calcula composições para várias combinações de observações que são exibidas no mapa para demonstrar como essas características afetam os dados.

Editor de código (JavaScript)

// 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

Configuração do Python

Consulte a página Ambiente Python para informações sobre a API Python e o uso de geemap para desenvolvimento interativo.

import ee
import geemap.core as geemap

Colab (Python)

# 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

Pré-processamento do Sentinel-1

As imagens no 'COPERNICUS/S1_GRD' Sentinel-1 do Earth Engine ImageCollection consistem em cenas de nível 1 com detecção de alcance do solo (GRD, na sigla em inglês) processadas para coeficiente de retroespalhamento (σ°) em decibéis (dB). O coeficiente de retroespalhamento representa a área de retroespalhamento do alvo (seção transversal do radar) por unidade de área do solo. Como pode variar em várias ordens de magnitude, ele é convertido em dB como 10*log10σ°. Ele mede se o terreno irradiado dispersa a radiação de micro-ondas incidente preferencialmente para longe do sensor de SAR (dB < 0) ou para o sensor de SAR (dB > 0). Esse comportamento de dispersão depende das características físicas do terreno, principalmente da geometria dos elementos do terreno e das características eletromagnéticas deles.

O Earth Engine usa as seguintes etapas de pré-processamento (implementadas pela caixa de ferramentas do Sentinel-1) para derivar o coeficiente de retroespalhamento em cada pixel:

  1. Aplicar arquivo de órbita
    • Atualiza os metadados da órbita com um arquivo de órbita restaurado (ou um arquivo de órbita preciso, se o restaurado não estiver disponível).
  2. Remoção de ruído de bordas de GRD
    • Remove ruídos de baixa intensidade e dados inválidos nas bordas da cena. (Em 12 de janeiro de 2018)
  3. Remoção de ruído térmico
    • Remove ruídos aditivos em subfaixas para ajudar a reduzir descontinuidades entre subfaixas para cenas em modos de aquisição de várias subfaixas. (Esta operação não pode ser aplicada a imagens produzidas antes de julho de 2015)
  4. Aplicação de valores de calibração radiométrica
    • Calcula a intensidade de retroespalhamento usando parâmetros de calibração do sensor nos metadados do GRD.
  5. Correção de terreno (ortorretificação)
    • Converte dados da geometria de alcance do solo, que não considera o terreno, em σ° usando o SRTM 30 meter DEM ou o ASTER DEM para latitudes altas (maiores que 60° ou menores que -60°).

Notas do conjunto de dados

  • A nivelação radiométrica do terreno não está sendo aplicada devido a artefatos nas encostas das montanhas.
  • O coeficiente de retroespalhamento sem unidade é convertido em dB, conforme descrito acima.
  • No momento, não é possível ingerir dados do Sentinel-1 SLC, porque o Earth Engine não aceita imagens com valores complexos devido à incapacidade de fazer a média delas durante a pirâmide sem perder informações de fase.
  • Os recursos de SM de GRD não são ingeridos porque a função computeNoiseScalingFactor() na operação de remoção de ruído de borda na caixa de ferramentas do S1 não oferece suporte ao modo SM.