Aufruf des Interpolations-Plugins über die Python-Konsole von QGIS


13

Ich möchte die QGIS-Interpolations-Plugin-Funktion (TIN-Methode) (Raster-> Interpolate) von der Python-Konsole aufrufen.

Ich kann die entsprechende Funktion in der QGIS-API oder in der Liste der Verarbeitungsalgorithmen nicht finden. Ich habe den SAGA-Triangulationsalgorithmus gefunden, der gut funktioniert, aber 5-10 x langsamer ist, und in meinem Fall ist die Geschwindigkeit wichtig.

Irgendeine Idee, wie man es ausführt?


2
Obwohl ich dies nicht benötige, wäre es eine nützliche Sache zu wissen. Ich bin diesem Link gefolgt: ( gis.stackexchange.com/questions/11216/… ). Ich bin mir from rasterinterpolation import rasterinterpolationaber nicht sicher, welches Modul ich aufrufen soll (oder wie ich es überhaupt aufrufen soll).
Joseph

Können Sie Ihre Anforderungen noch etwas präzisieren? Suchen Sie einfach nach einer Möglichkeit, einen neuen interpolierten Raster-Layer aus einem Eingabe-Raster-Layer zu berechnen?
Underdunkel

Ich habe ein ähnliches Problem: Ich möchte ein Countour-Modell erstellen, das mit Raster \ Interpolation gefolgt von Saga \ Konturen aus dem Raster beginnt. Die Frage ist, wie man den Rasterinrepolator im Fenster "Processing Modeler" hinzufügt.
H. Wiener

Antworten:


4

In der folgenden Frage konnte ich eine vollständige Lösung anbieten:

Wie berechnet man ein Interpolations-Raster aus der Python-Konsole in QGIS?

Ich werde die Antwort auch hier erneut veröffentlichen, da das Interesse offensichtlich sehr groß ist:

Antworten:

Die Dokumentation auf PyQGIS ist nicht sehr selbsterklärend, aber ich herausgefunden, wie richtig die damit verbundene Interpolation Klassen nennen ( QgsInterpolator, QgsTINInterpolator, QgsIDWInterpolator, QgsGridFileWriter) aus Python. Ich werde jeden Schritt des Skripts detailliert beschreiben:

Schritt 1:

Importieren Sie das Kern- und Analysemodul und rufen Sie die gewünschte Vektorebene für die Interpolation ab, indem Sie sie mit einem Mausklick auf der Registerkarte "Ebene" auswählen.

import qgis.core
import qgis.analysis

layer = qgis.utils.iface.activeLayer()

Schritt 2:

Bereiten Sie die Interpolationsklassen mit den erforderlichen Parametern vor. Die genauen Parameter für die Initialisierung der LayerData-Struktur finden Sie in den QGIS-API-Dokumenten (Suchbegriff: QgsInterpolator).

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

Bitte beachten Sie, dass ich die z-Koordinate nicht verwende, das erste verfügbare Feld (Index = 0) als Interpolationsattribut erhalte und POINTS als Eingabetyp verwende.

Schritt 3:

Wählen Sie Ihre Interpolationsmaschine. Hier können Sie zwischen der TIN-Interpolationsmethode ( QgsTINInterpolator) und der IDW-Interpolation ( QgsIDWInterpolator) wählen . Ich habe das QgsTINInterpolatorin meinen Code übernommen.

tin_interpolator = QgsTINInterpolator([layer_data])

Denken Sie daran, dass Sie eine Python-Liste von layer_dataan die Interpolations-Engine übergeben müssen! Auf diese Weise können Sie auch mehrere layer_data-Szenarien hinzufügen.

Schritt 4:

Stellen Sie die Parameter ein, die für den Export der Interpolationsausgabe benötigt werden (siehe Dokumentation von QgsGridFileWriter). Diese enthalten ähnliche Informationen wie die Interpolations-GUI (Dateipfad, Umfang, Auflösung, Anzahl der Spalten und Zeilen).

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

Beachten Sie die Dateierweiterung Ihres Ausgabe-Rasters, da QgsGridFileWriternur ASCII-Gitter ( .asc) geschrieben werden. Die Daten werden durch Aufrufen der writeFile()Methode auf die Festplatte geschrieben . Nach dem Export können Sie die Rasterdatei als Raster zur Zeichenfläche hinzufügen.

Vollständiges Skript als Referenz:

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)

Beachten Sie, dass die QGIS-API derzeit auf Version 3.0 umgeschrieben wird und die verwendeten Interpolationsklassen von qgis.analysisnach verschoben werden qgis.core! Dies hat enorme Auswirkungen auf die Funktionalität dieses Skripts, sodass es für Version 3.0 neu geschrieben werden muss!


1
Ich versuche Ihren Beispielcode, arbeite aber nur mit layer_data.InterpolationAttribute = 0, ich versuche es mit einem anderen Feldindex, aber und erhalte nur 0.
Leonard

Das ist richtig - ich bin auch auf dieses Problem gestoßen, aber ich hatte nicht genug Zeit, um die Ursache zu untersuchen. Meine Lösung bestand darin, dem Skript eine Ebene zuzuweisen, die nur das gewünschte Feld enthielt. Sie können die QGIS-API-Dokumente für eine verbesserte Lösung ausprobieren.
root676

3

Sie können dies tun, wenn Sie das Raster-Interpolations-Plugin mit dem Plugin-Manager installiert haben.

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

Hinweis: Ich weiß nicht wirklich, was der obige Code außer der Tatsache, dass es einen Wert gedruckt hat, tut. Aber es würde Ihnen wahrscheinlich helfen, die Verwendung zu verstehen.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.