我想从python控制台调用QGIS插值插件功能(TIN方法)(Raster-> Interpolate)。
我在QGIS API或处理算法列表中找不到相应的功能。我发现SAGA三角剖分算法可以正常工作,但速度要慢5-10倍,而速度对我而言很重要。
知道如何执行吗?
我想从python控制台调用QGIS插值插件功能(TIN方法)(Raster-> Interpolate)。
我在QGIS API或处理算法列表中找不到相应的功能。我发现SAGA三角剖分算法可以正常工作,但速度要慢5-10倍,而速度对我而言很重要。
知道如何执行吗?
Answers:
我能够在以下问题中提供完整的解决方案:
我也会在这里重新发布答案,因为它似乎引起了极大的兴趣:
在pyqgis的文件是不是很自我解释,但我想通了如何正确地调用相关的插值类(QgsInterpolator
,QgsTINInterpolator
,QgsIDWInterpolator
,QgsGridFileWriter
)从蟒蛇。我将详细描述脚本的每个步骤:
导入核心和分析模块,并通过在图层选项卡中单击鼠标进行选择来获取所需的矢量图层以进行插值。
import qgis.core
import qgis.analysis
layer = qgis.utils.iface.activeLayer()
准备具有必要参数的插值类。可以在QGIS API文档(搜索项:QgsInterpolator)中找到用于LayerData结构初始化的确切参数。
layer_data = QgsInterpolator.LayerData()
layer_data.vectorLayer = layer
layer_data.zCoordInterpolation=False
layer_data.InterpolationAttribute =0
layer_data.mInputType = 1
请注意,我不使用z坐标,而是将第一个可用字段(索引= 0)用作插值属性,并使用POINTS作为输入类型。
选择您的插值引擎。在这里,您可以在TIN插值方法(QgsTINInterpolator
)和IDW 插值方法()之间进行选择QgsIDWInterpolator
。我QgsTINInterpolator
在代码中加入了。
tin_interpolator = QgsTINInterpolator([layer_data])
请记住,您必须将的python列表传递layer_data
给插值引擎!这还允许您添加多个layer_data方案。
设置导出插值输出所需的参数(请参阅参考资料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网格(.asc
)时,输出栅格的文件扩展名。通过调用该writeFile()
方法将数据写入磁盘。导出后,您可以将栅格文件作为栅格添加到画布。
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.core.rasterinterpolator import RasterInterpolator
rastLayer = iface.activeLayer()
interpolator = RasterInterpolator(rastLayer,0,1)
a= interpolator.linear(QgsPoint(10.662629, 76.225421))
print a
注意:除了打印出一个值之外,我实际上不知道上面的代码在做什么。但这可能会帮助您了解用法。
from rasterinterpolation import rasterinterpolation
但不确定要调用哪个模块(或如何调用)。