Resolvido: a nova versão do rasterio (1.0 ou superior) não está me deixando usar geotransformações do tipo GDAL
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.
Esta semana, estou discutindo um erro que costumava ser um simples aviso (warning) no antigo rasterio - e eu ignorei. Aprendi a lição!
Eu estava salvando rasters GeoTIFF, como eu sempre faço, mas em um ambiente Python atualizado (com o rasterio 1.2.6) quando obtive este erro:
TypeError: GDAL-style transforms have been deprecated. This exception will be raised for a period of time to highlight potentially confusing errors, but will eventually be removed.
Lê-se, portanto, que em versões futuras, este erro não será mostrado e o rasterio tentará interpretar a geotransformação do GDAL fornecida como uma transformação do tipo affine, ou então, fornecerá uma mensagem de erro diferente desta. Se você está lendo este post porque teve erros utilizando versões posteriores do rasterio (que, neste momento, ainda não existem), saiba que um erro mais geral ou resultados inesperados, especialmente se o rasterio está sendo usado com transformações do tipo GDAL, podem ser indicativos do mesmo problema que eu estou descrevendo aqui neste post.
O que causou o erro para mim
O código que eu estava tentando executar tinha alguma semelhança com os mostrados neste post.
Primeiro, chamei o rasterio para ver a geotransformação de um arquivo .tif análogo ao que eu queria salvar (para que eu pudesse usar a mesma transformação).
with rasterio.open('…testtif.tif') as dataset:
print(dataset.crs)
Copiei a geotransformação e a salvei em uma variável:
Transform=(-120.10000000000001, 0.1, 0.0, 32.3, 0.0, -0.09999999999999999)
E, em seguida, tentei salvar meu arquivo análogo usando esta mesma transformação.
saida = np.float32(prec)
with rasterio.open(
'prec1.tif',
'w',
driver='GTiff',
height=saida.shape[0],
width=saida.shape[1],
count=1,
dtype=np.float32,
crs=dataset.crs,
transform=Transform,
) as dest_file:
dest_file.write(saida, 1)
dest_file.close()
mas… isso causou um erro!
Solução rápida
Felizmente, as transformações do GDAL estão obsoletas, mas é muito fácil transformá-las em geotransformações do tipo Affine! Esta resposta do StackExchange me deu o que eu precisava saber resolver meu problema na hora. Para resolver rapidamente o erro, basta executar:
from affine import aff
af_transf = aff.from_gdal(*Transform)
e, em seguida, execute o resto do código, mas, na hora de salvar, chame a transformação affine em vez da do GDAL. Não houve necessidade de alterar a referência espacial (crs) ao salvar.
saida = np.float32(prec)
with rasterio.open(
'prec1.tif',
'w',
driver='GTiff',
height=saida.shape[0],
width=saida.shape[1],
count=1,
dtype=np.float32,
crs=dataset.crs,
transform=af_transform,
) as dest_file:
dest_file.write(saida, 1)
dest_file.close()
Se você já estiver usando o rasterio, você não precisa instalar nada antes de carregar o affine.
Por que isso acontece?
Esses erros estão começando a aparecer agora, à medida que migramos das versões antigas do rasterio para as mais novas. Este erro, em especial, foi implementado na versão 1.0 do rasterio para descontinuar o uso das geotransformações do tipo GDAL, para que se use somente geotransformações do tipo affine no rasterio. Isto pode ser visto na documentação do rasterio 1.0.
Essencialmente, as geotransformações GDAL e affine possuem as mesmas informações, em uma ordem diferente. É como se as transformações GDAL fossem do tipo: (c, a, b, f, d, e) enquanto as affine são (a, b, c, d, e, f). Portanto, outra possibilidade seria reorganizar esses valores você mesmo antes de salvar o raster. Mais informações sobre as diferenças das geotransformações GDAL e rasterio podem ser encontradas na documentação do rasterio.