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ć?


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!


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.

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.