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 QgsTINInterpolator
kod.
tin_interpolator = QgsTINInterpolator([layer_data])
Pamiętaj, że musisz przekazać listę python layer_data
do 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ż QgsGridFileWriter
zapisuje 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.analysis
do qgis.core
! Będzie to miało ogromny wpływ na funkcjonalność tego skryptu, dlatego należy go przepisać dla wersji 3.0!
from rasterinterpolation import rasterinterpolation
ale nie jestem pewien, do którego modułu zadzwonić (lub jak nawet zadzwonić).