Skip to content

Commit 9ddbae6

Browse files
committedApr 27, 2019
Respect custom layer order for groups in GetMap
Backport of bugfix from master PR 9878 Fixes #21917
1 parent 1e3b83e commit 9ddbae6

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
@@ -2790,9 +2790,33 @@ namespace QgsWms
27902790
if ( !groupName.isEmpty() )
27912791
{
27922792
mLayerGroups[groupName] = QList<QgsMapLayer *>();
2793-
for ( QgsLayerTreeLayer *layer : group->findLayers() )
2793+
const auto projectLayerTreeRoot { mProject->layerTreeRoot() };
2794+
const auto treeGroupLayers { group->findLayers() };
2795+
// Fast track if there is no custom layer order,
2796+
// otherwise reorder layers.
2797+
if ( ! projectLayerTreeRoot->hasCustomLayerOrder() )
27942798
{
2795-
mLayerGroups[groupName].append( layer->layer() );
2799+
for ( const auto &tl : treeGroupLayers )
2800+
{
2801+
mLayerGroups[groupName].push_back( tl->layer() );
2802+
}
2803+
}
2804+
else
2805+
{
2806+
const auto projectLayerOrder { projectLayerTreeRoot->layerOrder() };
2807+
// Flat list containing the layers from the tree nodes
2808+
QList<QgsMapLayer *> groupLayersList;
2809+
for ( const auto &tl : treeGroupLayers )
2810+
{
2811+
groupLayersList << tl->layer();
2812+
}
2813+
for ( const auto &l : projectLayerOrder )
2814+
{
2815+
if ( groupLayersList.contains( l ) )
2816+
{
2817+
mLayerGroups[groupName].push_back( l );
2818+
}
2819+
}
27962820
}
27972821
}
27982822

‎tests/src/python/test_qgsserver_wms_getmap.py

Lines changed: 44 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1450,6 +1450,50 @@ def test_wms_getmap_datasource_error(self):
14501450

14511451
self.assertTrue('ServerException' in str(r))
14521452

1453+
def test_wms_getmap_root_custom_layer_order_regression_21917(self):
1454+
"""When drawing root layer, custom layer order order should be respected."""
1455+
1456+
qs = "?" + "&".join(["%s=%s" % i for i in list({
1457+
"MAP": urllib.parse.quote(os.path.join(self.testdata_path, 'bug_21917_root_layer_order.qgs')),
1458+
"SERVICE": "WMS",
1459+
"VERSION": "1.3.0",
1460+
"REQUEST": "GetMap",
1461+
"BBOX": "44.9014,8.20346,44.9015,8.20355",
1462+
"CRS": "EPSG:4326",
1463+
"WIDTH": "400",
1464+
"HEIGHT": "400",
1465+
"LAYERS": "group",
1466+
"STYLES": ",",
1467+
"FORMAT": "image/png",
1468+
"DPI": "200",
1469+
"MAP_RESOLUTION": "200",
1470+
"FORMAT_OPTIONS": "dpi:200"
1471+
}.items())])
1472+
1473+
r, h = self._result(self._execute_request(qs))
1474+
self._img_diff_error(r, h, "WMS_GetMap_Group_Layer_Order")
1475+
1476+
# Check with root_layer
1477+
qs = "?" + "&".join(["%s=%s" % i for i in list({
1478+
"MAP": urllib.parse.quote(os.path.join(self.testdata_path, 'bug_21917_root_layer_order.qgs')),
1479+
"SERVICE": "WMS",
1480+
"VERSION": "1.3.0",
1481+
"REQUEST": "GetMap",
1482+
"BBOX": "44.9014,8.20346,44.9015,8.20355",
1483+
"CRS": "EPSG:4326",
1484+
"WIDTH": "400",
1485+
"HEIGHT": "400",
1486+
"LAYERS": "root_layer",
1487+
"STYLES": ",",
1488+
"FORMAT": "image/png",
1489+
"DPI": "200",
1490+
"MAP_RESOLUTION": "200",
1491+
"FORMAT_OPTIONS": "dpi:200"
1492+
}.items())])
1493+
1494+
r, h = self._result(self._execute_request(qs))
1495+
self._img_diff_error(r, h, "WMS_GetMap_Group_Layer_Order")
1496+
14531497

14541498
if __name__ == '__main__':
14551499
unittest.main()

‎tests/testdata/qgis_server/bug_21917_root_layer_order.qgs

Lines changed: 957 additions & 0 deletions
Large diffs are not rendered by default.

0 commit comments

Comments
 (0)
Please sign in to comment.