Ocorrência de água (1984 a 2015)

O conjunto de dados do GSW contém várias camadas de dados que apresentam os dados de água da superfície de diferentes maneiras. Vamos começar visualizando a camada de ocorrência de água, que fornece um resumo de onde e com que frequência a água da superfície ocorreu durante todo o período entre março de 1984 e outubro de 2015.

Esta seção do tutorial vai:

  1. adicionar uma camada de mapa para visualizar a ocorrência de água na superfície;
  2. mostrar como consultar valores da camada de mapa;
  3. adicionar um estilo personalizado para melhorar a visualização;
  4. criar uma camada de máscara de água binária usando um valor de limite;
  5. centralizar o mapa em partes interessantes do mundo;
  6. mostrar como refatorar o script para torná-lo mais legível e fácil de manter.

Como criar uma visualização básica

Comece copiando as seguintes instruções no editor de código:

Editor de código (JavaScript)

var gsw = ee.Image('JRC/GSW1_0/GlobalSurfaceWater');
var occurrence = gsw.select('occurrence');
Map.addLayer(occurrence);

A primeira instrução faz referência ao objeto de imagem do Earth Engine para o conjunto de dados GSW e o armazena em uma variável chamada gsw. A segunda instrução seleciona uma única camada do conjunto de dados GSW e a armazena em uma variável chamada occurrence. A terceira instrução adiciona a imagem da ocorrência ao mapa interativo do Editor de código.

Clique no botão "Executar" do editor de código. Após alguns segundos, um mapa com coloração cinza ao longo das costas vai aparecer, semelhante à Figura 1.

visualização padrão
Figura 1. Visualização padrão da camada de dados global de ocorrência de água superficial.

Na maioria das áreas, o conjunto de dados do GSW aparece transparente porque os locais em que as imagens do Landsat não foram coletadas (ou seja, áreas oceânicas) ou em que a água não foi detectada por nenhuma observação nos 32 anos são mascarados.

Como inspecionar valores

Para analisar os valores da camada de ocorrência de água, vamos usar a guia de inspeção do editor de código. Primeiro, clique na guia "Inspetor" e depois no mapa para selecionar um local. A guia "Inspetor" mostra informações sobre cada uma das camadas presentes no local em que você clicou.

guia do inspetor
Figura 2. Exemplo de saída da guia "Inspector".

No exemplo acima, o valor da camada chamada value é 98. As unidades são pontos percentuais. Portanto, aproximadamente 98% das vezes, o local foi classificado como coberto por água. O valor é a média de cada um dos valores mensais de ocorrência de água superficial, que é normalizada em relação à variação sazonal, conforme descrito no Guia para usuários de dados (v2) .

Refatoração para melhorar seu código

Nosso script contém apenas duas instruções, mas já temos a oportunidade de refatorar o código para que o script final seja mais fácil de ler e manter ao longo do tempo. No momento, a instrução Map.addLayer() transmite um único argumento occurrence, que é o objeto de imagem do Earth Engine que queremos mostrar no mapa. No entanto, o método Map.addLayer() também permite que outros argumentos sejam transmitidos a ele. Para ver rapidamente quais argumentos estão disponíveis, coloque o cursor após o parêntese de abertura e pressione o atalho de teclado "Mostrar sugestões de código" para abrir o documento de ajuda do método addLayer. (Para ver os atalhos do teclado, selecione o menu Ajuda -> Atalhos.)

Argumentos de Map.addLayer
Figura 3. Captura de tela mostrando os argumentos do método addLayer.

Os atalhos de teclado mostram que há cinco argumentos que podem ser transmitidos para Map.addLayer: eeObject, visParams, name, shown e opacity. No script atual, estamos transmitindo uma única variável occurrence, que é interpretada como o primeiro argumento, eeObject. Para transmitir o objeto variável e um argumento adicional que nomeia a camada, podemos refatorar o código para usar "argumentos nomeados" (eeObject e name) que são transmitidos ao método de uma estrutura de dados JSON , conforme mostrado abaixo:

Editor de código (JavaScript)

Map.addLayer({eeObject: occurrence, name: 'Water Occurrence (1984-2015)'});

Execute o código novamente para garantir que ele ainda funcione após as mudanças de refatoração. O mapa resultante não deve mudar.

Como adicionar parâmetros de visualização

Em seguida, vamos trabalhar para melhorar os parâmetros de visualização padrão, que estão fazendo com que a água apareça cinza. Adicione uma nova instrução que cria uma variável VIS_OCCURRENCE e transmita-a como um argumento adicional ao método addLayer.

Editor de código (JavaScript)

var VIS_OCCURRENCE = {
  min: 0,
  max: 100,
  palette: ['red', 'blue']
};

Editor de código (JavaScript)

Map.addLayer({
  eeObject: occurrence.updateMask(occurrence.divide(100)),
  name: 'Water Occurrence (1984-2015)',
  visParams: VIS_OCCURRENCE
});

Os parâmetros de visualização armazenados na estrutura JSON VIS_OCCURRENCE indicam que o vermelho deve ser usado para um valor mínimo de 0% e o azul para um valor máximo de 100%. A adição de .updateMask(occurrence.divide(100)) faz com que a opacidade/transparência dos pixels seja definida com base no valor de ocorrência.

Execute o script novamente e confira os resultados revisados das mudanças de estilo.

Ocorrência de água superficial
Figura 4. Captura de tela da ocorrência de água no Delta do Paraná, perto de Buenos Aires, usando uma cor vermelha transparente para o endpoint de valor mínimo de 0% e uma cor azul sólida para o endpoint de valor máximo.

As áreas de água agora estão azuis! Continue o processo.

Como criar uma camada de limite

A imagem de ocorrência de água contém informações sobre a frequência esperada de água usando um intervalo de valores de 0 a 100%. No entanto, muitas vezes é útil definir uma camada de água binária (ou seja, "água" x "não água") com base em uma determinada porcentagem de ocorrência (ou seja, um valor de limite). Vamos usar essa camada binária simples como uma camada de plano de fundo limpa em que outras camadas do GSW podem ser colocadas. É possível criar essa camada de limite usando as instruções a seguir, que usam um valor de limite de 90% para separar água e não água.

Primeiro, definimos uma nova variável de visualização VIS_WATER_MASK para armazenar informações de estilo da máscara de água:

Editor de código (JavaScript)

var VIS_WATER_MASK = {
  palette: ['white', 'black']
};

Em seguida, calculamos uma camada de máscara de água usando o operador de comparação maior que .gt(90) e definimos as áreas mascaradas anteriormente como zero usando o método .unmask():

Editor de código (JavaScript)

// Create a water mask layer, and set the image mask so that non-water areas
// are opaque.
var water_mask = occurrence.gt(90).unmask(0);

Por fim, adicione a camada ao mapa. Para renderizar essa camada abaixo de todas as outras, coloque a seguinte instrução antes de qualquer outra instrução Map.addLayer.

Editor de código (JavaScript)

Map.addLayer({
  eeObject: water_mask,
  visParams: VIS_WATER_MASK,
  name: '90% occurrence water mask'
});
Máscara de água de 90%
Figura 5. Captura de tela de uma máscara de água de 90% para o Delta do Paraná, perto de Buenos Aires.

Ir para lugares interessantes do mundo

É divertido explorar o mundo movendo e ampliando a tela, mas o mundo é grande e às vezes é útil ir direto para um local específico. Confira uma série de declarações que fornecem uma pequena amostra de locais interessantes em termos de água superficial. Basta remover o comentário de uma das instruções por vez, e o script vai para esse local quando for executado.

Editor de código (JavaScript)

// Uncomment one of the following statements to center the map.
// Map.setCenter(-90.162, 29.8597, 10);   // New Orleans, USA
// Map.setCenter(-114.9774, 31.9254, 10); // Mouth of the Colorado River, Mexico
// Map.setCenter(-111.1871, 37.0963, 11); // Lake Powell, USA
// Map.setCenter(149.412, -35.0789, 11);  // Lake George, Australia
// Map.setCenter(105.26, 11.2134, 9);     // Mekong River Basin, SouthEast Asia
// Map.setCenter(90.6743, 22.7382, 10);   // Meghna River, Bangladesh
// Map.setCenter(81.2714, 16.5079, 11);   // Godavari River Basin Irrigation Project, India
// Map.setCenter(14.7035, 52.0985, 12);   // River Oder, Germany & Poland
// Map.setCenter(-59.1696, -33.8111, 9);  // Buenos Aires, Argentina
Map.setCenter(-74.4557, -8.4289, 11);  // Ucayali River, Peru

Essa é apenas uma pequena amostra de locais interessantes. Você pode adicionar os seus!

Refatoração, de novo...

Antes de passarmos para a próxima camada do conjunto de dados do GSW, vamos fazer mais um pouco de refatoração de código. Vamos agrupar as declarações semelhantes e adicionar alguns comentários que vão dividir nosso código em seções para recursos, constantes, cálculos, centralização do mapa e adição de camadas.

Este é o script final refatorado:

Editor de código (JavaScript)

//////////////////////////////////////////////////////////////
// Asset List
//////////////////////////////////////////////////////////////

var gsw = ee.Image('JRC/GSW1_0/GlobalSurfaceWater');
var occurrence = gsw.select('occurrence');

//////////////////////////////////////////////////////////////
// Constants
//////////////////////////////////////////////////////////////

var VIS_OCCURRENCE = {
  min: 0,
  max: 100,
  palette: ['red', 'blue']
};
var VIS_WATER_MASK = {
  palette: ['white', 'black']
};

//////////////////////////////////////////////////////////////
// Calculations
//////////////////////////////////////////////////////////////

// Create a water mask layer, and set the image mask so that non-water areas
// are opaque.
var water_mask = occurrence.gt(90).unmask(0);

//////////////////////////////////////////////////////////////
// Initialize Map Location
//////////////////////////////////////////////////////////////

// Uncomment one of the following statements to center the map.
// Map.setCenter(-90.162, 29.8597, 10);   // New Orleans, USA
// Map.setCenter(-114.9774, 31.9254, 10); // Mouth of the Colorado River, Mexico
// Map.setCenter(-111.1871, 37.0963, 11); // Lake Powell, USA
// Map.setCenter(149.412, -35.0789, 11);  // Lake George, Australia
// Map.setCenter(105.26, 11.2134, 9);     // Mekong River Basin, SouthEast Asia
// Map.setCenter(90.6743, 22.7382, 10);   // Meghna River, Bangladesh
// Map.setCenter(81.2714, 16.5079, 11);   // Godavari River Basin Irrigation Project, India
// Map.setCenter(14.7035, 52.0985, 12);   // River Oder, Germany & Poland
// Map.setCenter(-59.1696, -33.8111, 9);  // Buenos Aires, Argentina
Map.setCenter(-74.4557, -8.4289, 11);  // Ucayali River, Peru

//////////////////////////////////////////////////////////////
// Map Layers
//////////////////////////////////////////////////////////////

Map.addLayer({
  eeObject: water_mask,
  visParams: VIS_WATER_MASK,
  name: '90% occurrence water mask',
  shown: false
});
Map.addLayer({
  eeObject: occurrence.updateMask(occurrence.divide(100)),
  name: 'Water Occurrence (1984-2015)',
  visParams: VIS_OCCURRENCE
});

Na próxima seção, você vai saber como a ocorrência de água mudou ao longo do tempo.