Виклик інтерполяційного плагіна з консолі Python QGIS


13

Я б хотів викликати функцію інтерфейсу модуля QGIS для інтерполяції (метод TIN) (Raster-> Interpolate) з консолі python.

Я не можу знайти відповідну функцію в API QGIS або в списку алгоритмів обробки. Я знайшов алгоритм триагуляції SAGA, який працює чудово, але на 5-10 х повільніше, і швидкість важлива в моєму випадку.

Будь-яка ідея, як це виконати?


2
Хоча я цього і не вимагаю, було б корисно знати. Я перейшов за цим посиланням: ( gis.stackexchange.com/questions/11216/… ). Я дійшов, from rasterinterpolation import rasterinterpolationале не впевнений, в який модуль дзвонити (або як навіть дзвонити).
Йосип

Не могли б ви трохи уточнити свої вимоги? Ви просто шукаєте спосіб обчислити новий інтерпольований растровий шар із вхідного растрового шару?
underdark

У мене є аналогічна проблема: я хочу створити модель лічильника, яка починається з растрової \ інтерполяції з наступним Сага \ контури з сітки. Питання - як додати растерінреполятор у вікно "обробка моделера"?
Х.Вінер

Відповіді:


5

Мені вдалося надати повне рішення у наступному питанні:

Як обчислити інтерполяційний растр з консолі python в QGIS?

Я також перекладу відповідь і тут, оскільки великий інтерес, схоже, приваблює:

Відповідь:

Документація по pyqgis не надто зрозуміла, але я зрозумів, як правильно називати пов'язані класи інтерполяції ( QgsInterpolator, QgsTINInterpolator, QgsIDWInterpolator, QgsGridFileWriter) з пітона. Я збираюся детально описати кожен крок сценарію:

Крок 1:

Імпортуйте ядро ​​та модуль аналізу та отримайте потрібний векторний шар для інтерполяції, вибравши його клацанням миші на вкладці шару.

import qgis.core
import qgis.analysis

layer = qgis.utils.iface.activeLayer()

Крок 2:

Підготуйте інтерполяційні класи з необхідними параметрами. Точні параметри ініціалізації структури LayerData можна знайти в документах API QGIS (searchterm: QgsInterpolator).

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

Зауважте, що я не використовую координат z, я отримую перше доступне поле (індекс = 0) як атрибут інтерполяції, і використовую POINTS як тип введення.

Крок 3:

Виберіть свій механізм інтерполяції. Тут ви можете вибрати між методом TIN-інтерполяції ( QgsTINInterpolator) та IDW-інтерполяцією ( QgsIDWInterpolator). Я взяв QgsTINInterpolatorсвій код.

tin_interpolator = QgsTINInterpolator([layer_data])

Майте на увазі, що вам потрібно передати список пітонів layer_dataінтерполяційного двигуна! Це також дозволяє додавати кілька сценаріїв_шарових даних.

Крок 4:

Встановіть параметри, необхідні для експорту інтерполяції-виводу (див. Документацію QgsGridFileWriter). Вони включають аналогічну інформацію, як інтерполяційний gui (шлях файлу, розмір, роздільна здатність, кількість стовпців та рядків).

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

Будьте в курсі розширення файлу вашого вихідного растру, оскільки QgsGridFileWriterвін пише лише ASCII-grids ( .asc). Дані записуються на диск, викликаючи writeFile()метод. Після експорту ви можете додати grid-файл як растровий до полотна.

Повний сценарій:

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)

Майте на увазі, що QGIS-API в даний час переписаний на версію 3.0 і використовувані інтерполяційні класи переміщені з qgis.analysisдо qgis.core! Це матиме величезний вплив на функціональність цього сценарію, тому його потрібно переписати для версії 3.0!


1
Я пробую ваш приклад коду, але працюю лише слой_даних.InterpolationAttribute = 0, я намагаюся з іншим полевим індексом, але отримую лише 0.
Леонард

Це правильно - я теж зіткнувся з цією проблемою, але мені не вистачило часу на розслідування причини. Моє рішення полягало в подачі сценарію шаром, який мав лише одне бажане поле. Ви можете спробувати документи QGIS API для вдосконаленого рішення.
root676

3

Це можна зробити, якщо у вас встановлений плагін Raster Interpolation за допомогою 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

Примітка: я дійсно не знаю, що робить вищевказаний код, крім того, що він надрукував значення. Але це, ймовірно, допоможе вам зрозуміти використання.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.