Llamar al complemento de interpolación desde la consola Python de QGIS

13

Me gustaría llamar a la función del complemento de interpolación QGIS (método TIN) (Raster-> Interpolate) desde la consola de Python.

No puedo encontrar la función correspondiente en QGIS API o en la lista de algoritmos de procesamiento. Encontré el algoritmo de triangulación SAGA, que funciona bien pero es 5-10 veces más lento y la velocidad es importante en mi caso.

¿Alguna idea de cómo ejecutarlo?

Vincent D.
fuente
2
Aunque no requiero esto, sería útil saberlo. Seguí este enlace: ( gis.stackexchange.com/questions/11216/… ). Llegué from rasterinterpolation import rasterinterpolationpero no estoy seguro de a qué módulo llamar (o cómo llamar).
Joseph
¿Podría aclarar sus requisitos un poco más? ¿Simplemente está buscando una manera de calcular una nueva capa ráster interpolada a partir de una capa ráster de entrada?
oscuro
Tengo un problema similar: quiero crear un modelo de cuenta atrás que comience con Ráster \ interpolación seguido de Saga \ contornos desde la cuadrícula. La pregunta es: ¿cómo agregar el rasterinrepolator en la ventana "modelador de procesamiento"?
H.Wiener

Respuestas:

4

Pude proporcionar una solución completa en la siguiente pregunta:

¿Cómo calcular un ráster de interpolación desde la consola de Python en QGIS?

Volveré a publicar la respuesta aquí también, debido al gran interés que parece atraer:

Responder:

La documentación sobre PyQGIS no es muy explica por sí mismo, pero me di cuenta de cómo llamar correctamente a las clases de interpolación asociados ( QgsInterpolator, QgsTINInterpolator, QgsIDWInterpolator, QgsGridFileWriter) de pitón. Voy a describir cada paso del guión con gran detalle:

Paso 1:

Importe el núcleo y el módulo de análisis y obtenga la capa vectorial deseada para la interpolación seleccionándola con un clic del mouse en la pestaña de la capa.

import qgis.core
import qgis.analysis

layer = qgis.utils.iface.activeLayer()

Paso 2:

Prepare las clases de interpolación con los parámetros necesarios. Los parámetros exactos para la inicialización de la estructura LayerData se pueden encontrar en los documentos de la API QGIS (searchterm: QgsInterpolator).

layer_data = QgsInterpolator.LayerData()
layer_data.vectorLayer = layer
layer_data.zCoordInterpolation=False
layer_data.InterpolationAttribute =0
layer_data.mInputType = 1

Tenga en cuenta que no uso la Coordenada z, obtengo el primer campo disponible (índice = 0) como atributo de interpolación y uso PUNTOS como tipo de entrada.

Paso 3:

Elige tu motor de interpolación. Aquí puede elegir entre el método TIN-Interpolation ( QgsTINInterpolator) y IDW-Interpolation ( QgsIDWInterpolator). Tomé el QgsTINInterpolatoren mi código.

tin_interpolator = QgsTINInterpolator([layer_data])

¡Tenga en cuenta que debe pasar una lista de Python layer_dataal motor de interpolación! Esto también le permite agregar múltiples escenarios layer_data.

Etapa 4:

Configure los parámetros necesarios para la exportación de la salida de interpolación (consulte la documentación de QgsGridFileWriter). Estos incluyen información similar a la interfaz gráfica de usuario de interpolación (ruta de archivo, extensión, resolución, número de columnas y filas).

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") 

Tenga en cuenta la extensión del archivo de su ráster de salida, ya que QgsGridFileWritersolo escribe ASCII-grids ( .asc). Los datos se escriben en el disco llamando al writeFile()método. Después de exportar, puede agregar el archivo de cuadrícula como ráster al lienzo.

Guión completo para referencia:

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)

¡Tenga en cuenta que la API QGIS se reescribe actualmente a la versión 3.0 y las clases de interpolación utilizadas se trasladan de qgis.analysisa qgis.core! ¡Esto tendrá un gran impacto en la funcionalidad de este script, por lo que debe reescribirse para la versión 3.0!

root676
fuente
1
Intento su código de ejemplo, pero solo funciona por layer_data.InterpolationAttribute = 0, lo intento con otro índice de campo, pero solo obtengo 0.
Leonard
Así es, también encontré este problema, pero no tuve tiempo suficiente para investigar la causa. Mi solución fue alimentar el script con una capa que tenía solo el campo deseado. Puede probar los documentos de la API de QGIS para obtener una solución mejorada.
root676
3

Puede hacer esto si tiene instalado el complemento Raster Interpolation usando 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: Realmente no sé qué hace el código anterior aparte del hecho de que imprimió un valor. Pero probablemente te ayudaría a entender el uso.

vinayan
fuente