pyQGIS를 이용한 벡터 데이터 처리 7 : 새 피쳐 추가하기, 피쳐 제거하기

벡터 레이어에 새로운 피쳐를 추가하는 코드는 다음과 같습니다.

QgsProject.instance().removeAllMapLayers()
layer = QgsVectorLayer("D:/__Data__/세종특별자치시_36000/TL_SPRD_MANAGE.shp", "TL_SPRD_MANAGE", "ogr")
QgsProject.instance().addMapLayers([layer])

caps = layer.dataProvider().capabilities()
if caps & QgsVectorDataProvider.AddFeatures:
    feat = QgsFeature(layer.fields())
    feat.setAttribute("RN", "테스트로") # feat.setAttributes([.., .., .., ...])
    geom = QgsGeometry.fromWkt("MULTILINESTRING((968963 1820821, 993152 1819742, 993567 1844387))")
    feat.setGeometry(geom)
    result, outFeature = layer.dataProvider().addFeatures([feat])
    print(result, outFeature)

다음은 피쳐를 삭제하는 코드입니다.

QgsProject.instance().removeAllMapLayers()
layer = QgsVectorLayer("D:/__Data__/세종특별자치시_36000/TL_SPRD_MANAGE.shp", "TL_SPRD_MANAGE", "ogr")
QgsProject.instance().addMapLayers([layer])

caps = layer.dataProvider().capabilities()
fids = []

if caps & QgsVectorDataProvider.DeleteFeatures:
    features = layer.getFeatures()
    for feat in features:
        if feat["RN"] == "테스트로":
            fids.append(feat.id())
    res = layer.dataProvider().deleteFeatures(fids)
    print(res, len(fids))            
    
#layer.triggerRepaint()

pyQGIS를 이용한 벡터 데이터 처리 6 : 피쳐의 속성 및 좌표 편집

이미 저장되어 있는 피쳐의 속성과 좌표를 변경하는 코드를 살펴보겠습니다. 먼저 피쳐의 속성값을 변경하는 코드는 다음과 같습니다.

QgsProject.instance().removeAllMapLayers()

layer = QgsVectorLayer("D:/__Data__/세종특별자치시_36000/TL_SPRD_MANAGE.shp", "TL_SPRD_MANAGE", "ogr")
QgsProject.instance().addMapLayers([layer])
layer.selectByExpression('"RN_CD" = \'3251036\'')
idxField = layer.fields().indexOf('RN')

features = layer.selectedFeatures()
with edit(layer):
    for f in features:
        layer.changeAttributeValue(f.id(), idxField, "짱기로")

위의 코드는 먼저 RN_CD의 값이 3251036인 피쳐를 선택하고 선택된 피쳐의 RN 필드의 값을 “짱기로”로 변경하는 코드입니다.

다음은 위와 동일한 조건으로 피쳐를 선택하고 선택된 피쳐의 좌표를 편집하는 코드입니다.

QgsProject.instance().removeAllMapLayers()

layer = QgsVectorLayer("D:/__Data__/세종특별자치시_36000/TL_SPRD_MANAGE.shp", "TL_SPRD_MANAGE", "ogr")
QgsProject.instance().addMapLayers([layer])
layer.selectByExpression('"RN_CD" = \'2348142\'')

features = layer.selectedFeatures()
with edit(layer):
    for f in features:
        geom = QgsGeometry.fromWkt("MULTILINESTRING((968963 1820821, 993152 1819742, 993567 1844387))")
        layer.changeGeometry(f.id(),geom)

새롭게 정의할 도형의 좌표를 WKT 형식으로 지정하였습니다.