Reprojetando raster (GeoTIFF) usando PyQGIS em script autônomo

Oct 02 2020

Estou tentando reprojetar um arquivo GeoTIFF em um script autônomo PyQGIS.

Usando o QGIS 3.14, as etapas seriam:

resultando no seguinte histórico de processo e no output_raster.tiff sendo criado com sucesso:

processing.run ("gdal: warpreproject", {'INPUT': 'C: /Projects/PythonScripts/qgis_python/input/input_raster.tif', 'SOURCE_CRS': QgsCoordinateReferenceSystem ('EPSG: 2051'), 'TARGET_Coference_CRS': QgsCoordinate ('EPSG: 4326'), 'RESAMPLING': 0, 'NODATA': Nenhum, 'TARGET_RESOLUTION': Nenhum, 'OPTIONS': '', 'DATA_TYPE': 0, 'TARGET_EXTENT': Nenhum, 'TARGET_EXTENT_CRS': Nenhum , 'MULTITHREADING': False, 'EXTRA': '', 'OUTPUT': 'C: /Projects/PythonScripts/qgis_python/output/output_raster.tif'})

Contudo

Executar exatamente o mesmo comando em um script Python independente não cria o arquivo de saída, embora seja executado sem erros.

Meu palpite é que isso tem algo a ver com um GDAL conflitante porque recebo o seguinte erro ao reprojetar um raster diretamente com GDAL:

from osgeo import gdal

input_raster = gdal.Open(r'C:/Projects/PythonScripts/qgis_python/input/input_raster.tif')

gdal.Warp(r'C:\Projects\PythonScripts\qgis_python\output\output_raster.tiff', input_raster, format = 'GTiff', dstSRS="EPSG:4326") 

Erro:

TypeError: no método 'wrapper_GDALWarpDestName', argumento 4 do tipo 'GDALWarpAppOptions *'

e se eu importar GDAL antes qgis.core, ele não consegue encontrar a DLL paraqgis._core import *

Roteiro Completo

import os

os.environ['QT_QPA_PLATFORM_PLUGIN_PATH'] = 'C:\\Program Files\\QGIS 3.14\\apps\\Qt5\\plugins'
os.environ['GDAL_DATA'] = '/home/server/anaconda3/share/gdal'

from qgis.core import (
     QgsApplication,
     QgsProcessingFeedback,
     QgsVectorLayer,
     QgsCoordinateReferenceSystem
)

# See https://gis.stackexchange.com/a/155852/4972 for details about the prefix
QgsApplication.setPrefixPath('C:\\Program Files\\QGIS 3.14\\apps\\qgis\\', True)

from PyQt5 import QtGui, QtCore
qgs = QgsApplication([], False)
qgs.initQgis()

import sys
sys.path.append('C:\\Program Files\\QGIS 3.14\\apps\\qgis\\python\\plugins')

import processing
from processing.core.Processing import Processing
Processing.initialize()

from qgis.analysis import QgsNativeAlgorithms
QgsApplication.processingRegistry().addProvider(QgsNativeAlgorithms())


reproject_params = {'INPUT':'input/input_raster.tif',
                'SOURCE_CRS':QgsCoordinateReferenceSystem('EPSG:2051'),
                'TARGET_CRS':QgsCoordinateReferenceSystem('EPSG:4326'),
                'RESAMPLING':0,
                'NODATA':None,
                'TARGET_RESOLUTION':None,
                'OPTIONS':'',
                'DATA_TYPE':0,
                'TARGET_EXTENT':None,
                'TARGET_EXTENT_CRS':QgsCoordinateReferenceSystem('EPSG:4326'),
                'MULTITHREADING':False,
                'EXTRA':'',
                'OUTPUT':'output/output_raster.tif'}

processing.run("gdal:warpreproject", reproject_params)

Respostas

LeonPowałka Oct 02 2020 at 20:19

Se funcionar na interface QGIS, recomendo que você copie o comando aqui:

Você pode então usá-lo em um script Python autônomo como este:

import os
cmd = 'gdalwarp -s_srs EPSG:2180 -t_srs EPSG:2180 -r near -of GTiff {srcPath} {outPath}'\
    .format(srcPath='/home/lpowalka/Documents/dane/finalResults/fax3.tif', outPath='/home/lpowalka/Documents/dane/finalResults/fax3_warped.tif')
os.system(cmd)

Dessa forma, você evita a complexidade de implantar um script PyQGIS ou usar ligações GDAL Python, que essencialmente levam à execução desse comando de qualquer maneira.