Skip to content

Commit 042bd1f

Browse files
committedApr 22, 2019
backport for default map scale / default map units per mm in project for the case that GetLegendGraphic request does not pass parameters to calculate map unit sized symbol size
(cherry-picks of 7ef426b 10b5f08 3d7cc16 1c3cfd1 679b100 96f054e 7f7d910 755c8ff 1d6a7dd 8e62a89 c22effb fa8e5fa fab5254 27fc381)
1 parent 1782384 commit 042bd1f

File tree

18 files changed

+1151
-514
lines changed

18 files changed

+1151
-514
lines changed
 

‎python/server/auto_generated/qgsserverprojectutils.sip.in

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -161,6 +161,17 @@ Returns the maximum number of atlas features which can be printed in a request
161161
:param project: the QGIS project
162162

163163
:return: the number of atlas features
164+
%End
165+
166+
double wmsDefaultMapUnitsPerMm( const QgsProject &project );
167+
%Docstring
168+
Returns the default number of map units per millimeters in case of the scale is not given
169+
170+
:param project: the QGIS project
171+
172+
:return: the default number of map units per millimeter
173+
174+
.. versionadded:: 3.8
164175
%End
165176

166177
bool wmsUseLayerIds( const QgsProject &project );

‎src/app/qgsprojectproperties.cpp

Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -642,6 +642,25 @@ QgsProjectProperties::QgsProjectProperties( QgsMapCanvas *mapCanvas, QWidget *pa
642642

643643
mWMSMaxAtlasFeaturesSpinBox->setValue( QgsProject::instance()->readNumEntry( QStringLiteral( "WMSMaxAtlasFeatures" ), QStringLiteral( "/" ), 1 ) );
644644

645+
QString defaultValueToolTip = tr( "In case of no other information to evaluate the map unit sized symbols, it uses default scale (on projected CRS) or default map units per mm (on geographic CRS)." );
646+
mWMSDefaultMapUnitsPerMm = new QDoubleSpinBox();
647+
mWMSDefaultMapUnitsPerMm->setDecimals( 4 );
648+
mWMSDefaultMapUnitsPerMm->setSingleStep( 0.001 );
649+
mWMSDefaultMapUnitsPerMm->setValue( QgsProject::instance()->readDoubleEntry( QStringLiteral( "WMSDefaultMapUnitsPerMm" ), QStringLiteral( "/" ), 1 ) );
650+
mWMSDefaultMapUnitsPerMm->setToolTip( defaultValueToolTip );
651+
mWMSDefaultMapUnitScale = new QgsScaleWidget();
652+
mWMSDefaultMapUnitScale->setScale( QgsProject::instance()->readDoubleEntry( QStringLiteral( "WMSDefaultMapUnitsPerMm" ), QStringLiteral( "/" ), 1 ) * QgsUnitTypes::fromUnitToUnitFactor( QgsProject::instance()->crs().mapUnits(), QgsUnitTypes::DistanceMillimeters ) );
653+
mWMSDefaultMapUnitScale->setToolTip( defaultValueToolTip );
654+
if ( QgsProject::instance()->crs().isGeographic() )
655+
{
656+
mWMSDefaultMapUnitsPerMmLayout->addWidget( mWMSDefaultMapUnitsPerMm );
657+
}
658+
else
659+
{
660+
mWMSDefaultMapUnitsPerMmLayout->addWidget( mWMSDefaultMapUnitScale );
661+
mWMSDefaultMapUnitsPerMmLabel->setText( tr( "Default scale for legend" ) );
662+
}
663+
645664
mWMTSUrlLineEdit->setText( QgsProject::instance()->readEntry( QStringLiteral( "WMTSUrl" ), QStringLiteral( "/" ), QString() ) );
646665
mWMTSMinScaleLineEdit->setValue( QgsProject::instance()->readNumEntry( QStringLiteral( "WMTSMinScale" ), QStringLiteral( "/" ), 5000 ) );
647666

@@ -1298,6 +1317,18 @@ void QgsProjectProperties::apply()
12981317
int maxAtlasFeatures = mWMSMaxAtlasFeaturesSpinBox->value();
12991318
QgsProject::instance()->writeEntry( QStringLiteral( "WMSMaxAtlasFeatures" ), QStringLiteral( "/" ), maxAtlasFeatures );
13001319

1320+
double defaultMapUnitsPerMm;
1321+
if ( QgsProject::instance()->crs().isGeographic() )
1322+
{
1323+
defaultMapUnitsPerMm = mWMSDefaultMapUnitsPerMm->value();
1324+
}
1325+
else
1326+
{
1327+
defaultMapUnitsPerMm = mWMSDefaultMapUnitScale->scale() / QgsUnitTypes::fromUnitToUnitFactor( QgsProject::instance()->crs().mapUnits(), QgsUnitTypes::DistanceMillimeters );
1328+
}
1329+
1330+
QgsProject::instance()->writeEntry( QStringLiteral( "WMSDefaultMapUnitsPerMm" ), QStringLiteral( "/" ), defaultMapUnitsPerMm );
1331+
13011332
QgsProject::instance()->writeEntry( QStringLiteral( "WMTSUrl" ), QStringLiteral( "/" ), mWMTSUrlLineEdit->text() );
13021333
QgsProject::instance()->writeEntry( QStringLiteral( "WMTSMinScale" ), QStringLiteral( "/" ), mWMTSMinScaleLineEdit->value() );
13031334
bool wmtsProject = false;

‎src/app/qgsprojectproperties.h

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@
2222
#include "qgis.h"
2323
#include "qgsunittypes.h"
2424
#include "qgsguiutils.h"
25+
#include "qgsscalewidget.h"
2526
#include "qgshelp.h"
2627
#include "qgis_app.h"
2728

@@ -204,6 +205,9 @@ class APP_EXPORT QgsProjectProperties : public QgsOptionsDialogBase, private Ui:
204205
QgsMetadataWidget *mMetadataWidget = nullptr;
205206
QgsLayerCapabilitiesModel *mLayerCapabilitiesModel = nullptr;
206207

208+
QDoubleSpinBox *mWMSDefaultMapUnitsPerMm = nullptr;
209+
QgsScaleWidget *mWMSDefaultMapUnitScale = nullptr;
210+
207211
QgsCoordinateReferenceSystem mCrs;
208212

209213
void checkPageWidgetNameMap();

‎src/server/qgsserverprojectutils.cpp

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -116,6 +116,11 @@ int QgsServerProjectUtils::wmsMaxAtlasFeatures( const QgsProject &project )
116116
return project.readNumEntry( QStringLiteral( "WMSMaxAtlasFeatures" ), QStringLiteral( "/" ), 1 );
117117
}
118118

119+
double QgsServerProjectUtils::wmsDefaultMapUnitsPerMm( const QgsProject &project )
120+
{
121+
return project.readDoubleEntry( QStringLiteral( "WMSDefaultMapUnitsPerMm" ), QStringLiteral( "/" ), 1 );
122+
}
123+
119124
bool QgsServerProjectUtils::wmsInfoFormatSia2045( const QgsProject &project )
120125
{
121126
QString sia2045 = project.readEntry( QStringLiteral( "WMSInfoFormatSIA2045" ), QStringLiteral( "/" ), "" );

‎src/server/qgsserverprojectutils.h

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -154,6 +154,14 @@ namespace QgsServerProjectUtils
154154
*/
155155
SERVER_EXPORT int wmsMaxAtlasFeatures( const QgsProject &project );
156156

157+
/**
158+
* Returns the default number of map units per millimeters in case of the scale is not given
159+
* \param project the QGIS project
160+
* \returns the default number of map units per millimeter
161+
* \since QGIS 3.8
162+
*/
163+
SERVER_EXPORT double wmsDefaultMapUnitsPerMm( const QgsProject &project );
164+
157165
/**
158166
* Returns if layer ids are used as name in WMS.
159167
* \param project the QGIS project

‎src/server/services/wms/qgswmsrenderer.cpp

Lines changed: 13 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -183,15 +183,20 @@ namespace QgsWms
183183
std::unique_ptr<QImage> image;
184184
std::unique_ptr<QPainter> painter;
185185

186-
// getting scale from bbox
186+
// getting scale from bbox or default size
187187
if ( !mWmsParameters.bbox().isEmpty() )
188188
{
189189
QgsMapSettings mapSettings;
190-
image.reset( createImage( width(), height(), false ) );
191-
configureMapSettings( image.get(), mapSettings );
190+
std::unique_ptr<QImage> tmp( createImage( width(), height(), false ) );
191+
configureMapSettings( tmp.get(), mapSettings );
192192
legendSettings.setMapScale( mapSettings.scale() );
193193
legendSettings.setMapUnitsPerPixel( mapSettings.mapUnitsPerPixel() );
194194
}
195+
else
196+
{
197+
double defaultMapUnitsPerPixel = QgsServerProjectUtils::wmsDefaultMapUnitsPerMm( *mContext.project() ) / mContext.dotsPerMm();
198+
legendSettings.setMapUnitsPerPixel( defaultMapUnitsPerPixel );
199+
}
195200

196201
if ( !mWmsParameters.rule().isEmpty() )
197202
{
@@ -231,6 +236,11 @@ namespace QgsWms
231236
legendRendererNew.drawLegend( painter.get() );
232237
painter->end();
233238
}
239+
else
240+
{
241+
double defaultMapUnitsPerPixel = QgsServerProjectUtils::wmsDefaultMapUnitsPerMm( *mContext.project() ) / mContext.dotsPerMm();
242+
settings.setMapUnitsPerPixel( defaultMapUnitsPerPixel );
243+
}
234244

235245
rootGroup.clear();
236246
return image.release();

0 commit comments

Comments
 (0)
Please sign in to comment.