Consegui fornecer uma solução completa na seguinte pergunta:
Como calcular uma varredura de interpolação no console python no QGIS?
Também vou repassar a resposta aqui, devido ao grande interesse que parece atrair:
Responda:
A documentação sobre pyqgis não é muito auto-explicativo, mas eu descobri como chamar corretamente as classes de interpolação associados ( QgsInterpolator
, QgsTINInterpolator
, QgsIDWInterpolator
, QgsGridFileWriter
) a partir de python. Vou descrever cada etapa do script em grandes detalhes:
Passo 1:
Importe o núcleo e o módulo de análise e obtenha a camada vetorial desejada para interpolação, selecionando-a com um clique de mouse na guia Camada.
import qgis.core
import qgis.analysis
layer = qgis.utils.iface.activeLayer()
Passo 2:
Prepare as classes de interpolação com os parâmetros necessários. Os parâmetros exatos para a inicialização da estrutura LayerData podem ser encontrados nos documentos da API do QGIS (searchterm: QgsInterpolator).
layer_data = QgsInterpolator.LayerData()
layer_data.vectorLayer = layer
layer_data.zCoordInterpolation=False
layer_data.InterpolationAttribute =0
layer_data.mInputType = 1
Observe que eu não uso a coordenada z, obtenho o primeiro campo disponível (índice = 0) como atributo de interpolação e uso POINTS como tipo de entrada.
Etapa 3:
Escolha seu mecanismo de interpolação. Aqui você pode escolher entre o método de interpolação TIN ( QgsTINInterpolator
) e interpolação IDW ( QgsIDWInterpolator
). Eu peguei o QgsTINInterpolator
no meu código.
tin_interpolator = QgsTINInterpolator([layer_data])
Lembre-se de que você deve passar uma lista python layer_data
para o mecanismo de interpolação! Isso também permite adicionar vários cenários de layer_data.
Passo 4:
Configure os parâmetros necessários para a exportação da saída de interpolação (consulte a documentação de QgsGridFileWriter
). Isso inclui informações semelhantes às da GUI de interpolação (caminho do arquivo, extensão, resolução, número de colunas e linhas).
export_path ="C:/SomeFolder/output.asc"
rect = layer.extent()
res = 10
ncol = int( ( rect.xMaximum() - rect.xMinimum() ) / res )
nrows = int( (rect.yMaximum() - rect.yMinimum() ) / res)
output = QgsGridFileWriter(tin_interpolator,export_path,rect,ncol, nrows,res,res)
output.writeFile(True)
iface.addRasterLayer(export_path, "interpolation_output")
Esteja ciente da extensão do arquivo do seu raster de saída, pois QgsGridFileWriter
apenas grava ASCII-grids ( .asc
). Os dados são gravados no disco chamando o writeFile()
método Após a exportação, você pode adicionar o arquivo de grade como varredura à tela.
Script completo para referência:
import qgis.analysis
import qgis.core
layer = qgis.utils.iface.activeLayer()
layer_data = QgsInterpolator.LayerData()
layer_data.vectorLayer = layer
layer_data.zCoordInterpolation=False
layer_data.InterpolationAttribute =0
layer_data.mInputType = 1
tin_interpolator = QgsTINInterpolator([layer_data])
export_path = "E:/GIS_Workbench/script_output/test.asc"
rect = layer.extent()
res = 10
ncol = int( ( rect.xMaximum() - rect.xMinimum() ) / res )
nrows = int( (rect.yMaximum() - rect.yMinimum() ) / res)
output = QgsGridFileWriter(tin_interpolator,export_path,rect,ncol,nrows,res,res)
output.writeFile(True)
Lembre-se de que a API do QGIS está atualmente reescrita para a versão 3.0 e as classes de interpolação usadas foram movidas de qgis.analysis
para qgis.core
! Isso terá um enorme impacto na funcionalidade desse script, para que ele seja reescrito para a versão 3.0!
from rasterinterpolation import rasterinterpolation
mas não tenho certeza, de qual módulo ligar (ou como ligar).