0

我目前正在开发一个 QGIS 插件。当我使用 edit(QgsVectorLayer)或使用QgsVectorLayer.startediting()开始编辑图层时,此 RuneTimeError 发生大多数运行:RuntimeError: Wrapped C/C++ object of type QgsVectorLayer has been deleted。我可以运行脚本 10 次并且没有错误,然后再运行 10 次并连续出现 10 次错误。感觉完全随机。

正如我通过阅读诸如理解“底层 C/C++ 对象已被删除”错误之类的帖子所理解的那样,它可能是 C++ 方面的垃圾收集器问题。但我看到的帖子都不是关于 QgsVectorLayer 的,所以我不确定它是否适用。

这真的让我很恼火,以至于我开始创建空层来存储修改过的特征而不是编辑。

我试图在循环之前移动开始编辑,因为我正在考虑不断开始编辑并提交每个功能的更改可能会导致问题,但错误仍然出现。
然后我认为这可能是最后使用break但删除它并不能解决错误。
因为这是我第一次真正使用 PyQGIS,所以我有时会阅读开发者食谱或在线搜索(Anita Graser - 创建和编辑新的矢量图层),但我找不到任何解决方案。
我尝试了不同的版本,LTR 与否。绝望地使用另一台计算机,但问题仍然存在。
我还在某处读到进度条是问题所在,所以我删除了脚本中的反馈也没有成功。

以下是一些代码示例:

nodesLayer = self.parameterAsVectorLayer(parameters, self.INPUT_NODE, context)
arcsLayer = self.parameterAsVectorLayer(parameters, self.INPUT_LINE, context)

# Fill node Id_line_x
# Create spatial index
index = QgsSpatialIndex(nodesLayer.getFeatures())

for line in arcsLayer.getFeatures():
    # Construct a geometry engine to speed up spatial relationship
    engine = QgsGeometry.createGeometryEngine(line.geometry().constGet())
    engine.prepareGeometry()

    # Get potential neighbour
    candidateIds = index.intersects(line.geometry().boundingBox())
    request = QgsFeatureRequest().setFilterFids(candidateIds)

    for node in nodesLayer.getFeatures(request):
        # Get real neighbour
        if engine.intersects(node.geometry().constGet()):
            # Fill the Id_line fields for the number of neighbour
            for fld in range(1, node["Nb_seg"] + 1):
                if node["fk_Id_line_%d" %fld] == NULL:
                    with edit(nodesLayer):
                        node["fk_Id_line_%d" %fld] = line["Id_line"]
                        nodesLayer.updateFeature(node)
                    break

确切的错误:

Traceback (most recent call last):
File "/some/path/to/a/file.py", line 331, in processAlgorithm
nodesLayer.updateFeature(node)
RuntimeError: wrapped C/C++ object of type QgsVectorLayer has been deleted

希望这个例子就足够了。代码的目标是让节点在不经过线路的情况下了解其周围环境。它只是用于治疗,这些字段将在最终输出中删除。

4

0 回答 0