Richiamo del plug-in di interpolazione dalla console Python di QGIS


13

Vorrei chiamare la funzione del plugin di interpolazione QGIS (metodo TIN) (Raster-> Interpolate) dalla console di Python.

Non riesco a trovare la funzione corrispondente nell'API QGIS o nell'elenco degli algoritmi di elaborazione. Ho trovato l'algoritmo SAGA Triangulation, che funziona bene ma è 5-10 volte più lento e la velocità è importante nel mio caso.

Qualche idea su come eseguirlo?


2
Sebbene non lo richieda, sarebbe utile sapere. Ho seguito questo link: ( gis.stackexchange.com/questions/11216/… ). Sono arrivato al punto, from rasterinterpolation import rasterinterpolationma non sono sicuro di quale modulo chiamare (o come persino chiamare).
Joseph,

Potresti chiarire un po 'di più le tue esigenze? Stai semplicemente cercando un modo per calcolare un nuovo livello raster interpolato da un livello raster di input?
underdark

Ho un problema simile: voglio creare un modello di countour che inizia con Raster \ interpolazione seguito da Saga \ contorni dalla griglia. La domanda è: come aggiungere il rasterinrepolator nella finestra "Processing Modeler"?
H.Wiener,

Risposte:


4

Sono stato in grado di fornire una soluzione completa nella seguente domanda:

Come calcolare un raster di interpolazione dalla console Python in QGIS?

Ripubblicherò anche qui la risposta, a causa del grande interesse che sembra attrarre:

Risposta:

La documentazione sulla PyQGIS non è molto auto-esplicativo, ma ho capito come chiamare correttamente le classi di interpolazione associate ( QgsInterpolator, QgsTINInterpolator, QgsIDWInterpolator, QgsGridFileWriter) in pitone. Descriverò in dettaglio ogni fase della sceneggiatura:

Passo 1:

Importa il modulo principale e di analisi e ottieni il livello vettoriale desiderato per l'interpolazione selezionandolo con un clic del mouse nella scheda del livello.

import qgis.core
import qgis.analysis

layer = qgis.utils.iface.activeLayer()

Passo 2:

Preparare le classi di interpolazione con i parametri necessari. I parametri esatti per l'inizializzazione della struttura LayerData sono reperibili nei documenti dell'API QGIS (searchterm: QgsInterpolator).

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

Si noti che non utilizzo z Coordinate, ottengo il primo campo disponibile (indice = 0) come attributo di interpolazione e utilizzo PUNTI come tipo di input.

Passaggio 3:

Scegli il tuo motore di interpolazione. Qui puoi scegliere tra il metodo di interpolazione TIN ( QgsTINInterpolator) e l'interpolazione IDW ( QgsIDWInterpolator). Ho preso il QgsTINInterpolatormio codice.

tin_interpolator = QgsTINInterpolator([layer_data])

Tieni presente che devi passare un elenco Python layer_dataal motore di interpolazione! Ciò consente anche di aggiungere più scenari layer_data.

Passaggio 4:

Impostare i parametri necessari per l'esportazione dell'output di interpolazione (vedere la documentazione di QgsGridFileWriter). Questi includono informazioni simili alla GUI di interpolazione (percorso file, estensione, risoluzione, numero di colonne e righe).

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

Fai attenzione all'estensione del file del tuo output-raster poiché QgsGridFileWriterscrive solo ASCII-grids ( .asc). I dati vengono scritti su disco chiamando il writeFile()metodo. Dopo l'esportazione è possibile aggiungere il file della griglia come raster nell'area di disegno.

Script completo per riferimento:

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)

Tieni presente che l'API QGIS è attualmente riscritta alla versione 3.0 e le classi di interpolazione utilizzate vengono spostate da qgis.analysisa qgis.core! Ciò avrà un enorme impatto sulla funzionalità di questo script in modo che debba essere riscritto per la versione 3.0!


1
Provo il tuo codice di esempio, ma lavoro solo con layer_data.InterpolationAttribute = 0, provo con un altro indice di campo, ma ottengo solo 0.
Leonard

Esatto: ho riscontrato anche questo problema, ma non ho avuto abbastanza tempo per indagare sulla causa. La mia soluzione era di alimentare lo script con un livello che avesse solo il campo desiderato. È possibile provare i documenti dell'API QGIS per una soluzione migliorata.
root676

3

Potresti farlo se hai installato il plug-in di interpolazione raster 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: non so davvero cosa faccia il codice sopra oltre al fatto che ha stampato un valore. Ma probabilmente ti aiuterebbe a capire l'uso.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.