Filtruj legendę PyQGIS
Oct 22 2020
Wykonałem selectByExpression na jednej z moich warstw, a następnie utworzyłem nową warstwę. warstwa 1: co, warstwa 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()
Chciałbym móc utworzyć podpis co_temp, ale tylko dla wybranych wyrażeń co_temp. We współpracy jest wiele bezużytecznych informacji, których nie chciałbym pobierać do podpisu 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)
Próbowałem tego, ale to nie działa.
co:
co legenda:
co_temp:
co_temp legenda:
Odpowiedzi
1 mathiasmirra Oct 28 2020 at 17:09
W końcu udało mi się przefiltrować moją legendę, udostępniam Ci mój kod. co: warstwa 1 co_temp: warstwa 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()