삭제 된 기능 속성에 액세스하는 방법 (커밋하기 전에)


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
삭제 된 기능은 레이어의 원래 버전을 제외하고는 어디에도 저장되지 않은 것 같습니다 ... 그래서 ... 두 번 연 다음 수정하는 레이어 의 편집 버퍼 에서 반환 된 deletedFeatureIds 를 사용할 수 있습니까? 속성 값 변경 또는 지오메트리 변경 사항 만 저장됩니다 ... 삭제 된 피처는 아닙니다 (해당 featureId 만 있습니다)
— snaileater

@ snaileater 내 경우에는 레이어를 복사하는 것이 비용이 많이 드는 작업입니다. 선택한 기능의 속성을 기록하고 변경 사항이 적용되면 남은 속성과 비교합니다.
— Matt

@Matt 메일 링리스트에이 포스팅이 도움이 될 것입니다 : lists.osgeo.org/pipermail/qgis-developer/2015-May/037823.html
— eftas

답변:


5

삭제 될 기능을 계속 사용할 수있는 두 가지 순간이 있습니다.

  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 레이어에서는 작동하지 않는 것 같습니다. 편집 버퍼를 근본적으로 다르게 처리하는 것으로 보입니다. 레이어가 여전히 편집 모드에 있는데도 반복 중지 오류가 발생합니다. 거기에 어떤 제안?
— Jesse McMillan
당사 사이트를 사용함과 동시에 당사의 쿠키 정책과 개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.