Skip to content

Commit aa714d3

Browse files
committed
Respect custom layer order for groups in GetMap
Backport of bugfix from master PR 9878 Fixes #21917 (cherry-picking commit 9ddbae6 from 3.6)
1 parent c547fc6 commit aa714d3

File tree

4 files changed

+1027
-2
lines changed

4 files changed

+1027
-2
lines changed

src/server/services/wms/qgswmsrenderer.cpp

Lines changed: 26 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2496,9 +2496,33 @@ namespace QgsWms
24962496
if ( !groupName.isEmpty() )
24972497
{
24982498
mLayerGroups[groupName] = QList<QgsMapLayer *>();
2499-
for ( QgsLayerTreeLayer *layer : group->findLayers() )
2499+
const auto projectLayerTreeRoot { mProject->layerTreeRoot() };
2500+
const auto treeGroupLayers { group->findLayers() };
2501+
// Fast track if there is no custom layer order,
2502+
// otherwise reorder layers.
2503+
if ( ! projectLayerTreeRoot->hasCustomLayerOrder() )
25002504
{
2501-
mLayerGroups[groupName].append( layer->layer() );
2505+
for ( const auto &tl : treeGroupLayers )
2506+
{
2507+
mLayerGroups[groupName].push_back( tl->layer() );
2508+
}
2509+
}
2510+
else
2511+
{
2512+
const auto projectLayerOrder { projectLayerTreeRoot->layerOrder() };
2513+
// Flat list containing the layers from the tree nodes
2514+
QList<QgsMapLayer *> groupLayersList;
2515+
for ( const auto &tl : treeGroupLayers )
2516+
{
2517+
groupLayersList << tl->layer();
2518+
}
2519+
for ( const auto &l : projectLayerOrder )
2520+
{
2521+
if ( groupLayersList.contains( l ) )
2522+
{
2523+
mLayerGroups[groupName].push_back( l );
2524+
}
2525+
}
25022526
}
25032527
}
25042528

tests/src/python/test_qgsserver_wms_getmap.py

Lines changed: 44 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1427,6 +1427,50 @@ def test_wms_getmap_group_regression_20810(self):
14271427
r, h = self._result(self._execute_request(qs))
14281428
self._img_diff_error(r, h, "WMS_GetMap_GroupedLayersDown")
14291429

1430+
def test_wms_getmap_root_custom_layer_order_regression_21917(self):
1431+
"""When drawing root layer, custom layer order order should be respected."""
1432+
1433+
qs = "?" + "&".join(["%s=%s" % i for i in list({
1434+
"MAP": urllib.parse.quote(os.path.join(self.testdata_path, 'bug_21917_root_layer_order.qgs')),
1435+
"SERVICE": "WMS",
1436+
"VERSION": "1.3.0",
1437+
"REQUEST": "GetMap",
1438+
"BBOX": "44.9014,8.20346,44.9015,8.20355",
1439+
"CRS": "EPSG:4326",
1440+
"WIDTH": "400",
1441+
"HEIGHT": "400",
1442+
"LAYERS": "group",
1443+
"STYLES": ",",
1444+
"FORMAT": "image/png",
1445+
"DPI": "200",
1446+
"MAP_RESOLUTION": "200",
1447+
"FORMAT_OPTIONS": "dpi:200"
1448+
}.items())])
1449+
1450+
r, h = self._result(self._execute_request(qs))
1451+
self._img_diff_error(r, h, "WMS_GetMap_Group_Layer_Order")
1452+
1453+
# Check with root_layer
1454+
qs = "?" + "&".join(["%s=%s" % i for i in list({
1455+
"MAP": urllib.parse.quote(os.path.join(self.testdata_path, 'bug_21917_root_layer_order.qgs')),
1456+
"SERVICE": "WMS",
1457+
"VERSION": "1.3.0",
1458+
"REQUEST": "GetMap",
1459+
"BBOX": "44.9014,8.20346,44.9015,8.20355",
1460+
"CRS": "EPSG:4326",
1461+
"WIDTH": "400",
1462+
"HEIGHT": "400",
1463+
"LAYERS": "root_layer",
1464+
"STYLES": ",",
1465+
"FORMAT": "image/png",
1466+
"DPI": "200",
1467+
"MAP_RESOLUTION": "200",
1468+
"FORMAT_OPTIONS": "dpi:200"
1469+
}.items())])
1470+
1471+
r, h = self._result(self._execute_request(qs))
1472+
self._img_diff_error(r, h, "WMS_GetMap_Group_Layer_Order")
1473+
14301474

14311475
if __name__ == '__main__':
14321476
unittest.main()

0 commit comments

Comments
 (0)