Skip to content

Commit 611d644

Browse files
authoredJul 11, 2023
Merge pull request #53738 from Gustry/getlegend-json
Fix export legend as JSON when a rule based does not have a symbol
2 parents c1c38ee + 720b8dd commit 611d644

File tree

2 files changed

+69
-12
lines changed

2 files changed

+69
-12
lines changed
 

‎src/core/layertree/qgslayertreemodellegendnode.cpp

+12-11
Original file line numberDiff line numberDiff line change
@@ -812,10 +812,21 @@ QSizeF QgsSymbolLegendNode::drawSymbol( const QgsLegendSettings &settings, ItemC
812812

813813
QJsonObject QgsSymbolLegendNode::exportSymbolToJson( const QgsLegendSettings &settings, const QgsRenderContext &context ) const
814814
{
815+
QJsonObject json;
816+
if ( mItem.scaleMaxDenom() > 0 )
817+
{
818+
json[ QStringLiteral( "scaleMaxDenom" ) ] = mItem.scaleMaxDenom();
819+
}
820+
if ( mItem.scaleMinDenom() > 0 )
821+
{
822+
json[ QStringLiteral( "scaleMinDenom" ) ] = mItem.scaleMinDenom();
823+
}
824+
mItem.scaleMaxDenom();
825+
815826
const QgsSymbol *s = mCustomSymbol ? mCustomSymbol.get() : mItem.symbol();
816827
if ( !s )
817828
{
818-
return QJsonObject();
829+
return json;
819830
}
820831

821832

@@ -857,17 +868,7 @@ QJsonObject QgsSymbolLegendNode::exportSymbolToJson( const QgsLegendSettings &se
857868
img.save( &buffer, "PNG" );
858869
const QString base64 = QString::fromLatin1( byteArray.toBase64().data() );
859870

860-
QJsonObject json;
861871
json[ QStringLiteral( "icon" ) ] = base64;
862-
if ( mItem.scaleMaxDenom() > 0 )
863-
{
864-
json[ QStringLiteral( "scaleMaxDenom" ) ] = mItem.scaleMaxDenom();
865-
}
866-
if ( mItem.scaleMinDenom() > 0 )
867-
{
868-
json[ QStringLiteral( "scaleMinDenom" ) ] = mItem.scaleMinDenom();
869-
}
870-
mItem.scaleMaxDenom();
871872
return json;
872873
}
873874

‎tests/src/python/test_qgsserver_wms_getlegendgraphic.py

+57-1
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,8 @@
3232
from test_qgsserver_wms import TestQgsServerWMSTestBase
3333
from qgis.core import (
3434
QgsProject,
35+
QgsSymbol,
36+
QgsWkbTypes,
3537
QgsMarkerSymbol,
3638
QgsRuleBasedRenderer,
3739
QgsVectorLayer,
@@ -41,7 +43,6 @@
4143
QgsBufferServerRequest,
4244
QgsBufferServerResponse,
4345
QgsServer,
44-
QgsServerRequest,
4546
)
4647

4748
# Strip path and content length because path may vary
@@ -1285,6 +1286,61 @@ def testJsonSymbolMaxMinScale(self):
12851286
self.assertEqual(node['scaleMaxDenom'], 1000)
12861287
self.assertEqual(node['scaleMinDenom'], 10000)
12871288

1289+
def test_json_rule_based_max_min_scale_without_symbol(self):
1290+
""" Test min/max scale in rule based json export when a rule doesn't have a symbol. """
1291+
root_rule = QgsRuleBasedRenderer.Rule(None)
1292+
1293+
# Rule with symbol
1294+
high_scale_rule = QgsRuleBasedRenderer.Rule(
1295+
QgsSymbol.defaultSymbol(QgsWkbTypes.PointGeometry),
1296+
minimumScale=25000, maximumScale=1000, label='high-scale')
1297+
root_rule.appendChild(high_scale_rule)
1298+
1299+
# Rule without symbol
1300+
low_scale_rule = QgsRuleBasedRenderer.Rule(None, minimumScale=100000, maximumScale=25000, label='low-scale')
1301+
1302+
# Sub-rule with a symbol
1303+
sub_rule = QgsRuleBasedRenderer.Rule(
1304+
QgsSymbol.defaultSymbol(QgsWkbTypes.PointGeometry), label='low-scale-sub')
1305+
1306+
low_scale_rule.appendChild(sub_rule)
1307+
root_rule.appendChild(low_scale_rule)
1308+
1309+
layer = QgsVectorLayer("Point?field=fldtxt:string", "layer1", "memory")
1310+
layer.setRenderer(QgsRuleBasedRenderer(root_rule))
1311+
1312+
project = QgsProject()
1313+
project.addMapLayer(layer)
1314+
1315+
server = QgsServer()
1316+
request = QgsBufferServerRequest(
1317+
"/?"
1318+
"SERVICE=WMS&"
1319+
"VERSION=1.3.0&"
1320+
"REQUEST=GetLegendGraphic&"
1321+
"LAYERS=layer1&"
1322+
"FORMAT=application/json"
1323+
)
1324+
response = QgsBufferServerResponse()
1325+
server.handleRequest(request, response, project)
1326+
result = json.loads(bytes(response.body()))
1327+
1328+
node = result['nodes'][0]['symbols']
1329+
1330+
# With icon
1331+
first_rule = node[0]
1332+
self.assertEqual(first_rule['scaleMaxDenom'], 25000)
1333+
self.assertEqual(first_rule['scaleMinDenom'], 1000)
1334+
self.assertEqual(first_rule['title'], 'high-scale')
1335+
self.assertIn('icon', first_rule)
1336+
1337+
# Without icon
1338+
second_rule = node[1]
1339+
self.assertEqual(second_rule['scaleMaxDenom'], 100000)
1340+
self.assertEqual(second_rule['scaleMinDenom'], 25000)
1341+
self.assertEqual(second_rule['title'], 'low-scale')
1342+
self.assertNotIn('icon', second_rule)
1343+
12881344
def testLegendPlaceholderIcon(self):
12891345
qs = "?" + "&".join(["%s=%s" % i for i in list({
12901346
"MAP": self.testdata_path + 'test_project_legend_placeholder_image.qgs',

0 commit comments

Comments
 (0)
Please sign in to comment.