67 #include "qgsattributeeditorcontainer.h" 
   68 #include "qgsattributeeditorelement.h" 
   69 #include "qgsattributeeditorfield.h" 
   73 #include <QStringList> 
   74 #include <QTemporaryFile> 
   77 #include <nlohmann/json.hpp> 
  102     : mContext( context )
 
  107     mWmsParameters.
dump();
 
  112     removeTemporaryLayers();
 
  118     std::unique_ptr<QgsWmsRestorer> restorer;
 
  130     std::unique_ptr<QImage> image;
 
  133     const QSize size( 
static_cast<int>( minSize.width() * dpmm ), 
static_cast<int>( minSize.height() * dpmm ) );
 
  134     image.reset( createImage( size ) );
 
  137     QPainter painter( image.get() );
 
  151     return image.release();
 
  157     std::unique_ptr<QgsWmsRestorer> restorer;
 
  166     std::unique_ptr<QImage> image( createImage( size ) );
 
  170     std::unique_ptr<QPainter> painter;
 
  171     painter.reset( 
new QPainter( image.get() ) );
 
  172     painter->setRenderHint( QPainter::Antialiasing, 
true );
 
  173     painter->scale( dpmm, dpmm );
 
  179     nodeModel.
drawSymbol( settings, &ctx, size.height() / dpmm );
 
  182     return image.release();
 
  188     std::unique_ptr<QgsWmsRestorer> restorer;
 
  204   void QgsRenderer::runHitTest( 
const QgsMapSettings &mapSettings, HitTest &hitTest )
 const 
  208     for ( 
const QString &
id : mapSettings.
layerIds() )
 
  225       runHitTestLayer( vl, usedSymbols, context );
 
  231     std::unique_ptr< QgsFeatureRenderer > r( vl->
renderer()->
clone() );
 
  233     r->startRender( context, vl->
fields() );
 
  241       if ( moreSymbolsPerFeature )
 
  243         for ( 
QgsSymbol *s : r->originalSymbolsForFeature( f, context ) )
 
  249     r->stopRender( context );
 
  258                                     QStringLiteral( 
"The requested map size is too large" ) );
 
  262     std::unique_ptr<QgsWmsRestorer> restorer;
 
  272     std::unique_ptr<QPainter> painter;
 
  273     std::unique_ptr<QImage> image( createImage( mContext.
mapSize() ) );
 
  276     configureMapSettings( image.get(), mapSettings );
 
  283     runHitTest( mapSettings, 
symbols );
 
  291     std::unique_ptr<QgsWmsRestorer> restorer;
 
  296     if ( templateName.isEmpty() )
 
  315                                     QStringLiteral( 
"The template has no pages" ) );
 
  318     std::unique_ptr<QgsPrintLayout> layout( sourceLayout->
clone() );
 
  322     QStringList atlasPk = mWmsParameters.
atlasPk();
 
  323     if ( !atlasPk.isEmpty() ) 
 
  325       atlas = layout->atlas();
 
  326       if ( !atlas || !atlas->
enabled() )
 
  330                                       QStringLiteral( 
"The template has no atlas enabled" ) );
 
  337                                       QStringLiteral( 
"The atlas has no coverage layer" ) );
 
  341       if ( atlasPk.size() == 1 && atlasPk.at( 0 ) == QLatin1String( 
"*" ) )
 
  345         if ( atlas->
count() > maxAtlasFeatures )
 
  348                                         QString( 
"The project configuration allows printing maximum %1 atlas features at a time" ).arg( maxAtlasFeatures ) );
 
  354         if ( pkIndexes.size() < 1 )
 
  356           throw QgsException( QStringLiteral( 
"An error occurred during the Atlas print" ) );
 
  358         QStringList pkAttributeNames;
 
  359         for ( 
int i = 0; i < pkIndexes.size(); ++i )
 
  361           pkAttributeNames.append( cLayer->
fields()[pkIndexes.at( i )].name() );
 
  364         int nAtlasFeatures = atlasPk.size() / pkIndexes.size();
 
  365         if ( nAtlasFeatures * pkIndexes.size() != atlasPk.size() ) 
 
  368                                         QStringLiteral( 
"Wrong number of ATLAS_PK parameters" ) );
 
  372         if ( nAtlasFeatures > maxAtlasFeatures )
 
  375                                         QString( 
"%1 atlas features have been requestet, but the project configuration only allows printing %2 atlas features at a time" )
 
  376                                         .arg( nAtlasFeatures ).arg( maxAtlasFeatures ) );
 
  379         QString filterString;
 
  380         int currentAtlasPk = 0;
 
  382         for ( 
int i = 0; i < nAtlasFeatures; ++i )
 
  386             filterString.append( 
" OR " );
 
  389           filterString.append( 
"( " );
 
  391           for ( 
int j = 0; j < pkIndexes.size(); ++j )
 
  395               filterString.append( 
" AND " );
 
  397             filterString.append( QString( 
"\"%1\" = %2" ).arg( pkAttributeNames.at( j ), atlasPk.at( currentAtlasPk ) ) );
 
  401           filterString.append( 
" )" );
 
  407         if ( !errorString.isEmpty() )
 
  409           throw QgsException( QStringLiteral( 
"An error occurred during the Atlas print" ) );
 
  421     std::unique_ptr<QImage> image( 
new QImage() );
 
  422     configureMapSettings( image.get(), mapSettings );
 
  428     configurePrintLayout( layout.get(), mapSettings, atlas );
 
  430 #ifdef HAVE_SERVER_PYTHON_PLUGINS 
  432     mContext.accessControl()->resolveFilterFeatures( mapSettings.
layers() );
 
  442     QTemporaryFile tempOutputFile( QDir::tempPath() +  
'/' + QStringLiteral( 
"XXXXXX.%1" ).arg( extension ) );
 
  443     if ( !tempOutputFile.open() )
 
  445       throw QgsException( QStringLiteral( 
"Could not open temporary file for the GetPrint request." ) );
 
  454       if ( !mWmsParameters.
dpi().isEmpty() )
 
  457         double dpi( mWmsParameters.
dpi().toDouble( &ok ) );
 
  459           exportSettings.
dpi = dpi;
 
  470           atlasSvgExport.
exportToSvg( tempOutputFile.fileName(), exportSettings );
 
  476         exporter.
exportToSvg( tempOutputFile.fileName(), exportSettings );
 
  485       double dpi( layout->renderContext().dpi( ) );
 
  486       if ( !mWmsParameters.
dpi().isEmpty() )
 
  489         double _dpi = mWmsParameters.
dpi().toDouble( &ok );
 
  493       exportSettings.
dpi = dpi;
 
  497       QgsLayoutSize layoutSize( layout->pageCollection()->page( 0 )->sizeWithUnits() );
 
  499       QgsLayoutMeasurement width( layout->convertFromLayoutUnits( layoutSize.
width(), QgsUnitTypes::LayoutUnit::LayoutMillimeters ) );
 
  500       QgsLayoutMeasurement height( layout->convertFromLayoutUnits( layoutSize.
height(), QgsUnitTypes::LayoutUnit::LayoutMillimeters ) );
 
  502       const QSize imageSize = QSize( 
static_cast<int>( width.
length() * dpi / 25.4 ), 
static_cast<int>( height.
length() * dpi / 25.4 ) );
 
  504       const QString paramWidth = mWmsParameters.
width();
 
  505       const QString paramHeight = mWmsParameters.
height();
 
  510       if ( !paramWidth.isEmpty() && !paramHeight.isEmpty() )
 
  512         exportSettings.
imageSize = QSize( paramWidth.toInt(), paramHeight.toInt() );
 
  514       else if ( !paramWidth.isEmpty() && paramHeight.isEmpty() )
 
  516         exportSettings.
imageSize = QSize( paramWidth.toInt(), 
static_cast<double>( paramWidth.toInt() ) / imageSize.width() * imageSize.height() );
 
  518       else if ( paramWidth.isEmpty() && !paramHeight.isEmpty() )
 
  520         exportSettings.
imageSize = QSize( 
static_cast<double>( paramHeight.toInt() ) / imageSize.height() * imageSize.width(), paramHeight.toInt() );
 
  528       exportSettings.
pages.append( 0 );
 
  536           atlasPngExport.
exportToImage( tempOutputFile.fileName(), exportSettings );
 
  540           throw QgsServiceException( QStringLiteral( 
"Bad request" ), QStringLiteral( 
"Atlas error: empty atlas." ), QString(), 400 );
 
  546         exporter.
exportToImage( tempOutputFile.fileName(), exportSettings );
 
  554       if ( !mWmsParameters.
dpi().isEmpty() )
 
  557         double dpi( mWmsParameters.
dpi().toDouble( &ok ) );
 
  559           exportSettings.
dpi = dpi;
 
  564       exportSettings.
rasterizeWholeImage = layout->customProperty( QStringLiteral( 
"rasterize" ), 
false ).toBool();
 
  570         exporter.
exportToPdf( atlas, tempOutputFile.fileName(), exportSettings, exportError );
 
  574         exporter.
exportToPdf( tempOutputFile.fileName(), exportSettings );
 
  585       handlePrintErrors( atlas->
layout() );
 
  589       handlePrintErrors( layout.get() );
 
  592     return tempOutputFile.readAll();
 
  600     QList<QgsLayoutItemMap *> maps;
 
  606     for ( 
const auto &map : std::as_const( maps ) )
 
  611       if ( !atlasPrint || !map->atlasDriven() ) 
 
  617           c->removeLayoutItem( map );
 
  635         if ( cMapParams.
mScale > 0 )
 
  637           map->setScale( 
static_cast<double>( cMapParams.
mScale ) );
 
  643           map->setMapRotation( cMapParams.
mRotation );
 
  647       if ( !map->keepLayerSet() )
 
  649         QList<QgsMapLayer *> layerSet;
 
  650         if ( cMapParams.
mLayers.isEmpty() )
 
  652           layerSet = mapSettings.
layers();
 
  656           for ( 
auto layer : cMapParams.
mLayers )
 
  660               QList<QgsMapLayer *> layersFromGroup;
 
  662               const QList<QgsMapLayer *> cLayersFromGroup = mContext.
layersFromGroup( layer.mNickname );
 
  663               for ( 
QgsMapLayer *layerFromGroup : cLayersFromGroup )
 
  666                 if ( ! layerFromGroup )
 
  671                 layersFromGroup.push_front( layerFromGroup );
 
  674               if ( !layersFromGroup.isEmpty() )
 
  676                 layerSet.append( layersFromGroup );
 
  688               setLayerStyle( mlayer, layer.mStyle );
 
  692           std::reverse( layerSet.begin(), layerSet.end() );
 
  698         if ( map->followVisibilityPreset() )
 
  700           if ( layerSet.isEmpty() )
 
  704             layerSet = map->layersToRender( &ex );
 
  706           map->setFollowVisibilityPreset( 
false );
 
  710         const QList< QgsMapLayer *> highlights = highlightLayers( cMapParams.
mHighlightLayers );
 
  711         for ( 
const auto &hl : std::as_const( highlights ) )
 
  713           layerSet.prepend( hl );
 
  716         map->setLayers( layerSet );
 
  717         map->setKeepLayerSet( 
true );
 
  723         map->grid()->setIntervalX( 
static_cast<double>( cMapParams.
mGridX ) );
 
  724         map->grid()->setIntervalY( 
static_cast<double>( cMapParams.
mGridY ) );
 
  729     QList<QgsLayoutItemLabel *> labels;
 
  731     for ( 
const auto &label : std::as_const( labels ) )
 
  734       const QString labelId = label->
id();
 
  735       const QString labelParam = mWmsParameters.
layoutParameter( labelId, ok );
 
  740       if ( labelParam.isEmpty() )
 
  744         c->removeItem( label );
 
  749       label->setText( labelParam );
 
  753     QList<QgsLayoutItemHtml *> htmls;
 
  755     for ( 
const auto &html : std::as_const( htmls ) )
 
  757       if ( html->frameCount() == 0 )
 
  762       const QString htmlId = htmlFrame->
id();
 
  775         c->removeMultiFrame( html );
 
  781       html->setUrl( newUrl );
 
  787     QList<QgsLayoutItemLegend *> legends;
 
  789     for ( 
const auto &legend : std::as_const( legends ) )
 
  791       if ( legend->autoUpdateModel() )
 
  801         legend->setAutoUpdateModel( 
false );
 
  805         QStringList layerSet;
 
  806         const QList<QgsMapLayer *> layerList( map->
layers() );
 
  807         for ( 
const auto &layer : layerList )
 
  808           layerSet << layer->id();
 
  820         for ( 
const auto &layerId : layerIds )
 
  827           if ( !layerSet.contains( layerId ) )
 
  829             qobject_cast<QgsLayerTreeGroup *>( nodeLayer->
parent() )->removeChildNode( nodeLayer );
 
  836               qobject_cast<QgsLayerTreeGroup *>( nodeLayer->
parent() )->removeChildNode( nodeLayer );
 
  852                                     QStringLiteral( 
"The requested map size is too large" ) );
 
  856     std::unique_ptr<QgsWmsRestorer> restorer;
 
  867     std::unique_ptr<QPainter> painter;
 
  868     std::unique_ptr<QImage> image( createImage( mContext.
mapSize() ) );
 
  871     configureMapSettings( image.get(), mapSettings );
 
  877     painter.reset( layersRendering( mapSettings, *image ) );
 
  880     annotationsRendering( painter.get(), mapSettings );
 
  886     QImage *scaledImage = scaleImage( image.get() );
 
  888       image.reset( scaledImage );
 
  891     return image.release();
 
  897     std::unique_ptr<QgsWmsRestorer> restorer;
 
  906     QList< QgsDxfExport::DxfLayer > dxfLayers;
 
  918       int layerAttribute = -1;
 
  919       if ( attributes.size() > layerIdx )
 
  930     QString 
crs = mWmsParameters.
crs();
 
  931     if ( 
crs.compare( QStringLiteral( 
"CRS:84" ), Qt::CaseInsensitive ) == 0 )
 
  933       crs = QStringLiteral( 
"EPSG:4326" );
 
  936     else if ( 
crs.isEmpty() )
 
  938       crs = QStringLiteral( 
"EPSG:4326" );
 
  972     std::unique_ptr<QgsDxfExport> dxf = std::make_unique<QgsDxfExport>();
 
  973     dxf->setExtent( mapExtent );
 
  974     dxf->setDestinationCrs( outputCRS );
 
  975     dxf->addLayers( dxfLayers );
 
  977     dxf->setSymbologyExport( mWmsParameters.
dxfMode() );
 
  978     if ( mWmsParameters.
dxfFormatOptions().contains( QgsWmsParameters::DxfFormatOption::SCALE ) )
 
  980       dxf->setSymbologyScale( mWmsParameters.
dxfScale() );
 
  983     dxf->setForce2d( mWmsParameters.
isForce2D() );
 
  984     QgsDxfExport::Flags flags;
 
  985     if ( mWmsParameters.
noMText() )
 
  986       flags.setFlag( QgsDxfExport::Flag::FlagNoMText );
 
  988     dxf->setFlags( flags );
 
  996     if ( i < 0 || i > mapSettings.
outputSize().width() )
 
 1004     if ( j < 0 || j > mapSettings.
outputSize().height() )
 
 1029     const bool ijDefined = !mWmsParameters.
i().isEmpty() && !mWmsParameters.
j().isEmpty();
 
 1030     const bool xyDefined = !mWmsParameters.
x().isEmpty() && !mWmsParameters.
y().isEmpty();
 
 1031     const bool filtersDefined = !mWmsParameters.
filters().isEmpty();
 
 1032     const bool filterGeomDefined = !mWmsParameters.
filterGeom().isEmpty();
 
 1034     if ( !ijDefined && !xyDefined && !filtersDefined && !filterGeomDefined )
 
 1038       if ( mWmsParameters.
j().isEmpty() )
 
 1045     if ( infoFormat == QgsWmsParameters::Format::NONE )
 
 1052     std::unique_ptr<QImage> outputImage( createImage( mContext.
mapSize() ) );
 
 1055     std::unique_ptr<QgsWmsRestorer> restorer;
 
 1060     bool mandatoryCrsParam = 
true;
 
 1061     if ( filtersDefined && !ijDefined && !xyDefined && mWmsParameters.
crs().isEmpty() )
 
 1063       mandatoryCrsParam = 
false;
 
 1069     configureMapSettings( outputImage.get(), mapSettings, mandatoryCrsParam );
 
 1085 #ifdef HAVE_SERVER_PYTHON_PLUGINS 
 1086     mContext.accessControl()->resolveFilterFeatures( mapSettings.
layers() );
 
 1089     QDomDocument result = featureInfoDocument( layers, mapSettings, outputImage.get(), version );
 
 1093     if ( infoFormat == QgsWmsParameters::Format::TEXT )
 
 1094       ba = convertFeatureInfoToText( result );
 
 1095     else if ( infoFormat == QgsWmsParameters::Format::HTML )
 
 1096       ba = convertFeatureInfoToHtml( result );
 
 1097     else if ( infoFormat == QgsWmsParameters::Format::JSON )
 
 1098       ba = convertFeatureInfoToJson( layers, result );
 
 1100       ba = result.toByteArray();
 
 1105   QImage *QgsRenderer::createImage( 
const QSize &size )
 const 
 1107     std::unique_ptr<QImage> image;
 
 1115       image = std::make_unique<QImage>( size, QImage::Format_ARGB32_Premultiplied );
 
 1120       image = std::make_unique<QImage>( size, QImage::Format_RGB32 );
 
 1125     if ( image->isNull() )
 
 1127       throw QgsException( QStringLiteral( 
"createImage: image could not be created, check for out of memory conditions" ) );
 
 1130     const int dpm = 
static_cast<int>( mContext.
dotsPerMm() * 1000.0 );
 
 1131     image->setDotsPerMeterX( dpm );
 
 1132     image->setDotsPerMeterY( dpm );
 
 1134     return image.release();
 
 1137   void QgsRenderer::configureMapSettings( 
const QPaintDevice *paintDevice, 
QgsMapSettings &mapSettings, 
bool mandatoryCrsParam )
 const 
 1141       throw QgsException( QStringLiteral( 
"configureMapSettings: no paint device" ) );
 
 1144     mapSettings.
setOutputSize( QSize( paintDevice->width(), paintDevice->height() ) );
 
 1151     if ( !mWmsParameters.
bbox().isEmpty() && mapExtent.
isEmpty() )
 
 1157     QString 
crs = mWmsParameters.
crs();
 
 1158     if ( 
crs.compare( 
"CRS:84", Qt::CaseInsensitive ) == 0 )
 
 1160       crs = QString( 
"EPSG:4326" );
 
 1163     else if ( 
crs.isEmpty() && !mandatoryCrsParam )
 
 1165       crs = QString( 
"EPSG:4326" );
 
 1175       QgsWmsParameter parameter;
 
 1217     else if ( backgroundColor.isValid() )
 
 1239   QDomDocument QgsRenderer::featureInfoDocument( QList<QgsMapLayer *> &layers, 
const QgsMapSettings &mapSettings,
 
 1240       const QImage *outputImage, 
const QString &version )
 const 
 1244     bool ijDefined = ( !mWmsParameters.
i().isEmpty() && !mWmsParameters.
j().isEmpty() );
 
 1246     bool xyDefined = ( !mWmsParameters.
x().isEmpty() && !mWmsParameters.
y().isEmpty() );
 
 1248     bool filtersDefined = !mWmsParameters.
filters().isEmpty();
 
 1250     bool filterGeomDefined = !mWmsParameters.
filterGeom().isEmpty();
 
 1253     if ( featureCount < 1 )
 
 1258     int i = mWmsParameters.
iAsInt();
 
 1259     int j = mWmsParameters.
jAsInt();
 
 1260     if ( xyDefined && !ijDefined )
 
 1262       i = mWmsParameters.
xAsInt();
 
 1263       j = mWmsParameters.
yAsInt();
 
 1267     if ( ( i != -1 && j != -1 && width != 0 && height != 0 ) && ( width != outputImage->width() || height != outputImage->height() ) )
 
 1269       i *= ( outputImage->width() /  
static_cast<double>( width ) );
 
 1270       j *= ( outputImage->height() / 
static_cast<double>( height ) );
 
 1274     std::unique_ptr<QgsRectangle> featuresRect;
 
 1275     std::unique_ptr<QgsGeometry> filterGeom;
 
 1276     std::unique_ptr<QgsPointXY> infoPoint;
 
 1278     if ( i != -1 && j != -1 )
 
 1281       infoPointToMapCoordinates( i, j, infoPoint.get(), mapSettings );
 
 1283     else if ( filtersDefined )
 
 1287     else if ( filterGeomDefined )
 
 1292     QDomDocument result;
 
 1294     QDomElement getFeatureInfoElement;
 
 1296     if ( infoFormat == QgsWmsParameters::Format::GML )
 
 1298       getFeatureInfoElement = result.createElement( QStringLiteral( 
"wfs:FeatureCollection" ) );
 
 1299       getFeatureInfoElement.setAttribute( QStringLiteral( 
"xmlns:wfs" ), QStringLiteral( 
"http://www.opengis.net/wfs" ) );
 
 1300       getFeatureInfoElement.setAttribute( QStringLiteral( 
"xmlns:ogc" ), QStringLiteral( 
"http://www.opengis.net/ogc" ) );
 
 1301       getFeatureInfoElement.setAttribute( QStringLiteral( 
"xmlns:gml" ), QStringLiteral( 
"http://www.opengis.net/gml" ) );
 
 1302       getFeatureInfoElement.setAttribute( QStringLiteral( 
"xmlns:ows" ), QStringLiteral( 
"http://www.opengis.net/ows" ) );
 
 1303       getFeatureInfoElement.setAttribute( QStringLiteral( 
"xmlns:xlink" ), QStringLiteral( 
"http://www.w3.org/1999/xlink" ) );
 
 1304       getFeatureInfoElement.setAttribute( QStringLiteral( 
"xmlns:qgs" ), QStringLiteral( 
"http://qgis.org/gml" ) );
 
 1305       getFeatureInfoElement.setAttribute( QStringLiteral( 
"xmlns:xsi" ), QStringLiteral( 
"http://www.w3.org/2001/XMLSchema-instance" ) );
 
 1306       getFeatureInfoElement.setAttribute( QStringLiteral( 
"xsi:schemaLocation" ), QStringLiteral( 
"http://www.opengis.net/wfs http://schemas.opengis.net/wfs/1.0.0/wfs.xsd http://qgis.org/gml" ) );
 
 1311       if ( featureInfoElemName.isEmpty() )
 
 1313         featureInfoElemName = QStringLiteral( 
"GetFeatureInfoResponse" );
 
 1316       if ( featureInfoElemNs.isEmpty() )
 
 1318         getFeatureInfoElement = result.createElement( featureInfoElemName );
 
 1322         getFeatureInfoElement = result.createElementNS( featureInfoElemNs, featureInfoElemName );
 
 1326       if ( !featureInfoSchema.isEmpty() )
 
 1328         getFeatureInfoElement.setAttribute( QStringLiteral( 
"xmlns:xsi" ), QStringLiteral( 
"http://www.w3.org/2001/XMLSchema-instance" ) );
 
 1329         getFeatureInfoElement.setAttribute( QStringLiteral( 
"xsi:schemaLocation" ), featureInfoSchema );
 
 1332     result.appendChild( getFeatureInfoElement );
 
 1342     for ( 
const QString &queryLayer : queryLayers )
 
 1344       bool validLayer = 
false;
 
 1345       bool queryableLayer = 
true;
 
 1346       for ( 
QgsMapLayer *layer : std::as_const( layers ) )
 
 1352           if ( !queryableLayer )
 
 1357           QDomElement layerElement;
 
 1358           if ( infoFormat == QgsWmsParameters::Format::GML )
 
 1360             layerElement = getFeatureInfoElement;
 
 1364             layerElement = result.createElement( QStringLiteral( 
"Layer" ) );
 
 1365             QString layerName = queryLayer;
 
 1368             QHash<QString, QString>::const_iterator layerAliasIt = layerAliasMap.constFind( layerName );
 
 1369             if ( layerAliasIt != layerAliasMap.constEnd() )
 
 1371               layerName = layerAliasIt.value();
 
 1374             layerElement.setAttribute( QStringLiteral( 
"name" ), layerName );
 
 1375             getFeatureInfoElement.appendChild( layerElement );
 
 1378               layerElement.setAttribute( QStringLiteral( 
"id" ), layer->id() );
 
 1384             QgsVectorLayer *vectorLayer = qobject_cast<QgsVectorLayer *>( layer );
 
 1387               ( void )featureInfoFromVectorLayer( vectorLayer, infoPoint.get(), featureCount, result, layerElement, mapSettings, renderContext, version, featuresRect.get(), filterGeom.get() );
 
 1393             QgsRasterLayer *rasterLayer = qobject_cast<QgsRasterLayer *>( layer );
 
 1402             QgsPointXY layerInfoPoint = mapSettings.mapToLayerCoordinates( layer, *( infoPoint.get() ) );
 
 1407             if ( infoFormat == QgsWmsParameters::Format::GML )
 
 1409               layerElement = result.createElement( QStringLiteral( 
"gml:featureMember" ) );
 
 1410               getFeatureInfoElement.appendChild( layerElement );
 
 1413             ( void )featureInfoFromRasterLayer( rasterLayer, mapSettings, &layerInfoPoint, result, layerElement, version );
 
 1421         param.mValue = queryLayer;
 
 1425       else if ( ( validLayer && !queryableLayer ) || ( !validLayer && mContext.
isValidGroup( queryLayer ) ) )
 
 1428         param.mValue = queryLayer;
 
 1430         bool hasGroupAndQueryable { 
false };
 
 1435           for ( 
const QString &ql : constNicks )
 
 1439               const QList<QgsMapLayer *> constLayers { mContext.
layerGroups()[ql] };
 
 1442                 if ( ( ! ml->shortName().isEmpty() &&  ml->shortName() == queryLayer ) || ( ml->name() == queryLayer ) )
 
 1448                   hasGroupAndQueryable = 
true;
 
 1457         if ( ! hasGroupAndQueryable )
 
 1467       if ( infoFormat == QgsWmsParameters::Format::GML )
 
 1469         QDomElement bBoxElem = result.createElement( QStringLiteral( 
"gml:boundedBy" ) );
 
 1470         QDomElement boxElem;
 
 1472         if ( gmlVersion < 3 )
 
 1484           boxElem.setAttribute( QStringLiteral( 
"srsName" ), 
crs.
authid() );
 
 1486         bBoxElem.appendChild( boxElem );
 
 1487         getFeatureInfoElement.insertBefore( bBoxElem, QDomNode() ); 
 
 1491         QDomElement bBoxElem = result.createElement( QStringLiteral( 
"BoundingBox" ) );
 
 1492         bBoxElem.setAttribute( QStringLiteral( 
"CRS" ), mapSettings.destinationCrs().authid() );
 
 1493         bBoxElem.setAttribute( QStringLiteral( 
"minx" ), 
qgsDoubleToString( featuresRect->xMinimum(), 8 ) );
 
 1494         bBoxElem.setAttribute( QStringLiteral( 
"maxx" ), 
qgsDoubleToString( featuresRect->xMaximum(), 8 ) );
 
 1495         bBoxElem.setAttribute( QStringLiteral( 
"miny" ), 
qgsDoubleToString( featuresRect->yMinimum(), 8 ) );
 
 1496         bBoxElem.setAttribute( QStringLiteral( 
"maxy" ), 
qgsDoubleToString( featuresRect->yMaximum(), 8 ) );
 
 1497         getFeatureInfoElement.insertBefore( bBoxElem, QDomNode() ); 
 
 1501     if ( sia2045 && infoFormat == QgsWmsParameters::Format::XML )
 
 1503       convertFeatureInfoToSia2045( result );
 
 1509   bool QgsRenderer::featureInfoFromVectorLayer( 
QgsVectorLayer *layer,
 
 1512       QDomDocument &infoDocument,
 
 1513       QDomElement &layerElement,
 
 1516       const QString &version,
 
 1528     std::unique_ptr<QgsGeometry> layerFilterGeom;
 
 1531       layerFilterGeom.reset( 
new QgsGeometry( *filterGeom ) );
 
 1545       searchRect = featureInfoSearchRect( layer, mapSettings, renderContext, *infoPoint );
 
 1547     else if ( layerFilterGeom )
 
 1549       searchRect = layerFilterGeom->boundingBox();
 
 1551     else if ( !mWmsParameters.
bbox().isEmpty() )
 
 1553       searchRect = layerRect;
 
 1560     int featureCounter = 0;
 
 1579     if ( layerFilterGeom )
 
 1581       fReq.
setFilterExpression( QString( 
"intersects( $geometry, geom_from_wkt('%1') )" ).arg( layerFilterGeom->asWkt() ) );
 
 1586 #ifdef HAVE_SERVER_PYTHON_PLUGINS 
 1587     mContext.accessControl()->filterFeatures( layer, fReq );
 
 1589     QStringList attributes;
 
 1594     attributes = mContext.accessControl()->layerAttributes( layer, attributes );
 
 1599     std::unique_ptr< QgsFeatureRenderer > r2( layer->
renderer() ? layer->
renderer()->
clone() : 
nullptr );
 
 1602       r2->startRender( renderContext, layer->
fields() );
 
 1605     bool featureBBoxInitialized = 
false;
 
 1614       if ( featureCounter > nFeatures )
 
 1629         bool render = r2->willRenderFeature( feature, renderContext );
 
 1642           if ( !featureBBoxInitialized && featureBBox->
isEmpty() )
 
 1645             featureBBoxInitialized = 
true;
 
 1660       if ( mWmsParameters.
infoFormat() == QgsWmsParameters::Format::GML )
 
 1665         QDomElement elem = createFeatureGML(
 
 1667 #ifdef HAVE_SERVER_PYTHON_PLUGINS
 
 1671         QDomElement featureMemberElem = infoDocument.createElement( QStringLiteral( 
"gml:featureMember" ) );
 
 1672         featureMemberElem.appendChild( elem );
 
 1673         layerElement.appendChild( featureMemberElem );
 
 1678         QDomElement featureElement = infoDocument.createElement( QStringLiteral( 
"Feature" ) );
 
 1680         layerElement.appendChild( featureElement );
 
 1686           writeAttributesTabLayout( editConfig, layer, fields, featureAttributes, infoDocument, featureElement, renderContext
 
 1687 #ifdef HAVE_SERVER_PYTHON_PLUGINS
 
 1694           for ( 
int i = 0; i < featureAttributes.count(); ++i )
 
 1696             writeVectorLayerAttribute( i, layer, fields, featureAttributes, infoDocument, featureElement, renderContext
 
 1697 #ifdef HAVE_SERVER_PYTHON_PLUGINS
 
 1706         if ( !mapTip.isEmpty() && mWmsParameters.
withMapTip() )
 
 1708           QDomElement maptipElem = infoDocument.createElement( QStringLiteral( 
"Attribute" ) );
 
 1709           maptipElem.setAttribute( QStringLiteral( 
"name" ), QStringLiteral( 
"maptip" ) );
 
 1711           featureElement.appendChild( maptipElem );
 
 1718           QDomElement bBoxElem = infoDocument.createElement( QStringLiteral( 
"BoundingBox" ) );
 
 1719           bBoxElem.setAttribute( version == QLatin1String( 
"1.1.1" ) ? 
"SRS" : 
"CRS", 
outputCrs.
authid() );
 
 1724           featureElement.appendChild( bBoxElem );
 
 1740             if ( segmentizeWktGeometry )
 
 1748                   geom.
set( segmentizedGeom );
 
 1752             QDomElement geometryElement = infoDocument.createElement( QStringLiteral( 
"Attribute" ) );
 
 1753             geometryElement.setAttribute( QStringLiteral( 
"name" ), QStringLiteral( 
"geometry" ) );
 
 1754             geometryElement.setAttribute( QStringLiteral( 
"value" ), geom.
asWkt( mContext.
precision() ) );
 
 1755             geometryElement.setAttribute( QStringLiteral( 
"type" ), QStringLiteral( 
"derived" ) );
 
 1756             featureElement.appendChild( geometryElement );
 
 1763       r2->stopRender( renderContext );
 
 1769   void QgsRenderer::writeAttributesTabGroup( 
const QgsAttributeEditorElement *group, 
QgsVectorLayer *layer, 
const QgsFields &fields, 
QgsAttributes &featureAttributes, QDomDocument &doc, QDomElement &parentElem, 
QgsRenderContext &renderContext, QStringList *attributes )
 const 
 1771     const QgsAttributeEditorContainer *container = 
dynamic_cast<const QgsAttributeEditorContainer *
>( group );
 
 1774       QString groupName = container->name();
 
 1775       QDomElement nameElem;
 
 1777       if ( !groupName.isEmpty() )
 
 1779         nameElem = doc.createElement( groupName );
 
 1780         parentElem.appendChild( nameElem );
 
 1783       const QList<QgsAttributeEditorElement *> children =  container->children();
 
 1784       for ( 
const QgsAttributeEditorElement *child : children )
 
 1786         if ( child->type() == QgsAttributeEditorElement::AeTypeContainer )
 
 1788           writeAttributesTabGroup( child, layer, fields, featureAttributes, doc, nameElem.isNull() ? parentElem : nameElem, renderContext );
 
 1790         else if ( child->type() == QgsAttributeEditorElement::AeTypeField )
 
 1792           const QgsAttributeEditorField *editorField = 
dynamic_cast<const QgsAttributeEditorField *
>( child );
 
 1795             writeVectorLayerAttribute( editorField->idx(), layer, fields, featureAttributes, doc, nameElem.isNull() ? parentElem : nameElem, renderContext, attributes );
 
 1802   void QgsRenderer::writeAttributesTabLayout( QgsEditFormConfig &config, 
QgsVectorLayer *layer, 
const QgsFields &fields, 
QgsAttributes &featureAttributes, QDomDocument &doc, QDomElement &featureElem, 
QgsRenderContext &renderContext, QStringList *attributes )
 const 
 1804     QgsAttributeEditorContainer *editorContainer = config.invisibleRootContainer();
 
 1805     if ( !editorContainer )
 
 1810     writeAttributesTabGroup( editorContainer, layer, fields, featureAttributes, doc, featureElem, renderContext, attributes );
 
 1813   void QgsRenderer::writeVectorLayerAttribute( 
int attributeIndex,  
QgsVectorLayer *layer, 
const QgsFields &fields, 
QgsAttributes &featureAttributes, QDomDocument &doc, QDomElement &featureElem, 
QgsRenderContext &renderContext, QStringList *attributes )
 const 
 1815 #ifndef HAVE_SERVER_PYTHON_PLUGINS 
 1816     Q_UNUSED( attributes );
 
 1829 #ifdef HAVE_SERVER_PYTHON_PLUGINS 
 1831     if ( attributes && !attributes->contains( fields.
at( attributeIndex ).
name() ) )
 
 1838     QDomElement attributeElement = doc.createElement( QStringLiteral( 
"Attribute" ) );
 
 1839     attributeElement.setAttribute( QStringLiteral( 
"name" ), attributeName );
 
 1841     attributeElement.setAttribute( QStringLiteral( 
"value" ),
 
 1843                                      replaceValueMapAndRelation(
 
 1844                                        layer, attributeIndex,
 
 1845                                        featureAttributes[attributeIndex] ),
 
 1848     featureElem.appendChild( attributeElement );
 
 1851   bool QgsRenderer::featureInfoFromRasterLayer( 
QgsRasterLayer *layer,
 
 1854       QDomDocument &infoDocument,
 
 1855       QDomElement &layerElement,
 
 1856       const QString &version )
 const 
 1875       ? QgsRaster::IdentifyFormat::IdentifyFormatFeature
 
 1876       : QgsRaster::IdentifyFormat::IdentifyFormatValue );
 
 1888                                       .arg( layer->
name() ) );
 
 1897     if ( !identifyResult.
isValid() )
 
 1900     QMap<int, QVariant> attributes = identifyResult.
results();
 
 1902     if ( mWmsParameters.
infoFormat() == QgsWmsParameters::Format::GML )
 
 1914         for ( 
auto it = attributes.constBegin(); it != attributes.constEnd(); ++it )
 
 1917           feature.
setAttribute( index++, QString::number( it.value().toDouble() ) );
 
 1920         QDomElement elem = createFeatureGML(
 
 1921                              &feature, 
nullptr, infoDocument, layerCrs, mapSettings, 
typeName, 
false, gmlVersion, 
nullptr );
 
 1922         layerElement.appendChild( elem );
 
 1926         const auto values = identifyResult.
results();
 
 1927         for ( 
auto it = values.constBegin(); it != values.constEnd(); ++it )
 
 1929           QVariant value = it.value();
 
 1930           if ( value.type() == QVariant::Bool && !value.toBool() )
 
 1936           if ( value.type() == QVariant::String )
 
 1947             for ( 
const QgsFeature &feature : storeFeatures )
 
 1949               QDomElement elem = createFeatureGML(
 
 1950                                    &feature, 
nullptr, infoDocument, layerCrs, mapSettings, 
typeName, 
false, gmlVersion, 
nullptr );
 
 1951               layerElement.appendChild( elem );
 
 1961         for ( 
auto it = attributes.constBegin(); it != attributes.constEnd(); ++it )
 
 1963           QDomElement attributeElement = infoDocument.createElement( QStringLiteral( 
"Attribute" ) );
 
 1964           attributeElement.setAttribute( QStringLiteral( 
"name" ), layer->
bandName( it.key() ) );
 
 1967           if ( ! it.value().isNull() )
 
 1969             value  = QString::number( it.value().toDouble() );
 
 1972           attributeElement.setAttribute( QStringLiteral( 
"value" ), value );
 
 1973           layerElement.appendChild( attributeElement );
 
 1978         const auto values = identifyResult.
results();
 
 1979         for ( 
auto it = values.constBegin(); it != values.constEnd(); ++it )
 
 1981           QVariant value = it.value();
 
 1982           if ( value.type() == QVariant::Bool && !value.toBool() )
 
 1988           if ( value.type() == QVariant::String )
 
 1998             for ( 
const QgsFeature &feature : storeFeatures )
 
 2000               for ( 
const auto &fld : feature.
fields() )
 
 2002                 const auto val { feature.
attribute( fld.name() )};
 
 2003                 if ( val.isValid() )
 
 2005                   QDomElement attributeElement = infoDocument.createElement( QStringLiteral( 
"Attribute" ) );
 
 2006                   attributeElement.setAttribute( QStringLiteral( 
"name" ), fld.name() );
 
 2007                   attributeElement.setAttribute( QStringLiteral( 
"value" ), val.toString() );
 
 2008                   layerElement.appendChild( attributeElement );
 
 2019   bool QgsRenderer::testFilterStringSafety( 
const QString &filter )
 const 
 2022     if ( filter.contains( QLatin1String( 
";" ) ) )
 
 2027 #if QT_VERSION < QT_VERSION_CHECK(5, 15, 0) 
 2028     QStringList tokens = filter.split( 
' ', QString::SkipEmptyParts );
 
 2030     QStringList tokens = filter.split( 
' ', Qt::SkipEmptyParts );
 
 2032     groupStringList( tokens, QStringLiteral( 
"'" ) );
 
 2033     groupStringList( tokens, QStringLiteral( 
"\"" ) );
 
 2035     for ( 
auto tokenIt = tokens.constBegin() ; tokenIt != tokens.constEnd(); ++tokenIt )
 
 2038       if ( tokenIt->compare( QLatin1String( 
"," ) ) == 0
 
 2039            || tokenIt->compare( QLatin1String( 
"(" ) ) == 0
 
 2040            || tokenIt->compare( QLatin1String( 
")" ) ) == 0
 
 2041            || tokenIt->compare( QLatin1String( 
"=" ) ) == 0
 
 2042            || tokenIt->compare( QLatin1String( 
"!=" ) ) == 0
 
 2043            || tokenIt->compare( QLatin1String( 
"<" ) ) == 0
 
 2044            || tokenIt->compare( QLatin1String( 
"<=" ) ) == 0
 
 2045            || tokenIt->compare( QLatin1String( 
">" ) ) == 0
 
 2046            || tokenIt->compare( QLatin1String( 
">=" ) ) == 0
 
 2047            || tokenIt->compare( QLatin1String( 
"%" ) ) == 0
 
 2048            || tokenIt->compare( QLatin1String( 
"IS" ), Qt::CaseInsensitive ) == 0
 
 2049            || tokenIt->compare( QLatin1String( 
"NOT" ), Qt::CaseInsensitive ) == 0
 
 2050            || tokenIt->compare( QLatin1String( 
"NULL" ), Qt::CaseInsensitive ) == 0
 
 2051            || tokenIt->compare( QLatin1String( 
"AND" ), Qt::CaseInsensitive ) == 0
 
 2052            || tokenIt->compare( QLatin1String( 
"OR" ), Qt::CaseInsensitive ) == 0
 
 2053            || tokenIt->compare( QLatin1String( 
"IN" ), Qt::CaseInsensitive ) == 0
 
 2054            || tokenIt->compare( QLatin1String( 
"LIKE" ), Qt::CaseInsensitive ) == 0
 
 2055            || tokenIt->compare( QLatin1String( 
"ILIKE" ), Qt::CaseInsensitive ) == 0
 
 2056            || tokenIt->compare( QLatin1String( 
"DMETAPHONE" ), Qt::CaseInsensitive ) == 0
 
 2057            || tokenIt->compare( QLatin1String( 
"SOUNDEX" ), Qt::CaseInsensitive ) == 0 )
 
 2064       tokenIt->toDouble( &isNumeric );
 
 2073       if ( *tokenIt == QLatin1String( 
"''" ) )
 
 2079       if ( tokenIt->size() > 2
 
 2080            && ( *tokenIt )[0] == QChar( 
'\'' )
 
 2081            && ( *tokenIt )[tokenIt->size() - 1] == QChar( 
'\'' )
 
 2082            && ( *tokenIt )[1] != QChar( 
'\'' )
 
 2083            && ( *tokenIt )[tokenIt->size() - 2] != QChar( 
'\'' ) )
 
 2089       if ( tokenIt->size() > 2
 
 2090            && ( *tokenIt )[0] == QChar( 
'"' )
 
 2091            && ( *tokenIt )[tokenIt->size() - 1] == QChar( 
'"' )
 
 2092            && ( *tokenIt )[1] != QChar( 
'"' )
 
 2093            && ( *tokenIt )[tokenIt->size() - 2] != QChar( 
'"' ) )
 
 2104   void QgsRenderer::groupStringList( QStringList &list, 
const QString &groupString )
 
 2107     bool groupActive = 
false;
 
 2108     int startGroup = -1;
 
 2109     QString concatString;
 
 2111     for ( 
int i = 0; i < list.size(); ++i )
 
 2113       QString &
str = list[i];
 
 2114       if ( 
str.startsWith( groupString ) )
 
 2118         concatString.clear();
 
 2123         if ( i != startGroup )
 
 2125           concatString.append( 
" " );
 
 2127         concatString.append( 
str );
 
 2130       if ( 
str.endsWith( groupString ) )
 
 2133         groupActive = 
false;
 
 2135         if ( startGroup != -1 )
 
 2137           list[startGroup] = concatString;
 
 2138           for ( 
int j = startGroup + 1; j <= endGroup; ++j )
 
 2140             list.removeAt( startGroup + 1 );
 
 2145         concatString.clear();
 
 2151   void QgsRenderer::convertFeatureInfoToSia2045( QDomDocument &doc )
 const 
 2153     QDomDocument SIAInfoDoc;
 
 2154     QDomElement infoDocElement = doc.documentElement();
 
 2155     QDomElement SIAInfoDocElement = SIAInfoDoc.importNode( infoDocElement, 
false ).toElement();
 
 2156     SIAInfoDoc.appendChild( SIAInfoDocElement );
 
 2158     QString currentAttributeName;
 
 2159     QString currentAttributeValue;
 
 2160     QDomElement currentAttributeElem;
 
 2161     QString currentLayerName;
 
 2162     QDomElement currentLayerElem;
 
 2163     QDomNodeList layerNodeList = infoDocElement.elementsByTagName( QStringLiteral( 
"Layer" ) );
 
 2164     for ( 
int i = 0; i < layerNodeList.size(); ++i )
 
 2166       currentLayerElem = layerNodeList.at( i ).toElement();
 
 2167       currentLayerName = currentLayerElem.attribute( QStringLiteral( 
"name" ) );
 
 2169       QDomElement currentFeatureElem;
 
 2171       QDomNodeList featureList = currentLayerElem.elementsByTagName( QStringLiteral( 
"Feature" ) );
 
 2172       if ( featureList.isEmpty() )
 
 2175         QDomNodeList attributeList = currentLayerElem.elementsByTagName( QStringLiteral( 
"Attribute" ) );
 
 2176         QDomElement rasterLayerElem;
 
 2177         if ( !attributeList.isEmpty() )
 
 2179           rasterLayerElem = SIAInfoDoc.createElement( currentLayerName );
 
 2181         for ( 
int j = 0; j < attributeList.size(); ++j )
 
 2183           currentAttributeElem = attributeList.at( j ).toElement();
 
 2184           currentAttributeName = currentAttributeElem.attribute( QStringLiteral( 
"name" ) );
 
 2185           currentAttributeValue = currentAttributeElem.attribute( QStringLiteral( 
"value" ) );
 
 2186           QDomElement outAttributeElem = SIAInfoDoc.createElement( currentAttributeName );
 
 2187           QDomText outAttributeText = SIAInfoDoc.createTextNode( currentAttributeValue );
 
 2188           outAttributeElem.appendChild( outAttributeText );
 
 2189           rasterLayerElem.appendChild( outAttributeElem );
 
 2191         if ( !attributeList.isEmpty() )
 
 2193           SIAInfoDocElement.appendChild( rasterLayerElem );
 
 2199         QSet<QString> layerPropertyAttributes;
 
 2200         QString currentLayerId = currentLayerElem.attribute( QStringLiteral( 
"id" ) );
 
 2201         if ( !currentLayerId.isEmpty() )
 
 2206             QString WMSPropertyAttributesString = currentLayer->
customProperty( QStringLiteral( 
"WMSPropertyAttributes" ) ).toString();
 
 2207             if ( !WMSPropertyAttributesString.isEmpty() )
 
 2209               QStringList propertyList = WMSPropertyAttributesString.split( QStringLiteral( 
"//" ) );
 
 2210               for ( 
auto propertyIt = propertyList.constBegin() ; propertyIt != propertyList.constEnd(); ++propertyIt )
 
 2212                 layerPropertyAttributes.insert( *propertyIt );
 
 2218         QDomElement propertyRefChild; 
 
 2219         for ( 
int j = 0; j < featureList.size(); ++j )
 
 2221           QDomElement SIAFeatureElem = SIAInfoDoc.createElement( currentLayerName );
 
 2222           currentFeatureElem = featureList.at( j ).toElement();
 
 2223           QDomNodeList attributeList = currentFeatureElem.elementsByTagName( QStringLiteral( 
"Attribute" ) );
 
 2225           for ( 
int k = 0; k < attributeList.size(); ++k )
 
 2227             currentAttributeElem = attributeList.at( k ).toElement();
 
 2228             currentAttributeName = currentAttributeElem.attribute( QStringLiteral( 
"name" ) );
 
 2229             currentAttributeValue = currentAttributeElem.attribute( QStringLiteral( 
"value" ) );
 
 2230             if ( layerPropertyAttributes.contains( currentAttributeName ) )
 
 2232               QDomElement propertyElem = SIAInfoDoc.createElement( QStringLiteral( 
"property" ) );
 
 2233               QDomElement identifierElem = SIAInfoDoc.createElement( QStringLiteral( 
"identifier" ) );
 
 2234               QDomText identifierText = SIAInfoDoc.createTextNode( currentAttributeName );
 
 2235               identifierElem.appendChild( identifierText );
 
 2236               QDomElement valueElem = SIAInfoDoc.createElement( QStringLiteral( 
"value" ) );
 
 2237               QDomText valueText = SIAInfoDoc.createTextNode( currentAttributeValue );
 
 2238               valueElem.appendChild( valueText );
 
 2239               propertyElem.appendChild( identifierElem );
 
 2240               propertyElem.appendChild( valueElem );
 
 2241               if ( propertyRefChild.isNull() )
 
 2243                 SIAFeatureElem.insertBefore( propertyElem, QDomNode() );
 
 2244                 propertyRefChild = propertyElem;
 
 2248                 SIAFeatureElem.insertAfter( propertyElem, propertyRefChild );
 
 2253               QDomElement SIAAttributeElem = SIAInfoDoc.createElement( currentAttributeName );
 
 2254               QDomText SIAAttributeText = SIAInfoDoc.createTextNode( currentAttributeValue );
 
 2255               SIAAttributeElem.appendChild( SIAAttributeText );
 
 2256               SIAFeatureElem.appendChild( SIAAttributeElem );
 
 2259           SIAInfoDocElement.appendChild( SIAFeatureElem );
 
 2266   QByteArray QgsRenderer::convertFeatureInfoToHtml( 
const QDomDocument &doc )
 const 
 2268     QString featureInfoString;
 
 2271     featureInfoString.append( 
"<HEAD>\n" );
 
 2272     featureInfoString.append( 
"<TITLE> GetFeatureInfo results </TITLE>\n" );
 
 2273     featureInfoString.append( 
"<META http-equiv=\"Content-Type\" content=\"text/html;charset=utf-8\"/>\n" );
 
 2274     featureInfoString.append( 
"</HEAD>\n" );
 
 2277     featureInfoString.append( 
"<BODY>\n" );
 
 2279     QDomNodeList layerList = doc.elementsByTagName( QStringLiteral( 
"Layer" ) );
 
 2282     for ( 
int i = 0; i < layerList.size(); ++i )
 
 2284       QDomElement layerElem = layerList.at( i ).toElement();
 
 2286       featureInfoString.append( 
"<TABLE border=1 width=100%>\n" );
 
 2287       featureInfoString.append( 
"<TR><TH width=25%>Layer</TH><TD>" + layerElem.attribute( QStringLiteral( 
"name" ) ) + 
"</TD></TR>\n" );
 
 2288       featureInfoString.append( 
"</BR>" );
 
 2291       QDomNodeList featureNodeList = layerElem.elementsByTagName( QStringLiteral( 
"Feature" ) );
 
 2292       QDomElement currentFeatureElement;
 
 2294       if ( !featureNodeList.isEmpty() ) 
 
 2296         for ( 
int j = 0; j < featureNodeList.size(); ++j )
 
 2298           QDomElement featureElement = featureNodeList.at( j ).toElement();
 
 2299           featureInfoString.append( 
"<TABLE border=1 width=100%>\n" );
 
 2300           featureInfoString.append( 
"<TR><TH>Feature</TH><TD>" + featureElement.attribute( QStringLiteral( 
"id" ) ) +
 
 2304           QDomNodeList attributeNodeList = featureElement.elementsByTagName( QStringLiteral( 
"Attribute" ) );
 
 2305           for ( 
int k = 0; k < attributeNodeList.size(); ++k )
 
 2307             QDomElement attributeElement = attributeNodeList.at( k ).toElement();
 
 2308             featureInfoString.append( 
"<TR><TH>" + attributeElement.attribute( QStringLiteral( 
"name" ) ) +
 
 2309                                       "</TH><TD>" + attributeElement.attribute( QStringLiteral( 
"value" ) ) + 
"</TD></TR>\n" );
 
 2312           featureInfoString.append( 
"</TABLE>\n</BR>\n" );
 
 2317         QDomNodeList attributeNodeList = layerElem.elementsByTagName( QStringLiteral( 
"Attribute" ) );
 
 2318         for ( 
int j = 0; j < attributeNodeList.size(); ++j )
 
 2320           QDomElement attributeElement = attributeNodeList.at( j ).toElement();
 
 2321           QString value = attributeElement.attribute( QStringLiteral( 
"value" ) );
 
 2322           if ( value.isEmpty() )
 
 2324             value = QStringLiteral( 
"no data" );
 
 2326           featureInfoString.append( 
"<TR><TH>" + attributeElement.attribute( QStringLiteral( 
"name" ) ) +
 
 2327                                     "</TH><TD>" + value + 
"</TD></TR>\n" );
 
 2331       featureInfoString.append( 
"</TABLE>\n<BR></BR>\n" );
 
 2335     featureInfoString.append( 
"</BODY>\n" );
 
 2337     return featureInfoString.toUtf8();
 
 2340   QByteArray QgsRenderer::convertFeatureInfoToText( 
const QDomDocument &doc )
 const 
 2342     QString featureInfoString;
 
 2345     featureInfoString.append( 
"GetFeatureInfo results\n" );
 
 2346     featureInfoString.append( 
"\n" );
 
 2348     QDomNodeList layerList = doc.elementsByTagName( QStringLiteral( 
"Layer" ) );
 
 2351     for ( 
int i = 0; i < layerList.size(); ++i )
 
 2353       QDomElement layerElem = layerList.at( i ).toElement();
 
 2355       featureInfoString.append( 
"Layer '" + layerElem.attribute( QStringLiteral( 
"name" ) ) + 
"'\n" );
 
 2358       QDomNodeList featureNodeList = layerElem.elementsByTagName( QStringLiteral( 
"Feature" ) );
 
 2359       QDomElement currentFeatureElement;
 
 2361       if ( !featureNodeList.isEmpty() ) 
 
 2363         for ( 
int j = 0; j < featureNodeList.size(); ++j )
 
 2365           QDomElement featureElement = featureNodeList.at( j ).toElement();
 
 2366           featureInfoString.append( 
"Feature " + featureElement.attribute( QStringLiteral( 
"id" ) ) + 
"\n" );
 
 2369           QDomNodeList attributeNodeList = featureElement.elementsByTagName( QStringLiteral( 
"Attribute" ) );
 
 2370           for ( 
int k = 0; k < attributeNodeList.size(); ++k )
 
 2372             QDomElement attributeElement = attributeNodeList.at( k ).toElement();
 
 2373             featureInfoString.append( attributeElement.attribute( QStringLiteral( 
"name" ) ) + 
" = '" +
 
 2374                                       attributeElement.attribute( QStringLiteral( 
"value" ) ) + 
"'\n" );
 
 2380         QDomNodeList attributeNodeList = layerElem.elementsByTagName( QStringLiteral( 
"Attribute" ) );
 
 2381         for ( 
int j = 0; j < attributeNodeList.size(); ++j )
 
 2383           QDomElement attributeElement = attributeNodeList.at( j ).toElement();
 
 2384           QString value = attributeElement.attribute( QStringLiteral( 
"value" ) );
 
 2385           if ( value.isEmpty() )
 
 2387             value = QStringLiteral( 
"no data" );
 
 2389           featureInfoString.append( attributeElement.attribute( QStringLiteral( 
"name" ) ) + 
" = '" +
 
 2394       featureInfoString.append( 
"\n" );
 
 2397     return featureInfoString.toUtf8();
 
 2400   QByteArray QgsRenderer::convertFeatureInfoToJson( 
const QList<QgsMapLayer *> &layers, 
const QDomDocument &doc )
 const 
 2404       { 
"type", 
"FeatureCollection" },
 
 2405       { 
"features", json::array() },
 
 2409     const QDomNodeList layerList = doc.elementsByTagName( QStringLiteral( 
"Layer" ) );
 
 2410     for ( 
int i = 0; i < layerList.size(); ++i )
 
 2412       const QDomElement layerElem = layerList.at( i ).toElement();
 
 2413       const QString layerName = layerElem.attribute( QStringLiteral( 
"name" ) );
 
 2418         if ( mContext.
layerNickname( *l ).compare( layerName ) == 0 )
 
 2434         const QDomNodeList featuresNode = layerElem.elementsByTagName( QStringLiteral( 
"Feature" ) );
 
 2435         if ( featuresNode.isEmpty() )
 
 2438         QMap<QgsFeatureId, QString> fidMap;
 
 2440         for ( 
int j = 0; j < featuresNode.size(); ++j )
 
 2442           const QDomElement featureNode = featuresNode.at( j ).toElement();
 
 2443           const QString fid = featureNode.attribute( QStringLiteral( 
"id" ) );
 
 2446           if ( expression.isEmpty() )
 
 2448             feature = vl->
getFeature( fid.toLongLong() );
 
 2453             request.setFlags( QgsFeatureRequest::Flag::NoGeometry );
 
 2457           fidMap.insert( feature.
id(), fid );
 
 2462             const QDomNodeList attrs = featureNode.elementsByTagName( 
"Attribute" );
 
 2463             for ( 
int k = 0; k < attrs.count(); k++ )
 
 2465               const QDomElement elm = attrs.at( k ).toElement();
 
 2466               if ( elm.attribute( QStringLiteral( 
"name" ) ).compare( 
"geometry" ) == 0 )
 
 2468                 wkt = elm.attribute( 
"value" );
 
 2473             if ( ! wkt.isEmpty() )
 
 2479           features << feature;
 
 2482           if ( !attributes.isEmpty() )
 
 2485           const QDomNodeList attributesNode = featureNode.elementsByTagName( QStringLiteral( 
"Attribute" ) );
 
 2486           for ( 
int k = 0; k < attributesNode.size(); ++k )
 
 2488             const QDomElement attributeElement = attributesNode.at( k ).toElement();
 
 2489             const QString fieldName = attributeElement.
attribute( QStringLiteral( 
"name" ) );
 
 2491             attributes << feature.fieldNameIndex( fieldName );
 
 2497         exporter.setAttributeDisplayName( 
true );
 
 2498         exporter.setAttributes( attributes );
 
 2499         exporter.setIncludeGeometry( withGeometry );
 
 2500         exporter.setTransformGeometries( 
false );
 
 2502         for ( 
const auto &feature : std::as_const( features ) )
 
 2504           const QString 
id = QStringLiteral( 
"%1.%2" ).arg( layerName ).arg( fidMap.value( feature.id() ) );
 
 2505           json[
"features"].push_back( exporter.exportFeatureToJsonObject( feature, QVariantMap(), 
id ) );
 
 2510         auto properties = json::object();
 
 2511         const QDomNodeList attributesNode = layerElem.elementsByTagName( QStringLiteral( 
"Attribute" ) );
 
 2512         for ( 
int j = 0; j < attributesNode.size(); ++j )
 
 2514           const QDomElement attrElmt = attributesNode.at( j ).toElement();
 
 2515           const QString name = attrElmt.attribute( QStringLiteral( 
"name" ) );
 
 2517           QString value = attrElmt.attribute( QStringLiteral( 
"value" ) );
 
 2518           if ( value.isEmpty() )
 
 2520             value = QStringLiteral( 
"null" );
 
 2523           properties[name.toStdString()] = value.toStdString();
 
 2526         json[
"features"].push_back(
 
 2528           {
"type", 
"Feature" },
 
 2529           {
"id", layerName.toStdString() },
 
 2530           {
"properties", properties }
 
 2536     return QByteArray::fromStdString( json.dump( 2 ) );
 
 2538     return QByteArray::fromStdString( json.dump() );
 
 2542   QDomElement QgsRenderer::createFeatureGML(
 
 2551     QStringList *attributes )
 const 
 2554     QDomElement typeNameElement = doc.createElement( 
"qgs:" + 
typeName  );
 
 2561     typeNameElement.setAttribute( QStringLiteral( 
"fid" ), QStringLiteral( 
"%1.%2" ).arg( 
typeName, fid ) );
 
 2564     if ( layer && layer->
crs() != 
crs )
 
 2597       QDomElement bbElem = doc.createElement( QStringLiteral( 
"gml:boundedBy" ) );
 
 2598       QDomElement boxElem;
 
 2610         boxElem.setAttribute( QStringLiteral( 
"srsName" ), 
crs.
authid() );
 
 2612       bbElem.appendChild( boxElem );
 
 2613       typeNameElement.appendChild( bbElem );
 
 2625       QDomElement geomElem = doc.createElement( QStringLiteral( 
"qgs:geometry" ) );
 
 2626       QDomElement gmlElem;
 
 2636       if ( !gmlElem.isNull() )
 
 2640           gmlElem.setAttribute( QStringLiteral( 
"srsName" ), 
crs.
authid() );
 
 2642         geomElem.appendChild( gmlElem );
 
 2643         typeNameElement.appendChild( geomElem );
 
 2650     for ( 
int i = 0; i < fields.
count(); ++i )
 
 2652       QString attributeName = fields.
at( i ).
name();
 
 2659       if ( attributes && !attributes->contains( attributeName ) )
 
 2664       QDomElement fieldElem = doc.createElement( 
"qgs:" + attributeName.replace( 
' ', 
'_' ) );
 
 2665       QString fieldTextString = featureAttributes.at( i ).toString();
 
 2670       QDomText fieldText = doc.createTextNode( fieldTextString );
 
 2671       fieldElem.appendChild( fieldText );
 
 2672       typeNameElement.appendChild( fieldElem );
 
 2680       if ( !mapTip.isEmpty() && mWmsParameters.
withMapTip() )
 
 2683         QDomElement fieldElem = doc.createElement( QStringLiteral( 
"qgs:maptip" ) );
 
 2684         QDomText maptipText = doc.createTextNode( fieldTextString );
 
 2685         fieldElem.appendChild( maptipText );
 
 2686         typeNameElement.appendChild( fieldElem );
 
 2690     return typeNameElement;
 
 2693   QString QgsRenderer::replaceValueMapAndRelation( 
QgsVectorLayer *vl, 
int idx, 
const QVariant &attributeVal )
 
 2697     QString value( fieldFormatter->
representValue( vl, idx, setup.
config(), QVariant(), attributeVal ) );
 
 2699     if ( setup.
config().value( QStringLiteral( 
"AllowMulti" ) ).toBool() && value.startsWith( QLatin1Char( 
'{' ) ) && value.endsWith( QLatin1Char( 
'}' ) ) )
 
 2701       value = value.mid( 1, value.size() - 2 );
 
 2713     double mapUnitTolerance = 0.0;
 
 2723         mapUnitTolerance = mapSettings.
extent().
width() / 400.0;
 
 2735         mapUnitTolerance = mapSettings.
extent().
width() / 200.0;
 
 2747         mapUnitTolerance = mapSettings.
extent().
width() / 100.0;
 
 2751     QgsRectangle mapRectangle( infoPoint.
x() - mapUnitTolerance, infoPoint.
y() - mapUnitTolerance,
 
 2752                                infoPoint.
x() + mapUnitTolerance, infoPoint.
y() + mapUnitTolerance );
 
 2756   QList<QgsMapLayer *> QgsRenderer::highlightLayers( QList<QgsWmsParametersHighlightLayer> params )
 
 2758     QList<QgsMapLayer *> highlightLayers;
 
 2761     QString 
crs = mWmsParameters.
crs();
 
 2762     for ( 
const QgsWmsParametersHighlightLayer ¶m : params )
 
 2765       QDomDocument sldDoc;
 
 2769       if ( !sldDoc.setContent( param.mSld, 
true, &errorMsg, &errorLine, &errorColumn ) )
 
 2776                                    QStringLiteral( 
"Server" ), Qgis::MessageLevel::Warning );
 
 2781       std::unique_ptr<QgsFeatureRenderer> renderer;
 
 2782       QDomElement el = sldDoc.documentElement();
 
 2793       if ( ! param.mLabel.isEmpty() )
 
 2795         url += 
"&field=label:string";
 
 2800       std::unique_ptr<QgsVectorLayer> layer = std::make_unique<QgsVectorLayer>( url, param.mName, QLatin1String( 
"memory" ), options );
 
 2801       if ( !layer->isValid() )
 
 2808       if ( ! param.mLabel.isEmpty() )
 
 2810         fet.setAttribute( 0, param.mLabel );
 
 2819         switch ( param.mGeom.type() )
 
 2824             palSettings.
dist = 2; 
 
 2835             QVariant x( pt.
x() );
 
 2839             QVariant y( pt.
y() );
 
 2843             QVariant hali( 
"Center" );
 
 2847             QVariant vali( 
"Half" );
 
 2854             palSettings.
dist = 2;
 
 2863         if ( param.mColor.isValid() )
 
 2865           textFormat.
setColor( param.mColor );
 
 2868         if ( param.mSize > 0 )
 
 2870           textFormat.
setSize( param.mSize );
 
 2878         if ( ! param.mFont.isEmpty() )
 
 2880           textFormat.
setFont( param.mFont );
 
 2883         if ( param.mBufferColor.isValid() )
 
 2885           bufferSettings.
setColor( param.mBufferColor );
 
 2888         if ( param.mBufferSize > 0 )
 
 2891           bufferSettings.
setSize( 
static_cast<double>( param.mBufferSize ) );
 
 2898         layer->setLabeling( simpleLabeling );
 
 2899         layer->setLabelsEnabled( 
true );
 
 2901       fet.setGeometry( param.mGeom );
 
 2905       layer->setRenderer( renderer.release() );
 
 2908       if ( layer->isValid() )
 
 2910         highlightLayers.append( layer.release() );
 
 2914     mTemporaryLayers.append( highlightLayers );
 
 2915     return highlightLayers;
 
 2918   void QgsRenderer::removeTemporaryLayers()
 
 2920     qDeleteAll( mTemporaryLayers );
 
 2921     mTemporaryLayers.clear();
 
 2924   QPainter *QgsRenderer::layersRendering( 
const QgsMapSettings &mapSettings, QImage &image )
 const 
 2926     QPainter *painter = 
nullptr;
 
 2930 #ifdef HAVE_SERVER_PYTHON_PLUGINS 
 2931     mContext.accessControl()->resolveFilterFeatures( mapSettings.
layers() );
 
 2935     renderJob.render( mapSettings, &image );
 
 2936     painter = renderJob.takePainter();
 
 2938     if ( !renderJob.errors().isEmpty() )
 
 2940       QString layerWMSName;
 
 2941       QString firstErrorLayerId = renderJob.errors().at( 0 ).layerID;
 
 2948       throw QgsException( QStringLiteral( 
"Map rendering error in layer '%1'" ).arg( layerWMSName ) );
 
 2954   void QgsRenderer::setLayerOpacity( 
QgsMapLayer *layer, 
int opacity )
 const 
 2956     if ( opacity >= 0 && opacity <= 255 )
 
 2958       switch ( layer->
type() )
 
 2971           rasterRenderer->
setOpacity( opacity / 255. );
 
 2985   void QgsRenderer::setLayerFilter( 
QgsMapLayer *layer, 
const QList<QgsWmsParametersFilter> &filters )
 
 2989       QgsVectorLayer *filteredLayer = qobject_cast<QgsVectorLayer *>( layer );
 
 2990       QStringList expList;
 
 2991       for ( 
const QgsWmsParametersFilter &filter : filters )
 
 2996           QDomDocument filterXml;
 
 2998           if ( !filterXml.setContent( filter.mFilter, 
true, &errorMsg ) )
 
 3001                                           QStringLiteral( 
"Filter string rejected. Error message: %1. The XML string was: %2" ).arg( errorMsg, filter.mFilter ) );
 
 3003           QDomElement filterElem = filterXml.firstChildElement();
 
 3008             expList << filterExp->dump();
 
 3014           if ( !testFilterStringSafety( filter.mFilter ) )
 
 3016             throw QgsSecurityException( QStringLiteral( 
"The filter string %1" 
 3017                                         " has been rejected because of security reasons." 
 3018                                         " Note: Text strings have to be enclosed in single or double quotes." 
 3019                                         " A space between each word / special character is mandatory." 
 3020                                         " Allowed Keywords and special characters are " 
 3021                                         " IS,NOT,NULL,AND,OR,IN,=,<,>=,>,>=,!=,',',(,),DMETAPHONE,SOUNDEX." 
 3022                                         " Not allowed are semicolons in the filter expression." ).arg(
 
 3026           QString newSubsetString = filter.mFilter;
 
 3029             newSubsetString.prepend( 
") AND (" );
 
 3030             newSubsetString.append( 
")" );
 
 3031             newSubsetString.prepend( filteredLayer->
subsetString() );
 
 3032             newSubsetString.prepend( 
"(" );
 
 3038       expList.append( dimensionFilter( filteredLayer ) );
 
 3042       if ( expList.size() == 1 )
 
 3046       else if ( expList.size() > 1 )
 
 3048         exp = QStringLiteral( 
"( %1 )" ).arg( expList.join( QLatin1String( 
" ) AND ( " ) ) );
 
 3050       if ( !exp.isEmpty() )
 
 3052         std::unique_ptr<QgsExpression> expression( 
new QgsExpression( exp ) );
 
 3055           mFeatureFilter.
setFilter( filteredLayer, *expression );
 
 3061   QStringList QgsRenderer::dimensionFilter( 
QgsVectorLayer *layer )
 const 
 3063     QStringList expList;
 
 3066     if ( wmsDims.isEmpty() )
 
 3076       if ( fieldIndex == -1 )
 
 3081       int endFieldIndex = -1;
 
 3082       if ( !dim.endFieldName.isEmpty() )
 
 3084         endFieldIndex = layer->
fields().
indexOf( dim.endFieldName );
 
 3085         if ( endFieldIndex == -1 )
 
 3091       if ( !dimParamValues.contains( dim.name.toUpper() ) )
 
 3101           defValue = dim.referenceValue;
 
 3106           QSet<QVariant> uniqueValues = layer->
uniqueValues( fieldIndex );
 
 3107           if ( endFieldIndex != -1 )
 
 3109             uniqueValues.unite( layer->
uniqueValues( endFieldIndex ) );
 
 3112           QList<QVariant> values = qgis::setToList( uniqueValues );
 
 3113           std::sort( values.begin(), values.end() );
 
 3116             defValue = values.first();
 
 3120             defValue = values.last();
 
 3124         if ( endFieldIndex == -1 )
 
 3130           QStringList expElems;
 
 3135           expList << expElems.join( 
' ' );
 
 3143         QString dimParamValue = dimParamValues[dim.name.toUpper()];
 
 3145         QStringList dimExplist;
 
 3147         QStringList dimValues = dimParamValue.split( 
',' );
 
 3148         for ( 
int i = 0; i < dimValues.size(); ++i )
 
 3150           QString dimValue = dimValues[i];
 
 3152           if ( dimValue.size() > 1 )
 
 3154             dimValue = dimValue.trimmed();
 
 3157           if ( dimValue.contains( 
'/' ) )
 
 3159             QStringList rangeValues = dimValue.split( 
'/' );
 
 3161             if ( rangeValues.size() != 2 )
 
 3166             QVariant rangeMin = QVariant( rangeValues[0] );
 
 3167             QVariant rangeMax = QVariant( rangeValues[1] );
 
 3178             QStringList expElems;
 
 3179             if ( endFieldIndex == -1 )
 
 3199                        << QStringLiteral( 
")" );
 
 3201             dimExplist << expElems.join( 
' ' );
 
 3205             QVariant dimVariant = QVariant( dimValue );
 
 3211             if ( endFieldIndex == -1 )
 
 3220               QStringList expElems;
 
 3225               dimExplist << expElems.join( 
' ' );
 
 3230         if ( dimExplist.size() == 1 )
 
 3232           expList << dimExplist;
 
 3234         else if ( dimExplist.size() > 1 )
 
 3236           expList << QStringLiteral( 
"( %1 )" ).arg( dimExplist.join( QLatin1String( 
" ) OR ( " ) ) );
 
 3243   void QgsRenderer::setLayerSelection( 
QgsMapLayer *layer, 
const QStringList &fids )
 const 
 3253       if ( selectedIds.empty() )
 
 3264   void QgsRenderer::setLayerAccessControlFilter( 
QgsMapLayer *layer )
 const 
 3266 #ifdef HAVE_SERVER_PYTHON_PLUGINS 
 3284   void QgsRenderer::annotationsRendering( QPainter *painter, 
const QgsMapSettings &mapSettings )
 const 
 3287     const QList< QgsAnnotation * > annotations = annotationManager->
annotations();
 
 3293       if ( !annotation || !annotation->isVisible() )
 
 3299       if ( annotation->hasFixedMapPosition() )
 
 3301         QgsPointXY mapPos = annotation->mapPosition();
 
 3302         if ( mapSettings.
destinationCrs() != annotation->mapPositionCrs() )
 
 3307             mapPos = coordTransform.transform( mapPos );
 
 3315         offsetX = devicePos.
x();
 
 3316         offsetY = devicePos.
y();
 
 3320         const QPointF relativePos = annotation->relativePosition();
 
 3321         offsetX = mapSettings.
outputSize().width() * relativePos.x();
 
 3322         offsetY = mapSettings.
outputSize().height() * relativePos.y();
 
 3326       painter->translate( offsetX, offsetY );
 
 3327       annotation->render( renderContext );
 
 3332   QImage *QgsRenderer::scaleImage( 
const QImage *image )
 const 
 3337     QImage *scaledImage = 
nullptr;
 
 3338     const int width = mWmsParameters.
widthAsInt();
 
 3340     if ( width != image->width() || height != image->height() )
 
 3342       scaledImage = 
new QImage( image->scaled( width, height, Qt::IgnoreAspectRatio, Qt::SmoothTransformation ) );
 
 3348   void QgsRenderer::handlePrintErrors( 
const QgsLayout *layout )
 const 
 3354     QList< QgsLayoutItemMap * > mapList;
 
 3357     QList< QgsLayoutItemMap * >::const_iterator mapIt = mapList.constBegin();
 
 3358     for ( ; mapIt != mapList.constEnd(); ++mapIt )
 
 3360       if ( !( *mapIt )->renderingErrors().isEmpty() )
 
 3372     for ( 
auto layer : layers )
 
 3385           setLayerOpacity( layer, param.
mOpacity );
 
 3392         setLayerSld( layer, mContext.
sld( *layer ) );
 
 3396         setLayerStyle( layer, mContext.
style( *layer ) );
 
 3401         setLayerOpacity( layer, param.
mOpacity );
 
 3406         setLayerFilter( layer, param.
mFilter );
 
 3411         setLayerAccessControlFilter( layer );
 
 3416         setLayerSelection( layer, param.
mSelection );
 
 3421         updateExtent( layer, *settings );
 
 3431   void QgsRenderer::setLayerStyle( 
QgsMapLayer *layer, 
const QString &style )
 const 
 3433     if ( style.isEmpty() )
 
 3442                                     QStringLiteral( 
"Style '%1' does not exist for layer '%2'" ).arg( style, layer->
name() ) );
 
 3446   void QgsRenderer::setLayerSld( 
QgsMapLayer *layer, 
const QDomElement &sld )
 const 
 3451     QString sldStyleName = 
"__sld_style";
 
 3452     while ( styles.contains( sldStyleName ) )
 
 3454       sldStyleName.append( 
'@' );
 
 3467     if ( !mWmsParameters.
bbox().isEmpty() )
 
 3471       std::unique_ptr<QImage> tmp( createImage( mContext.
mapSize( 
false ) ) );
 
 3472       configureMapSettings( tmp.get(), mapSettings );
 
Abstract base class for all geometries.
virtual QgsAbstractGeometry * segmentize(double tolerance=M_PI/180., SegmentationToleranceType toleranceType=MaximumAngle) const
Returns a version of the geometry without curves.
QgsWkbTypes::Type wkbType() const SIP_HOLDGIL
Returns the WKB type of the geometry.
Manages storage of a set of QgsAnnotation annotation objects.
QList< QgsAnnotation * > annotations() const
Returns a list of all annotations contained in the manager.
Abstract base class for annotation items which are drawn over a map.
static QgsFieldFormatterRegistry * fieldFormatterRegistry()
Gets the registry of available field formatters.
Exception thrown in case of malformed request.
This class represents a coordinate reference system (CRS).
static QgsCoordinateReferenceSystem fromOgcWmsCrs(const QString &ogcCrs)
Creates a CRS from a given OGC WMS-format Coordinate Reference System string.
bool isValid() const
Returns whether this CRS is correctly initialized and usable.
QString authid() const
Returns the authority identifier for the CRS.
Q_GADGET QgsUnitTypes::DistanceUnit mapUnits
bool hasAxisInverted() const
Returns whether axis is inverted (e.g., for WMS 1.3) for the CRS.
Custom exception class for Coordinate Reference System related exceptions.
Defines a QGIS exception class.
static QgsExpressionContextScope * projectScope(const QgsProject *project)
Creates a new scope which contains variables and functions relating to a QGIS project.
static QgsExpressionContextScope * mapSettingsScope(const QgsMapSettings &mapSettings)
Creates a new scope which contains variables and functions relating to a QgsMapSettings object.
static QgsExpressionContextScope * layerScope(const QgsMapLayer *layer)
Creates a new scope which contains variables and functions relating to a QgsMapLayer.
static QgsExpressionContextScope * globalScope()
Creates a new scope which contains variables and functions relating to the global QGIS context.
Expression contexts are used to encapsulate the parameters around which a QgsExpression should be eva...
void setFeature(const QgsFeature &feature)
Convenience function for setting a feature for the context.
Class for parsing and evaluation of expressions (formerly called "search strings").
QString expression() const
Returns the original, unmodified expression string.
static QString quotedValue(const QVariant &value)
Returns a string representation of a literal value, including appropriate quotations where required.
static QString replaceExpressionText(const QString &action, const QgsExpressionContext *context, const QgsDistanceArea *distanceArea=nullptr)
This function replaces each expression between [% and %] in the string with the result of its evaluat...
static QString createFieldEqualityExpression(const QString &fieldName, const QVariant &value)
Create an expression allowing to evaluate if a field is equal to a value.
static QString quotedColumnRef(QString name)
Returns a quoted column reference (in double quotes)
A filter filter provider grouping several filter providers.
QgsFeatureFilterProviderGroup & addProvider(const QgsFeatureFilterProvider *provider)
Add another filter provider to the group.
void setFilter(const QgsVectorLayer *layer, const QgsExpression &expression)
Set a filter for the given layer.
void filterFeatures(const QgsVectorLayer *layer, QgsFeatureRequest &filterFeatures) const override
Filter the features of the layer.
Wrapper for iterator of features from vector data provider or vector layer.
bool nextFeature(QgsFeature &f)
virtual QgsFeatureRenderer * clone() const =0
Create a deep copy of this renderer.
static QgsFeatureRenderer * loadSld(const QDomNode &node, QgsWkbTypes::GeometryType geomType, QString &errorMessage)
Create a new renderer according to the information contained in the UserStyle element of a SLD style ...
@ MoreSymbolsPerFeature
May use more than one symbol to render a feature: symbolsForFeature() will return them.
This class wraps a request for features to a vector layer (or directly its vector data provider).
QgsExpression * filterExpression() const
Returns the filter expression if set.
QgsFeatureRequest & setFlags(QgsFeatureRequest::Flags flags)
Sets flags that affect how features will be fetched.
QgsFeatureRequest & setSubsetOfAttributes(const QgsAttributeList &attrs)
Set a subset of attributes that will be fetched.
QgsFeatureRequest & setFilterExpression(const QString &expression)
Set the filter expression.
@ ExactIntersect
Use exact geometry intersection (slower) instead of bounding boxes.
@ NoGeometry
Geometry is not required. It may still be returned if e.g. required for a filter condition.
QgsCoordinateTransformContext transformContext() const
Returns the transform context, for use when a destinationCrs() has been set and reprojection is requi...
const QgsFeatureIds & filterFids() const
Gets feature IDs that should be fetched.
const Flags & flags() const
QgsFeatureRequest & setFilterRect(const QgsRectangle &rectangle)
Sets the rectangle from which features will be taken.
A container for features with the same fields and crs.
The feature class encapsulates a single feature including its unique ID, geometry and a list of field...
bool setAttribute(int field, const QVariant &attr)
Sets an attribute's value by field index.
void initAttributes(int fieldCount)
Initialize this feature with the given number of fields.
void setFields(const QgsFields &fields, bool initAttributes=false)
Assigns a field map with the feature to allow attribute access by attribute name.
QVariant attribute(const QString &name) const
Lookup attribute value by attribute name.
void setGeometry(const QgsGeometry &geometry)
Set the feature's geometry.
Encapsulate a field in an attribute table or data source.
bool convertCompatible(QVariant &v, QString *errorMessage=nullptr) const
Converts the provided variant to a compatible format.
ConfigurationFlags configurationFlags
@ HideFromWms
Fields is available if layer is served as WMS from QGIS server.
Container of fields for a vector layer.
bool append(const QgsField &field, FieldOrigin origin=OriginProvider, int originIndex=-1)
Appends a field. The field must have unique name, otherwise it is rejected (returns false)
int indexFromName(const QString &fieldName) const
Gets the field index from the field name.
int indexOf(const QString &fieldName) const
Gets the field index from the field name.
int count() const
Returns number of items.
QgsField at(int i) const
Returns the field at particular index (must be in range 0..N-1).
A geometry is the spatial representation of a feature.
const QgsAbstractGeometry * constGet() const SIP_HOLDGIL
Returns a non-modifiable (const) reference to the underlying abstract geometry primitive.
QgsGeometry pointOnSurface() const
Returns a point guaranteed to lie on the surface of a geometry.
static QgsGeometry fromWkt(const QString &wkt)
Creates a new geometry from a WKT string.
QgsPointXY asPoint() const
Returns the contents of the geometry as a 2-dimensional point.
QgsWkbTypes::GeometryType type
void set(QgsAbstractGeometry *geometry)
Sets the underlying geometry store.
OperationResult transform(const QgsCoordinateTransform &ct, QgsCoordinateTransform::TransformDirection direction=QgsCoordinateTransform::ForwardTransform, bool transformZ=false) SIP_THROW(QgsCsException)
Transforms this geometry as described by the coordinate transform ct.
QgsRectangle boundingBox() const
Returns the bounding box of the geometry.
QString asWkt(int precision=17) const
Exports the geometry to WKT.
Handles exporting QgsFeature features to GeoJSON features.
void setPlacementFlags(QgsLabeling::LinePlacementFlags flags)
Returns the line placement flags, which dictate how line labels can be placed above or below the line...
QStringList findLayerIds() const
Find layer IDs used in all layer nodes.
QgsLayerTreeLayer * findLayer(QgsMapLayer *layer) const
Find layer node representing the map layer.
void removeChildrenGroupWithoutLayers()
Remove all child group nodes without layers.
Layer tree node points to a map layer.
QgsMapLayer * layer() const
Returns the map layer associated with this node.
The QgsLegendRendererItem class is abstract interface for legend items returned from QgsMapLayerLegen...
virtual QSizeF drawSymbol(const QgsLegendSettings &settings, ItemContext *ctx, double itemHeight) const
Draws symbol on the left side of the item.
The QgsLayerTreeModel class is model implementation for Qt item views framework.
QgsLayerTree * rootGroup() const
Returns pointer to the root node of the layer tree. Always a non nullptr value.
QgsLayerTreeNode * parent()
Gets pointer to the parent. If parent is nullptr, the node is a root node.
Namespace with helper functions for layer tree operations.
Class used to render QgsLayout as an atlas, by iterating over the features from an associated vector ...
QgsVectorLayer * coverageLayer() const
Returns the coverage layer used for the atlas features.
bool beginRender() override
Called when rendering begins, before iteration commences.
bool setFilterExpression(const QString &expression, QString &errorString)
Sets the expression used for filtering features in the coverage layer.
QgsLayout * layout() override
Returns the layout associated with the iterator.
bool enabled() const
Returns whether the atlas generation is enabled.
int count() const override
Returns the number of features to iterate over.
void setFilterFeatures(bool filtered)
Sets whether features should be filtered in the coverage layer.
int updateFeatures()
Requeries the current atlas coverage layer and applies filtering and sorting.
Handles rendering and exports of layouts to various formats.
ExportResult exportToSvg(const QString &filePath, const QgsLayoutExporter::SvgExportSettings &settings)
Exports the layout as an SVG to the filePath, using the specified export settings.
ExportResult exportToImage(const QString &filePath, const QgsLayoutExporter::ImageExportSettings &settings)
Exports the layout to the filePath, using the specified export settings.
ExportResult exportToPdf(const QString &filePath, const QgsLayoutExporter::PdfExportSettings &settings)
Exports the layout as a PDF to the filePath, using the specified export settings.
Base class for frame items, which form a layout multiframe item.
A layout multiframe subclass for HTML content.
A layout item subclass for text labels.
A layout item subclass for map legends.
Layout graphical items for displaying a map.
double scale() const
Returns the map scale.
QList< QgsMapLayer * > layers() const
Returns the stored layer set.
QString id() const
Returns the item's ID name.
Manages storage of a set of layouts.
QgsMasterLayoutInterface * layoutByName(const QString &name) const
Returns the layout with a matching name, or nullptr if no matching layouts were found.
This class provides a method of storing measurements for use in QGIS layouts using a variety of diffe...
double length() const
Returns the length of the measurement.
int pageCount() const
Returns the number of pages in the collection.
Stores information relating to the current rendering settings for a layout.
void setFeatureFilterProvider(QgsFeatureFilterProvider *featureFilterProvider)
Sets feature filter provider to featureFilterProvider.
@ FlagDrawSelection
Draw selection.
This class provides a method of storing sizes, consisting of a width and height, for use in QGIS layo...
double height() const
Returns the height of the size.
double width() const
Returns the width of the size.
Base class for layouts, which can contain items such as maps, labels, scalebars, etc.
QgsLayoutPageCollection * pageCollection()
Returns a pointer to the layout's page collection, which stores and manages page items in the layout.
void layoutItems(QList< T * > &itemList) const
Returns a list of layout items of a specific type.
Item model implementation based on layer tree model for layout legend.
The QgsLegendRenderer class handles automatic layout and rendering of legend.
QSizeF minimumSize(QgsRenderContext *renderContext=nullptr)
Runs the layout algorithm and returns the minimum size required for the legend.
QJsonObject exportLegendToJson(const QgsRenderContext &context)
Renders the legend in a json object.
Q_DECL_DEPRECATED void drawLegend(QPainter *painter)
Draws the legend with given painter.
The QgsLegendSettings class stores the appearance and layout settings for legend drawing with QgsLege...
Q_DECL_DEPRECATED void setMapScale(double scale)
Sets the legend map scale.
Q_DECL_DEPRECATED void setMapUnitsPerPixel(double mapUnitsPerPixel)
Sets the mmPerMapUnit calculated by mapUnitsPerPixel mostly taken from the map settings.
Q_DECL_DEPRECATED double mmPerMapUnit() const
Q_DECL_DEPRECATED double mapScale() const
Returns the legend map scale.
QStringList styles() const
Returns list of all defined style names.
bool setCurrentStyle(const QString &name)
Set a different style as the current style - will apply it to the layer.
bool addStyleFromLayer(const QString &name)
Add style by cloning the current one.
Base class for all map layer types.
bool isInScaleRange(double scale) const
Tests whether the layer should be visible at the specified scale.
virtual QgsRectangle extent() const
Returns the extent of the layer.
Q_INVOKABLE QVariant customProperty(const QString &value, const QVariant &defaultValue=QVariant()) const
Read a custom property from layer.
QgsCoordinateReferenceSystem crs
virtual void setOpacity(double opacity)
Sets the opacity for the layer, where opacity is a value between 0 (totally transparent) and 1....
Q_INVOKABLE void setCustomProperty(const QString &key, const QVariant &value)
Set a custom property for layer.
bool hasScaleBasedVisibility() const
Returns whether scale based visibility is enabled for the layer.
@ Identifiable
If the layer is identifiable using the identify map tool and as a WMS layer.
virtual bool readSld(const QDomNode &node, QString &errorMessage)
QgsMapLayerStyleManager * styleManager() const
Gets access to the layer's style manager.
virtual Q_INVOKABLE QgsDataProvider * dataProvider()
Returns the layer's data provider, it may be nullptr.
The QgsMapSettings class contains configuration for rendering of the map.
QgsPointXY layerToMapCoordinates(const QgsMapLayer *layer, QgsPointXY point) const
transform point coordinates from layer's CRS to output CRS
void setSelectionColor(const QColor &color)
Sets the color that is used for drawing of selected vector features.
void setLayers(const QList< QgsMapLayer * > &layers)
Sets the list of layers to render in the map.
double scale() const
Returns the calculated map scale.
QgsCoordinateTransform layerTransform(const QgsMapLayer *layer) const
Returns the coordinate transform from layer's CRS to destination CRS.
QgsRectangle layerExtentToOutputExtent(const QgsMapLayer *layer, QgsRectangle extent) const
transform bounding box from layer's CRS to output CRS
QStringList layerIds() const
Returns the list of layer IDs which will be rendered in the map.
@ UseRenderingOptimization
Enable vector simplification and other rendering optimizations.
@ RenderBlocking
Render and load remote sources in the same thread to ensure rendering remote sources (svg and images)...
@ RenderMapTile
Draw map such that there are no problems between adjacent tiles.
void setOutputDpi(double dpi)
Sets the dpi (dots per inch) used for conversion between real world units (e.g.
double mapUnitsPerPixel() const
Returns the distance in geographical coordinates that equals to one pixel in the map.
QSize outputSize() const
Returns the size of the resulting map image, in pixels.
QgsRectangle extent() const
Returns geographical coordinates of the rectangle that should be rendered.
void setExtent(const QgsRectangle &rect, bool magnified=true)
Sets the coordinates of the rectangle which should be rendered.
void setExpressionContext(const QgsExpressionContext &context)
Sets the expression context.
const QgsMapToPixel & mapToPixel() const
QColor selectionColor() const
Returns the color that is used for drawing of selected vector features.
void setExtentBuffer(double buffer)
Sets the buffer in map units to use around the visible extent for rendering symbols whose correspondi...
void setLabelingEngineSettings(const QgsLabelingEngineSettings &settings)
Sets the global configuration of the labeling engine.
QList< QgsMapLayer * > layers() const
Returns the list of layers which will be rendered in the map.
void setFlag(Flag flag, bool on=true)
Enable or disable a particular flag (other flags are not affected)
void setOutputSize(QSize size)
Sets the size of the resulting map image, in pixels.
QgsPointXY mapToLayerCoordinates(const QgsMapLayer *layer, QgsPointXY point) const
transform point coordinates from output CRS to layer's CRS
void setBackgroundColor(const QColor &color)
Sets the background color of the map.
QgsCoordinateReferenceSystem destinationCrs() const
Returns the destination coordinate reference system for the map render.
void setDestinationCrs(const QgsCoordinateReferenceSystem &crs)
Sets the destination crs (coordinate reference system) for the map render.
QgsCoordinateTransformContext transformContext() const
Returns the coordinate transform context, which stores various information regarding which datum tran...
Perform transforms between map coordinates and device coordinates.
double mapUnitsPerPixel() const
Returns current map units per pixel.
QgsPointXY transform(const QgsPointXY &p) const
Transform the point p from map (world) coordinates to device coordinates.
static void logMessage(const QString &message, const QString &tag=QString(), Qgis::MessageLevel level=Qgis::MessageLevel::Warning, bool notifyUser=true)
Adds a message to the log instance (and creates it if necessary).
static void applyAccessControlLayerFilters(const QgsAccessControl *accessControl, QgsMapLayer *mapLayer, QHash< QgsMapLayer *, QString > &originalLayerFilters)
Apply filter from AccessControl.
static QDomElement geometryToGML(const QgsGeometry &geometry, QDomDocument &doc, QgsOgcUtils::GMLVersion gmlVersion, const QString &srsName, bool invertAxisOrientation, const QString &gmlIdBase, int precision=17)
Exports the geometry to GML.
static QDomElement rectangleToGMLEnvelope(QgsRectangle *env, QDomDocument &doc, int precision=17)
Exports the rectangle to GML3 Envelope.
static QgsExpression * expressionFromOgcFilter(const QDomElement &element, QgsVectorLayer *layer=nullptr)
Parse XML with OGC filter into QGIS expression.
static QDomElement rectangleToGMLBox(QgsRectangle *box, QDomDocument &doc, int precision=17)
Exports the rectangle to GML2 Box.
Contains settings for how a map layer will be labeled.
void setFormat(const QgsTextFormat &format)
Sets the label text formatting settings, e.g., font settings, buffer settings, etc.
bool displayAll
If true, all features will be labelled even when overlaps occur.
QgsPropertyCollection & dataDefinedProperties()
Returns a reference to the label's property collection, used for data defined overrides.
Placement
Placement modes which determine how label candidates are generated for a feature.
@ AroundPoint
Arranges candidates in a circle around a point (or centroid of a polygon). Applies to point or polygo...
@ Line
Arranges candidates parallel to a generalised line representing the feature or parallel to a polygon'...
int priority
Label priority.
Property
Data definable properties.
@ PositionY
Y-coordinate data defined label position.
@ PositionX
X-coordinate data defined label position.
@ Hali
Horizontal alignment for data defined label position (Left, Center, Right)
@ Vali
Vertical alignment for data defined label position (Bottom, Base, Half, Cap, Top)
const QgsLabelLineSettings & lineSettings() const
Returns the label line settings, which contain settings related to how the label engine places and fo...
double dist
Distance from feature to the label.
QString fieldName
Name of field (or an expression) to use for label text.
A class to represent a 2D point.
void setX(double x) SIP_HOLDGIL
Sets the x value of the point.
void setY(double y) SIP_HOLDGIL
Sets the y value of the point.
Print layout, a QgsLayout subclass for static or atlas-based layouts.
QgsPrintLayout * clone() const override
Creates a clone of the layout.
A class to describe the version of a project.
static QgsProject * instance()
Returns the QgsProject singleton instance.
Q_INVOKABLE QgsMapLayer * mapLayer(const QString &layerId) const
Retrieve a pointer to a registered layer by layer ID.
QgsExpressionContext createExpressionContext() const override
This method needs to be reimplemented in all classes which implement this interface and return an exp...
QgsAnnotationManager * annotationManager()
Returns pointer to the project's annotation manager.
QgsCoordinateTransformContext transformContext
const QgsLayoutManager * layoutManager() const
Returns the project's layout manager, which manages print layouts, atlases and reports within the pro...
const QgsLabelingEngineSettings & labelingEngineSettings() const
Returns project's global labeling engine settings.
void setProperty(int key, const QgsProperty &property)
Adds a property to the collection and takes ownership of it.
virtual QgsRasterIdentifyResult identify(const QgsPointXY &point, QgsRaster::IdentifyFormat format, const QgsRectangle &boundingBox=QgsRectangle(), int width=0, int height=0, int dpi=96)
Identify raster value(s) found on the point position.
Raster identify results container.
bool isValid() const
Returns true if valid.
QMap< int, QVariant > results() const
Returns the identify results.
@ IdentifyValue
Numerical values.
@ IdentifyFeature
WMS GML -> feature.
virtual int capabilities() const
Returns a bitmask containing the supported capabilities.
Represents a raster layer.
QString bandName(int bandNoInt) const
Returns the name of a band given its number.
QgsRasterDataProvider * dataProvider() override
Returns the source data provider.
QgsRasterRenderer * renderer() const
Returns the raster's renderer.
Raster renderer pipe that applies colors to a raster.
void setOpacity(double opacity)
Sets the opacity for the renderer, where opacity is a value between 0 (totally transparent) and 1....
A rectangle specified with double values.
double yMaximum() const SIP_HOLDGIL
Returns the y maximum value (top side of rectangle).
double xMaximum() const SIP_HOLDGIL
Returns the x maximum value (right side of rectangle).
double xMinimum() const SIP_HOLDGIL
Returns the x minimum value (left side of rectangle).
double yMinimum() const SIP_HOLDGIL
Returns the y minimum value (bottom side of rectangle).
double height() const SIP_HOLDGIL
Returns the height of the rectangle.
double width() const SIP_HOLDGIL
Returns the width of the rectangle.
void combineExtentWith(const QgsRectangle &rect)
Expands the rectangle so that it covers both the original rectangle and the given rectangle.
bool isEmpty() const
Returns true if the rectangle is empty.
void invert()
Swap x/y coordinates in the rectangle.
bool contains(const QgsRectangle &rect) const SIP_HOLDGIL
Returns true when rectangle contains other rectangle.
Contains information about the context of a rendering operation.
double scaleFactor() const
Returns the scaling factor for the render to convert painter units to physical sizes.
void setCoordinateTransform(const QgsCoordinateTransform &t)
Sets the current coordinate transform for the context.
QgsExpressionContext & expressionContext()
Gets the expression context.
const QgsMapToPixel & mapToPixel() const
Returns the context's map to pixel transform, which transforms between map coordinates and device coo...
void setFlag(Flag flag, bool on=true)
Enable or disable a particular flag (other flags are not affected)
void setExtent(const QgsRectangle &extent)
When rendering a map layer, calling this method sets the "clipping" extent for the layer (in the laye...
void setMapToPixel(const QgsMapToPixel &mtp)
Sets the context's map to pixel transform, which transforms between map coordinates and device coordi...
@ Antialiasing
Use antialiasing while drawing.
@ RenderBlocking
Render and load remote sources in the same thread to ensure rendering remote sources (svg and images)...
static QgsRenderContext fromMapSettings(const QgsMapSettings &mapSettings)
create initialized QgsRenderContext instance from given QgsMapSettings
static QgsRenderContext fromQPainter(QPainter *painter)
Creates a default render context given a pixel based QPainter destination.
void setRendererScale(double scale)
Sets the renderer map scale.
const QgsRectangle & extent() const
When rendering a map layer, calling this method returns the "clipping" extent for the layer (in the l...
Calculates scale for a given combination of canvas size, map extent, and monitor dpi.
double calculate(const QgsRectangle &mapExtent, double canvasWidth) const
Calculate the scale denominator.
Scoped object for temporary scaling of a QgsRenderContext for millimeter based rendering.
int maxThreads() const
Returns the maximum number of threads to use.
bool parallelRendering() const
Returns parallel rendering setting.
static QString symbolProperties(QgsSymbol *symbol)
Returns a string representing the symbol.
Abstract base class for all rendered symbols.
Container for settings relating to a text buffer.
void setColor(const QColor &color)
Sets the color for the buffer.
void setEnabled(bool enabled)
Sets whether the text buffer will be drawn.
void setSize(double size)
Sets the size of the buffer.
Container for all settings relating to text rendering.
void setColor(const QColor &color)
Sets the color that text will be rendered in.
void setSize(double size)
Sets the size for rendered text.
void setFont(const QFont &font)
Sets the font used for rendering text.
void setBuffer(const QgsTextBufferSettings &bufferSettings)
Sets the text's buffer settings.
This is the base class for vector data providers.
virtual QgsAttributeList pkAttributeIndexes() const
Returns list of indexes of fields that make up the primary key.
const QList< QgsVectorLayerServerProperties::WmsDimensionInfo > wmsDimensions() const
Returns the QGIS Server WMS Dimension list.
Basic implementation of the labeling interface.
Represents a vector layer which manages a vector based data sets.
QString attributeDisplayName(int index) const
Convenience function that returns the attribute alias if defined or the field name else.
Q_INVOKABLE QgsWkbTypes::Type wkbType() const FINAL
Returns the WKBType or WKBUnknown in case of error.
QgsVectorLayerServerProperties * serverProperties() const
Returns QGIS Server Properties of the vector layer.
Q_INVOKABLE QgsWkbTypes::GeometryType geometryType() const
Returns point, line or polygon.
void updateFields()
Will regenerate the fields property of this layer by obtaining all fields from the dataProvider,...
QgsFeatureIterator getFeatures(const QgsFeatureRequest &request=QgsFeatureRequest()) const FINAL
Queries the layer for features specified in request.
QgsFields fields() const FINAL
Returns the list of fields of this layer.
Q_INVOKABLE void selectByExpression(const QString &expression, QgsVectorLayer::SelectBehavior behavior=QgsVectorLayer::SetSelection)
Selects matching features using an expression.
QgsVectorDataProvider * dataProvider() FINAL
Returns the layer's data provider, it may be nullptr.
QgsEditorWidgetSetup editorWidgetSetup(int index) const
The editor widget setup defines which QgsFieldFormatter and editor widget will be used for the field ...
QgsFeature getFeature(QgsFeatureId fid) const
Queries the layer for the feature with the given id.
virtual bool setSubsetString(const QString &subset)
Sets the string (typically sql) used to define a subset of the layer.
QgsAttributeList primaryKeyAttributes() const
Returns the list of attributes which make up the layer's primary keys.
Q_INVOKABLE void selectByIds(const QgsFeatureIds &ids, QgsVectorLayer::SelectBehavior behavior=QgsVectorLayer::SetSelection)
Selects matching features using a list of feature IDs.
QgsEditFormConfig editFormConfig
QSet< QVariant > uniqueValues(int fieldIndex, int limit=-1) const FINAL
Calculates a list of unique values contained within an attribute in the layer.
QgsFeatureRenderer * renderer()
Returns the feature renderer used for rendering the features in the layer in 2D map views.
static QString displayString(Type type) SIP_HOLDGIL
Returns a non-translated display string type for a WKB type, e.g., the geometry name used in WKT geom...
static bool isCurvedType(Type type) SIP_HOLDGIL
Returns true if the WKB type is a curved type or can contain curved geometries.
Exception thrown in case of malformed request.
QgsRenderer(const QgsWmsRenderContext &context)
Constructor for QgsRenderer.
QHash< QgsVectorLayer *, SymbolSet > HitTest
QByteArray getPrint()
Returns printed page as binary.
HitTest symbols()
Returns the hit test according to the current context.
std::unique_ptr< QgsDxfExport > getDxf()
Returns the map as DXF data.
QSet< QString > SymbolSet
void configureLayers(QList< QgsMapLayer * > &layers, QgsMapSettings *settings=nullptr)
Configures layers for rendering optionally considering the map settings.
QJsonObject getLegendGraphicsAsJson(QgsLayerTreeModel &model)
Returns the map legend as a JSON object.
QByteArray getFeatureInfo(const QString &version="1.3.0")
Creates an xml document that describes the result of the getFeatureInfo request.
QImage * getLegendGraphics(QgsLayerTreeModel &model)
Returns the map legend as an image (or nullptr in case of error).
QImage * getMap()
Returns the map as an image (or nullptr in case of error).
~QgsRenderer()
Destructor for QgsRenderer.
Exception class for WMS service exceptions.
ExceptionCode
Exception codes as defined in OGC scpecifications for WMS 1.1.1 and WMS 1.3.0.
@ QGIS_InvalidParameterValue
@ QGIS_MissingParameterValue
WMS parameter received from the client.
double dxfScale() const
Returns the DXF SCALE parameter.
bool transparentAsBool() const
Returns TRANSPARENT parameter as a bool or its default value if not defined.
QString x() const
Returns X parameter or an empty string if not defined.
QMap< DxfFormatOption, QString > dxfFormatOptions() const
Returns a map of DXF options defined within FORMAT_OPTIONS parameter.
QString formatAsString() const
Returns FORMAT parameter as a string.
QgsProjectVersion versionAsNumber() const
Returns VERSION parameter if defined or its default value.
QgsWmsParametersComposerMap composerMapParameters(int mapId) const
Returns the requested parameters for a composer map parameter.
QgsRectangle bboxAsRectangle() const
Returns BBOX as a rectangle if defined and valid.
bool withGeometry() const
Returns if the client wants the feature info response with geometry information.
QString pointTolerance() const
Returns FI_POINT_TOLERANCE parameter or an empty string if not defined.
QString filterGeom() const
Returns the filter geometry found in FILTER_GEOM parameter.
QString composerTemplate() const
Returns TEMPLATE parameter or an empty string if not defined.
Format infoFormat() const
Returns infoFormat.
QString y() const
Returns Y parameter or an empty string if not defined.
void dump() const
Dumps parameters.
int pointToleranceAsInt() const
Returns FI_POINT_TOLERANCE parameter as an integer.
bool withMapTip() const
withMapTip
QString polygonTolerance() const
Returns FI_POLYGON_TOLERANCE parameter or an empty string if not defined.
QString i() const
Returns I parameter or an empty string if not defined.
int lineToleranceAsInt() const
Returns FI_LINE_TOLERANCE parameter as an integer.
QString lineTolerance() const
Returns FI_LINE_TOLERANCE parameter or an empty string if not defined.
QString j() const
Returns J parameter or an empty string if not defined.
int xAsInt() const
Returns X parameter as an int or its default value if not defined.
QString bbox() const
Returns BBOX if defined or an empty string.
int heightAsInt() const
Returns HEIGHT parameter as an int or its default value if not defined.
QColor backgroundColorAsColor() const
Returns BGCOLOR parameter as a QColor or its default value if not defined.
Format format() const
Returns format.
QStringList atlasPk() const
Returns the ATLAS_PK parameter.
QList< QgsWmsParametersHighlightLayer > highlightLayersParameters() const
Returns parameters for each highlight layer.
int iAsInt() const
Returns I parameter as an int or its default value if not defined.
int polygonToleranceAsInt() const
Returns FI_POLYGON_TOLERANCE parameter as an integer.
QgsDxfExport::SymbologyExport dxfMode() const
Returns the DXF MODE parameter.
int widthAsInt() const
Returns WIDTH parameter as an int or its default value if not defined.
QString sldBody() const
Returns SLD_body if defined or an empty string.
QString layoutParameter(const QString &id, bool &ok) const
Returns a layout parameter thanks to its id.
bool dxfUseLayerTitleAsName() const
Returns the DXF USE_TITLE_AS_LAYERNAME parameter.
QMap< QString, QString > dimensionValues() const
Returns the dimensions parameter.
int infoFormatVersion() const
Returns the infoFormat version for GML.
QgsLegendSettings legendSettings() const
Returns legend settings.
QStringList dxfLayerAttributes() const
Returns the DXF LAYERATTRIBUTES parameter.
QString height() const
Returns HEIGHT parameter or an empty string if not defined.
QString crs() const
Returns CRS or an empty string if none is defined.
int featureCountAsInt() const
Returns FEATURE_COUNT as an integer.
int yAsInt() const
Returns Y parameter as an int or its default value if not defined.
Format
Output format for the response.
QString width() const
Returns WIDTH parameter or an empty string if not defined.
QStringList filters() const
Returns the list of filters found in FILTER parameter.
QString dpi() const
Returns DPI parameter or an empty string if not defined.
int jAsInt() const
Returns J parameter as an int or its default value if not defined.
QStringList queryLayersNickname() const
Returns nickname of layers found in QUERY_LAYERS parameter.
Rendering context for the WMS renderer.
QSize mapSize(bool aspectRatio=true) const
Returns the size (in pixels) of the map to render, according to width and height WMS parameters as we...
bool isExternalLayer(const QString &name) const
Returns true if the layer is an external layer, false otherwise.
bool isValidGroup(const QString &name) const
Returns true if name is a group.
QStringList flattenedQueryLayers(const QStringList &layerNames) const
Returns a list of query layer names where group names are replaced by the names of their layer compon...
QList< QgsMapLayer * > layersToRender() const
Returns a list of all layers to actually render according to the current configuration.
QgsMapLayer * layer(const QString &nickname) const
Returns the layer corresponding to the nickname, or a nullptr if not found or if the layer do not nee...
bool updateExtent() const
Returns true if the extent has to be updated before the rendering, false otherwise.
const QgsServerSettings & settings() const
Returns settings of the server.
bool isValidWidthHeight() const
Returns true if width and height are valid according to the maximum values defined within the project...
QList< QgsMapLayer * > layersFromGroup(const QString &nickname) const
Returns the group's layers list corresponding to the nickname, or an empty list if not found.
QgsWmsParameters parameters() const
Returns WMS parameters.
void setScaleDenominator(double scaleDenominator)
Sets a custom scale denominator.
QString style(const QgsMapLayer &layer) const
Returns a style's name for a specific layer.
QMap< QString, QList< QgsMapLayer * > > layerGroups() const
Returns a map having layer group names as keys and a list of layers as values.
double mapTileBuffer(int mapWidth) const
Returns the tile buffer in geographical units for the given map width in pixels.
QString layerNickname(const QgsMapLayer &layer) const
Returns the nickname (short name, id or name) of the layer according to the current configuration.
qreal dotsPerMm() const
Returns default dots per mm according to the current configuration.
bool testFlag(Flag flag) const
Returns the status of a rendering flag.
QDomElement sld(const QgsMapLayer &layer) const
Returns a SLD document for a specific layer.
bool isValidLayer(const QString &nickname) const
Returns true if the layer has to be rendered, false otherwise.
const QgsProject * project() const
Returns the project.
int precision() const
Returns the precision to use according to the current configuration.
bool renderMapTiles() const
Returns true if WMS requests should use the QgsMapSettings::RenderMapTile flag, so that no visible ar...
RAII class to restore the rendering context configuration on destruction.
@ PointCloudLayer
Added in 3.18.
@ VectorTileLayer
Added in 3.14.
@ AnnotationLayer
Contains freeform, georeferenced annotations. Added in QGIS 3.16.
SERVER_EXPORT QString getExpressionFromServerFid(const QString &serverFid, const QgsVectorDataProvider *provider)
Returns the expression feature id based on primary keys.
SERVER_EXPORT QgsFeatureRequest updateFeatureRequestFromServerFids(QgsFeatureRequest &featureRequest, const QStringList &serverFids, const QgsVectorDataProvider *provider)
Returns the feature request based on feature ids build with primary keys.
SERVER_EXPORT QString getServerFid(const QgsFeature &feature, const QgsAttributeList &pkAttributes)
Returns the feature id based on primary keys.
SERVER_EXPORT QString wmsFeatureInfoSchema(const QgsProject &project)
Returns the schema URL for XML GetFeatureInfo request.
SERVER_EXPORT bool wmsInfoFormatSia2045(const QgsProject &project)
Returns if the info format is SIA20145.
SERVER_EXPORT QString wmsFeatureInfoDocumentElementNs(const QgsProject &project)
Returns the document element namespace for XML GetFeatureInfo request.
SERVER_EXPORT bool wmsFeatureInfoSegmentizeWktGeometry(const QgsProject &project)
Returns if the geometry has to be segmentize in GetFeatureInfo request.
SERVER_EXPORT bool wmsFeatureInfoUseAttributeFormSettings(const QgsProject &project)
Returns if feature form settings should be considered for the format of the feature info response.
SERVER_EXPORT QHash< QString, QString > wmsFeatureInfoLayerAliasMap(const QgsProject &project)
Returns the mapping between layer name and wms layer name for GetFeatureInfo request.
SERVER_EXPORT bool wmsFeatureInfoAddWktGeometry(const QgsProject &project)
Returns if the geometry is displayed as Well Known Text in GetFeatureInfo request.
SERVER_EXPORT double wmsDefaultMapUnitsPerMm(const QgsProject &project)
Returns the default number of map units per millimeters in case of the scale is not given.
SERVER_EXPORT QString wmsFeatureInfoDocumentElement(const QgsProject &project)
Returns the document element name for XML GetFeatureInfo request.
SERVER_EXPORT int wmsMaxAtlasFeatures(const QgsProject &project)
Returns the maximum number of atlas features which can be printed in a request.
Median cut implementation.
As part of the API refactoring and improvements which landed in the Processing API was substantially reworked from the x version This was done in order to allow much of the underlying Processing framework to be ported into c
#define Q_NOWARN_DEPRECATED_POP
QString qgsDoubleToString(double a, int precision=17)
Returns a string representation of a double.
#define Q_NOWARN_DEPRECATED_PUSH
QList< QgsFeature > QgsFeatureList
QSet< QgsFeatureId > QgsFeatureIds
#define FID_TO_STRING(fid)
QVector< QgsFeatureStore > QgsFeatureStoreList
QList< int > QgsAttributeList
const QgsCoordinateReferenceSystem & outputCrs
const QgsCoordinateReferenceSystem & crs
Layers and optional attribute index to split into multiple layers using attribute value as layer name...
QPainter * painter
Painter.
Contains settings relating to exporting layouts to raster images.
QList< int > pages
List of specific pages to export, or an empty list to export all pages.
QSize imageSize
Manual size in pixels for output image.
QgsLayoutRenderContext::Flags flags
Layout context flags, which control how the export will be created.
double dpi
Resolution to export layout at. If dpi <= 0 the default layout dpi will be used.
Contains settings relating to exporting layouts to PDF.
bool rasterizeWholeImage
Set to true to force whole layout to be rasterized while exporting.
QgsLayoutRenderContext::Flags flags
Layout context flags, which control how the export will be created.
double dpi
Resolution to export layout at. If dpi <= 0 the default layout dpi will be used.
Contains settings relating to exporting layouts to SVG.
double dpi
Resolution to export layout at. If dpi <= 0 the default layout dpi will be used.
QgsLayoutRenderContext::Flags flags
Layout context flags, which control how the export will be created.
Setting to define QGIS Server WMS Dimension.
@ MaxValue
Modify current selection to include only select features which match.
@ AllValues
Display all values of the dimension.
@ ReferenceValue
Remove from current selection.
@ MinValue
Add selection to current selection.
Setting options for loading vector layers.
QList< QgsWmsParametersLayer > mLayers
QList< QgsWmsParametersHighlightLayer > mHighlightLayers
QList< QgsWmsParametersFilter > mFilter