pyQGIS를 이용한 벡터 데이터 처리 9 : 계산 필드 추가하기

계산 필드는 어떤 값 등을 이용해 계산된 결과값을 저장하는 필드인데, 특히 기존의 다른 필드값들을 이용하여 새로운 값을 만들어 새로운 필드에 저장해 둘 수 있습니다. 이 예제에서는 2개의 계산 필드를 새롭게 추가할 것이며 첫번째는 지오메트리의 길이값, 두번째는 기존의 어떤 필드값을 첫번째 계산필드로 나눈 필드입니다. 이 2개의 계산필드를 정의하는 코드는 다음과 같습니다.

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

pv = layer.dataProvider()
pv.addAttributes(
    [
        QgsField("len", QVariant.Double),
        QgsField("calc", QVariant.Double)
    ]
)

layer.updateFields()

위의 코드에서 len 필드가 지오메트리의 길이 값을 저장해 둘 필드이고 calc는 ROAD_LT라는 필드값에 len 필드값을 나눈 결과를 저장할 필드입니다. 이처럼 계산에 대한 표현식을 정의합니다.

expression1 = QgsExpression("$length")
expression2 = QgsExpression('"ROAD_LT"/"len"')

그리고 계산 필드에 표현식 적용을 위한 문맥을 정의하는 객체를 생성합니다.

context = QgsExpressionContext()
context.appendScopes(QgsExpressionContextUtils.globalProjectLayerScopes(layer))

이제 레이어를 구성하는 모든 피쳐에 대해 순차적으로 계산 필드의 값을 저장하는 코드를 작성합니다. 먼저 len 필드에 대한 처리입니다.

with edit(layer):
    for f in layer.getFeatures():
        context.setFeature(f)
        f["len"] = expression1.evaluate(context)
        layer.updateFeature(f)

다음은 calc 필드에 대한 처리입니다.

with edit(layer):
    for f in layer.getFeatures():
        context.setFeature(f)
        f["calc"] = expression2.evaluate(context)
        layer.updateFeature(f)       

실행하고 레이어의 속성 정보를 확인해 보면 다음처럼 2개의 계산 필드가 저장되어 있는 것을 확인할 수 있습니다. (피쳐 개수에 따라 실행 시간이 제법 걸립니다)

답글 남기기

이메일 주소는 공개되지 않습니다. 필수 필드는 *로 표시됩니다