본문 바로가기
[Framework] - QGIS

# 3. QgsVectorDataProvider

by Bebsae 2021. 4. 13.

QgsVectorLayer 클래스의 dataProvider() 메소드를 호출하면 해당 벡터 레이어의 QgsVectorDataProvider 인스턴스를 얻을 수 있다. 이 인스턴스는 벡터 레이어에 속하는 QgsFeature 인스턴스들을 추가, 수정, 삭제를 할 수 있다.

 

self.connection_feature = QgsFeature()
connection_geometry = QgsGeometry().fromPolylineXY(points)
self.connection_feature.setGeometry(connection_geometry)
self.connection_layer.dataProvider().addFeatures((self.connection_feature,))

위 코드는 QgsFeature 인스턴스를 임의로 만들어서 벡터레이어에 추가시키는 코드이다. 물론 벡터레이어의 편집모드를 활성화하여 (startEditing()) 추가시키는 방법도 있다. 주의할 점은 벡터레이어에 추가 이전에 QgsFeature 인스턴스에 부여한 ID는 벡터레이어에 추가된 인스턴스의 ID와 동일하지 않다. (레이어 자체적으로 ID를 부여, 추가하는 순간 다른 인스턴스)
참고로 addFeatures() 메소드는 tuple(bool, List[QgsFeature]) 타입을 리턴하는데 이중 List[QgsFeature] 타입의 인스턴스는 벡터레이어에 추가된 QgsFeature 인스턴스들을 의미한다.

 

provider: QgsVectorDataProvider = self.connection_layer.dataProvider()
provider.deleteFeatures([self.existed_connection_feature.id()])
self.connection_layer.triggerRepaint()

위 코드는 QgsFeature 인스턴스를 벡터레이어로부터 제거하는 코드다. 주의할 점은 벡터레이어에 추가된 객체의 ID를 사용해야 한다는 점이다. 해당 레이어의 triggerReapin()를 호출해야 해당 레이어만 렌더링을 한다.

 

 

connection_points = self.calculate_connection_points()
connection_geometry = QgsGeometry().fromPolylineXY(connection_points)
self.connection_layer.dataProvider().changeGeometryValues(
{self.existed_connection_feature.id(): connection_geometry})
self.connection_layer.triggerRepaint()

위 코드는 QgsFeature 인스턴스의 지오메트리 정보를 바꾸는 것이다. 

 

exist_geom: QgsGeometry = self.existed_connection_feature.geometry()
exist_geom_txt = exist_geom.asWkt()
field_names: list = self.memo_layer.fields().names()
wkt_field_index = field_names.index('connection')
# self.memo_layer.dataProvider().changeAttributeValues({self.memo_feature.id(): {wkt_field_index: exist_geom_txt}})  # 왜 안되는지 모르겠음.. (0으로 변경됨)
self.memo_layer.changeAttributeValue(self.memo_feature.id(), wkt_field_index, exist_geom_txt)

위 코드는 QgsFeature 인스턴스의 속성값을 바꾸는 것이다. 이유는 아직 파악하지 못했는데 QgsVectorDataProvider인스턴스를 통해 속성값을 변경할 경우 해당 필드에  0이 채워지는 현상이 발생하여 직접 레이어를 통해 접근했다.

 

'[Framework] - QGIS' 카테고리의 다른 글

# 5. QgsLayerTree  (0) 2021.04.21
# 4. QGIS MV (Model-View) 패턴  (0) 2021.04.21
#2. QgsFeature 이동  (0) 2021.04.09
#1. 시점이동, 객체의 필드  (0) 2021.01.22
#0. QgsGeometry, asPolyline()  (0) 2021.01.22

댓글