18.5. 使用Python创建自定义地理处理脚本¶
我们使用了处理工具箱分析我们的数据,但我们并不局限于这些工具。 我们可以扩展处理用我们自己的脚本。 与普通Python脚本(如我们在上一节中看到的脚本)相比,脚本如下:
处理过程自动生成脚本的图形用户界面以配置脚本参数
处理脚本可用于图形建模器创建地质处理模型
如下面的截图所示,脚本节最初是空的,除了一些工具要添加和创建新脚本,如 图 18.7 。

图 18.7 添加和创建新脚本¶
18.5.1. 编写第一个处理脚本¶
我们将创建第一个简单的脚本;它获取一些层信息。要开始,双击“创建新脚本”报关进口``脚本``工具。 这将打开一个空的“脚本编辑器”对话。下面的屏幕截图显示“脚本编辑器”用一个短脚本在Python控制台 :
第一行意味着我们的脚本将被放入学习QGIS一组脚本,如下图所示 图 18.8 。

图 18.8 脚本¶
双哈希( ## )正在处理语法,它们指示行包含处理特定信息,而不是Python代码。脚本名是根据保存脚本时选择的文件名创建的。 在本例中,我将脚本保存为"my_first_script.py"。第二行定义脚本输入,在本例中是向量层。 在下面的行中,我们使用“获取对象()”函数获取对输入层对象的访问权,最后在 Python控制台。
通过单击``运行算法``按钮,或双击``处理工具箱``。如果要更改代码,请使用``编辑脚本``从条目上下文菜单中, 如此屏幕截图所示 图 18.9 。

图 18.9 编辑脚本¶
学习如何编写自定义脚本进行处理的一个好方法是查看现有脚本,例如 https://github.com/qgis/QGIS-Processing/tree/
master/scripts。这是正式的脚本存储库,在这里您还可以使用内置的 Get scripts from on-line scripts collection 中的工具``处理工具箱``。
18.5.2. 使用矢量层输出编写脚本¶
当然,在大多数情况下,我们不想在Python控制台。这就是为什么下面的示例演示如何创建向量层。 更具体地说,脚本将围绕输入层中的点创建方形多边形。数字"size"输入参数控制``输出矢量``层。 将在自动生成的对话框中显示的默认大小设置为 1000000 :
##Learning QGIS=group
##input_layer=vector
##size=number 1000000
**##squares=output vector from qgis.core import ** *
从processing.tools.vector导入矢量写入程序
# get the input layer and its fields my_layer =
processing.getObject(input_layer) fields = my_layer.dataProvider().fields()
# create the output vector writer with the same fields writer =
VectorWriter(squares, None, fields, QGis.WKBPolygon, my_layer.crs())
# create output features feat = QgsFeature() for input_feature in
my_layer.getFeatures():
# copy attributes from the input point feature attributes =
input_feature.attributes() feat.setAttributes(attributes)
# create square polygons
point = input_feature.geometry().asPoint() xmin = point.x() - size/2
ymin = point.y() - size/2
square = QgsRectangle(xmin,ymin,xmin+size,ymin+size)
feat.setGeometry(QgsGeometry.fromRect(square))
writer.addFeature(feat) del writer
在这个脚本中,我们使用 VectorWriter 写入输出向量层。用于创建 VectorWriter 对象是文件名,编码,领域,几何类型和 crs 。
可用的几何图形类型有QGis.WKBPoint,卡吉斯。WKBLineString公司,QGis.WKBPolygon,QGis.WKBMultiPoint,QGis.WKBMultiLineString 和 QGis.WKBMultiPolygon 。
也可以通过键入VectorWriter.TYPE_MAP 在Python控制台。
注意我们如何使用输入层的字段( my_layer.dataProvider()。
(字段())创建 VectorWriter。这可以确保输出层与输入层具有相同的字段(属性表列)。 类似地,对于输入层中的每个特征,我们复制其属性值( input_feature.attributes() )对应的输出特性。
运行脚本后,生成的层将加载到QGIS中,并使用输出参数名列出;在这种情况下,将调用该层方块 。 以下屏幕截图显示了自动生成的输入对话框以及从示例数据集中应用到机场时脚本的输出,如 图 18.10 。

图 18.10 生成结果界面¶
18.5.3. 可视化脚本进程¶
特别是在执行需要一段时间才能完成的复杂脚本时,最好在进度条中显示脚本执行的进度。 若要向上一个脚本添加进度条,可以在for循环遍历输入功能的循环:
i = 0
n = my_layer.featureCount() for input_feature in
my_layer.getFeatures(): progress.setPercentage(int(100*i/n)) i+=1
注意,我们初始化 i 在循环之前计数器,并在使用进度。设置百分比() .