Chamando o plugin de interpolação no console Python do QGIS

13

Gostaria de chamar a função de plug-in de interpolação QGIS (método TIN) (Raster-> Interpolate) no console python.

Não consigo encontrar a função correspondente na API do QGIS ou na lista do algoritmo de processamento. Encontrei o algoritmo de triangulação SAGA, que funciona bem, mas é 5-10 vezes mais lento e a velocidade é importante no meu caso.

Alguma idéia de como executá-lo?

Vincent D.
fonte
2
Embora eu não exija isso, seria útil saber. Eu segui este link: ( gis.stackexchange.com/questions/11216/… ). Cheguei ao ponto, from rasterinterpolation import rasterinterpolationmas não tenho certeza, de qual módulo ligar (ou como ligar).
Joseph
Você poderia esclarecer um pouco mais seus requisitos? Você está simplesmente procurando uma maneira de calcular uma nova camada raster interpolada a partir de uma camada raster de entrada?
Subterrâneo
Eu tenho um problema semelhante: quero criar um modelo de contorno que comece com Raster \ interpolação seguida por Saga \ contornos da grade. A questão é: como adicionar o rasterinrepolator na janela "processing modeler"?
H.Wiener

Respostas:

4

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 QgsTINInterpolatorno meu código.

tin_interpolator = QgsTINInterpolator([layer_data])

Lembre-se de que você deve passar uma lista python layer_datapara 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 QgsGridFileWriterapenas 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.analysispara qgis.core! Isso terá um enorme impacto na funcionalidade desse script, para que ele seja reescrito para a versão 3.0!

root676
fonte
1
Eu tento o seu código de exemplo, mas apenas trabalhando por layer_data.InterpolationAttribute = 0, I tentar com outro índice de campo, mas e só recebem 0.
Leonard
Isso mesmo - também encontrei esse problema, mas não tive tempo suficiente para investigar a causa. Minha solução foi alimentar o script com uma camada que tivesse apenas o único campo desejado. Você pode tentar os documentos da API do QGIS para obter uma solução aprimorada.
root676
3

Você pode fazer isso se tiver o plug-in Interpolação de varredura instalado usando o Plugin Manager.

from rasterinterpolation.core.rasterinterpolator import RasterInterpolator
rastLayer = iface.activeLayer()
interpolator = RasterInterpolator(rastLayer,0,1)
a= interpolator.linear(QgsPoint(10.662629, 76.225421))
print a

Nota: eu realmente não sei o que o código acima faz, exceto o fato de que ele imprimiu um valor. Mas provavelmente ajudaria você a entender o uso.

vinayan
fonte