从QGIS的Python控制台调用插值插件


13

我想从python控制台调用QGIS插值插件功能(TIN方法)(Raster-> Interpolate)。

我在QGIS API或处理算法列表中找不到相应的功能。我发现SAGA三角剖分算法可以正常工作,但速度要慢5-10倍,而速度对我而言很重要。

知道如何执行吗?


2
尽管我不要求这样做,但要知道这将是一件有用的事情。我点击了以下链接:(gis.stackexchange.com/questions/11216/…)。我到目前为止from rasterinterpolation import rasterinterpolation但不确定要调用哪个模块(或如何调用)。
约瑟夫

您能否再澄清一下您的要求?您是否只是在寻找一种从输入栅格图层计算新的插值栅格图层的方法?
黑暗

我有一个类似的问题:我想创建一个以Raster \ interpolation开始,然后是来自网格的Saga \ contours的countour模型。问题是-如何在“处理建模器”窗口中添加rasterinrepolator?
H.Wiener

Answers:


4

我能够在以下问题中提供完整的解决方案:

如何从QGIS中的python控制台计算插值栅格?

我也会在这里重新发布答案,因为它似乎引起了极大的兴趣:

回答:

在pyqgis的文件是不是很自我解释,但我想通了如何正确地调用相关的插值类(QgsInterpolatorQgsTINInterpolatorQgsIDWInterpolatorQgsGridFileWriter)从蟒蛇。我将详细描述脚本的每个步骤:

步骤1:

导入核心和分析模块,并通过在图层选项卡中单击鼠标进行选择来获取所需的矢量图层以进行插值。

import qgis.core
import qgis.analysis

layer = qgis.utils.iface.activeLayer()

第2步:

准备具有必要参数的插值类。可以在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方案。

步骤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网格(.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版进行重写!


1
我尝试您的示例代码,但仅通过layer_data.InterpolationAttribute = 0进行工作,我尝试使用另一个字段索引,但仅获得0。–
Leonard

是的-我也遇到了这个问题,但是我没有足够的时间来调查原因。我的解决方案是为脚本提供仅包含单个所需字段的图层。您可以尝试使用QGIS API文档以获得改进的解决方案。
root676

3

如果使用插件管理器安装了栅格插值插件,则可以执行此操作。

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

注意:除了打印出一个值之外,我实际上不知道上面的代码在做什么。但这可能会帮助您了解用法。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.