Skip to content

Commit 956ed06

Browse files
committed
[server] Respect custom layer order for groups in GetMap
Fixes #21917
1 parent c0105bd commit 956ed06

File tree

4 files changed

+1027
-2
lines changed

4 files changed

+1027
-2
lines changed

src/server/services/wms/qgswmsrendercontext.cpp

+26-2
Original file line numberDiff line numberDiff line change
@@ -300,9 +300,33 @@ void QgsWmsRenderContext::initLayerGroupsRecursive( const QgsLayerTreeGroup *gro
300300
if ( !groupName.isEmpty() )
301301
{
302302
mLayerGroups[groupName] = QList<QgsMapLayer *>();
303-
for ( QgsLayerTreeLayer *layer : group->findLayers() )
303+
const auto projectLayerTreeRoot { mProject->layerTreeRoot() };
304+
const auto treeGroupLayers { group->findLayers() };
305+
// Fast track if there is no custom layer order,
306+
// otherwise reorder layers.
307+
if ( ! projectLayerTreeRoot->hasCustomLayerOrder() )
304308
{
305-
mLayerGroups[groupName].append( layer->layer() );
309+
for ( const auto &tl : treeGroupLayers )
310+
{
311+
mLayerGroups[groupName].push_back( tl->layer() );
312+
}
313+
}
314+
else
315+
{
316+
const auto projectLayerOrder { projectLayerTreeRoot->layerOrder() };
317+
// Flat list containing the layers from the tree nodes
318+
QList<QgsMapLayer *> groupLayersList;
319+
for ( const auto &tl : treeGroupLayers )
320+
{
321+
groupLayersList << tl->layer();
322+
}
323+
for ( const auto &l : projectLayerOrder )
324+
{
325+
if ( groupLayersList.contains( l ) )
326+
{
327+
mLayerGroups[groupName].push_back( l );
328+
}
329+
}
306330
}
307331
}
308332

tests/src/python/test_qgsserver_wms_getmap.py

+44
Original file line numberDiff line numberDiff line change
@@ -1516,6 +1516,50 @@ def test_wms_getmap_external(self):
15161516
r, h = self._result(self._execute_request(qs))
15171517
self._img_diff_error(r, h, "WMS_GetMap_External", 20000)
15181518

1519+
def test_wms_getmap_root_custom_layer_order_regression_21917(self):
1520+
"""When drawing root layer, custom layer order order should be respected."""
1521+
1522+
qs = "?" + "&".join(["%s=%s" % i for i in list({
1523+
"MAP": urllib.parse.quote(os.path.join(self.testdata_path, 'bug_21917_root_layer_order.qgs')),
1524+
"SERVICE": "WMS",
1525+
"VERSION": "1.3.0",
1526+
"REQUEST": "GetMap",
1527+
"BBOX": "44.9014,8.20346,44.9015,8.20355",
1528+
"CRS": "EPSG:4326",
1529+
"WIDTH": "400",
1530+
"HEIGHT": "400",
1531+
"LAYERS": "group",
1532+
"STYLES": ",",
1533+
"FORMAT": "image/png",
1534+
"DPI": "200",
1535+
"MAP_RESOLUTION": "200",
1536+
"FORMAT_OPTIONS": "dpi:200"
1537+
}.items())])
1538+
1539+
r, h = self._result(self._execute_request(qs))
1540+
self._img_diff_error(r, h, "WMS_GetMap_Group_Layer_Order")
1541+
1542+
# Check with root_layer
1543+
qs = "?" + "&".join(["%s=%s" % i for i in list({
1544+
"MAP": urllib.parse.quote(os.path.join(self.testdata_path, 'bug_21917_root_layer_order.qgs')),
1545+
"SERVICE": "WMS",
1546+
"VERSION": "1.3.0",
1547+
"REQUEST": "GetMap",
1548+
"BBOX": "44.9014,8.20346,44.9015,8.20355",
1549+
"CRS": "EPSG:4326",
1550+
"WIDTH": "400",
1551+
"HEIGHT": "400",
1552+
"LAYERS": "root_layer",
1553+
"STYLES": ",",
1554+
"FORMAT": "image/png",
1555+
"DPI": "200",
1556+
"MAP_RESOLUTION": "200",
1557+
"FORMAT_OPTIONS": "dpi:200"
1558+
}.items())])
1559+
1560+
r, h = self._result(self._execute_request(qs))
1561+
self._img_diff_error(r, h, "WMS_GetMap_Group_Layer_Order")
1562+
15191563

15201564
if __name__ == '__main__':
15211565
unittest.main()

0 commit comments

Comments
 (0)