Manipulações básicas de arquivos raster usando GDAL e python

 

  • Reprojetar raster;

  • Fazer resample de raster;

  • Clipar raster

 

O GDAL é uma translator library para dados vetoriais e rasteriais, com modelos próprios para trabalhar esses tipos de dados.

Uma grande diversidade de pacotes e libraries em diversas linguagens são baseados no GDAL. Acredito que vale muito a pena saber usá-la até para entender melhor a estrutura dos dados no contexto de GIS.

O GDAL tem API para diversas linguagens, incluindo o python. A API para python pode ser consultada aqui

 

Resampling é uma operação na qual pegamos os dados (valores) do raster, tiramos do seu grid original, e colocamos em um novo grid (outro tamanho de pixel: diferentes números de linhas e colunas).

A Reprojeção acaba sendo algo semelhante, pois conta com um resampling feito em um grid de diferente CRS do raster original.

Já a operação conhecida como clip é apenas cortar o raster usando, em geral, um arquivo vetorial (como shape por exemplo) como referência.

 

Reprojetar

from osgeo import gdal
import numpy as np

ds = gdal.Open('path_to_raster')
# (apenas p/ checar:)
print(ds.GetGeoTransform()) # upper left corner, spatial resolution
print(ds.GetProjection()) # proj system

# Usar o método gdal.Warp, bem versátil p/ várias dessas operações
dsReprj = gdal.Warp('nameRasterOutput.tif',
                    ds,
                    dstSRS = 'EPSG:4326') # epsg p/ o qual quero mudar

 

Resample

Nesse caso, tenho um raster de resolução espacial = 3m, e quero fazer um resampling para que ele passe a ter resolução espacial = 10m.

dsRes = gdal.Warp('ndviRes.tif',
                  ds,
                  xRes = 10, # modificando numero de linhas e colunas
                  yRes = 10,
                  resampleAlg = 'bilinear') # Metodo. default: nearest neighbour

 

Clip

Esse é um tipo de atividade bastante comum quando trabalhamos com arquivos rasteriais e vetorais. Para arquivos rasteriais, é comum usarmos um arquivo tipo shapefile para delimitar e recortar nossa área de interesse em um raster (ex: imagem de satélite) maior.

dsClip = gdal.Warp('ndviClip.tif', # arquivo que será criado
                   ds, # o raster que foi aberto anteriormente
                   cutlineDSName = 'path_to_vector_file', # meu shapefile de referencia
                   cropToCutline = True, # clip to the extent of the vector file
                   dstNodata = np.nan)

# fechar
ds = dsClip = dsRes = dsReprj = None

 

Obs: Usei como fonte para o código o canal Making Sense Remotely, que tem ótimos tutoriais de GIS para R e python. Veja aqui.