INTRODUÇÃO AO GOOGLE EARTH ENGINE
PARTE I
O Google Earth Engine (GEE) é um serviço de processamento geoespacial orientado por dados. Possuí um vasto catálogo de dados públicos que podem ser utilizados em diversos estudos e análises.
Utilizando uma “Application Programming Interface” (API), em português Interface de Programação de Aplicação, em JavaScript, é possível desenvolver e executar algoritmos em imagens georreferenciadas que estão armazenadas na infraestrutura do Google.
Interface
A interface do GEE é um ambiente de desenvolvimento, comumente chamado de Code Editor, em português Editor de Código, onde no centro temos o próprio Code Editor em JavaScript.
A interface contém alguns botões, como o Get Link (gera um link para o script), Save (salvar), Run (executar) e Reset (limpar o mapa).
Na parte superior, consta uma caixa para pesquisa, onde é possível buscar conjuntos de dados que podem ser utilizados em suas análises.
No painel esquerdo, contém exemplos de código, seus scripts salvos, uma referência para a API e um gerenciador de ativos.
Já no painel direito, contém um Inspector (inspetor) para consultar o mapa, um Console para saídas e Tasks, um gerenciador para tarefas.
INTRODUÇÃO AO JAVASCRIPT
O JavaScript (JS) é uma linguagem de programação interpretada e baseada em objetos, comumente utilizada para o desenvolvimento dinâmico de páginas web. É uma linguagem client side (lado cliente), ou seja, que roda na máquina do cliente.
Existe uma crença que lhe trará boa sorte quando se está aprendendo uma nova linguagem de programação, onde em seu primeiro script você deve exibir uma mensagem de saudação: Hello world!
No Code Editor, insira o código abaixo e clique em Run.
Após a execução do script, a mensagem irá aparecer no Console (painel direito do Code Editor). No código acima, essa linha de código é considerada uma instrução, sendo o fim dessa instrução identificada pelo ponto e virgula.
Salve o script atual clicando no botão Save, escolha um nome para o arquivo com poucas palavras, sem espaços e sem caracteres especiais. Quando salvo, irá aparecer o arquivo no painel esquerdo.
No painel esquerdo, contém uma caixa de busca e um botão New (Novo) para criação de um novo Repository (Repositório), Folder (Pasta) ou File (Arquivo).
Você pode criar um repository para desenvolver algum projeto ou organizar seus estudos do GEE. Dessa forma, dentro dos repositórios, é possível criar folders e files de scripts, quanto mais organizado, melhor.
Crie um novo file com o nome hello_world.
Também é possível escrever notas nos códigos, ou seja, chamados de “comentários”, são uma forma de documentar e descrever uma parte do código, o que facilita a compreensão quando se realizada um projeto e depois de algum tempo retornamos para o mesmo, bem como para que outras pessoas consigam entender.
O formato de comentário JSDoc (/** comentário */) deve ser utilizado para documentar arquivos, classes, funções, métodos e propriedades. Os demais tipos de comentários serão apenas visuais para o usuário.
Execute o código abaixo no Code Editor e salve.
A instrução que será executada é uma função chamada print() com um determinado valor entre aspas — podendo ser apóstrofo ou aspas. O restante do código — que contém os comentários — não será considerado pelo interpretador, pois são apenas comentários que nos ajudam na documentação.
Tipos de Dados JavaScript
Existem vários tipos de dados no JavaScript, alguns deles são: string, integer, decimal, array e boolean.
Os tipos de dados integer e decimal, lidam com números, strings consistem em letras e outros caracteres, enquanto o boolean é definido como true ou false. Já um array, pode ser considerado como uma lista, ou seja, você consegue armazenar um conjunto de valores.
Para definir valores, seja de qual tipo forem, é necessário declararmos “variáveis”, que são responsáveis pelo armazenamento de um determinado valor/conteúdo e que serão organizadas na memória, onde cada variável tem seu endereço de memória.
Utiliza-se a palavra-chave“var” para definir uma nova variável, que pode estar com ou sem nenhuma atribuição.
Crie um novo file com o nome variables, salve e execute o código abaixo.
Toda linguagem de programação contém “palavras-chave”, ou seja, são palavras que não devem ser utilizadas como nomes de variáveis ou funções, pois são restritas para o funcionamento adequado de cada linguagem de programação.
Restrições para nomear variáveis
- O nome pode começar com cifrão ($) ou sublinhado (_), mas não um número ou outros caracteres especiais;
- O nome pode conter letras, números, cifrão ou sublinhado;
- Variáveis levam em consideração se as letras são maiúsculas ou minúsculas — ou seja, message é diferente de Message;
- Sempre defina uma variável com um nome que descreva o seu tipo de informação;
- Caso a variável possua mais de uma palavra, utilize a convenção Camelo: a primeira palavra se escreve com letras minúsculas e as demais com a primeira letra sempre maiúscula — por exemplo, firstName.
Acessando e Alterando um Array
É comum trabalhar com arrays, mas é importante entender como lidar com eles. Seus valores são armazenados como uma lista, onde existe uma sequência numerada e cada valor possuí sua devida posição nesse array, onde a primeira posição do array, ou seja, seu primeiro elemento, consta na posição zero.
Crie um novo file com o nome lists, salve e execute o código abaixo.
Foi declarado um array chamado colors, que contém nomes de três cores: red, green e blue. Em seguida, são exibidas as cores e alterado o segundo item do array, então, novamente exibe-se o array alterado.
Expressões e Operadores
Uma expressão resulta em um único valor a partir de uma atribuição ou uma avaliação entre dois ou mais valores, como 1 + 1 = 2.
O JavaScript contém os seguintes operadores matemáticos:
- Adição (+);
- Subtração (-);
- Divisão (/);
- Multiplicação (*);
- Incremento (++);
- Decremento(- -);
- Módulo (%).
É importante entender que existe uma ordem de execução ao realizar alguma operação/expressão. A multiplicação e divisão é efetuada antes da adição ou subtração, por exemplo: 5 + 10 * 2 = ?
Crie um novo file com o nome expression_operator, salve e execute o código abaixo.
Observe que temos diversas atribuições no código acima, como a variável price que recebe o valor 10 e qty com o valor 3. Na variável total, é feita a multiplicação de price (10) * qty (3), o resultado será plotado na tela a partir da última instrução print().
Condicionais, Operadores de Condição e Operadores Lógicos
Uma estrutura condicional, juntamente com os operadores condicionais e operadores lógicos (and, or, not), nos auxiliam na lógica para a tomada de decisão, ou seja, verifica-se uma determinada comparação ou restrição foi atendida ou não.
A estrutura consiste na ideia de if then else, ou seja, se uma condição é verdadeira (true), então o código de seu escopo será executado, caso contrário (false), outro escopo de código será.
Os operadores condicionais nos permitem avaliar determinadas situações para obter o resultado que desejamos, seja true ou false. São eles:
- Igual a (==);
- Diferente de (!=);
- Maior que (>);
- Menor que (<);
- Maior que ou igual a (>=);
- Menor que ou igual a (<=);
- Estritamente igual a (===);
- Estritamente diferente que (!==).
Os operadores lógicos podem ser utilizados para realizar mais de uma comparação, são eles:
- AND (&&), possibilita testar mais de uma condição;
- OR (||), verifica uma condição;
- NOT (!), considera-se um booleano, inverte a lógica, ou seja, o que é true se torna false e o que é false se torna true.
Crie um novo file com o nome conditionals_operators, salve e execute o código abaixo.
Acima, foi elaborada diversas comparações utilizando a instrução if…else com operadores de comparação e lógicos. Repare no último if que contém a comparação de uma string com um integer, mas a instrução considerou o número como uma string, pois não estamos utilizando o operador de condicional “estritamente igual a” (===).
Sendo assim, é necessário sempre ter atenção ao lidar com os dados e a lógica que se aplica para obter um resultado conciso.
Estrutura Switch
A estrutura switch avalia uma determinada expressão ou valor para cada cláusula case, ao encontrar alguma correspondência com esse valor, um bloco de código é executado. Também é possível definir um valor default (padrão), caso nenhuma das clausulas case tenha correspondido. A palavra-chave break, indica uma flag de saída, nesse caso, a instrução switch é interrompida, pois já cumpriu o seu papel.
Crie um novo file com o nome switch, salve e execute o código abaixo.
Avaliando o primeiro switch, foi declarada uma variável chamada pi, a estrutura switch irá verificar a expressão e em seguida, cada cláusula case contém um valor para ser comparada com a expressão e um código que será executado — caso o valor seja correspondido.
O primeiro case, não é executado, pois seu valor não corresponde com o valor da expressão que estamos tentando validar. Já no segundo case, o valor corresponde ao pi e as instruções desse respectivo case é executado. A última instrução é um break, finalizando a estrutura switch, ou seja, o próximo case e default, não serão executados.
Loops
Quando necessário realizar uma tarefa repetidamente, é útil utilizar loops, comumente chamados de “laço de repetição”, utiliza-se as estruturas for, while ou do…while.
Quando é sabido o número de repetições necessárias para resolver uma tarefa, é comum utilizar um for, sua expressão — geralmente — é um contador. Já quando não se sabe o número de vezes que o código num loop deve ser executado, utilizamos o while, onde é necessário definir uma expressão adequada, enquanto essa expressão for verdadeira, o código será executado.
A estrutura do…while é semelhante ao while, a diferença é que ela sempre irá executar as primeiras instruções do loop para depois verificar se continua ou não.
Crie um novo file com o nome loops, salve e execute o código abaixo.
Inicialmente foi definido duas variáveis, arr e k, em seguida a instrução for, que conta com uma expressão: inicialização (var i = 0) seguida de uma condição (i < 10) e um pós-incremento (i++).
Sendo assim, o loop será executado enquanto i < 10 e a cada vez que ele executar seu escopo de código, irá checar novamente se i < 10 e atribuirá +1 para i se a condição (i < 10) ainda for true.
No array, é atribuído o valor de i na posição i (do indice do array), em seguida, consta uma condição if, para verificar se i é igual a 5, se for, irá executar a instrução continue, que diz ao interpretador para continuar normalmente o fluxo da iteração — o contrário do break.
Na estrutura while, utilizamos a variavél k na condição (k < 10), ou seja, enquanto essa condição é true, o código em seu escopo será executado — repare que utilizamos pós-incremento na variável k.
Em seguida, utilizando do…while, as instruções são executadas, exibindo o valor da posição x do array (arr), onde no while anterior, fizemos atruibuições na variável k, ou seja, k contém 10 armazenado — por isso utilizou-se um pré-decremento para o indice que desejamos exibir.
No final, a condição (k < 1) é false, mas ainda sim, as instruções contidas nessa estrutura, foram executadas pelo menos uma vez.
Funções
Uma função tem o objetivo da realização de uma determinada tarefa através de uma ou mais instruções, como por exemplo um cálculo, o que possibilita efetuar a chamada de uma função a qualquer momento que precisar, sem necessidade de escrever a mesma novamente.
Existem algumas maneiras de declarar uma função:
- Funções nomeadas, que contém um nome de função e podem ser chamadas pelo seu nome;
- Expressões de funções, onde comumente o nome é omitido — chamada de função anônima. Essa função é armazenada em uma variável;
- “Immediately Invoked Function Expression” (IIFE), em português Expressão de Função Chamada Imediatamente, é executada no momento em que o interpretador as encontram.
Para criar uma função, utiliza-se a palavra-chave function seguida do nome da função, onde a depender de cada tarefa que se deseja realizar, uma função pode conter parâmetros, ou seja, algum valor que deva ser fornecido para que a função consiga realizar a tarefa.
Crie um novo file com o nome functions, salve e execute o código abaixo.
Declaramos algumas funções acima, mas focando na de nome square, é possível entender as demais com auxílio do descritivo das formas de declarar uma função.
A função square contém um parâmetro chamado num. No escopo entre as chaves de abertura e fechamento ({ }) temos as instruções de uma função — aqui apenas uma.
Essas instruções no escopo da função são próprias dela, ou seja, num pode ser utilizada no escopo atual (nível local), mas também é possível utilizar variáveis de fora, ou seja, variáveis de nível global se assim definirmos. A palavra-chave return irá retornar a multiplicação entre num * num para quem a chamou.
Já na função print() do JavaScript, passamos como argumento a função square que foi criada, onde também passamos o número 2 como argumento — da função square. Existe uma pequena diferença entre parâmetros e argumentos: parâmetros são considerados como uma declaração de algum valor que nos será passado — tais valores são os argumentos.
Objetos
Objetos são formados por chave-valor, a partir de um conjunto de propriedades e métodos (funções) que os caracterizam. É a forma de “materializar” aspectos do mundo real em código, como um livro, que possuí um nome, autor e quantidade de páginas.
Crie um novo file com o nome objects, salve e execute o código abaixo.
Existem algumas maneiras de criar objetos conforme o código acima, mas no GEE, é recomendável utilizar a notação literal e para acessar suas propriedades, notação de ponto, também conhecida como operador de membro. Definimos um objeto chamado car, que contém algumas propriedades e um método (checkGas).
Veja que temos diversos tipos de propriedades no objeto car, cada um com seu respectivo valor. No método checkGas, a palavra-chave this é utilizada genericamente para indicar o objeto da função que this invoca — ou seja, car.
Para acessar determinadas propriedades e métodos, utilizamos a notação de ponto. Nos prints elaborados, constam algumas maneiras de exibir as propriedades de um objeto.
Agora que você possui uma fundamentação básica em JS para codificar no ambiente do GEE, acesse a Parte II deste artigo.
REFERÊNCIAS BIBLIOGRÁFICAS
AWS. O que é uma API?, 2023. Disponível em: <https://aws.amazon.com/pt/what-is/api/>. Acessado em: 02 jan 2023.
DEITEL, Paul. Java: como programar: 10 ed. — São Paulo, SP: Pearson Education do Brasil, 2017.
DUCKETT, Jon. JavaScript & Jquery: desenvolvimento de interfaces web interativas: 1 ed. — Rio de Janeiro, RJ: Alta Books, 2015.
Google. Google JavaScript Style Guide, 2022. Disponível em: <https://google.github.io/styleguide/javascriptguide.xml>. Acessado em: 05 jan. 2023.
Google Earth Engine. Get Started with Earth Engine, 2022. Disponível em: <https://developers.google.com/earth-engine/guides/getstarted>. Acessado em: 02 jan. 2023.
Google Earth Engine. Introduction to JavaScript for Earth Engine, 2021. Disponível em: <https://developers.google.com/earth-engine/tutorials/tutorial_js_01>. Acessado em: 03 jan. 2023.
MDN Web Docs. Functions, 2022. Disponível em: <https://developer.mozilla.org/pt-BR/docs/Web/JavaScript/Guide/Functions>. Acessado em: 04 jan. 2023.
MDN Web Docs. If…else, 2022. Disponível em: <https://developer.mozilla.org/pt-BR/docs/Web/JavaScript/Reference/Statements/if...else>. Acessado em: 05 jan. 2023.
MDN Web Docs. IIFE, 2022. Disponível em: <https://developer.mozilla.org/pt-BR/docs/Glossary/IIFE>. Acessado em: 04 jan. 2023.
MDN Web Docs. Looping code, 2022. Disponível em: <https://developer.mozilla.org/en-US/docs/Learn/JavaScript/Building_blocks/Looping_code>. Acessado em: 07 jan. 2023.
MDN Web Docs. Making decisions in your code — conditionals, 2022. Disponível em: <https://developer.mozilla.org/en-US/docs/Learn/JavaScript/Building_blocks/conditionals>. Acessado em: 05 jan. 2023.
MDN Web Docs. switch, 2022. Disponível em: <https://developer.mozilla.org/pt-BR/docs/Web/JavaScript/Reference/Statements/switch>. Acessado em: 07 jan. 2023.
MDN Web Docs. Working with objects, 2022. Disponível em: <https://developer.mozilla.org/pt-BR/docs/Web/JavaScript/Guide/Working_with_Objects>. Acessado em: 05 jan. 2023.