Я смог дать полное решение в следующем вопросе:
Как вычислить интерполяционный растр из консоли 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!
from rasterinterpolation import rasterinterpolation
не знаю, какой модуль вызывать (или как вообще звонить).