Skip to content

Commit 5f4c052

Browse files
committed
Update getFeatureInfo with render context
1 parent b702c30 commit 5f4c052

File tree

2 files changed

+29
-74
lines changed

2 files changed

+29
-74
lines changed

src/server/services/wms/qgswmsgetfeatureinfo.cpp

+14-15
Original file line numberDiff line numberDiff line change
@@ -24,26 +24,25 @@
2424

2525
namespace QgsWms
2626
{
27-
2827
void writeGetFeatureInfo( QgsServerInterface *serverIface, const QgsProject *project,
2928
const QString &version, const QgsServerRequest &request,
3029
QgsServerResponse &response )
3130
{
32-
Q_UNUSED( version );
33-
QgsServerRequest::Parameters params = request.parameters();
34-
35-
QgsWmsParameters wmsParameters( QUrlQuery( request.url() ) );
36-
QgsRenderer renderer( serverIface, project, wmsParameters );
37-
38-
QString infoFormat = params.value( QStringLiteral( "INFO_FORMAT" ), QStringLiteral( "text/plain" ) );
39-
31+
// get wms parameters from query
32+
QgsWmsParameters parameters( QUrlQuery( request.url() ) );
33+
34+
// prepare render context
35+
QgsWmsRenderContext context( project, serverIface );
36+
context.setFlag( QgsWmsRenderContext::AddQueryLayers );
37+
context.setFlag( QgsWmsRenderContext::UseFilter );
38+
context.setFlag( QgsWmsRenderContext::UseScaleDenominator );
39+
context.setFlag( QgsWmsRenderContext::SetAccessControl );
40+
context.setParameters( parameters );
41+
42+
const QString infoFormat = request.parameters().value( QStringLiteral( "INFO_FORMAT" ), QStringLiteral( "text/plain" ) );
4043
response.setHeader( QStringLiteral( "Content-Type" ), infoFormat + QStringLiteral( "; charset=utf-8" ) );
44+
45+
QgsRenderer renderer( context );
4146
response.write( renderer.getFeatureInfo( version ) );
4247
}
43-
44-
4548
} // namespace QgsWms
46-
47-
48-
49-

src/server/services/wms/qgswmsrenderer.cpp

+15-59
Original file line numberDiff line numberDiff line change
@@ -864,8 +864,7 @@ namespace QgsWms
864864
{
865865
// Verifying Mandatory parameters
866866
// The QUERY_LAYERS parameter is Mandatory
867-
QStringList queryLayers = mWmsParameters.queryLayersNickname();
868-
if ( queryLayers.isEmpty() )
867+
if ( mWmsParameters.queryLayersNickname().isEmpty() )
869868
{
870869
QString msg = QObject::tr( "QUERY_LAYERS parameter is required for GetFeatureInfo" );
871870
throw QgsBadRequestException( QStringLiteral( "LayerNotDefined" ), msg );
@@ -883,52 +882,29 @@ namespace QgsWms
883882
QStringLiteral( "I/J parameters are required for GetFeatureInfo" ) );
884883
}
885884

886-
QgsWmsParameters::Format infoFormat = mWmsParameters.infoFormat();
885+
const QgsWmsParameters::Format infoFormat = mWmsParameters.infoFormat();
887886
if ( infoFormat == QgsWmsParameters::Format::NONE )
888887
{
889888
throw QgsBadRequestException( QStringLiteral( "InvalidFormat" ),
890889
QStringLiteral( "Invalid INFO_FORMAT parameter" ) );
891890
}
892891

893-
// get layers parameters
894-
QList<QgsMapLayer *> layers;
895-
QList<QgsWmsParametersLayer> params = mWmsParameters.layersParameters();
896-
897-
// init layer restorer before doing anything
898-
std::unique_ptr<QgsLayerRestorer> restorer;
899-
restorer.reset( new QgsLayerRestorer( mNicknameLayers.values() ) );
900-
901-
// init stylized layers according to LAYERS/STYLES or SLD
902-
QString sld = mWmsParameters.sldBody();
903-
if ( !sld.isEmpty() )
904-
layers = sldStylizedLayers( sld );
905-
else
906-
layers = stylizedLayers( params );
907-
908-
// add QUERY_LAYERS to list of available layers for more flexibility
909-
for ( const QString &queryLayer : queryLayers )
910-
{
911-
if ( mNicknameLayers.contains( queryLayer )
912-
&& !layers.contains( mNicknameLayers[queryLayer] ) )
913-
{
914-
layers.append( mNicknameLayers[queryLayer] );
915-
}
916-
}
917-
918892
// create the mapSettings and the output image
919893
int imageWidth = mWmsParameters.widthAsInt();
920894
int imageHeight = mWmsParameters.heightAsInt();
921895

922-
// Provide default image width/height values if format is not image
923896
if ( !( imageWidth && imageHeight ) && ! mWmsParameters.infoFormatIsImage() )
924897
{
925898
imageWidth = 10;
926899
imageHeight = 10;
927900
}
928901

929-
QgsMapSettings mapSettings;
930902
std::unique_ptr<QImage> outputImage( createImage( imageWidth, imageHeight ) );
931903

904+
// init layer restorer before doing anything
905+
std::unique_ptr<QgsLayerRestorer> restorer;
906+
restorer.reset( new QgsLayerRestorer( mContext.layers() ) );
907+
932908
// The CRS parameter is considered as mandatory in configureMapSettings
933909
// but in the case of filter parameter, CRS parameter has not to be mandatory
934910
bool mandatoryCrsParam = true;
@@ -938,41 +914,21 @@ namespace QgsWms
938914
}
939915

940916
// configure map settings (background, DPI, ...)
917+
QgsMapSettings mapSettings;
941918
configureMapSettings( outputImage.get(), mapSettings, mandatoryCrsParam );
942919

943-
QgsMessageLog::logMessage( "mapSettings.destinationCrs(): " + mapSettings.destinationCrs().authid() );
944-
QgsMessageLog::logMessage( "mapSettings.extent(): " + mapSettings.extent().toString() );
945-
QgsMessageLog::logMessage( QStringLiteral( "mapSettings width = %1 height = %2" ).arg( mapSettings.outputSize().width() ).arg( mapSettings.outputSize().height() ) );
946-
QgsMessageLog::logMessage( QStringLiteral( "mapSettings.mapUnitsPerPixel() = %1" ).arg( mapSettings.mapUnitsPerPixel() ) );
947-
920+
// compute scale denominator
948921
QgsScaleCalculator scaleCalc( ( outputImage->logicalDpiX() + outputImage->logicalDpiY() ) / 2, mapSettings.destinationCrs().mapUnits() );
949-
QgsRectangle mapExtent = mapSettings.extent();
950-
double scaleDenominator = scaleCalc.calculate( mapExtent, outputImage->width() );
922+
const double scaleDenominator = scaleCalc.calculate( mWmsParameters.bboxAsRectangle(), outputImage->width() );
951923

952-
// remove unwanted layers (restricted layers, ...)
953-
removeUnwantedLayers( layers, scaleDenominator );
954-
// remove non identifiable layers
955-
//removeNonIdentifiableLayers( layers );
956-
957-
for ( QgsMapLayer *layer : layers )
958-
{
959-
checkLayerReadPermissions( layer );
960-
961-
for ( const QgsWmsParametersLayer &param : params )
962-
{
963-
if ( param.mNickname == layerNickname( *layer ) )
964-
{
965-
setLayerFilter( layer, param.mFilter );
966-
967-
break;
968-
}
969-
}
924+
// configure layers
925+
QgsWmsRenderContext context = mContext;
926+
context.setScaleDenominator( scaleDenominator );
970927

971-
setLayerAccessControlFilter( layer );
972-
}
928+
QList<QgsMapLayer *> layers = context.layersToRender();
929+
configureLayers( layers, &mapSettings );
973930

974-
// add layers to map settings (revert order for the rendering)
975-
std::reverse( layers.begin(), layers.end() );
931+
// add layers to map settings
976932
mapSettings.setLayers( layers );
977933

978934
QDomDocument result = featureInfoDocument( layers, mapSettings, outputImage.get(), version );

0 commit comments

Comments
 (0)