pyqgis를 사용하여 벡터 레이어를 반복 할 때 기능이 선택되었는지 어떻게 확인합니까?


10

다음 코드를 사용하여 벡터 레이어를 반복하는 동안 ( pyqgis cookbook 의 예에서 여름 임 ) 피처가 선택되었는지 확인할 수 있습니까?

provider = vlayer.dataProvider()
feat = QgsFeature()
allAttrs = provider.attributeIndexes()
provider.select(allAttrs)
while provider.nextFeature(feat):
    geom = feat.geometry()
    attrs = feat.attributeMap()
    for (k,attr) in attrs.iteritems():
        print "%d: %s" % (k, attr.toString())

또는을 사용하여 선택한 기능 목록을 만들 수는 vlayer.selectedFeatures()있지만 각 기능을 직접 확인하는 방법이 있기를 바랍니다.

답변:


8

피처 객체의 부모 레이어를 직접 찾거나 QgsFeature 클래스의 메서드에서 선택했는지 여부를 직접 확인할 수있는 방법이 없습니다.

에 대한 유사한 접근 방식 vlayer.selectedFeatures()이에 있는지 테스트하는 feat.id()것입니다 vlayer.selectedFeaturesIds(). QgsFeatureId는 다른 벡터 레이어와 비교할 때 고유 한 값이 아니며 고유 한 레이어 내에서만 가능합니다.

또는 vlayer.selectedFeatures()공급자의 모든 기능 대신 해당 기능으로 시작하여 해당 기능을 반복 할 수 있습니다.

또 다른 방법은 주어진 벡터 레이어에 대해 선택된 피처 ID와 선택되지 않은 피처 ID의 세트 (또는 목록)를 초기에 수집하는 것입니다.

# previous relevant code

set_selids = set(vlayer.selectedFeaturesIds())
feat = QgsFeature()
vlayer.select([], QgsRectangle(), False)
set_allids = set()
while vlayer.nextFeature(feat):
    set_allids.add(feat.id())

set_notselids = set_allids - set_selids

print set_allids
print set_selids
print set_notselids

벡터 레이어의 모든 기능 (또는 ID)에 대한 참조를 검색하는 단일 호출을 찾지 못하는 것 같습니다 (즉, 여전히 사용 QgsVectorLayer.select()하고 반복해야 함 QgsVectorLayer.nextFeature()).

편집 : QgsVectorLaer가 선택 호출을 처리 할 수 ​​있도록 업데이트 된 코드 (제공자를 직접 가져올 필요가 없음) 및 setSelectedFeatures()업데이트 해야하는 맵 캔버스에서 실제로 선택된 기능을 엉망으로 만들지 않습니다 .

편집 2 : 기능 ID 세트를 작성한 후 반복 QgsVectorLayer.featureAtId(featid)하여 기능에 액세스하는 데 사용할 수 있습니다.


나는 그럴지도 모른다고 생각했지만 도움이되는 제안에 대단히 감사드립니다.
Cyrus
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.