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?


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!


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.

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.