Script em python para Diferença de Temperatura de Brilho

A diferença de temperatura de brilho (BTD, de Brightness Temperature Difference) é uma das ferramentas disponíveis para detecção de nevoeiros e nuvens stratus usando imagens de satélite. Ela é calculada através do valor da temperatura de brilho obtida em 10,3 μm menos a de 3,9 μm (canal 13 – canal 7 do GOES-16). Para mais detalhes desse produto e outras ferramentas de diagnóstico e previsão dessas nuvens baixas, veja no post Detecção de nevoeiro com imagens de satélite.

Imagens dos canais 7 e 13 (GOES-16) com pontos de observação em superfície considerados.
Imagens dos canais 7 e 13 (GOES-16) com pontos de observação em superfície considerados.

O script “fog_product.py” descrito nesse post e hospedado no github (viniroger/fog_product) tem como objetivo gerar uma imagem de BTD para uma certa área e data/horário informados pelo usuário. Na preparação do ambiente, a sugestão é instalar o miniconda com python 3.8 (o 3.7.10 ainda funciona mas dá uns warnings e no 3.9.5 funciona normalmente) e criar um ambiente virtual com alguns pacotes instalados, conforme o comando a seguir:

conda create --name workshop -c conda-forge pandas matplotlib netcdf4 cartopy boto3 gdal

Esses pacotes devem ser carregados no início da execução do script. O netcdf4 será responsável por ler os arquivos netCDF, o cartopy deve adicionar o shapefile de contornos políticos no mapa, o boto3 faz a conexão com o Amazon Web Services (AWS) para baixar as imagens de satélite e o gdal faz a manipulação de dados geoespaciais.

Os limites em latitudes e longitudes que definem a área desejada, assim como a data e horário da imagem de interesse, devem ser inseridos nas variáveis “extent” e “yyyymmddhhmn” respectivamente, conforme indicado no script. O restante não precisa receber alterações do usuário. A informação de tempo é importante para definir o nome do arquivo do GOES-16, que usa a seguinte nomenclatura:

{Operational System Real-Time Data}_{sensor}-{nivel}-{nome curto do produto}-M{modo de operação}{canal}-G{GOES}-s{hora inicial do scan:ano-dia_do_ano-hh:mm:ssUTC}_e{hora final do scan:ano-dia_do_ano-hh:mm:ssUTC}_c{hora de criação do dado}{ano-dia_do_ano-hh:mm:ssUTC}.nc

Em seguida, o script verifica se existem os diretórios “input” (recebe as imagens baixadas) e “output” (recebe a imagem recortada e reprojetada e o mapa em PNG gerado) existem; caso contrário, serão criados. Os métodos desenvolvidos para o script são definidos no arquivo “helpers/utilities.py”.

O método “download_CMI” recebe como parâmetros a informação de tempo, a banda e o diretório de destino para os arquivos a serem baixados. Ele também verifica se o arquivo existe no servidor para essa data e se o arquivo já existe – somente baixa se o arquivo não existir. Basicamente, o método conecta-se ao Amazon S3 (Amazon Simple Storage Service) no bucket “noaa-goes16” e baixa o arquivo indicado pela variável “prefix”. Um bucket é um contêiner para objetos armazenados no Amazon S3. Um valor de prefixo é semelhante a um nome de diretório que permite agrupar objetos semelhantes em um bucket. Para mais informações, veja o guia do usuário da Amazon.

O método “get_ds” recebe a localização de onde está gravado o arquivo baixado, nome do arquivo, variável a ser lida (‘CMI’ no caso, de “ABI L2 Cloud and Moisture Imagery”) e um valor ‘k’ a ser somado no resultado final de cada pixel (nesse caso, zero). Quando o arquivo é aberto, deve-se obter os valores de ‘scale’ (escala, a ser multiplicado) e ‘offset’ (limiar, a ser somado) no valor de cada pixel. Tamvém são obtidos os valores de ‘undef’ (indefinido) e ‘dtime’ (data/horário de início da cobertura).

Esse procedimento é repetido para as duas bandas, calculando-se a diferença entre elas. Também é criado um novo nome para o arquivo final, baseado no nome do arquivo baixado.

O método “proj_ret” lê a projeção do arquivo original e configura a projeção de saída (retangular). Ele também recorta para a área informada na variável ‘extent’ e salva com o nome informado como parêmetro.

Por fim, são definidas algumas propriedades, dentro de um dicionário, para plotagem do mapa: ‘colormap’ (mapa de cores), ‘label’ (rótulo da escala de cores), ‘band’ (banda utilizada, para o título) e os valores mínimos e máximos da escala de cores (‘vmin’ e ‘vmax’).

A escala de cores ‘gray’ vai do preto ao branco (usada para o canal visível e para o BTD), enquanto que a ‘gray_r’ é a cinza reversa (do branco ao preto, usada para os canais do infravermelho). Com o método “matplotlib.colors.ListedColormap”, você pode criar uma escala de cores personalizada. Para esse produto, pode ser interessante uma escala (des)contínua divergente de duas cores: cinza escuro do valor mínimo até branco no zero (parte negativa) e do branco até azul no valor máximo (parte positiva).

O método “plot_map” recebe esse e outros parâmetros já conhecidos para ler o arquivo netCDF reprojetado e plotar essa imagem com o mapa de cores indicado. Também é adicionada uma camada “shapefile” com os contornos dos estados brasileiros, além de linhas para os litorais, fronteiras e linhas de grade. Essa camada extra pode ser obtida no site do IBGE (“BR_UF_2019.shp”) ou da Natural Earth (com os contornos de estados e províncias dos outros países). Alguns pontos do arquivo ‘helpers/places.csv’ também são plotados sobre o mapa (cada linha do arquivo é um ponto, com as colunas indicando o texto a ser impresso, latitude e longitude). Após a inclusão de barra de cores e título com informações de banda, data/horário e limites da região recortada, o arquivo é salvo em uma imagem do tipo PNG.

Esses scripts e arquivos utilizados estão disponíveis no github (viniroger/fog_product) juntamente com o arquivo “plot_goes16.py”, que é uma versão do script principal para baixar e plotar somente uma banda. Eles foram utilizados para o estudo de caso de BTD na detecção de nevoeiro durante um episódio de massa de ar frio no inverno sobre o sul da América do Sul.

Curso Processamento de Dados de Satélites Geoestacionários com Python

Esses scripts foram feitos com base no curso Processamento de Dados de Satélites Geoestacionários com Python, oferecido por dois cursos por especialistas da Divisão de Satélite e Sensores Meteorológicos (DISSM) e Divisão de Previsão de Tempo e Clima (DIPTC) do INPE: Rogério Batista e Diego Souza. Ele possui um pré-curso, que contém alguns vídeos curtos introdutórios sobre o GOES-16 (veja playlist abaixo), instruções para instalação de ambiente e tutoriais para testar algumas funcionalidades.

Para baixar os arquivos de imagens ABI e GLM do GOES-16/17 disponíveis na Amazon, existe este link do Research Computing Support for the University of Utah que disponibiliza uma interface gráfica para escolher o tipo e período dos dados. Mais procedimentos podem ser vistos no Google colab, na apresentação gravada no Youtube e no github: diegormsouza/Geo-Sat-Python-Mar-2021.

Compartilhe :)

2 comments

Leave a Reply

O seu endereço de e-mail não será publicado. Campos obrigatórios são marcados com *

Esse site utiliza o Akismet para reduzir spam. Aprenda como seus dados de comentários são processados.