Вызов модуля интерполяции из консоли Python QGIS

13

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

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

Есть идеи, как это выполнить?

Винсент Д.
источник
2
Хотя я не требую этого, это было бы полезно узнать. Я перешел по этой ссылке: ( gis.stackexchange.com/questions/11216/… ). Я дошел до того, что from rasterinterpolation import rasterinterpolationне знаю, какой модуль вызывать (или как вообще звонить).
Джозеф
Не могли бы вы уточнить ваши требования немного больше? Вы просто ищете способ вычислить новый интерполированный растровый слой из входного растрового слоя?
Подземье
У меня похожая проблема: я хочу создать контурную модель, которая начинается с Raster \ interpolation, а затем Saga \ contours from grid. Вопрос - как добавить растеринреполятор в окно «Processing Modeler»?
Х. Винер

Ответы:

4

Я смог дать полное решение в следующем вопросе:

Как вычислить интерполяционный растр из консоли 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, я получаю первое доступное поле (index = 0) в качестве атрибута интерполяции и использую POINTS в качестве типа ввода.

Шаг 3:

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

tin_interpolator = QgsTINInterpolator([layer_data])

Имейте в виду, что вы должны передать список python layer_dataв механизм интерполяции! Это также позволяет добавлять несколько сценариев layer_data.

Шаг 4:

Настройте параметры, необходимые для экспорта выходных данных интерполяции (см. Документацию QgsGridFileWriter). Они включают информацию, аналогичную интерфейсу интерполяции (путь к файлу, экстент, разрешение, количество столбцов и строк).

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-сетки ( .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!

root676
источник
1
Я пробую ваш пример кода, но работаю только по layer_data.InterpolationAttribute = 0, я пробую с другим индексом поля, но получаю только 0.
Леонард
Это верно - я тоже столкнулся с этой проблемой, но у меня не было достаточно времени, чтобы разобраться в причине. Мое решение состояло в том, чтобы передать сценарию слой, который имел только одно желаемое поле. Вы можете попробовать документацию по QGIS API для улучшенного решения.
root676
3

Вы можете сделать это, если у вас установлен плагин Raster Interpolation с помощью диспетчера плагинов.

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

Примечание: я действительно не знаю, что делает приведенный выше код, кроме того, что он напечатал значение. Но это, вероятно, поможет вам понять использование.

Винаян
источник