Google Earth Engine: Como Baixar Imagens do Sentinel-2 e Landsat e Calcular Índices (Passo a Passo)

Sensoriamento Remoto • 29 de Outubro de 2026

O Google Earth Engine (GEE) é uma plataforma que permite processar imagens de satélite em escala planetária sem depender de um computador potente, porque todo o cálculo acontece nos servidores da Google. Neste tutorial vai aprender a aceder, filtrar e limpar de nuvens imagens Sentinel-2 e Landsat 8/9, a calcular quatro índices espectrais (NDVI, NDWI, CMRI e NBRI), a explorá-los num mapa interativo e a exportar os resultados para o Google Drive em formato GeoTIFF. Todo o código está pronto para copiar e colar, e não é preciso instalar nenhum programa.

O que vai precisar antes de começar

O tutorial exige muito pouco, mas há quatro coisas que precisam de estar prontas para que tudo funcione sem interrupções. A primeira é uma conta Google ativa, a mesma que usa para o Gmail ou para o YouTube. A segunda é o acesso ao Google Earth Engine: aceda a code.earthengine.google.com e conclua o registo gratuito. O plano comunitário é suficiente para aprender e para trabalhos não comerciais, mas a aprovação pode demorar algum tempo, por isso convém fazer este passo primeiro.

A terceira é ter noções básicas de JavaScript. Não é preciso ser programador: basta perceber o que são variáveis, funções e objetos, e o código abaixo vem comentado para ajudar a acompanhar cada decisão. Por fim, reserve espaço livre no Google Drive. As imagens finais vão ser exportadas para uma pasta chamada Earth Engine, que o próprio sistema cria automaticamente na primeira exportação.

Passo 1: Aceder ao Code Editor e definir a área de interesse

Abra o navegador, aceda a code.earthengine.google.com e entre com a sua conta Google. A interface divide-se em três zonas. À esquerda ficam os scripts e a documentação, ao centro está o editor de código com o mapa interativo por baixo, e à direita encontra o console de mensagens e o separador Tasks, que vamos usar no final para as exportações.

Qualquer análise no GEE começa por definir a área de interesse, também conhecida pela sigla AOI (do inglês Area of Interest). Pode ser um retângulo, um polígono desenhado com o rato ou um shapefile importado. Neste tutorial usamos um retângulo simples sobre uma área florestal na Amazónia, porque é fácil de reproduzir. Quando quiser aplicar o método ao seu próprio estudo, basta substituir as coordenadas, que seguem a ordem oeste, sul, leste e norte.

// 1. Definir a área de interesse (exemplo: retângulo na Amazónia)
var aoi = ee.Geometry.Rectangle([-62.0, -5.0, -61.0, -4.0]);

// Centralizar o mapa na área de interesse
Map.centerObject(aoi, 10);
Map.addLayer(aoi, {color: 'red'}, 'Área de Interesse');

Copie o código para o editor e clique em Run, no topo da página. O mapa desloca-se para a região escolhida e o retângulo vermelho aparece sobre ela. Se isso acontecer, o ambiente está a funcionar e pode avançar.

Code Editor do Google Earth Engine com a área de interesse definida
Figura 1: Interface do Code Editor com a área de interesse delimitada a vermelho sobre o mapa interativo. Fonte: GEOFLORESTA

Passo 2: Carregar imagens Sentinel-2 e remover as nuvens

As imagens Sentinel-2 estão entre as mais usadas em estudos ambientais. Têm resolução espacial de 10 metros nas bandas do visível e do infravermelho próximo e passam sobre o mesmo local aproximadamente a cada cinco dias. A coleção recomendada é a COPERNICUS/S2_SR_HARMONIZED, que já traz a refletância de superfície, isto é, imagens corrigidas dos efeitos da atmosfera e comparáveis ao longo do tempo.

As nuvens são o principal obstáculo ao trabalhar com este tipo de imagem, sobretudo em regiões tropicais. Para as tratar, a coleção inclui duas bandas auxiliares: a SCL, que classifica cada pixel em categorias como vegetação, solo nu, água ou nuvem, e a MSK_CLDPRB, que indica a probabilidade de existir nuvem em cada pixel. Combinamos as duas para construir uma máscara mais fiável do que qualquer uma isoladamente.

O código seguinte faz três coisas em sequência. Primeiro filtra a coleção pelo período e pela área de interesse, descartando as cenas com mais de 20% de nuvens. Depois aplica a máscara, mantendo apenas os pixels classificados como vegetação (4), solo (5), água (6) ou neve e gelo (11) e com baixa probabilidade de nuvem. Por fim cria uma composição mediana: para cada pixel, calcula o valor mediano de todas as imagens limpas do período. Esta técnica reduz o ruído e preenche as falhas deixadas pelas nuvens, porque um pixel coberto numa data costuma estar limpo noutra.

// 2. Carregar Sentinel-2 Surface Reflectance (harmonizada)
var s2 = ee.ImageCollection('COPERNICUS/S2_SR_HARMONIZED')
  .filterBounds(aoi)
  .filterDate('2024-01-01', '2024-12-31')
  .filter(ee.Filter.lt('CLOUDY_PIXEL_PERCENTAGE', 20));

// Função que remove nuvens e sombras com base na SCL e na probabilidade de nuvem
function maskS2clouds(image) {
  var scl = image.select('SCL');
  var cloudProb = image.select('MSK_CLDPRB');
  // Manter vegetação (4), solo (5), água (6) e neve/gelo (11), com baixa probabilidade de nuvem
  var mask = scl.eq(4).or(scl.eq(5)).or(scl.eq(6)).or(scl.eq(11))
    .and(cloudProb.lt(20));
  return image.updateMask(mask);
}

// Aplicar a máscara e criar a composição mediana
var s2_masked = s2.map(maskS2clouds).median().clip(aoi);

// Visualizar em cores naturais (RGB)
Map.addLayer(s2_masked, {bands: ['B4', 'B3', 'B2'], min: 0, max: 3000}, 'Sentinel-2 RGB');

Depois de executar, deverá ver a área de estudo em cores naturais, já sem as nuvens mais evidentes. Se aparecerem manchas escuras ou zonas sem dados, é normal em regiões muito nubladas, e pode ser atenuado alargando o período de datas.

Composição RGB do Sentinel-2 após máscara de nuvem
Figura 2: Composição mediana do Sentinel-2 depois da aplicação da máscara de nuvem, visualizada em cores naturais. Fonte: GEOFLORESTA

Passo 3: Carregar imagens Landsat 8/9 e remover as nuvens

As imagens Landsat 8 e Landsat 9 têm resolução de 30 metros, menor do que a do Sentinel-2, mas oferecem algo que o Sentinel não tem: uma série histórica longa. O programa Landsat regista a superfície terrestre desde 1984, o que permite estudar mudanças ao longo de décadas. Usamos as coleções LANDSAT/LC08/C02/T1_L2 e LANDSAT/LC09/C02/T1_L2, ambas com refletância de superfície e com uma banda de qualidade chamada QA_PIXEL.

A banda QA_PIXEL funciona como um cartão de identidade de cada pixel: cada bit guarda uma condição diferente, como nuvem, sombra de nuvem ou nuvem dilatada. Com operações bit a bit mantemos apenas os pixels sem nenhuma dessas condições. Repare também que, na Collection 2, os valores das bandas vêm guardados como números inteiros e precisam de um fator de escala (multiplicar por 0,0000275 e somar −0,2) para se transformarem em refletância real, entre 0 e 1. Sem este passo, índices que dependem de diferenças entre bandas, como o NDVI, saem ligeiramente distorcidos e deixam de ser comparáveis com os do Sentinel-2.

Por fim juntamos as duas coleções numa só, o que aumenta o número de datas disponíveis e melhora a composição mediana.

// 3. Carregar Landsat 8 e Landsat 9 (Surface Reflectance, Tier 1)
var l8 = ee.ImageCollection('LANDSAT/LC08/C02/T1_L2')
  .filterBounds(aoi)
  .filterDate('2024-01-01', '2024-12-31')
  .filter(ee.Filter.lt('CLOUD_COVER', 20));

var l9 = ee.ImageCollection('LANDSAT/LC09/C02/T1_L2')
  .filterBounds(aoi)
  .filterDate('2024-01-01', '2024-12-31')
  .filter(ee.Filter.lt('CLOUD_COVER', 20));

// Juntar as duas coleções numa só
var landsat = l8.merge(l9);

// Função que remove nuvens e sombras e aplica o fator de escala
function maskLandsatClouds(image) {
  var qa = image.select('QA_PIXEL');
  // Bits 1 (nuvem dilatada), 3 (nuvem) e 4 (sombra de nuvem) devem ser 0
  var cloudMask = qa.bitwiseAnd(parseInt('11010', 2)).eq(0);
  // Converter os valores inteiros em refletância (0 a 1)
  var optical = image.select('SR_B.').multiply(0.0000275).add(-0.2);
  return image.addBands(optical, null, true).updateMask(cloudMask);
}

var landsat_median = landsat.map(maskLandsatClouds).median().clip(aoi);

Map.addLayer(landsat_median, {bands: ['SR_B4', 'SR_B3', 'SR_B2'], min: 0, max: 0.3}, 'Landsat RGB');

Ao executar, compare visualmente com o resultado do Sentinel-2. A imagem do Landsat parece menos nítida, e isso é esperado, porque cada pixel cobre 900 metros quadrados em vez de 100.

Composição RGB do Landsat 8/9 após máscara de nuvem
Figura 3: Composição mediana do Landsat 8/9 depois da aplicação da máscara de nuvem, visualizada em cores naturais. Fonte: GEOFLORESTA

Passo 4: Calcular os índices espectrais

Com as imagens limpas e prontas, chegou a parte central do tutorial. Um índice espectral é uma combinação matemática de duas ou mais bandas que realça uma característica da superfície e reduz o efeito de fatores como a iluminação. Vamos calcular quatro: o NDVI (Normalized Difference Vegetation Index), que mede o vigor da vegetação, o NDWI (Normalized Difference Water Index), que destaca a água, o CMRI (Combined Mangrove Recognition Index), que ajuda a identificar manguezais, e o NBRI (Normalized Burn Ratio Index), usado para realçar áreas queimadas.

As fórmulas são as mesmas nos dois satélites e o que muda é o nome das bandas, porque o Sentinel-2 e o Landsat numeram os seus sensores de forma diferente. Por isso, em cada subsecção indicamos as bandas correspondentes a cada um.

4.1 NDVI: vigor da vegetação

O NDVI aproveita o facto de a vegetação saudável absorver muita luz vermelha e refletir muita luz do infravermelho próximo. A fórmula é (NIR - Red) / (NIR + Red). No Sentinel-2 usam-se as bandas B8 (infravermelho próximo) e B4 (vermelho), e no Landsat as bandas SR_B5 e SR_B4, respetivamente.

// NDVI para Sentinel-2
var ndvi_s2 = s2_masked.expression(
  '(NIR - RED) / (NIR + RED)', {
    'NIR': s2_masked.select('B8'),
    'RED': s2_masked.select('B4')
  }).rename('NDVI_S2');

// NDVI para Landsat
var ndvi_l8 = landsat_median.expression(
  '(NIR - RED) / (NIR + RED)', {
    'NIR': landsat_median.select('SR_B5'),
    'RED': landsat_median.select('SR_B4')
  }).rename('NDVI_L8');

// Visualização (marrom, amarelo, verde)
var ndviVis = {min: -1, max: 1, palette: ['brown', 'yellow', 'green']};
Map.addLayer(ndvi_s2, ndviVis, 'NDVI Sentinel-2');
Map.addLayer(ndvi_l8, ndviVis, 'NDVI Landsat');

Como interpretar: valores próximos de +1 indicam vegetação densa e saudável, valores próximos de 0 indicam solo exposto ou vegetação muito esparsa, e valores negativos aparecem sobre água, neve ou nuvens que escaparam à máscara.

4.2 NDWI: corpos de água

O NDWI explora o comportamento oposto: a água reflete a luz verde e absorve quase todo o infravermelho próximo. A fórmula é (Green - NIR) / (Green + NIR). No Sentinel-2 usam-se B3 (verde) e B8, e no Landsat SR_B3 e SR_B5.

var ndwi_s2 = s2_masked.expression(
  '(GREEN - NIR) / (GREEN + NIR)', {
    'GREEN': s2_masked.select('B3'),
    'NIR': s2_masked.select('B8')
  }).rename('NDWI_S2');

var ndwi_l8 = landsat_median.expression(
  '(GREEN - NIR) / (GREEN + NIR)', {
    'GREEN': landsat_median.select('SR_B3'),
    'NIR': landsat_median.select('SR_B5')
  }).rename('NDWI_L8');

var ndwiVis = {min: -1, max: 1, palette: ['red', 'white', 'blue']};
Map.addLayer(ndwi_s2, ndwiVis, 'NDWI Sentinel-2');
Map.addLayer(ndwi_l8, ndwiVis, 'NDWI Landsat');

Como interpretar: valores positivos destacam rios, lagos e reservatórios, enquanto valores negativos correspondem a vegetação ou solo. Em áreas húmidas, como planícies de inundação, é comum encontrar valores intermédios.

4.3 CMRI: manguezais

O CMRI foi desenhado para separar os manguezais da água aberta e da vegetação terrestre comum. Como os mangues têm folhagem densa e ficam sobre solo encharcado, apresentam NDVI alto e NDWI relativamente elevado ao mesmo tempo, e o índice resulta da diferença entre os dois: CMRI = NDVI - NDWI. Não precisa de bandas novas, apenas dos índices que já calculou.

var cmri_s2 = ndvi_s2.subtract(ndwi_s2).rename('CMRI_S2');
var cmri_l8 = ndvi_l8.subtract(ndwi_l8).rename('CMRI_L8');

var cmriVis = {min: -1, max: 1, palette: ['red', 'white', 'blue']};
Map.addLayer(cmri_s2, cmriVis, 'CMRI Sentinel-2');
Map.addLayer(cmri_l8, cmriVis, 'CMRI Landsat');

Como interpretar: valores mais altos indicam maior probabilidade de cobertura de manguezal, e valores baixos ou negativos indicam água ou vegetação que não é de mangue. Como a área de exemplo está na Amazónia interior e não tem manguezais, o resultado será pouco informativo aqui. Para ver o índice a funcionar de verdade, experimente trocar a AOI por uma zona costeira de mangue.

4.4 NBRI: áreas queimadas

O NBRI, também chamado NBR, compara o infravermelho próximo, que é alto na vegetação viva, com o infravermelho de ondas curtas (SWIR), que aumenta em superfícies queimadas ou sem vegetação. A fórmula é (NIR - SWIR) / (NIR + SWIR). No Sentinel-2 usam-se B8 e B12, e no Landsat SR_B5 e SR_B7 (SWIR 2).

var nbri_s2 = s2_masked.expression(
  '(NIR - SWIR) / (NIR + SWIR)', {
    'NIR': s2_masked.select('B8'),
    'SWIR': s2_masked.select('B12')
  }).rename('NBRI_S2');

var nbri_l8 = landsat_median.expression(
  '(NIR - SWIR) / (NIR + SWIR)', {
    'NIR': landsat_median.select('SR_B5'),
    'SWIR': landsat_median.select('SR_B7')
  }).rename('NBRI_L8');

var nbriVis = {min: -1, max: 1, palette: ['green', 'yellow', 'red']};
Map.addLayer(nbri_s2, nbriVis, 'NBRI Sentinel-2');
Map.addLayer(nbri_l8, nbriVis, 'NBRI Landsat');

Como interpretar: valores baixos ou negativos indicam áreas queimadas ou solo exposto, e valores altos indicam vegetação saudável. Para detetar uma queimada específica, o procedimento habitual é calcular o NBRI antes e depois do evento e analisar a diferença entre os dois.

Explore os índices no mapa interativo

Em vez de executar o código para ver cada resultado, pode usar o mapa abaixo. No menu do canto superior direito escolha o índice e o satélite, e use o rato, ou os dedos no telemóvel, para dar zoom e arrastar o mapa. Vale a pena alternar entre NDVI e NBRI na mesma zona e entre Sentinel-2 e Landsat para perceber como o mesmo território é descrito por cada combinação. O primeiro carregamento pode demorar alguns segundos, porque o cálculo é feito em tempo real nos servidores do Google.

Figura 4: Mapa interativo dos índices NDVI, NDWI, CMRI e NBRI (Sentinel-2 e Landsat 8/9) sobre a área de interesse. Use o menu do mapa para alternar entre os índices. Fonte: GEOFLORESTA / Google Earth Engine Abrir o mapa em ecrã inteiro

Passo 5: Exportar todos os resultados para o Google Drive

Depois de confirmar visualmente que os índices fazem sentido, é altura de levar os resultados para o seu computador. A função Export.image.toDrive() não exporta nada imediatamente: cria uma tarefa de exportação que fica registada no separador Tasks, no painel direito, e só é executada quando você clica em Run ao lado dela. Esta separação existe porque exportações podem demorar minutos e consumir recursos, e o GEE quer que a decisão seja sua.

Em vez de escrever oito exportações à mão, o código abaixo percorre todos os índices num ciclo e cria as tarefas automaticamente. A resolução ajusta-se sozinha: 10 metros para os produtos do Sentinel-2 e 30 metros para os do Landsat, de acordo com a resolução original de cada sensor.

// 5. Exportar todos os índices para o Google Drive
var indices = {
  'NDVI_S2': ndvi_s2,
  'NDWI_S2': ndwi_s2,
  'CMRI_S2': cmri_s2,
  'NBRI_S2': nbri_s2,
  'NDVI_L8': ndvi_l8,
  'NDWI_L8': ndwi_l8,
  'CMRI_L8': cmri_l8,
  'NBRI_L8': nbri_l8
};

Object.keys(indices).forEach(function(name) {
  Export.image.toDrive({
    image: indices[name],
    description: name,
    folder: 'Earth Engine',
    fileNamePrefix: name + '_2024',
    region: aoi,
    scale: name.includes('S2') ? 10 : 30,  // 10 m para Sentinel-2, 30 m para Landsat
    crs: 'EPSG:4326',
    maxPixels: 1e13,
    fileFormat: 'GeoTIFF'
  });
});

Depois de executar o script, abra o separador Tasks e clique em Run ao lado de cada tarefa que quiser executar. Uma janela pede a confirmação do nome, da pasta e do formato, e basta confirmar. O GEE indica o progresso e avisa quando cada exportação termina. Os ficheiros GeoTIFF aparecem na pasta Earth Engine do seu Google Drive, de onde pode descarregá-los ou abri-los diretamente no QGIS, no ArcGIS ou em Python.

Aba Tasks do Google Earth Engine com as tarefas de exportação listadas
Figura 5: Painel de tarefas (Tasks) do GEE com as oito exportações criadas, prontas para serem executadas e enviadas para o Google Drive. Fonte: GEOFLORESTA

Quando os ficheiros estiverem no seu computador, abra um deles no QGIS através de Camada, Adicionar Camada, Adicionar Camada Raster. Nas propriedades de simbologia, escolha uma rampa de cores adequada ao índice e fixe o mínimo em −1 e o máximo em 1, para que as cores sejam comparáveis entre ficheiros.

Considerações finais

O grande valor deste fluxo de trabalho está em não obrigar a descarregar imagens brutas. Todo o processamento acontece nos servidores do Google, por isso pode trabalhar com séries históricas completas de Sentinel-2 e Landsat a partir de um portátil simples e de uma ligação à internet. As máscaras de nuvem automáticas, o cálculo de vários índices e a exportação em lote reduzem a poucas dezenas de linhas um trabalho que, noutros programas, ocuparia dias.

O passo seguinte natural é adaptar o método ao seu caso: trocar a área de interesse, alargar o período para vários anos e comparar a evolução dos índices. A partir dos GeoTIFF exportados, pode seguir para análises estatísticas, classificações de uso do solo ou mapas finais no QGIS.

Perguntas frequentes

1. Qual é a diferença entre Sentinel-2 e Landsat para calcular índices?

O Sentinel-2 tem melhor resolução espacial (10 metros) e revisita mais frequente (cerca de 5 dias), o que o torna ideal para áreas pequenas e monitoramento detalhado. O Landsat tem resolução de 30 metros, mas uma série histórica muito mais longa, desde 1984, e por isso é mais adequado para análises de médio e longo prazo. Para o CMRI e para os restantes índices, os dois podem ser usados, desde que as bandas sejam selecionadas corretamente.

2. Posso calcular estes índices para qualquer área do mundo?

Sim. O GEE cobre todo o planeta, e basta alterar a variável aoi e o período de tempo. Lembre-se apenas de que a disponibilidade de imagens sem nuvens varia com a região e com a estação do ano, e que em zonas muito nubladas pode ser necessário alargar o intervalo de datas.

3. O CMRI só funciona para manguezais?

O CMRI foi criado especificamente para realçar manguezais, mas pode ser lido como um indicador genérico de vegetação associada a ambientes húmidos. Para outros tipos de cobertura, o NDVI e o NDWI isolados costumam ser mais fáceis de interpretar.

4. Como faço para exportar as imagens originais e não apenas os índices?

No bloco de exportação, substitua a variável image pela imagem original, por exemplo s2_masked ou landsat_median, e escolha as bandas que quer guardar com .select(['B4','B3','B2']) antes de chamar a função de exportação.

5. Preciso pagar algo para usar o Google Earth Engine?

Para uso não comercial e para aprendizagem, o GEE oferece o Community Tier gratuito, com limites de processamento e de armazenamento. Projetos comerciais de grande escala exigem planos pagos.

6. E se a minha área for muito grande e a exportação falhar?

Divida a área de interesse em blocos menores e crie uma tarefa de exportação para cada um. O parâmetro maxPixels deve manter-se elevado (1e13) para evitar erros de dimensão, e para a maioria dos projetos regionais o valor já presente no código é suficiente.

7. Por que os valores do Landsat não são iguais aos do Sentinel-2 na mesma zona?

Porque os sensores têm bandas com larguras espetrais ligeiramente diferentes, resoluções diferentes e datas de passagem distintas. Pequenas diferenças são normais. Diferenças grandes costumam indicar que o fator de escala do Landsat não foi aplicado ou que a máscara de nuvem deixou passar pixels contaminados.

Leave a Comment

O seu endereço de email não será publicado. Campos obrigatórios marcados com *