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


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.