pyQGIS를 이용한 벡터 데이터 처리 4 : 스타일 심벌 및 라벨 지정하기

추가한 벡터 레이어에 대한 그리기 스타일을 심벌이라고 하는데, 이 심벌은 매우 다양합니다. 먼저 전체 도형을 하나의 심벌로 지정하는 코드는 다음과 같습니다.

QgsProject.instance().removeAllMapLayers()

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

symbol = QgsLineSymbol.createSimple({"line_style":"solid", "color": "red", "width": "0.5"})
layer.renderer().setSymbol(symbol)
layer.triggerRepaint()

선 스타일은 Solid이고 색상은 red, 굵기는 0.5로 지정했으며 결과는 다음과 같습니다.

다음은 특정 필드의 값에 대한 범위에 따라 심벌을 다르게 설정하는 코드입니다.

QgsProject.instance().removeAllMapLayers()

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

for field in layer.fields():
    print(field.name())
    
field = "ROAD_BT"

def createRendererRange(layer, label, minV, maxV, color, opacity, width):
    color = QColor(color)
    symbol = QgsSymbol.defaultSymbol(layer.geometryType())
    symbol.setColor(color)
    symbol.setOpacity(1)
    symbol.setWidth(width)
    range = QgsRendererRange(minV, maxV, symbol, label)
    return range

rangeList = [
    createRendererRange(layer, "Group1", 0.0, 10, "#aaaaaa", 1, 0.2),
    createRendererRange(layer, "Group2", 10, 20, "#00ff00", 0.5, 0.5),
    createRendererRange(layer, "Group3", 20, 30, "#ffff00", 1, 0.5),
    createRendererRange(layer, "Group4", 30, 50, "#ff0000", 0.5, 0.5)
]

groupRenderer = QgsGraduatedSymbolRenderer("", rangeList)
groupRenderer.setMode(QgsGraduatedSymbolRenderer.EqualInterval)
groupRenderer.setClassAttribute(field)
layer.setRenderer(groupRenderer)

ROAD_BT에 대한 필드값을 4개의 구간에 대해 다른 심벌을 지정하고 있으며 그 결과는 다음과 같습니다.

다음은 라벨을 설정하는 코드입니다.

text_format = QgsTextFormat()
text_format.setFont(QFont("Arial"))
text_format.setSize(12)
text_format.setColor(QColor("white"))
buffer_settings = QgsTextBufferSettings()
buffer_settings.setEnabled(True)
buffer_settings.setSize(1)
buffer_settings.setColor(QColor("gray"))
text_format.setBuffer(buffer_settings)

layer_settings = QgsPalLayerSettings()
layer_settings.setFormat(text_format)
layer_settings.fieldName = "name"
layer_settings.placement = QgsPalLayerSettings.Line

label_settings = QgsVectorLayerSimpleLabeling(layer_settings)
layer.setLabelsEnabled(True)
layer.setLabeling(label_settings)
layer.triggerRepaint()

실행 결과는 다음과 같습니다.

답글 남기기

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