Python para Geociências: Abrindo Imagens de Satélites (passo a passo)

Primeiro post de uma série que vai ensinar a não programadores como usar o Python para tratar a analisar dados geoespaciais.

Introdução

Esse é o primeiro de uma série de stories que pretendo publicar sobre como utilizar a linguagem de programação Python para trabalhar com dados geoespaciais. Após alguns anos trabalhando na área, observo que existem muitos profissionais da area de geociências que não são programadores mas que precisam, em algum momento, usar uma linguagem de programação pra fazer alguma análise, um cálculo ou apenas automatizar um processo manual. Muitas vezes aqueles que buscam fazê-lo encontram dificuldade. Sem o devido conhecimento, acabam por desenvolver códigos complexos sem seguir as melhores práticas que são propensos a erros e que nem sempre são eficientes para tratar dados tão pesados como os dados geoespaciais. Em um outro extremo, temos também profissionais da área de TI que dominam os conceitos da programação mas que não possuem o conhecimento para trabalhar corretamente com os dados geoespaciais. Essa série visa preencher justamente esta lacuna.

Além disso se você, assim como eu, não tem uma formação em programação, alguns conceitos fundamentais para uma boa codificação tais como classes, herança, sobrecarga de operadores, dentre outros, são normalmente explicados de forma abstrata ou por meio de exemplos que não fazem muito sentido na vida real, causando desinteresse e dificuldade de entendimento.

Dessa forma, a ideia é ensinar desde conceitos básicos até mais avançados de Python por meio de exemplos das áreas de geociências e meio ambiente, com manipulação de dados geoespaciais, sejam matriciais ou vetoriais. Ao contrário da maioria do material disponível online, a abordagem será top-down, onde primeiro aprenderemos a executar uma tarefa para depois nos aprofundarmos em algum conceito necessário. Todo o código necessário para acompanhar o material estará disponível por meio de Jupyter Notebooks (mais detalhes ao longo do texto).

Passo 1- Instalação

Instalando o Python

Como estamos aqui assumindo que os leitores não são muito familiarizados com a programação, vamos optar por instalar o Python em ambiente Windows, por meio da interface gráfica, sem nos preocuparmos com a linha de comando (pelo menos nesse momento, pois à medida em que formos avançando passaremos a usar também linha de comando para instalação de pacotes, download de imagens, etc.). Para alguns trabalhos mais avançados, como por exemplo o processamento de múltiplas imagens geoespaciais em um servidor remoto de alto desempenho, normalmente será necessário utilizar o Python em Linux, mas tudo o que for feito no Windows servirá de base para a futura migração.

No Windows, a maneira mais fácil de ter um ambiente Python pronto para ser utilizado é instalando o gerenciador de pacotes Anaconda, disponível em: https://www.anaconda.com/products/individual

A instalação segue o padrão normal do Windows, por meio de wizards. Uma vez instalado, o Anaconda Navigator estará disponível.

Figura 1: Tela inicial do Anaconda Navigator. Imagem do autor.

Antes de iniciarmos com nosso exemplo vamos criar um ambiente específico para nosso código. Ambientes são a forma como os pacotes do Python são instalados para evitar conflitos entre pacotes e versões. Por exemplo, se você possui um código desenvolvido utilizando um pacote do NumPy 1.18 e este código não funciona com a versão atual que é a 1.20, você pode (e deve) criar ambientes específicos para cada versão, conforme exemplificado na Figura 2.

Figura 2: Exemplo de ambientes do Anaconda. Fonte: https://nbisweden.github.io/workshop_omics_integration/conda_instructions.html

Inicialmente o conda vem com um ambiente padrão denominado base(root). Vamos criar um novo ambiente, clicando em Environments à esquerda e no botão Create abaixo da lista de ambientes . Podemos dar a este novo ambiente o nome “pfg_env_1” e selecionar Python 3.7 como pacote principal (Figura 3).

Figura 3: Criação de um novo ambiente usando o Anaconda Navigator no windows. Imagem do autor.

Para escrever e executar nosso código vamos utilizar o Jupyter Lab, que é uma evolução do Jupyter Notebook, com algumas funcionalidades adicionais. Com o novo ambiente selecionado, clicando novamente em Home, podemos clicar em Install, abaixo do ícone do Jupyter-Lab.

Instalando Pacotes

Voltando para a janela de Environments e clicando sobre o ambiente que acabamos de criar é possível ver na direita a lista de pacotes instalados. A instalação padrão já vem com diversos pacotes, mas para o nosso primeiro exemplo será necessário instalar novos pacotes. Mais uma vez, vamos usar a interface gráfica do Anaconda para procurar e instalar pacotes necessários. Abaixo a lista de pacotes que precisamos instalar e o link para a documentação original de cada um para futura referência (não precisamos nos preocupar com isso no momento).

Para instalar, basta procurar o pacote desejado na lista à direita (de preferência colocar All no dropdown), selecionar o pacote e clicar em Apply.

Obs: Como os pacotes trabalham com dependências, dependendo do pacote que vai ser instalado ele irá instalar todos os pacotes necessários que ainda não existem no ambiente na versão correta.

A Figura 4 mostra o procedimento para instalar o Rasterio e o detalhe de que o NumPy é automaticamente instalado por ser uma das dependências não existentes.

Figura 4: Instalação de pacotes usando o Anaconda Navigator. Imagem do autor.

Repetimos a mesma operação para o Matplotlib (que usaremos para uma primeira visualização) e estamos prontos para prosseguir.

Iniciando o Jupyter Lab

Como já mencionado, o Jupyter Lab é o ambiente que usaremos para desenvolver todo o nosso trabalho em Python. O Jupyter Lab é uma interface web interativa para o desenvolvimento de código, que segue o conceito conhecido como REPL (Read — Evaluate — Print — Loop), bastante usado por cientistas de dados. A grande vantagem de utilizar um ambiente REPL é que podemos construir o que queremos de forma gradativa, executando comando a comando. Adicionalmente, podemos manter texto explicativo juntamente ao código que vamos desenvolver e também visualizar os resultados, tudo em um mesmo local sem a necessidade de ficar alternando entre linha de comando e outros aplicativos, como visualizador de imagens ou outro.

Para iniciar o Jupyter Lab basta voltar à tela Home e clicar no botão Launch abaixo do ícone correspondente. Uma nova aba deverá se abrir no navegador padrão. Se você tem agora a tela como na Figura 5 parabéns, você instalou o Python corretamente.

Figura 5: Tela inicial do Jupyter Lab. Imagem do autor.

Passo 2- Trabalhando com o Jupyter Lab

Antes de passar para o nosso objetivo propriamente dito, vamos dedicar alguns instantes apenas para aprender o básico do Jupyter Lab. Conceitos básicos do Python como tipos de dados, trabalhando com listas e muitos outros serão apresentados posteriormente, à medida que necessitarmos deles para realizar nossos objetivos. Neste momento veremos apenas o básico do básico para podermos prosseguir.

Inicialmente vamos clicar no botão Notebook/Python3 para abrir um novo notebook. Notebooks são criados inicialmente com o nome UntitledX.ipynb, que pode ser trocado posteriormente. Note que existem dois tipos de células em um notebook: as células de texto, chamadas de Markdown e as células de código. As células do tipo Markdown servem para deixar cabeçalhos, comentários ou qualquer outra explicação estática, ou seja, que não precisa ser executada. As células de código contém informações que vão ser efetivamente processadas pelo Python para realizar o cálculo solicitado.

O primeiro botão à esquerda (FileBrowser) mostra a árvore de diretório e arquivos do nosso usuário. Como exemplo, vamos digitar inicialmente alguns comandos (o notebook 1, abaixo, possui diversos comandos para você poder executar e se ambientar) para vermos os resultados. Digite sempre os comandos Shift + Enter após finalizar o código de uma célula para executar os comandos e mostrar os resultados.

Notebook 1: Primeiros passos com o Jupyter Lab.

Passo 3- Download de uma imagem Landsat 8

Agora que já temos o Python rodando e já sabemos como executar comandos simples, vamos buscar uma imagem de satélite que queremos abrir. Para começar, vamos usar imagens do satélite Landsat 8, que estão disponíveis para baixar no site da USGS (EarthExplorer). O site requer login por uma conta gratuita. A Figura 6, abaixo, mostra o passo a passo para baixar uma imagem da região de Manaus usando o EarthExplorer.

Figura 6: Baixando uma imagem Landsat 8 pelo Earth Explorer do USGS. Imagem do autor.

Inicialmente navegamos no mapa interativo, fazemos um “zoom” na região de interesse e clicamos em Use Map. Depois selecionamos o período de interesse no meu caso de 1/1/2020 a 1/1/2021 para imagens com cobertura de nuvens (Cloud Cover) entre 0 e 20%, a fim de evitar imagens com muitas nuvens. Depois clicamos em Data Sets para selecionar a coleção de dados que queremos (no caso as imagens do Landsat Level 2A, o que significa que essas imagens já passaram por um primeiro tratamento de correção atmosférica, dentre outros) e por fim clicamos em Results para que o sistema mostre uma lista de imagens encontradas de acordo com os filtros selecionados. No meu caso, selecionei a imagem LC08_L2SP_231062_20201026_20201106_02_T1 e descompactei o conteúdo em um diretório denominado d:/Images/Landsat/. Dentro do diretório da imagem devem estar contidos os seguintes arquivos:

Figura 7: Conteúdo de uma imagem Landsat 8. Imagem do autor.

Os arquivos que terminam com _SR_B?.tif representam a reflectância de superfície (sr = surface reflectance) para cada uma das bandas do sensor OLI (Operational Land Imager). Os comprimentos de onda de cada banda, bem como outras informações técnicas sobre o sensor, podem ser encontradas na página do próprio USGS (aqui).

Passo 4- Abrindo uma imagem GeoTiff

Coloquei GeoTiff no título do tópico pois nesse primeiro momento abriremos apenas uma “banda” e não uma imagem inteira com as várias bandas, metadados, etc. Para fazer isso, vamos utilizar o pacote Rasterio que já foi instalado no Passo 1. Inicialmente precisamos compreender o que uma imagem raster representa na prática e o que uma imagem geoespacial tem de diferente.

Imagem raster

Uma imagem raster é uma imagem que pode ser representada por uma matriz de n linhas por m colunas de valores, onde cada valor representa a intensidade ou “brilho” daquele pixel. A Figura 8 mostra a imagem de uma flor em escala de cinza (apenas um “canal” ou banda) e os valores correspondentes para cada pixel.

Figura 8: Exemplo de uma imagem raster. Imagem do autor.

Além disso, uma imagem raster geoespacial possui também metadados para informar o local na superfície terrestre onde cada um dos valores ocorre. Para isso, são utilizados adicionalmente uma transformação , responsável por indicar o local da matriz em um espaço arbitrário, e um sistema de coordenadas de referência (CRS), que converte esse espaço em localização terrestre.

Abrindo o GeoTiff

Os tipos de dados suportados originalmente pelo Python são bastante limitados, então pra que possamos manipular outros tipos de dados normalmente recorremos a módulos desenvolvidos por terceiros. Os módulos necessários já foram instalados anteriormente e agora basta os incluir no nosso código com o comando Import. O código abaixo mostra como importar os pacotes e abrir a banda 4 da imagem do Landsat que baixamos, que corresponde ao comprimento de onda do vermelho (entre 640–670 nanômetros).

Notebook 2: Abrindo uma imagem GeoTiff com o Rasterio e visualizando com o Matplotlib.

Agora que já conseguimos abrir uma banda do Landsat, que tal tentar abrir outras bandas (apenas ajustando o caminho), combiná-las em uma imagem colorida ou mesmo dar um “zoom” em alguma área específica, como os exemplos da Figura 9. Mas não se preocupe se for muito complicado, pois faremos isso na próxima história.

Figura 9: Imagem Landsat 8 de 26/10/2020, apresentada em cores naturais e detalhe da cidade de Manaus. Imagem do autor.

Conclusão

Na história de hoje aprendemos o básico de como instalar o Python e usá-lo para abrir uma banda de uma imagem Landsat 8. Na próxima história vamos aprender a trabalhar com várias bandas, criar índices e mostrar imagens com cores naturais e falso RGB.

Enquanto isso, deixe nos comentários o que achou do tutorial e se teve alguma dificuldade para segui-lo, ou alguma sugestão para melhorá-lo. Esse primeiro foi simples, mas aumentaremos a dificuldade ao longo dos próximos. Fique ligado e até a próxima!

Doctorate student @ Université Paul Sabatier (Toulouse). Water Resources Specialist at the Brazilian National Water Agency.

Get the Medium app

A button that says 'Download on the App Store', and if clicked it will lead you to the iOS App store
A button that says 'Get it on, Google Play', and if clicked it will lead you to the Google Play store