Ocorrência de água (1984 a 2015)

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

Nesta seção do tutorial, você vai:

  1. adicionar uma camada do mapa para visualizar a ocorrência de água de superfície,
  2. mostram como consultar valores da camada do 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 limite,
  5. centralizar o mapa em partes interessantes do mundo e
  6. mostrar como refatorar o script para facilitar a leitura e a manutenção.

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 do GSW e o armazena em uma variável chamada gsw. A segunda instrução seleciona uma única camada do conjunto de dados do GSW e a armazena em uma variável chamada occurrence. A terceira instrução adiciona a imagem de ocorrência ao mapa interativo do editor de código.

Clique no botão "Run" do editor de código e, após alguns segundos, você verá um mapa com coloração cinza ao longo das linhas costeiras, semelhante à Figura 1.

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

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 do inspetor do editor de código. Primeiro, clique na guia do inspetor e, em seguida, no mapa para selecionar um local. A guia do inspetor vai mostrar informações sobre cada uma das camadas presentes no local em que você clicou.

guia "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, então, em aproximadamente 98% do tempo, o local foi classificado como coberto por água. O valor é a média de cada um dos valores mensais de ocorrência de água de superfície, que normaliza em relação à variação sazonal, conforme descrito no Guia do usuário de dados (v2) .

Refatoração para melhorar seu código

Nosso script contém apenas duas instruções, mas já temos uma 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 do teclado para "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 do 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 de 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 para o método de dentro 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 melhorar os parâmetros de visualização padrão, que estão fazendo com que a água pareça cinza. Adicione uma nova instrução que crie uma variável VIS_OCCURRENCE e a transmita como um argumento adicional para o 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 com que a água é esperada usando um intervalo de valores de 0 a 100%. No entanto, geralmente é ú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 limite). Vamos usar essa camada binária simples como uma camada de plano de fundo limpa sobre a qual outras camadas do GSW podem ser colocadas. Para criar essa camada de limite, use 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 para a 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 que essa camada seja renderizada 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'
});
90% de máscara de água
Figura 5. Captura de tela de uma máscara de água de 90% para o Delta do Paraná, perto de Buenos Aires.

Ir para partes interessantes do mundo

É divertido explorar o mundo usando os recursos de movimentação e zoom, mas o mundo é grande e, às vezes, é útil pular diretamente para um local específico. Confira uma série de instruções que mostram uma pequena amostra de locais interessantes em termos de água de superfície. Remova a marca de comentário de uma das instruções por vez, e seu 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. Fique à vontade para adicionar as suas.

Refatoração, de novo…

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

Este é o script refatorado final:

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 analisar como a ocorrência de água mudou ao longo do tempo.