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