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

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

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
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()
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()
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로 지정했으며 결과는 다음과 같습니다.

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

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
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)
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)
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개의 구간에 대해 다른 심벌을 지정하고 있으며 그 결과는 다음과 같습니다.

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

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
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()
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()
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()

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

답글 남기기

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