diff --git a/src/server/services/wms/qgswmsgetstyles.cpp b/src/server/services/wms/qgswmsgetstyles.cpp index f903a79ec13..f087e05b092 100644 --- a/src/server/services/wms/qgswmsgetstyles.cpp +++ b/src/server/services/wms/qgswmsgetstyles.cpp @@ -29,6 +29,7 @@ #include "qgsrenderer.h" #include "qgsvectorlayer.h" #include "qgsmaplayerstylemanager.h" +#include "qgsvectorlayerlabeling.h" namespace QgsWms @@ -181,11 +182,35 @@ namespace QgsWms if ( vlayer->isSpatial() ) { QString currentStyle = vlayer->styleManager()->currentStyle(); + + QgsStringMap props; + if ( vlayer->hasScaleBasedVisibility() ) + { + props[ QStringLiteral( "scaleMinDenom" ) ] = QString::number( vlayer->maximumScale() ); + props[ QStringLiteral( "scaleMaxDenom" ) ] = QString::number( vlayer->minimumScale() ); + } + for ( const QString &styleName : vlayer->styleManager()->styles() ) { vlayer->styleManager()->setCurrentStyle( styleName ); - QDomElement styleElem = vlayer->renderer()->writeSld( myDocument, styleName ); - namedLayerNode.appendChild( styleElem ); + + QDomElement userStyleElem = myDocument.createElement( QStringLiteral( "UserStyle" ) ); + + QDomElement styleNameElem = myDocument.createElement( QStringLiteral( "se:Name" ) ); + styleNameElem.appendChild( myDocument.createTextNode( styleName ) ); + + userStyleElem.appendChild( styleNameElem ); + + QDomElement featureTypeStyleElem = myDocument.createElement( QStringLiteral( "se:FeatureTypeStyle" ) ); + userStyleElem.appendChild( featureTypeStyleElem ); + + vlayer->renderer()->toSld( myDocument, featureTypeStyleElem, props ); + if ( vlayer->labelsEnabled() ) + { + vlayer->labeling()->toSld( featureTypeStyleElem, props ); + } + + namedLayerNode.appendChild( userStyleElem ); } vlayer->styleManager()->setCurrentStyle( currentStyle ); } diff --git a/tests/src/python/test_qgsserver_wms.py b/tests/src/python/test_qgsserver_wms.py index 58eb3dfd787..6ac8dfa81d5 100644 --- a/tests/src/python/test_qgsserver_wms.py +++ b/tests/src/python/test_qgsserver_wms.py @@ -48,7 +48,8 @@ class TestQgsServerWMSTestBase(QgsServerTestBase): regenerate_reference = False def wms_request(self, request, extra=None, project='test_project.qgs', version='1.3.0'): - project = os.path.join(self.testdata_path, project) + if not os.path.exists(project): + project = os.path.join(self.testdata_path, project) assert os.path.exists(project), "Project file not found: " + project query_string = 'https://www.qgis.org/?MAP=%s&SERVICE=WMS&VERSION=%s&REQUEST=%s' % (urllib.parse.quote(project), version, request) if extra is not None: @@ -121,6 +122,12 @@ class TestQgsServerWMS(TestQgsServerWMSTestBase): '&layers=testlayer%20%C3%A8%C3%A9&', 'getstyles') + # Test GetStyles with labeling + self.wms_request_compare('GetStyles', + '&layers=pointlabel', + 'getstyles_pointlabel', + project=self.projectPath) + def test_wms_getschemaextension(self): self.wms_request_compare('GetSchemaExtension', '', diff --git a/tests/testdata/qgis_server/getstyles_pointlabel.txt b/tests/testdata/qgis_server/getstyles_pointlabel.txt new file mode 100644 index 00000000000..804a5b86da6 --- /dev/null +++ b/tests/testdata/qgis_server/getstyles_pointlabel.txt @@ -0,0 +1,76 @@ +***** +Content-Type: text/xml; charset=utf-8 + + + + + pointlabel + + default + + + + + + + + geo_1a4e7b82_a552_467a_b681_c1155fb76f54 + fid + + gid + 1 + + + val + + 1.72300000000000009 + + + + + + circle + + #fffb00 + + + #d711da + 4 + + + 43 + + + + + + + Placeholder + + QGIS Vera Sans + 18 + bold + + + + + 1 + 0 + + + + + 3.5 + + #3ba7a7 + + + + #ff0000 + + + + + + +