Вызов модуля интерполяции из консоли 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!


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

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

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.