Wywoływanie wtyczki interpolacji z konsoli Python QGIS

13

Chciałbym wywołać funkcję wtyczki interpolacji QGIS (metoda TIN) (Raster-> Interpolate) z konsoli python.

Nie mogę znaleźć odpowiedniej funkcji w QGIS API lub na liście algorytmów przetwarzania. Znalazłem algorytm triangulacji SAGA, który działa dobrze, ale jest 5-10 x wolniejszy, a szybkość jest ważna w moim przypadku.

Masz pomysł, jak to wykonać?

Vincent D.
źródło
2
Chociaż nie wymagam tego, dobrze byłoby wiedzieć. Poszedłem za tym linkiem: ( gis.stackexchange.com/questions/11216/… ). Dotarłem do, from rasterinterpolation import rasterinterpolationale nie jestem pewien, do którego modułu zadzwonić (lub jak nawet zadzwonić).
Joseph,
Czy mógłbyś bardziej wyjaśnić swoje wymagania? Czy szukasz sposobu na obliczenie nowej interpolowanej warstwy rastrowej z wejściowej warstwy rastrowej?
podmrok
Mam podobny problem: chcę stworzyć model konturu, który zaczyna się od interpolacji Raster \, a następnie Sagi \ kontury z siatki. Pytanie brzmi - jak dodać rasterinrepolator w oknie „modelowania przetwarzania”?
H.Wiener,

Odpowiedzi:

5

Byłem w stanie zapewnić pełne rozwiązanie w następującym pytaniu:

Jak obliczyć raster interpolacji z konsoli python w QGIS?

Ponownie opublikuję odpowiedź tutaj, z uwagi na duże zainteresowanie, które wydaje się przyciągać:

Odpowiedź:

Dokumentacja na pyqgis nie jest zbyt oczywiste, ale zorientowali się, jak prawidłowo zadzwonić przynależne klas interpolacji ( QgsInterpolator, QgsTINInterpolator, QgsIDWInterpolator, QgsGridFileWriter) z pytona. Szczegółowo opiszę każdy krok skryptu:

Krok 1:

Zaimportuj moduł rdzenia i analizy i uzyskaj żądaną warstwę wektorową do interpolacji, zaznaczając ją myszką na karcie warstwy.

import qgis.core
import qgis.analysis

layer = qgis.utils.iface.activeLayer()

Krok 2:

Przygotuj klasy interpolacji z niezbędnymi parametrami. Dokładne parametry inicjalizacji struktury LayerData można znaleźć w dokumentacji API QGIS (searchterm: QgsInterpolator).

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

Zauważ, że nie używam współrzędnej z, otrzymuję pierwsze dostępne pole (indeks = 0) jako atrybut interpolacji i używam PUNKTÓW jako typu danych wejściowych.

Krok 3:

Wybierz silnik interpolacji. Tutaj możesz wybrać pomiędzy metodą interpolacji TIN ( QgsTINInterpolator) a interpolacją IDW ( QgsIDWInterpolator). Wziąłem QgsTINInterpolatorkod.

tin_interpolator = QgsTINInterpolator([layer_data])

Pamiętaj, że musisz przekazać listę python layer_datado silnika interpolacji! Umożliwia to także dodawanie wielu scenariuszy layer_data.

Krok 4:

Ustaw parametry potrzebne do eksportu wyniku interpolacji (patrz dokumentacja QgsGridFileWriter). Obejmują one podobne informacje jak GUI interpolacji (ścieżka pliku, zasięg, rozdzielczość, liczba kolumn i wierszy).

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

Pamiętaj o rozszerzeniu pliku wyjściowego rastra, ponieważ QgsGridFileWriterzapisuje tylko ASCII-grids ( .asc). Dane zostają zapisane na dysk przez wywołanie writeFile()metody Po wyeksportowaniu możesz dodać plik siatki jako raster do kanwy.

Pełny skrypt w celach informacyjnych:

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)

Należy pamiętać, że QGIS-API jest obecnie przepisywany do wersji 3.0, a używane klasy interpolacji są przenoszone z qgis.analysisdo qgis.core! Będzie to miało ogromny wpływ na funkcjonalność tego skryptu, dlatego należy go przepisać dla wersji 3.0!

root676
źródło
1
Próbuję twój przykładowy kod, ale pracuję tylko przez layer_data.InterpolationAttribute = 0, próbuję z innym indeksem pola, ale dostaję tylko 0.
Leonard
Zgadza się - napotkałem również ten problem, ale nie miałem wystarczająco dużo czasu, aby zbadać przyczynę. Moim rozwiązaniem było nakarmienie skryptu warstwą zawierającą tylko jedno pożądane pole. Możesz wypróbować dokumentację API QGIS w celu uzyskania lepszego rozwiązania.
root676
3

Możesz to zrobić, jeśli masz zainstalowaną wtyczkę Raster Interpolation przy użyciu Menedżera wtyczek.

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

Uwaga: tak naprawdę nie wiem, co robi powyższy kod poza faktem, że wypisał wartość. Ale prawdopodobnie pomoże ci to zrozumieć użycie.

vinayan
źródło