削除された機能属性にアクセスする方法(コミットする前)


13

レイヤー上のフィーチャ削除イベントの信号セットアップがあります:

self.layer.featureDeleted.connect(self.feature_deleted)

スロット上の削除された機能から属性を取得しようとすると、StopIterationエラーがスローされます(つまり、機能を取得できません)。

レイヤーへの変更がコミットされる前に、削除されたフィーチャから属性を取得できるはずだと思っていただろうか?それ以外の場合、fidパラメーターの使用方法がわかりません。

def feature_deleted(self, fid):
    feature = self.layer.getFeatures(QgsFeatureRequest().setFilterFid(int(fid))).next()
    idx = self.layer.fieldNameIndex('my_attribute')
    print feature.attributes()[idx]

(レイヤーへの変更がコミットされる前に)削除されたフィーチャの属性にアクセスするにはどうすればよいですか?


1
削除されたフィーチャは、レイヤーの元のバージョンを除いてどこにも保存されていないようです...ので、...それを2回開き、レイヤーの編集バッファーによって返されたdeletedFeatureIdsを使用していますか?属性値の変更またはジオメトリの変更が保存されることだけがわかりました...削除されたフィーチャではなく(featureIdのみが...)
snaileater

@snaileater私の場合、レイヤーのコピーは高価な操作になります。機能が選択されたときにそれらの属性を記録して記録し、変更がコミットされたらそれらを残された属性と比較します。
マット

@Mattメーリングリストへのこの投稿は役立つでしょう。lists.osgeo.org
pipermail

回答:


5

削除される機能を取得できる瞬間は2つあります。

  1. 編集セッションでそれらを削除したが、変更をコミットまたは保存していない場合(つまり、ロールバックできます)。

    layer = iface.activeLayer()
    idx = layer.fieldNameIndex( 'my_attribute' )
    def feature_deleted( fid ):
        feature = layer.dataProvider().getFeatures( QgsFeatureRequest( fid ) ).next()
        print feature.id(), feature.attributes()[idx]
    
    layer.featureDeleted.connect( feature_deleted )
  2. 削除された機能がコミットされる直前(つまり、Save Layer Editsボタンをクリックしたか、呼び出したばかりlayer.commitChanges())。

    layer = iface.activeLayer()
    idx = layer.fieldNameIndex( 'my_attribute' )
    def features_deleted():
        if layer.editBuffer():
           ids = layer.editBuffer().deletedFeatureIds()
           for feature in layer.dataProvider().getFeatures( QgsFeatureRequest().setFilterFids( ids ) ):
               print feature.id(), feature.attributes()[idx]
    
    layer.beforeCommitChanges.connect( features_deleted )

これは良い解決策ですが、postGisレイヤーでは機能しないようです。彼らは基本的に異なる編集バッファを処理しているように見えます。レイヤーがまだ編集モードであっても、反復停止エラーが発生します。何か提案はありますか?
ジェシーマクミラン
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.