From 8cda1bbb791a14a308d4af0e58c1dbd3691a81ce Mon Sep 17 00:00:00 2001 From: Blottiere Paul Date: Fri, 9 Dec 2016 16:26:53 +0100 Subject: [PATCH] fix getLegendGraphics when BBox parameter is used --- src/server/qgswmsprojectparser.cpp | 1 - src/server/qgswmsserver.cpp | 46 +++++++------ src/server/qgswmsserver.h | 3 +- tests/src/python/test_qgsserver.py | 65 +++++++++--------- .../WMS_GetLegendGraphic_BBox.png | Bin 625 -> 862 bytes .../WMS_GetLegendGraphic_BBox2.png | Bin 862 -> 625 bytes 6 files changed, 59 insertions(+), 56 deletions(-) diff --git a/src/server/qgswmsprojectparser.cpp b/src/server/qgswmsprojectparser.cpp index 1000cef4737..72bab364e4f 100644 --- a/src/server/qgswmsprojectparser.cpp +++ b/src/server/qgswmsprojectparser.cpp @@ -24,7 +24,6 @@ #include "qgsmaplayerstylemanager.h" #include "qgsmapserviceexception.h" #include "qgspallabeling.h" -#include "qgsproject.h" #include "qgsrenderer.h" #include "qgsvectorlayer.h" diff --git a/src/server/qgswmsserver.cpp b/src/server/qgswmsserver.cpp index 1ee1c64817f..c15d99b14ee 100644 --- a/src/server/qgswmsserver.cpp +++ b/src/server/qgswmsserver.cpp @@ -847,8 +847,6 @@ QImage* QgsWmsServer::getLegendGraphics() } QgsLayerTreeModel legendModel( &rootGroup ); - QList rootChildren = rootGroup.children(); - if ( scaleDenominator > 0 ) legendModel.setLegendFilterByScale( scaleDenominator ); @@ -889,7 +887,7 @@ QImage* QgsWmsServer::getLegendGraphics() } // find out DPI - QImage* tmpImage = createImage( 1, 1 ); + QImage* tmpImage = createImage( 1, 1, false ); if ( !tmpImage ) return nullptr; qreal dpmm = tmpImage->dotsPerMeterX() / 1000.0; @@ -917,7 +915,7 @@ QImage* QgsWmsServer::getLegendGraphics() if ( !rule.isEmpty() ) { //create second image with the right dimensions - QImage* paintImage = createImage( ruleSymbolWidth, ruleSymbolHeight ); + QImage* paintImage = createImage( ruleSymbolWidth, ruleSymbolHeight, false ); //go through the items a second time for painting QPainter p( paintImage ); @@ -939,6 +937,7 @@ QImage* QgsWmsServer::getLegendGraphics() return paintImage; } + QList rootChildren = rootGroup.children(); Q_FOREACH ( QgsLayerTreeNode* node, rootChildren ) { if ( QgsLayerTree::isLayer( node ) ) @@ -978,7 +977,7 @@ QImage* QgsWmsServer::getLegendGraphics() QSizeF minSize = legendRenderer.minimumSize(); QSize s( minSize.width() * dpmm, minSize.height() * dpmm ); - QImage* paintImage = createImage( s.width(), s.height() ); + QImage* paintImage = createImage( s.width(), s.height(), false ); QPainter p( paintImage ); p.setRenderHint( QPainter::Antialiasing, true ); @@ -1422,7 +1421,7 @@ QImage* QgsWmsServer::getMap( QgsMapSettings& mapSettings, HitTest* hitTest ) QStringList highlightLayersId = QgsWmsConfigParser::addHighlightLayers( mParameters, layerSetIds ); QList layerSet; - Q_FOREACH( QString layerSetId, layerSetIds ) + Q_FOREACH ( QString layerSetId, layerSetIds ) { layerSet.append( QgsProject::instance()->mapLayer( layerSetId ) ); } @@ -1967,7 +1966,7 @@ QImage* QgsWmsServer::initializeRendering( QStringList& layersList, QStringList& #endif QList layers; - Q_FOREACH( QString layerId, layerIdList ) + Q_FOREACH ( QString layerId, layerIdList ) { layers.append( QgsProject::instance()->mapLayer( layerId ) ); } @@ -1979,7 +1978,7 @@ QImage* QgsWmsServer::initializeRendering( QStringList& layersList, QStringList& return theImage; } -QImage* QgsWmsServer::createImage( int width, int height ) const +QImage* QgsWmsServer::createImage( int width, int height, bool useBbox ) const { bool conversionSuccess; @@ -2001,23 +2000,26 @@ QImage* QgsWmsServer::createImage( int width, int height ) const //Adapt width / height if the aspect ratio does not correspond with the BBOX. //Required by WMS spec. 1.3. - bool bboxOk; - QgsRectangle mapExtent = _parseBBOX( mParameters.value( "BBOX" ), bboxOk ); - if ( bboxOk ) + if ( useBbox ) { - double mapWidthHeightRatio = mapExtent.width() / mapExtent.height(); - double imageWidthHeightRatio = ( double )width / ( double )height; - if ( !qgsDoubleNear( mapWidthHeightRatio, imageWidthHeightRatio, 0.0001 ) ) + bool bboxOk; + QgsRectangle mapExtent = _parseBBOX( mParameters.value( "BBOX" ), bboxOk ); + if ( bboxOk ) { - if ( mapWidthHeightRatio >= imageWidthHeightRatio ) + double mapWidthHeightRatio = mapExtent.width() / mapExtent.height(); + double imageWidthHeightRatio = ( double )width / ( double )height; + if ( !qgsDoubleNear( mapWidthHeightRatio, imageWidthHeightRatio, 0.0001 ) ) { - //decrease image height - height = width / mapWidthHeightRatio; - } - else - { - //decrease image width - width = height * mapWidthHeightRatio; + if ( mapWidthHeightRatio >= imageWidthHeightRatio ) + { + //decrease image height + height = width / mapWidthHeightRatio; + } + else + { + //decrease image width + width = height * mapWidthHeightRatio; + } } } } diff --git a/src/server/qgswmsserver.h b/src/server/qgswmsserver.h index 7a1c0a09542..ec04e2b8ac9 100644 --- a/src/server/qgswmsserver.h +++ b/src/server/qgswmsserver.h @@ -136,8 +136,9 @@ class QgsWmsServer: public QgsOWSServer /** Creates a QImage from the HEIGHT and WIDTH parameters @param width image width (or -1 if width should be taken from WIDTH wms parameter) @param height image height (or -1 if height should be taken from HEIGHT wms parameter) + @param useBbox flag to indicate if the BBOX has to be used to adapt aspect ratio @return 0 in case of error*/ - QImage* createImage( int width = -1, int height = -1 ) const; + QImage* createImage( int width = -1, int height = -1, bool useBbox = true ) const; /** Configures mapSettings to the parameters HEIGHT, WIDTH, BBOX, CRS. diff --git a/tests/src/python/test_qgsserver.py b/tests/src/python/test_qgsserver.py index 1fda2d39697..60e8898a3b4 100644 --- a/tests/src/python/test_qgsserver.py +++ b/tests/src/python/test_qgsserver.py @@ -781,40 +781,41 @@ class TestQgsServer(unittest.TestCase): r, h = self._result(self.server.handleRequest(qs)) self._img_diff_error(r, h, "WMS_GetLegendGraphic_SymbolSize") - #def test_wms_GetLegendGraphic_BBox(self): - # qs = "&".join(["%s=%s" % i for i in list({ - # "MAP": urllib.parse.quote(self.projectPath), - # "SERVICE": "WMS", - # "VERSION": "1.1.1", - # "REQUEST": "GetLegendGraphic", - # "LAYER": "Country,Hello,db_point", - # "LAYERTITLE": "FALSE", - # "FORMAT": "image/png", - # "HEIGHT": "500", - # "WIDTH": "500", - # "BBOX": "-151.7,-38.9,51.0,78.0", - # "CRS": "EPSG:4326" - # }.items())]) - # r, h = self._result(self.server.handleRequest(qs)) - # self._img_diff_error(r, h, "WMS_GetLegendGraphic_BBox") + def test_wms_GetLegendGraphic_BBox(self): + qs = "&".join(["%s=%s" % i for i in list({ + "MAP": urllib.parse.quote(self.projectPath), + "SERVICE": "WMS", + "VERSION": "1.1.1", + "REQUEST": "GetLegendGraphic", + "LAYER": "Country,Hello,db_point", + "LAYERTITLE": "FALSE", + "FORMAT": "image/png", + "HEIGHT": "500", + "WIDTH": "500", + "BBOX": "-151.7,-38.9,51.0,78.0", + "CRS": "EPSG:4326" + }.items())]) - #def test_wms_GetLegendGraphic_BBox2(self): - # qs = "&".join(["%s=%s" % i for i in list({ - # "MAP": urllib.parse.quote(self.projectPath), - # "SERVICE": "WMS", - # "VERSION": "1.1.1", - # "REQUEST": "GetLegendGraphic", - # "LAYER": "Country,Hello,db_point", - # "LAYERTITLE": "FALSE", - # "FORMAT": "image/png", - # "HEIGHT": "500", - # "WIDTH": "500", - # #"BBOX": "-76.08,38.04,109.95,-6.4", - # "SRS": "EPSG:4326" - # }.items())]) + r, h = self._result(self.server.handleRequest(qs)) + self._img_diff_error(r, h, "WMS_GetLegendGraphic_BBox") - # r, h = self._result(self.server.handleRequest(qs)) - # self._img_diff_error(r, h, "WMS_GetLegendGraphic_BBox2") + def test_wms_GetLegendGraphic_BBox2(self): + qs = "&".join(["%s=%s" % i for i in list({ + "MAP": urllib.parse.quote(self.projectPath), + "SERVICE": "WMS", + "VERSION": "1.1.1", + "REQUEST": "GetLegendGraphic", + "LAYER": "Country,Hello,db_point", + "LAYERTITLE": "FALSE", + "FORMAT": "image/png", + "HEIGHT": "500", + "WIDTH": "500", + "BBOX": "-76.08,-6.4,-19.38,38.04", + "SRS": "EPSG:4326" + }.items())]) + + r, h = self._result(self.server.handleRequest(qs)) + self._img_diff_error(r, h, "WMS_GetLegendGraphic_BBox2") def _result(self, data): headers = {} diff --git a/tests/testdata/control_images/qgis_server/WMS_GetLegendGraphic_BBox/WMS_GetLegendGraphic_BBox.png b/tests/testdata/control_images/qgis_server/WMS_GetLegendGraphic_BBox/WMS_GetLegendGraphic_BBox.png index 22210c4ec5721d325ea22f31ed5d2d2ee53e1ebb..607250a58646c4e1d29d3d90b72bfd28d4aa4458 100644 GIT binary patch delta 833 zcmV-H1HSz61l|Ua7Ya@Y0ssI2&@Zz(ks%j<0}x3>K~!jg?buCB(@+4w@%P$}4w}Xl z8XY4eTOtWl)Oj%`vIGtuCbwN+5DA)aAsQ152NOR|9=IBJg~W>|4k+287aFsOA(%L0 zCa^4MfRvf2gVAn-uJyn{G%x$;+t?28e_PYN{<8M9uY-nRfX0ZbH{frCf{IX35eh1Q zLP13+s0alWp`c<+d`Fh$<>h6Lk5G`Fzea=Yt5 zc|AY>bZTnqn(yeNrt3HQ`@@pta=Gv+u>1w3VHj7vm+xJ?#2z~-t3Og-tnACVIebb5 zmu(`EXr?Ik-;2ZD+P0BQ;yWs%bai!qy^DSNZ{zmvu9`nMX$pjJd~9stYy9}ew;Rcc zyLYNWso+{U>ekQ@+}b{4weIKh-&EB9h@z^V*m}k3beg9C00ssI005FCt*xy&91hcziYoSG z76c)kPG_@O{KK@gw3Iy2CEl4gH#hMe005rnZ8jSgkvXw z6gxUP>P(4!j{p3<&owi_V6gZ@ptdu}06^2>VF5x|`algdnF$3Ip`aoZR1HKy-)(h0 z4L}TkbVJW!QF?oOdwO1|>it|Urzk4U%1RL0MDetFirsEsT6zTlh{a;>KYTnaKnzR; zm3SOd5HM5~R-EN5TZ>UFy1TnmsZ^Q&85OTh6idFFk!3cj2BQ1{2512p>t!Jg00000 LNkvXXu0mjf9S4T8 delta 594 zcmV-Y0ks%j<0wYO8K~z|U?bxwy+CUh<@$ZZwa&6bC zEQNyP1%yOZBzT05aTzmZ$&#Tj>9_~M)!~6`~`D_$L5o9Cjp#lFA6jp-5N>Eq{3M)Zjl_84EeAV;3Fbw&B zk8T)7wOUP2aUAFE$(f#0`6)NK+fTjEl}aTgWjdWcSF0bMz2T=Ee}5MQ!G?p`KhS+e z2pNyZvMigXSt^wtl7cZF3>UpfsC*&GYN`FTR}K-C;tgB&Gl6$_FLWG}BXRwc3x# zPXOrm`=imQTrQ`kY*oVL5M#VvulYZQQp!bXG#ak!E*1-ZO1)ms=kxJnka)hrC_@zX z-uCF|)xG>%Ez9b5KkB-klHxdy>pr@=I_IbO{@G+QX|-A@DF7fz`v4ogKfYXlPT73$ zZnxQC81{NS&-0A^Cok>8_=S776dFar3SS1dlwJ}-;wd|yK~V%7u3QTzj-i*VHck!JZy@i z06@Fl27uvk`1tELOi+5uHpN{%4mC|vl>*|p5Bl5QULK)@Q%cxo&*yV~2LLFFqG=iz g<$so;$($j|A0tw?Z32tLL;wH)07*qoM6N<$g2@6LDF6Tf diff --git a/tests/testdata/control_images/qgis_server/WMS_GetLegendGraphic_BBox2/WMS_GetLegendGraphic_BBox2.png b/tests/testdata/control_images/qgis_server/WMS_GetLegendGraphic_BBox2/WMS_GetLegendGraphic_BBox2.png index 607250a58646c4e1d29d3d90b72bfd28d4aa4458..22210c4ec5721d325ea22f31ed5d2d2ee53e1ebb 100644 GIT binary patch delta 594 zcmV-Y0ks%j<0wYO8K~z|U?bxwy+CUh<@$ZZwa&6bC zEQNyP1%yOZBzT05aTzmZ$&#Tj>9_~M)!~6`~`D_$L5o9Cjp#lFA6jp-5N>Eq{3M)Zjl_84EeAV;3Fbw&B zk8T)7wOUP2aUAFE$(f#0`6)NK+fTjEl}aTgWjdWcSF0bMz2T=Ee}5MQ!G?p`KhS+e z2pNyZvMigXSt^wtl7cZF3>UpfsC*&GYN`FTR}K-C;tgB&Gl6$_FLWG}BXRwc3x# zPXOrm`=imQTrQ`kY*oVL5M#VvulYZQQp!bXG#ak!E*1-ZO1)ms=kxJnka)hrC_@zX z-uCF|)xG>%Ez9b5KkB-klHxdy>pr@=I_IbO{@G+QX|-A@DF7fz`v4ogKfYXlPT73$ zZnxQC81{NS&-0A^Cok>8_=S776dFar3SS1dlwJ}-;wd|yK~V%7u3QTzj-i*VHck!JZy@i z06@Fl27uvk`1tELOi+5uHpN{%4mC|vl>*|p5Bl5QULK)@Q%cxo&*yV~2LLFFqG=iz g<$so;$($j|A0tw?Z32tLL;wH)07*qoM6N<$g2@6LDF6Tf delta 833 zcmV-H1HSz61l|Ua7Ya@Y0ssI2&@Zz(ks%j<0}x3>K~!jg?buCB(@+4w@%P$}4w}Xl z8XY4eTOtWl)Oj%`vIGtuCbwN+5DA)aAsQ152NOR|9=IBJg~W>|4k+287aFsOA(%L0 zCa^4MfRvf2gVAn-uJyn{G%x$;+t?28e_PYN{<8M9uY-nRfX0ZbH{frCf{IX35eh1Q zLP13+s0alWp`c<+d`Fh$<>h6Lk5G`Fzea=Yt5 zc|AY>bZTnqn(yeNrt3HQ`@@pta=Gv+u>1w3VHj7vm+xJ?#2z~-t3Og-tnACVIebb5 zmu(`EXr?Ik-;2ZD+P0BQ;yWs%bai!qy^DSNZ{zmvu9`nMX$pjJd~9stYy9}ew;Rcc zyLYNWso+{U>ekQ@+}b{4weIKh-&EB9h@z^V*m}k3beg9C00ssI005FCt*xy&91hcziYoSG z76c)kPG_@O{KK@gw3Iy2CEl4gH#hMe005rnZ8jSgkvXw z6gxUP>P(4!j{p3<&owi_V6gZ@ptdu}06^2>VF5x|`algdnF$3Ip`aoZR1HKy-)(h0 z4L}TkbVJW!QF?oOdwO1|>it|Urzk4U%1RL0MDetFirsEsT6zTlh{a;>KYTnaKnzR; zm3SOd5HM5~R-EN5TZ>UFy1TnmsZ^Q&85OTh6idFFk!3cj2BQ1{2512p>t!Jg00000 LNkvXXu0mjf9S4T8