계산 필드는 어떤 값 등을 이용해 계산된 결과값을 저장하는 필드인데, 특히 기존의 다른 필드값들을 이용하여 새로운 값을 만들어 새로운 필드에 저장해 둘 수 있습니다. 이 예제에서는 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개의 계산 필드가 저장되어 있는 것을 확인할 수 있습니다. (피쳐 개수에 따라 실행 시간이 제법 걸립니다)