1

我正在处理一个矢量图层,我必须将所有 n+i [id] 属性合并到实体(n)[id] 中,其中实体(n+i)[id] 等于实体(n)[id],然后删除所有 n+i 个实体。一切正常,但我在提交更改之前调用了几次startEditing函数,我的问题是:调用commitChangesclosesstartEditing还是让它打开,就像它是我们需要在工作完成后释放的文件描述符或指针一样?

代码是:

  olayer.startEditing()
  olayer.changeAttributeValue(n,id_obj,id_obj_sum,NULL,True)
  olayer.commitChanges()
  olayer.startEditing()
  i= i-1
  while i >=1:
   olayer.deleteFeature(n+i)
   i=i-1

  olayer.commitChanges()

如您所见,我们调用了多次olayer.startEditing,甚至更多,因为所有代码都在 while 正文中......那么这会产生大量的 startEditing “指针”还是只是不断地将 olayer 可编辑状态设置为“对版本开放”?

实际上代码可以工作,但是速度很慢,这是原因吗?

4

1 回答 1

0

总的来说,您不应在图层中多次启动编辑模式。

您可以在对图层的所有更改结束时提交,以便您的修改同时保留在编辑缓冲区中。

QgsVectorLayer.commitChanges()如果您传递一个 as 参数,可以让编辑模式打开False(该参数被调用stopEditing,请参阅文档)。像这样:

# If the commit is sucessful, let the edit mode open
layer.commitChanges(False)  

此外,请查看QGIS 文档with edit(layer):中的语法。使用这种语法可以避免启动/提交/关闭编辑模式,QGIS 会为您完成。

with edit(layer):
    # All my layer modifications here

# When this line is reached, my layer modifications are already committed.
于 2021-06-21T17:32:02.377 回答