Appel du plugin d'interpolation depuis la console Python de QGIS

13

Je voudrais appeler la fonction du plugin d'interpolation QGIS (méthode TIN) (Raster-> Interpoler) à partir de la console python.

Je ne trouve pas la fonction correspondante dans l'API QGIS ou dans la liste des algorithmes de traitement. J'ai trouvé l'algorithme de triangulation SAGA, qui fonctionne bien mais est 5-10 fois plus lent et la vitesse est importante dans mon cas.

Une idée de comment l'exécuter?

Vincent D.
la source
2
Bien que je ne l'exige pas, ce serait une chose utile à savoir. J'ai suivi ce lien: ( gis.stackexchange.com/questions/11216/… ). Je suis allé jusqu'à, from rasterinterpolation import rasterinterpolationmais je ne sais pas quel module appeler (ou même comment appeler).
Joseph
Pourriez-vous clarifier un peu plus vos besoins? Cherchez-vous simplement un moyen de calculer une nouvelle couche raster interpolée à partir d'une couche raster en entrée?
underdark
J'ai un problème similaire: je veux créer un modèle de contours qui commence par Raster \ interpolation suivi par Saga \ contours from grid. La question est - comment ajouter le rasterinrepolator dans la fenêtre "modeleur de traitement"?
H.Wiener

Réponses:

4

J'ai pu apporter une solution complète à la question suivante:

Comment calculer un raster d'interpolation à partir de la console python dans QGIS?

Je republierai également la réponse ici, en raison du grand intérêt qu'elle semble susciter:

Répondre:

La documentation sur PyQGIS est pas très explicite, mais je me suis dit comment appeler correctement les classes d'interpolation associées ( QgsInterpolator, QgsTINInterpolator, QgsIDWInterpolator, QgsGridFileWriter) de python. Je vais décrire chaque étape du script en détail:

Étape 1:

Importez le noyau et le module d'analyse et obtenez la couche vectorielle souhaitée pour l'interpolation en la sélectionnant avec un clic de souris dans l'onglet des couches.

import qgis.core
import qgis.analysis

layer = qgis.utils.iface.activeLayer()

Étape 2:

Préparez les classes d'interpolation avec les paramètres nécessaires. Les paramètres exacts pour l'initialisation de la structure LayerData peuvent être trouvés dans les documents de l'API QGIS (searchterm: QgsInterpolator).

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

Veuillez noter que je n'utilise pas la coordonnée z, j'obtiens le premier champ disponible (index = 0) comme attribut d'interpolation et j'utilise POINTS comme type d'entrée.

Étape 3:

Choisissez votre moteur d'interpolation. Ici, vous pouvez choisir entre la méthode d'interpolation TIN ( QgsTINInterpolator) et l'interpolation IDW ( QgsIDWInterpolator). J'ai pris le QgsTINInterpolatordans mon code.

tin_interpolator = QgsTINInterpolator([layer_data])

Gardez à l'esprit que vous devez passer une liste de python layer_dataau moteur d'interpolation! Cela vous permet également d'ajouter plusieurs scénarios layer_data.

Étape 4:

Configurez les paramètres nécessaires à l'exportation de la sortie d'interpolation (voir la documentation de QgsGridFileWriter). Celles-ci incluent des informations similaires à celles de l'interface d'interpolation (chemin de fichier, étendue, résolution, nombre de colonnes et de lignes).

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

Soyez conscient de l'extension de fichier de votre raster de sortie car QgsGridFileWriteril écrit uniquement des grilles ASCII ( .asc). Les données sont écrites sur le disque en appelant la writeFile()méthode. Après l'exportation, vous pouvez ajouter le fichier de grille en tant que raster au canevas.

Script complet pour référence:

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)

Gardez à l'esprit que l'API QGIS est actuellement réécrite dans la version 3.0 et les classes d'interpolation utilisées sont déplacées de qgis.analysisvers qgis.core! Cela aura un impact énorme sur la fonctionnalité de ce script et devra donc être réécrit pour la version 3.0!

root676
la source
1
J'essaie votre exemple de code, mais en travaillant uniquement par layer_data.InterpolationAttribute = 0, j'essaie avec un autre index de champ, mais et j'obtiens seulement 0.
Leonard
C'est vrai - j'ai aussi rencontré ce problème, mais je n'ai pas eu assez de temps pour enquêter sur la cause. Ma solution était d'alimenter le script d'une couche qui avait juste le seul champ souhaité. Vous pouvez essayer les documents de l'API QGIS pour une solution améliorée.
root676
3

Vous pouvez le faire si vous avez installé le plugin Raster Interpolation à l'aide de 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

Remarque: je ne sais pas vraiment ce que fait le code ci-dessus à part le fait qu'il a imprimé une valeur. Mais cela vous aiderait probablement à comprendre l'utilisation.

vinayan
la source