พล็อตค่า RGB สำหรับแต่ละคุณสมบัติแยกกัน

Aug 18 2020

ฉันต้องการพล็อตค่า rgb แต่ละค่าสำหรับคุณสมบัติตามลำดับของเลเยอร์ผ่าน pyqgis Atm ฉันพยายามที่จะใช้มันอย่างถูกต้องสำหรับแต่ละเลเยอร์ทีละชั้น ด้วยรหัสปัจจุบันของฉันด้านล่างคุณสมบัติทั้งหมดจะได้รับรหัสสีสุดท้ายในแถวที่ 3 ดังนั้นพวกมันทั้งหมดจึงมีสีเดียวกันแทนที่จะเป็นองค์ประกอบแต่ละอย่าง

ฉันใช้ QGIS 2.8.8 Wien ดังนั้นโซลูชันที่เสนอสำหรับ QGIS 3 จึงทำงานไม่ถูกต้อง

b = iface.activeLayer()

symbols = b.rendererV2().symbols()
symbol = symbols[0]
            
for f in b.getFeatures():
    expr = f['rgb']
    express = "color_rgb("+str(expr) +")"
    symbol.symbolLayer(0).setDataDefinedProperty('color', express)

b.triggerRepaint()
iface.legendInterface().refreshLayerSymbology(b)

คำตอบ

2 LouisCottereau Aug 18 2020 at 21:08

นี่คือรหัสที่ฉันปรับให้เหมาะกับคุณมันใช้ได้กับ qgis ของฉัน 2.18.28:

b = iface.activeLayer()

fni = b.fieldNameIndex("rgb")
unique_values = b.uniqueValues(fni)

# fill categories
categories = []
for unique_value in unique_values:
    red, blue, green = unique_value.split(",")
    # initialize the default symbol for this geometry type
    symbol = QgsSymbolV2.defaultSymbol(b.geometryType())
    symbol.setSize(size)
    # configure a symbol layer
    layer_style = {}
    layer_style['color'] = '%d, %d, %d' % (red, blue, green)
    layer_style['outline'] = '#000000'
    symbol_layer = QgsSimpleFillSymbolLayerV2.create(layer_style)

    # replace default symbol layer with the configured one
    if symbol_layer is not None:
        symbol.changeSymbolLayer(0, symbol_layer)

    # create renderer object
    category = QgsRendererCategoryV2(unique_value, symbol, str(unique_value))
    # entry for the list of category items
    categories.append(category)

# create renderer object
renderer = QgsCategorizedSymbolRendererV2('$id', categories)

# assign the created renderer to the layer
if renderer is not None:
    b.setRendererV2(renderer)
b.triggerRepaint()


b.triggerRepaint()
iface.legendInterface().refreshLayerSymbology(b)