Como abrir, editar e salvar arquivos raster (.tif) usando Python

Colegas pesquisadores e entusiastas de SIG e código-livre,

Bem-vindos ao meu blog!

Gostaria de começar com um aviso - posso ser pesquisadora desta área, mas isso não significa que tudo o que faço ou escrevo aqui funcionará para você, em suas próprias configurações de desktop e versões de packages. Me eximo de responsabilidade se você perder dados ou bagunçar sua instalação. Eu também não autorizo nenhum tipo de cópia do meu conteúdo.

Hoje, vou escrever sobre como abrir, editar e salvar arquivos raster usando Python, se você já estiver familiarizado com Python (principalmente Anaconda).

Talvez você precise executar uma função Python em cada pixel de um raster, ou talvez você deseje fazer operações personalizadas que não seriam possíveis em softwares com interfaces gráficas como o QGIS. O Python também pode ser usado para fazer processamento em lotes. Em outro post, eu mostrei outra forma de fazer processamento em lote, veja aqui.

Para o processamento de hoje, usaremos o GDAL no Python, instalado através do Conda.

Como fazer isso

A primeira coisa que você precisa fazer é instalar o GDAL no Python usando o Anaconda

conda install gdal

Li que pode ser instalado usando o pip install também, mas não testei:

pip install gdal

e carregue o pacote gdal do osgeo em seu console Python ou script. Eu costumo usar scripts no Anaconda Spyder.

from osgeo import gdal

Sabendo o caminho de seu raster a ser aberto, você pode abri-lo usando o comando a seguir para abrir o raster no modo somente leitura e salvá-lo na variável passo1.

passo1 = gdal.Open ('caminho_do_arquivo.tif', gdal.GA_ReadOnly)

Copie a transformação geográfica para uma variável, que será útil mais tarde.

GT_entrada = passo1.GetGeoTransform()

Leia as bandas de seu raster usando GetRasterBand. No caso, é um raster de somente uma banda.

passo2 = passo1.GetRasterBand(1)

Transforme a banda lida em uma matriz, para poder trabalhar com ela.

img_como_array = passo2.ReadAsArray()

Leia as dimensões do seu array

tam1,tam2 = img_como_array.shape

Crie a saída, a ser salva com as mesmas dimensões do raster de entrada

import numpy as np
saida = np.zeros(shape=(tam1, tam2))

Faça o processamento necessário e salve a saída do mesmo na variável de saída. Por exemplo, todo o raster elevado a 1.2:

for i in range(0,tam1):
    for j in range(0,tam2):
        saida[i,j]=img_como_array[i,j] ** 1.2

A seguir, podemos exportar a variável de saída para um arquivo usando o rasterio.

import rasterio

Pode ser necessário instalar o rasterio digitando no console:

conda install -c conda-forge rasterio

Crie uma variável com a projeção do seu raster. Por exemplo:

dst_crs='EPSG:32722'

Transforme sua saída para float (ponto flutuante)

saida = np.float32(saida)

E, finalmente, salve no arquivo raster de saida

with rasterio.open(
    'raster_saida.tif',
    'w',
    driver='GTiff',
    height=saida.shape[0],
    width=saida.shape[1],
    count=1,
    dtype=np.float32,
    crs=dst_crs,
    transform=GT_entrada,
) as dest_file:
    dest_file.write(saida, 1)
dest_file.close()

Este exemplo salva um arquivo chamado raster_saida.tif

Exemplo com um raster randômico

Eu gerei um raster randômico por distribuição binomial no QGIS 3.18, com valores entre 0 e 10. O intervalo real do raster gerado foi [2,7].

randomized raster

Depois de executar o código do exemplo dado neste post (elevar a 1.2), o seguinte raster foi gerado:

randomized raster

Parece igual, mas a amplitude (min e max) aparece alterada:

randomized raster

Mostrando que o código funcionou!

Luísa Vieira Lucchese
Luísa Vieira Lucchese
Doutoranda

MSc., Engª.

Relacionados