PyQGIS 범례 필터링

Oct 22 2020

내 레이어 중 하나에서 selectByExpression을 수행 한 다음 새 레이어를 만들었습니다. 레이어 1 : co, 레이어 2 : co_temp

  co.selectByExpression("SECTION=1")
  co_temp = processing.run("native:saveselectedfeatures", {'INPUT': co, 'OUTPUT': 'memory:'})['OUTPUT']
  co.removeSelection()
  renderer = co.renderer().clone()
  co_temp.setRenderer(renderer)
  co_temp.renderer().filter()
  co_temp.triggerRepaint()
  co.removeSelection()

co_temp 캡션을 생성하고 싶지만 선택된 co_temp 표현식에 대해서만 가능합니다. co_temp 캡션에 대해 검색하지 않으려는 쓸모없는 정보가 많이 있습니다.

mapt = QgsLayoutItemMap(layout)
mapt.attemptSetSceneRect(QRectF(20, 20, 80, 80))
mapt.setFrameEnabled(True)
mapt.setLayers([co_temp])
mapt.setCrs(co_temp.crs())
layout.addLayoutItem(mapt)
mapt.setExtent(co_temp.extent().buffered(250))

legend = QgsLayoutItemLegend(layout)
legend.setTitle("Legend")
legend.attemptSetSceneRect(QRectF(120, 20, 80, 80))
legend.setFrameEnabled(True)
legend.setBackgroundColor(QColor(200, 200, 200))
legend.setTitle('')
legend.setLegendFilterByMapEnabled(True)

legend.setResizeToContents(False)

layout.addLayoutItem(legend)
legend.setLinkedMap(mapt)

나는 이것을 시도했지만 작동하지 않습니다.

공동 :

공동 전설 :

co_temp :

co_temp 범례 :

답변

1 mathiasmirra Oct 28 2020 at 17:09

나는 마침내 내 전설을 걸러 내고 내 코드를 당신과 공유하고 있습니다. co : 레이어 1 co_temp : 레이어 2

            co.selectByExpression("SECTION=1")
            co_temp = processing.run("native:saveselectedfeatures", {'INPUT': co, 
            'OUTPUT': 'memory:'})['OUTPUT']
            co.removeSelection()

            renderer = co.renderer().clone()
            renderer2 = co.renderer().clone()
            renderer3 = co.renderer().clone()
            renderer2.deleteAllCategories()
            renderer3.deleteAllCategories()
            co_temp.setRenderer(renderer)
            ctx = QgsRenderContext()
            table = []
            table2 = []

            for feature in co_temp.getFeatures():
                for i in renderer.categories():
                    renderer3.addCategory(i)
                    #####################################
                    renderer3.startRender(ctx, QgsFields())
                    ctx.expressionContext().setFeature(feature)
                    #####################################
                    if renderer3.willRenderFeature(feature, ctx):
                        if i.label() not in table and i.label() != "":
                            table.append(i.label())
                            table2.append(i)
                    #####################################
                    renderer3.stopRender(ctx)
                    #####################################
                    renderer3.deleteAllCategories()

            for i in table2:
                i.setLabel(i.label().lower())
                renderer2.addCategory(i)

            co_temp.setRenderer(renderer2)
            co_temp.triggerRepaint()