From 4b921d9ee9ff1c121a559fad2c8f172a6a0452f6 Mon Sep 17 00:00:00 2001 From: Nyall Dawson Date: Thu, 28 Jan 2021 16:57:41 +1000 Subject: [PATCH] Respect project "avoid tile artefacts" setting when rendering a project using WMS services Fixes #37679 --- .../auto_generated/qgsserverprojectutils.sip.in | 15 +++++++++++++++ src/server/qgsserverprojectutils.cpp | 5 +++++ src/server/qgsserverprojectutils.h | 14 ++++++++++++++ src/server/services/wms/qgswmsrendercontext.cpp | 5 +++++ src/server/services/wms/qgswmsrendercontext.h | 11 +++++++++++ src/server/services/wms/qgswmsrenderer.cpp | 2 ++ 6 files changed, 52 insertions(+) diff --git a/python/server/auto_generated/qgsserverprojectutils.sip.in b/python/server/auto_generated/qgsserverprojectutils.sip.in index 84f8b19361ff..64e080f9e82f 100644 --- a/python/server/auto_generated/qgsserverprojectutils.sip.in +++ b/python/server/auto_generated/qgsserverprojectutils.sip.in @@ -165,6 +165,21 @@ Returns the tile buffer in pixels for WMS images defined in a QGIS project. :return: tile buffer if defined in project, 0 otherwise. .. versionadded:: 3.10 +%End + + bool wmsRenderMapTiles( const QgsProject &project ); +%Docstring +Returns ``True`` if WMS requests should use the QgsMapSettings.RenderMapTile flag, +so that no visible artefacts are visible between adjacent tiles. + +This flag can slow down rendering considerably, so it is only used if the corresponding +setting is enabled in the project. + +:param project: the QGIS project + +:return: ``True`` if the flag should be used, or ``False`` if not. + +.. versionadded:: 3.18 %End int wmsMaxAtlasFeatures( const QgsProject &project ); diff --git a/src/server/qgsserverprojectutils.cpp b/src/server/qgsserverprojectutils.cpp index ae9e075de2f6..8b165a60bc94 100644 --- a/src/server/qgsserverprojectutils.cpp +++ b/src/server/qgsserverprojectutils.cpp @@ -389,3 +389,8 @@ QString QgsServerProjectUtils::wmtsServiceUrl( const QgsProject &project ) { return project.readEntry( QStringLiteral( "WMTSUrl" ), QStringLiteral( "/" ), "" ); } + +bool QgsServerProjectUtils::wmsRenderMapTiles( const QgsProject &project ) +{ + return project.readBoolEntry( QStringLiteral( "RenderMapTile" ), QStringLiteral( "/" ), false ); +} diff --git a/src/server/qgsserverprojectutils.h b/src/server/qgsserverprojectutils.h index 923b8a002cab..e82574a2d487 100644 --- a/src/server/qgsserverprojectutils.h +++ b/src/server/qgsserverprojectutils.h @@ -171,6 +171,20 @@ namespace QgsServerProjectUtils */ SERVER_EXPORT int wmsTileBuffer( const QgsProject &project ); + /** + * Returns TRUE if WMS requests should use the QgsMapSettings::RenderMapTile flag, + * so that no visible artefacts are visible between adjacent tiles. + * + * This flag can slow down rendering considerably, so it is only used if the corresponding + * setting is enabled in the project. + * + * \param project the QGIS project + * \returns TRUE if the flag should be used, or FALSE if not. + * + * \since QGIS 3.18 + */ + SERVER_EXPORT bool wmsRenderMapTiles( const QgsProject &project ); + /** * Returns the maximum number of atlas features which can be printed in a request * \param project the QGIS project diff --git a/src/server/services/wms/qgswmsrendercontext.cpp b/src/server/services/wms/qgswmsrendercontext.cpp index 5608bcec55e5..982054d0c28b 100644 --- a/src/server/services/wms/qgswmsrendercontext.cpp +++ b/src/server/services/wms/qgswmsrendercontext.cpp @@ -150,6 +150,11 @@ int QgsWmsRenderContext::tileBuffer() const return tileBuffer; } +bool QgsWmsRenderContext::renderMapTiles() const +{ + return QgsServerProjectUtils::wmsRenderMapTiles( *mProject ); +} + int QgsWmsRenderContext::precision() const { int precision = QgsServerProjectUtils::wmsFeatureInfoPrecision( *mProject ); diff --git a/src/server/services/wms/qgswmsrendercontext.h b/src/server/services/wms/qgswmsrendercontext.h index 93559f1dae7b..b14ee1d189a2 100644 --- a/src/server/services/wms/qgswmsrendercontext.h +++ b/src/server/services/wms/qgswmsrendercontext.h @@ -156,6 +156,17 @@ namespace QgsWms */ int tileBuffer() const; + /** + * Returns TRUE if WMS requests should use the QgsMapSettings::RenderMapTile flag, + * so that no visible artefacts are visible between adjacent tiles. + * + * This flag can slow down rendering considerably, so it is only used if the corresponding + * if explicitly opted in. + * + * \since QGIS 3.18 + */ + bool renderMapTiles() const; + /** * Returns the precision to use according to the current configuration. */ diff --git a/src/server/services/wms/qgswmsrenderer.cpp b/src/server/services/wms/qgswmsrenderer.cpp index 2a7badfdae4b..6c6f5badc1d0 100644 --- a/src/server/services/wms/qgswmsrenderer.cpp +++ b/src/server/services/wms/qgswmsrenderer.cpp @@ -1165,6 +1165,8 @@ namespace QgsWms // enable rendering optimization mapSettings.setFlag( QgsMapSettings::UseRenderingOptimization ); + mapSettings.setFlag( QgsMapSettings::RenderMapTile, mContext.renderMapTiles() ); + // set selection color mapSettings.setSelectionColor( mProject->selectionColor() ); }