77#include <QTemporaryFile> 
   80#include <nlohmann/json.hpp> 
  104    : mContext( context )
 
  109    mWmsParameters.
dump();
 
 
  114    removeTemporaryLayers();
 
 
  120    std::unique_ptr<QgsWmsRestorer> restorer;
 
  133    if ( !mWmsParameters.
bbox().isEmpty() )
 
  137      std::unique_ptr<QImage> tmp( createImage( mContext.
mapSize( 
false ) ) );
 
  138      configureMapSettings( tmp.get(), mapSettings );
 
  144      context = configureDefaultRenderContext();
 
  148    std::unique_ptr<QImage> image;
 
  150    const QSizeF minSize = renderer.
minimumSize( &context );
 
  151    const QSize size( 
static_cast<int>( minSize.width() * dpmm ), 
static_cast<int>( minSize.height() * dpmm ) );
 
  156    image.reset( createImage( size ) );
 
  159    QPainter painter( image.get() );
 
  162    if ( painter.renderHints() & QPainter::SmoothPixmapTransform )
 
  164    if ( painter.renderHints() & QPainter::LosslessImageRendering )
 
  174    return image.release();
 
 
  180    std::unique_ptr<QgsWmsRestorer> restorer;
 
  194    std::unique_ptr<QImage> image( createImage( size ) );
 
  198    std::unique_ptr<QPainter> painter;
 
  199    painter.reset( 
new QPainter( image.get() ) );
 
  200    painter->setRenderHint( QPainter::Antialiasing, 
true );
 
  201    painter->scale( dpmm, dpmm );
 
  212    nodeModel.
drawSymbol( settings, &ctx, size.height() / dpmm );
 
  215    return image.release();
 
 
  221    std::unique_ptr<QgsWmsRestorer> restorer;
 
 
  241    std::unique_ptr<QgsWmsRestorer> restorer;
 
  261        if ( vLayer->renderer() )
 
  265          const QString ruleExp { vLayer->renderer()->legendKeyToExpression( ruleKey, vLayer, ok ) };
 
  268            jsonSymbol[ QStringLiteral( 
"rule" ) ] = ruleExp;
 
 
  277  void QgsRenderer::runHitTest( 
const QgsMapSettings &mapSettings, HitTest &hitTest )
 const 
  281    for ( 
const QString &
id : mapSettings.layerIds() )
 
  298      runHitTestLayer( vl, usedSymbols, context );
 
  304    std::unique_ptr< QgsFeatureRenderer > r( vl->
renderer()->
clone() );
 
  306    r->startRender( context, vl->
fields() );
 
  314      if ( moreSymbolsPerFeature )
 
  316        for ( 
QgsSymbol *s : r->originalSymbolsForFeature( f, context ) )
 
  322    r->stopRender( context );
 
  331                                    QStringLiteral( 
"The requested map size is too large" ) );
 
  335    std::unique_ptr<QgsWmsRestorer> restorer;
 
  345    std::unique_ptr<QPainter> painter;
 
  346    std::unique_ptr<QImage> image( createImage( mContext.
mapSize() ) );
 
  349    configureMapSettings( image.get(), mapSettings );
 
  356    runHitTest( mapSettings, 
symbols );
 
 
  364    std::unique_ptr<QgsWmsRestorer> restorer;
 
  369    if ( templateName.isEmpty() )
 
  393                                    QStringLiteral( 
"The template has no pages" ) );
 
  396    std::unique_ptr<QgsPrintLayout> layout( sourceLayout->
clone() );
 
  400    QStringList atlasPk = mWmsParameters.
atlasPk();
 
  401    if ( !atlasPk.isEmpty() ) 
 
  403      atlas = layout->atlas();
 
  404      if ( !atlas || !atlas->
enabled() )
 
  408                                      QStringLiteral( 
"The template has no atlas enabled" ) );
 
  415                                      QStringLiteral( 
"The atlas has no coverage layer" ) );
 
  419      if ( atlasPk.size() == 1 && atlasPk.at( 0 ) == QLatin1String( 
"*" ) )
 
  423        if ( atlas->
count() > maxAtlasFeatures )
 
  426                                        QString( 
"The project configuration allows printing maximum %1 atlas features at a time" ).arg( maxAtlasFeatures ) );
 
  432        if ( pkIndexes.size() == 0 )
 
  434          QgsDebugMsgLevel( QStringLiteral( 
"Atlas print: layer %1 has no primary key attributes" ).arg( cLayer->
name() ), 2 );
 
  438        const int pkIndexesSize {std::max< int >( pkIndexes.size(), 1 )};
 
  440        QStringList pkAttributeNames;
 
  441        for ( 
int pkIndex : std::as_const( pkIndexes ) )
 
  443          pkAttributeNames.append( cLayer->
fields().
at( pkIndex ).
name() );
 
  446        const int nAtlasFeatures = atlasPk.size() / pkIndexesSize;
 
  447        if ( nAtlasFeatures * pkIndexesSize != atlasPk.size() ) 
 
  450                                        QStringLiteral( 
"Wrong number of ATLAS_PK parameters" ) );
 
  454        if ( nAtlasFeatures > maxAtlasFeatures )
 
  457                                        QString( 
"%1 atlas features have been requested, but the project configuration only allows printing %2 atlas features at a time" )
 
  458                                        .arg( nAtlasFeatures ).arg( maxAtlasFeatures ) );
 
  461        QString filterString;
 
  462        int currentAtlasPk = 0;
 
  464        for ( 
int i = 0; i < nAtlasFeatures; ++i )
 
  468            filterString.append( 
" OR " );
 
  471          filterString.append( 
"( " );
 
  474          if ( pkAttributeNames.isEmpty() )
 
  476            filterString.append( QStringLiteral( 
"$id = %1" ).arg( atlasPk.at( currentAtlasPk ) ) );
 
  481            for ( 
int j = 0; j < pkIndexes.size(); ++j )
 
  485                filterString.append( 
" AND " );
 
  492          filterString.append( 
" )" );
 
  501        if ( !errorString.isEmpty() )
 
  503          throw QgsException( QStringLiteral( 
"An error occurred during the Atlas print: %1" ).arg( errorString ) );
 
  516    std::unique_ptr<QImage> image( 
new QImage() );
 
  517    configureMapSettings( image.get(), mapSettings );
 
  523    configurePrintLayout( layout.get(), mapSettings, atlas );
 
  527    const QList<QgsMapLayer *> lyrs = mapSettings.
layers();
 
  529#ifdef HAVE_SERVER_PYTHON_PLUGINS 
  530    mContext.accessControl()->resolveFilterFeatures( lyrs );
 
  534    QHash<const QgsVectorLayer *, QStringList> fltrs;
 
  539        fltrs.insert( vl, dimensionFilter( vl ) );
 
  551    QTemporaryFile tempOutputFile( QDir::tempPath() +  
'/' + QStringLiteral( 
"XXXXXX.%1" ).arg( extension ) );
 
  552    if ( !tempOutputFile.open() )
 
  554      throw QgsException( QStringLiteral( 
"Could not open temporary file for the GetPrint request." ) );
 
  563      if ( !mWmsParameters.
dpi().isEmpty() )
 
  566        double dpi( mWmsParameters.
dpi().toDouble( &ok ) );
 
  568          exportSettings.
dpi = dpi;
 
  581          atlasSvgExport.
exportToSvg( tempOutputFile.fileName(), exportSettings );
 
  587        exporter.
exportToSvg( tempOutputFile.fileName(), exportSettings );
 
  596      double dpi( layout->renderContext().dpi( ) );
 
  597      if ( !mWmsParameters.
dpi().isEmpty() )
 
  600        double _dpi = mWmsParameters.
dpi().toDouble( &ok );
 
  604      exportSettings.
dpi = dpi;
 
  610      QgsLayoutSize layoutSize( layout->pageCollection()->page( 0 )->sizeWithUnits() );
 
  615      const QSize imageSize = QSize( 
static_cast<int>( width.
length() * dpi / 25.4 ), 
static_cast<int>( height.
length() * dpi / 25.4 ) );
 
  617      const QString paramWidth = mWmsParameters.
width();
 
  618      const QString paramHeight = mWmsParameters.
height();
 
  623      if ( !paramWidth.isEmpty() && !paramHeight.isEmpty() )
 
  625        exportSettings.
imageSize = QSize( paramWidth.toInt(), paramHeight.toInt() );
 
  627      else if ( !paramWidth.isEmpty() && paramHeight.isEmpty() )
 
  629        exportSettings.
imageSize = QSize( paramWidth.toInt(), 
static_cast<double>( paramWidth.toInt() ) / imageSize.width() * imageSize.height() );
 
  631      else if ( paramWidth.isEmpty() && !paramHeight.isEmpty() )
 
  633        exportSettings.
imageSize = QSize( 
static_cast<double>( paramHeight.toInt() ) / imageSize.height() * imageSize.width(), paramHeight.toInt() );
 
  641      exportSettings.
pages.append( 0 );
 
  649          atlasPngExport.
exportToImage( tempOutputFile.fileName(), exportSettings );
 
  653          throw QgsServiceException( QStringLiteral( 
"Bad request" ), QStringLiteral( 
"Atlas error: empty atlas." ), QString(), 400 );
 
  659        exporter.
exportToImage( tempOutputFile.fileName(), exportSettings );
 
  667      if ( !mWmsParameters.
dpi().isEmpty() )
 
  670        double dpi( mWmsParameters.
dpi().toDouble( &ok ) );
 
  672          exportSettings.
dpi = dpi;
 
  677      exportSettings.
rasterizeWholeImage = layout->customProperty( QStringLiteral( 
"rasterize" ), 
false ).toBool();
 
  680      if ( requestMapScales.size() > 0 )
 
  690      if ( exportThemes.size() > 0 )
 
  718        exporter.
exportToPdf( tempOutputFile.fileName(), exportSettings );
 
  729      handlePrintErrors( atlas->
layout() );
 
  733      handlePrintErrors( layout.get() );
 
  736    return tempOutputFile.readAll();
 
 
  744    QList<QgsLayoutItemMap *> maps;
 
  750    for ( 
const auto &map : std::as_const( maps ) )
 
  756      if ( cMapParams.
mLayers.isEmpty() )
 
  761      if ( !atlas || !map->atlasDriven() ) 
 
  767          c->removeLayoutItem( map );
 
  785        if ( cMapParams.
mScale > 0 )
 
  787          map->setScale( 
static_cast<double>( cMapParams.
mScale ) );
 
  793          map->setMapRotation( cMapParams.
mRotation );
 
  797      if ( !map->keepLayerSet() )
 
  800        QList<QgsMapLayer *> layerSet;
 
  802        for ( 
const auto &layer : std::as_const( cMapParams.mLayers ) )
 
  806            QList<QgsMapLayer *> layersFromGroup;
 
  808            const QList<QgsMapLayer *> cLayersFromGroup = mContext.
layersFromGroup( layer.mNickname );
 
  809            for ( 
QgsMapLayer *layerFromGroup : cLayersFromGroup )
 
  812              if ( ! layerFromGroup )
 
  817              layersFromGroup.push_front( layerFromGroup );
 
  820            if ( !layersFromGroup.isEmpty() )
 
  822              layerSet.append( layersFromGroup );
 
  834            setLayerStyle( mlayer, layer.mStyle );
 
  839        std::reverse( layerSet.begin(), layerSet.end() );
 
  844        QMap<QString, QString> layersStyle;
 
  845        if ( map->followVisibilityPreset() )
 
  856          const QString presetName = map->followVisibilityPresetName();
 
  857          if ( layerSet.isEmpty() )
 
  861            layerSet = map->layersToRender( &ex );
 
  864          map->setFollowVisibilityPreset( 
false );
 
  868          for ( 
const auto &layerMapThemeRecord : std::as_const( mapThemeRecords ) )
 
  870            if ( layerSet.contains( layerMapThemeRecord.layer() ) )
 
  872              layersStyle.insert( layerMapThemeRecord.layer()->id(),
 
  873                                  layerMapThemeRecord.layer()->styleManager()->style( layerMapThemeRecord.currentStyle ).xmlData() );
 
  879        const QList< QgsMapLayer *> highlights = highlightLayers( cMapParams.
mHighlightLayers );
 
  880        for ( 
const auto &hl : std::as_const( highlights ) )
 
  882          layerSet.prepend( hl );
 
  885        map->setLayers( layerSet );
 
  886        map->setKeepLayerSet( 
true );
 
  890        if ( !layersStyle.isEmpty() )
 
  892          map->setLayerStyleOverrides( layersStyle );
 
  893          map->setKeepLayerStyles( 
true );
 
  900        map->grid()->setIntervalX( 
static_cast<double>( cMapParams.
mGridX ) );
 
  901        map->grid()->setIntervalY( 
static_cast<double>( cMapParams.
mGridY ) );
 
  906    QList<QgsLayoutItemLabel *> labels;
 
  908    for ( 
const auto &label : std::as_const( labels ) )
 
  911      const QString labelId = label->
id();
 
  912      const QString labelParam = mWmsParameters.
layoutParameter( labelId, ok );
 
  917      if ( labelParam.isEmpty() )
 
  921        c->removeItem( label );
 
  926      label->setText( labelParam );
 
  930    QList<QgsLayoutItemHtml *> htmls;
 
  932    for ( 
const auto &html : std::as_const( htmls ) )
 
  934      if ( html->frameCount() == 0 )
 
  939      const QString htmlId = htmlFrame->
id();
 
  940      const QString htmlValue = mWmsParameters.
layoutParameter( htmlId, ok );
 
  950      if ( htmlValue.isEmpty() )
 
  952        c->removeMultiFrame( html );
 
  959        QUrl newUrl( htmlValue );
 
  960        html->setUrl( newUrl );
 
  964        html->setHtml( htmlValue );
 
  971    QList<QgsLayoutItemLegend *> legends;
 
  973    for ( 
const auto &legend : std::as_const( legends ) )
 
  975      if ( legend->autoUpdateModel() )
 
  985        legend->setAutoUpdateModel( 
false );
 
  989        QStringList layerSet;
 
  990        QList<QgsMapLayer *> mapLayers;
 
  991        if ( map->
layers().isEmpty() )
 
  995          mapLayers = mProject->
mapLayers( 
true ).values();
 
  999          mapLayers = map->
layers();
 
 1001        const QList<QgsMapLayer *> layerList = mapLayers;
 
 1002        for ( 
const auto &layer : layerList )
 
 1003          layerSet << layer->id();
 
 1015        for ( 
const auto &layerId : layerIds )
 
 1022          if ( !layerSet.contains( layerId ) )
 
 1024            qobject_cast<QgsLayerTreeGroup *>( nodeLayer->
parent() )->removeChildNode( nodeLayer );
 
 1031              qobject_cast<QgsLayerTreeGroup *>( nodeLayer->
parent() )->removeChildNode( nodeLayer );
 
 1047                                    QStringLiteral( 
"The requested map size is too large" ) );
 
 1051    std::unique_ptr<QgsWmsRestorer> restorer;
 
 1062    std::unique_ptr<QPainter> painter;
 
 1063    std::unique_ptr<QImage> image( createImage( mContext.
mapSize() ) );
 
 1066    configureMapSettings( image.get(), mapSettings );
 
 1072    QPainter *renderedPainter = layersRendering( mapSettings, *image );
 
 1073    if ( !renderedPainter ) 
 
 1078    painter.reset( renderedPainter );
 
 1081    annotationsRendering( painter.get(), mapSettings );
 
 1087    QImage *scaledImage = scaleImage( image.get() );
 
 1089      image.reset( scaledImage );
 
 1092    return image.release();
 
 
 1103    QList< QgsDxfExport::DxfLayer > dxfLayers;
 
 1115      int layerAttribute = -1;
 
 1116      if ( attributes.size() > layerIdx )
 
 1127    QString 
crs = mWmsParameters.
crs();
 
 1128    if ( 
crs.compare( QStringLiteral( 
"CRS:84" ), Qt::CaseInsensitive ) == 0 )
 
 1130      crs = QStringLiteral( 
"EPSG:4326" );
 
 1133    else if ( 
crs.isEmpty() )
 
 1135      crs = QStringLiteral( 
"EPSG:4326" );
 
 1169    std::unique_ptr<QgsDxfExport> dxf = std::make_unique<QgsDxfExport>();
 
 1170    dxf->setExtent( mapExtent );
 
 1171    dxf->setDestinationCrs( outputCRS );
 
 1172    dxf->addLayers( dxfLayers );
 
 1174    dxf->setSymbologyExport( mWmsParameters.
dxfMode() );
 
 1177      dxf->setSymbologyScale( mWmsParameters.
dxfScale() );
 
 1180    dxf->setForce2d( mWmsParameters.
isForce2D() );
 
 1182    if ( mWmsParameters.
noMText() )
 
 1190    dxf->setFlags( flags );
 
 
 1218    std::unique_ptr<QgsMapRendererTask> pdf = std::make_unique<QgsMapRendererTask>( ms, tmpFileName, QStringLiteral( 
"PDF" ), 
false, 
QgsTask::Hidden, geoPdf, pdfExportDetails );
 
 1221      pdf->setSaveWorldFile( 
true );
 
 
 1229    if ( i < 0 || i > mapSettings.
outputSize().width() )
 
 1237    if ( j < 0 || j > mapSettings.
outputSize().height() )
 
 1262    const bool ijDefined = !mWmsParameters.
i().isEmpty() && !mWmsParameters.
j().isEmpty();
 
 1263    const bool xyDefined = !mWmsParameters.
x().isEmpty() && !mWmsParameters.
y().isEmpty();
 
 1264    const bool filtersDefined = !mWmsParameters.
filters().isEmpty();
 
 1265    const bool filterGeomDefined = !mWmsParameters.
filterGeom().isEmpty();
 
 1267    if ( !ijDefined && !xyDefined && !filtersDefined && !filterGeomDefined )
 
 1271      if ( mWmsParameters.
j().isEmpty() )
 
 1285    std::unique_ptr<QImage> outputImage( createImage( mContext.
mapSize() ) );
 
 1288    std::unique_ptr<QgsWmsRestorer> restorer;
 
 1293    bool mandatoryCrsParam = 
true;
 
 1294    if ( filtersDefined && !ijDefined && !xyDefined && mWmsParameters.
crs().isEmpty() )
 
 1296      mandatoryCrsParam = 
false;
 
 1302    configureMapSettings( outputImage.get(), mapSettings, mandatoryCrsParam );
 
 1318#ifdef HAVE_SERVER_PYTHON_PLUGINS 
 1319    mContext.accessControl()->resolveFilterFeatures( mapSettings.
layers() );
 
 1322    QDomDocument result = featureInfoDocument( layers, mapSettings, outputImage.get(), version );
 
 1327      ba = convertFeatureInfoToText( result );
 
 1329      ba = convertFeatureInfoToHtml( result );
 
 1331      ba = convertFeatureInfoToJson( layers, result, mapSettings.
destinationCrs() );
 
 1333      ba = result.toByteArray();
 
 
 1338  QImage *QgsRenderer::createImage( 
const QSize &size )
 const 
 1340    std::unique_ptr<QImage> image;
 
 1348      image = std::make_unique<QImage>( size, QImage::Format_ARGB32_Premultiplied );
 
 1353      image = std::make_unique<QImage>( size, QImage::Format_RGB32 );
 
 1358    if ( image->isNull() )
 
 1360      throw QgsException( QStringLiteral( 
"createImage: image could not be created, check for out of memory conditions" ) );
 
 1363    const int dpm = 
static_cast<int>( mContext.
dotsPerMm() * 1000.0 );
 
 1364    image->setDotsPerMeterX( dpm );
 
 1365    image->setDotsPerMeterY( dpm );
 
 1367    return image.release();
 
 1370  void QgsRenderer::configureMapSettings( 
const QPaintDevice *paintDevice, 
QgsMapSettings &mapSettings, 
bool mandatoryCrsParam )
 
 1374      throw QgsException( QStringLiteral( 
"configureMapSettings: no paint device" ) );
 
 1377    mapSettings.
setOutputSize( QSize( paintDevice->width(), paintDevice->height() ) );
 
 1384    if ( !mWmsParameters.
bbox().isEmpty() && mapExtent.
isEmpty() )
 
 1390    QString 
crs = mWmsParameters.
crs();
 
 1391    if ( 
crs.compare( 
"CRS:84", Qt::CaseInsensitive ) == 0 )
 
 1393      crs = QString( 
"EPSG:4326" );
 
 1396    else if ( 
crs.isEmpty() && !mandatoryCrsParam )
 
 1398      crs = QString( 
"EPSG:4326" );
 
 1408      QgsWmsParameter parameter;
 
 1450    else if ( backgroundColor.isValid() )
 
 1479    const QString timeString { mWmsParameters.
dimensionValues().value( QStringLiteral( 
"TIME" ), QString() ) };
 
 1480    if ( ! timeString.isEmpty() )
 
 1482      bool isValidTemporalRange { 
true };
 
 1485      const QDateTime dt { QDateTime::fromString( timeString, Qt::DateFormat::ISODateWithMs ) };
 
 1498          isValidTemporalRange = 
false;
 
 1503      if ( isValidTemporalRange )
 
 1513  QgsRenderContext QgsRenderer::configureDefaultRenderContext( QPainter *painter )
 
 1526  QDomDocument QgsRenderer::featureInfoDocument( QList<QgsMapLayer *> &layers, 
const QgsMapSettings &mapSettings,
 
 1527      const QImage *outputImage, 
const QString &version )
 const 
 1531    bool ijDefined = ( !mWmsParameters.
i().isEmpty() && !mWmsParameters.
j().isEmpty() );
 
 1533    bool xyDefined = ( !mWmsParameters.
x().isEmpty() && !mWmsParameters.
y().isEmpty() );
 
 1535    bool filtersDefined = !mWmsParameters.
filters().isEmpty();
 
 1537    bool filterGeomDefined = !mWmsParameters.
filterGeom().isEmpty();
 
 1540    if ( featureCount < 1 )
 
 1545    int i = mWmsParameters.
iAsInt();
 
 1546    int j = mWmsParameters.
jAsInt();
 
 1547    if ( xyDefined && !ijDefined )
 
 1549      i = mWmsParameters.
xAsInt();
 
 1550      j = mWmsParameters.
yAsInt();
 
 1554    if ( ( i != -1 && j != -1 && width != 0 && height != 0 ) && ( width != outputImage->width() || height != outputImage->height() ) )
 
 1556      i *= ( outputImage->width() /  
static_cast<double>( width ) );
 
 1557      j *= ( outputImage->height() / 
static_cast<double>( height ) );
 
 1561    std::unique_ptr<QgsRectangle> featuresRect;
 
 1562    std::unique_ptr<QgsGeometry> filterGeom;
 
 1563    std::unique_ptr<QgsPointXY> infoPoint;
 
 1565    if ( i != -1 && j != -1 )
 
 1568      infoPointToMapCoordinates( i, j, infoPoint.get(), mapSettings );
 
 1570    else if ( filtersDefined )
 
 1574    else if ( filterGeomDefined )
 
 1579    QDomDocument result;
 
 1580    const QDomNode header = result.createProcessingInstruction( QStringLiteral( 
"xml" ), QStringLiteral( 
"version=\"1.0\" encoding=\"UTF-8\"" ) );
 
 1581    result.appendChild( header );
 
 1583    QDomElement getFeatureInfoElement;
 
 1587      getFeatureInfoElement = result.createElement( QStringLiteral( 
"wfs:FeatureCollection" ) );
 
 1588      getFeatureInfoElement.setAttribute( QStringLiteral( 
"xmlns:wfs" ), QStringLiteral( 
"http://www.opengis.net/wfs" ) );
 
 1589      getFeatureInfoElement.setAttribute( QStringLiteral( 
"xmlns:ogc" ), QStringLiteral( 
"http://www.opengis.net/ogc" ) );
 
 1590      getFeatureInfoElement.setAttribute( QStringLiteral( 
"xmlns:gml" ), QStringLiteral( 
"http://www.opengis.net/gml" ) );
 
 1591      getFeatureInfoElement.setAttribute( QStringLiteral( 
"xmlns:ows" ), QStringLiteral( 
"http://www.opengis.net/ows" ) );
 
 1592      getFeatureInfoElement.setAttribute( QStringLiteral( 
"xmlns:xlink" ), QStringLiteral( 
"http://www.w3.org/1999/xlink" ) );
 
 1593      getFeatureInfoElement.setAttribute( QStringLiteral( 
"xmlns:qgs" ), QStringLiteral( 
"http://qgis.org/gml" ) );
 
 1594      getFeatureInfoElement.setAttribute( QStringLiteral( 
"xmlns:xsi" ), QStringLiteral( 
"http://www.w3.org/2001/XMLSchema-instance" ) );
 
 1595      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" ) );
 
 1600      if ( featureInfoElemName.isEmpty() )
 
 1602        featureInfoElemName = QStringLiteral( 
"GetFeatureInfoResponse" );
 
 1605      if ( featureInfoElemNs.isEmpty() )
 
 1607        getFeatureInfoElement = result.createElement( featureInfoElemName );
 
 1611        getFeatureInfoElement = result.createElementNS( featureInfoElemNs, featureInfoElemName );
 
 1615      if ( !featureInfoSchema.isEmpty() )
 
 1617        getFeatureInfoElement.setAttribute( QStringLiteral( 
"xmlns:xsi" ), QStringLiteral( 
"http://www.w3.org/2001/XMLSchema-instance" ) );
 
 1618        getFeatureInfoElement.setAttribute( QStringLiteral( 
"xsi:schemaLocation" ), featureInfoSchema );
 
 1621    result.appendChild( getFeatureInfoElement );
 
 1631    for ( 
const QString &queryLayer : queryLayers )
 
 1633      bool validLayer = 
false;
 
 1634      bool queryableLayer = 
true;
 
 1635      for ( 
QgsMapLayer *layer : std::as_const( layers ) )
 
 1641          if ( !queryableLayer )
 
 1646          QDomElement layerElement;
 
 1649            layerElement = getFeatureInfoElement;
 
 1653            layerElement = result.createElement( QStringLiteral( 
"Layer" ) );
 
 1654            QString layerName = queryLayer;
 
 1657            QHash<QString, QString>::const_iterator layerAliasIt = layerAliasMap.constFind( layerName );
 
 1658            if ( layerAliasIt != layerAliasMap.constEnd() )
 
 1660              layerName = layerAliasIt.value();
 
 1663            layerElement.setAttribute( QStringLiteral( 
"name" ), layerName );
 
 1664            const QString layerTitle = layer->serverProperties()->title();
 
 1665            if ( !layerTitle.isEmpty() )
 
 1667              layerElement.setAttribute( QStringLiteral( 
"title" ), layerTitle );
 
 1671              layerElement.setAttribute( QStringLiteral( 
"title" ), layerName );
 
 1673            getFeatureInfoElement.appendChild( layerElement );
 
 1676              layerElement.setAttribute( QStringLiteral( 
"id" ), layer->id() );
 
 1682            QgsVectorLayer *vectorLayer = qobject_cast<QgsVectorLayer *>( layer );
 
 1685              ( void )featureInfoFromVectorLayer( vectorLayer, infoPoint.get(), featureCount, result, layerElement, mapSettings, renderContext, version, featuresRect.get(), filterGeom.get() );
 
 1691            QgsRasterLayer *rasterLayer = qobject_cast<QgsRasterLayer *>( layer );
 
 1700            QgsPointXY layerInfoPoint = mapSettings.mapToLayerCoordinates( layer, *( infoPoint.get() ) );
 
 1707              layerElement = result.createElement( QStringLiteral( 
"gml:featureMember" ) );
 
 1708              getFeatureInfoElement.appendChild( layerElement );
 
 1711            ( void )featureInfoFromRasterLayer( rasterLayer, mapSettings, &layerInfoPoint, renderContext, result, layerElement, version );
 
 1719        param.mValue = queryLayer;
 
 1723      else if ( ( validLayer && !queryableLayer ) || ( !validLayer && mContext.
isValidGroup( queryLayer ) ) )
 
 1726        param.mValue = queryLayer;
 
 1728        bool hasGroupAndQueryable { 
false };
 
 1733          for ( 
const QString &ql : constNicks )
 
 1737              const QList<QgsMapLayer *> constLayers { mContext.
layerGroups()[ql] };
 
 1740                if ( ( ! ml->serverProperties()->shortName().isEmpty() &&  ml->serverProperties()->shortName() == queryLayer ) || ( ml->name() == queryLayer ) )
 
 1746                  hasGroupAndQueryable = 
true;
 
 1755        if ( ! hasGroupAndQueryable )
 
 1763    if ( featuresRect && ! featuresRect->isNull() )
 
 1767        QDomElement bBoxElem = result.createElement( QStringLiteral( 
"gml:boundedBy" ) );
 
 1768        QDomElement boxElem;
 
 1770        if ( gmlVersion < 3 )
 
 1782          boxElem.setAttribute( QStringLiteral( 
"srsName" ), 
crs.
authid() );
 
 1784        bBoxElem.appendChild( boxElem );
 
 1785        getFeatureInfoElement.insertBefore( bBoxElem, QDomNode() ); 
 
 1789        QDomElement bBoxElem = result.createElement( QStringLiteral( 
"BoundingBox" ) );
 
 1790        bBoxElem.setAttribute( QStringLiteral( 
"CRS" ), mapSettings.destinationCrs().authid() );
 
 1791        bBoxElem.setAttribute( QStringLiteral( 
"minx" ), 
qgsDoubleToString( featuresRect->xMinimum(), 8 ) );
 
 1792        bBoxElem.setAttribute( QStringLiteral( 
"maxx" ), 
qgsDoubleToString( featuresRect->xMaximum(), 8 ) );
 
 1793        bBoxElem.setAttribute( QStringLiteral( 
"miny" ), 
qgsDoubleToString( featuresRect->yMinimum(), 8 ) );
 
 1794        bBoxElem.setAttribute( QStringLiteral( 
"maxy" ), 
qgsDoubleToString( featuresRect->yMaximum(), 8 ) );
 
 1795        getFeatureInfoElement.insertBefore( bBoxElem, QDomNode() ); 
 
 1801      convertFeatureInfoToSia2045( result );
 
 1807  bool QgsRenderer::featureInfoFromVectorLayer( 
QgsVectorLayer *layer,
 
 1810      QDomDocument &infoDocument,
 
 1811      QDomElement &layerElement,
 
 1814      const QString &version,
 
 1826    std::unique_ptr<QgsGeometry> layerFilterGeom;
 
 1829      layerFilterGeom.reset( 
new QgsGeometry( *filterGeom ) );
 
 1843      searchRect = featureInfoSearchRect( layer, mapSettings, renderContext, *infoPoint );
 
 1845    else if ( layerFilterGeom )
 
 1847      searchRect = layerFilterGeom->boundingBox();
 
 1849    else if ( !mWmsParameters.
bbox().isEmpty() )
 
 1851      searchRect = layerRect;
 
 1858    int featureCounter = 0;
 
 1877    if ( layerFilterGeom )
 
 1879      fReq.
setFilterExpression( QString( 
"intersects( $geometry, geom_from_wkt('%1') )" ).arg( layerFilterGeom->asWkt() ) );
 
 1884#ifdef HAVE_SERVER_PYTHON_PLUGINS 
 1885    mContext.accessControl()->filterFeatures( layer, fReq );
 
 1887    QStringList attributes;
 
 1888    for ( 
const QgsField &field : fields )
 
 1890      attributes.append( field.name() );
 
 1892    attributes = mContext.accessControl()->layerAttributes( layer, attributes );
 
 1897    std::unique_ptr< QgsFeatureRenderer > r2( layer->
renderer() ? layer->
renderer()->
clone() : nullptr );
 
 1900      r2->startRender( renderContext, layer->
fields() );
 
 1903    bool featureBBoxInitialized = 
false;
 
 1912      if ( featureCounter > nFeatures )
 
 1927        bool render = r2->willRenderFeature( feature, renderContext );
 
 1940          if ( !featureBBoxInitialized && featureBBox->
isEmpty() )
 
 1943            featureBBoxInitialized = 
true;
 
 1963        QDomElement elem = createFeatureGML(
 
 1965#ifdef HAVE_SERVER_PYTHON_PLUGINS
 
 1969        QDomElement featureMemberElem = infoDocument.createElement( QStringLiteral( 
"gml:featureMember" ) );
 
 1970        featureMemberElem.appendChild( elem );
 
 1971        layerElement.appendChild( featureMemberElem );
 
 1976        QDomElement featureElement = infoDocument.createElement( QStringLiteral( 
"Feature" ) );
 
 1978        layerElement.appendChild( featureElement );
 
 1984          writeAttributesTabLayout( editConfig, layer, fields, featureAttributes, infoDocument, featureElement, renderContext
 
 1985#ifdef HAVE_SERVER_PYTHON_PLUGINS
 
 1992          for ( 
int i = 0; i < featureAttributes.count(); ++i )
 
 1994            writeVectorLayerAttribute( i, layer, fields, featureAttributes, infoDocument, featureElement, renderContext
 
 1995#ifdef HAVE_SERVER_PYTHON_PLUGINS
 
 2006          QDomElement maptipElem = infoDocument.createElement( QStringLiteral( 
"Attribute" ) );
 
 2007          maptipElem.setAttribute( QStringLiteral( 
"name" ), QStringLiteral( 
"maptip" ) );
 
 2011          featureElement.appendChild( maptipElem );
 
 2017          QDomElement displayElem = infoDocument.createElement( QStringLiteral( 
"Attribute" ) );
 
 2018          displayElem.setAttribute( QStringLiteral( 
"name" ), QStringLiteral( 
"displayName" ) );
 
 2021          displayExpression.
prepare( &context );
 
 2022          displayElem.setAttribute( QStringLiteral( 
"value" ),  displayExpression.
evaluate( &context ).toString() );
 
 2023          featureElement.appendChild( displayElem );
 
 2030          QDomElement bBoxElem = infoDocument.createElement( QStringLiteral( 
"BoundingBox" ) );
 
 2031          bBoxElem.setAttribute( version == QLatin1String( 
"1.1.1" ) ? 
"SRS" : 
"CRS", 
outputCrs.authid() );
 
 2036          featureElement.appendChild( bBoxElem );
 
 2052            if ( segmentizeWktGeometry )
 
 2060                  geom.
set( segmentizedGeom );
 
 2064            QDomElement geometryElement = infoDocument.createElement( QStringLiteral( 
"Attribute" ) );
 
 2065            geometryElement.setAttribute( QStringLiteral( 
"name" ), QStringLiteral( 
"geometry" ) );
 
 2066            geometryElement.setAttribute( QStringLiteral( 
"value" ), geom.
asWkt( mContext.
precision() ) );
 
 2067            geometryElement.setAttribute( QStringLiteral( 
"type" ), QStringLiteral( 
"derived" ) );
 
 2068            featureElement.appendChild( geometryElement );
 
 2075      r2->stopRender( renderContext );
 
 2086      QString groupName = container->
name();
 
 2087      QDomElement nameElem;
 
 2089      if ( !groupName.isEmpty() )
 
 2091        nameElem = doc.createElement( groupName );
 
 2092        parentElem.appendChild( nameElem );
 
 2095      const QList<QgsAttributeEditorElement *> children =  container->
children();
 
 2100          writeAttributesTabGroup( child, layer, fields, featureAttributes, doc, nameElem.isNull() ? parentElem : nameElem, renderContext );
 
 2110              writeVectorLayerAttribute( idx, layer, fields, featureAttributes, doc, nameElem.isNull() ? parentElem : nameElem, renderContext, attributes );
 
 2121    if ( !editorContainer )
 
 2126    writeAttributesTabGroup( editorContainer, layer, fields, featureAttributes, doc, featureElem, renderContext, attributes );
 
 2129  void QgsRenderer::writeVectorLayerAttribute( 
int attributeIndex,  
QgsVectorLayer *layer, 
const QgsFields &fields, 
QgsAttributes &featureAttributes, QDomDocument &doc, QDomElement &featureElem, 
QgsRenderContext &renderContext, QStringList *attributes )
 const 
 2131#ifndef HAVE_SERVER_PYTHON_PLUGINS 
 2132    Q_UNUSED( attributes );
 
 2145#ifdef HAVE_SERVER_PYTHON_PLUGINS 
 2147    if ( attributes && !attributes->contains( fields.
at( attributeIndex ).
name() ) )
 
 2154    QDomElement attributeElement = doc.createElement( QStringLiteral( 
"Attribute" ) );
 
 2155    attributeElement.setAttribute( QStringLiteral( 
"name" ), attributeName );
 
 2157    attributeElement.setAttribute( QStringLiteral( 
"value" ),
 
 2159                                     replaceValueMapAndRelation(
 
 2160                                       layer, attributeIndex,
 
 2161                                       featureAttributes[attributeIndex] ),
 
 2164    featureElem.appendChild( attributeElement );
 
 2167  bool QgsRenderer::featureInfoFromRasterLayer( 
QgsRasterLayer *layer,
 
 2171      QDomDocument &infoDocument,
 
 2172      QDomElement &layerElement,
 
 2173      const QString &version )
 const 
 2193      : 
Qgis::RasterIdentifyFormat::Value );
 
 2205                                      .arg( layer->
name() ) );
 
 2214    if ( !identifyResult.
isValid() )
 
 2217    QMap<int, QVariant> attributes = identifyResult.
results();
 
 2231        for ( 
auto it = attributes.constBegin(); it != attributes.constEnd(); ++it )
 
 2234          feature.
setAttribute( index++, QString::number( it.value().toDouble() ) );
 
 2237        QDomElement elem = createFeatureGML(
 
 2238                             &feature, 
nullptr, infoDocument, layerCrs, mapSettings, 
typeName, 
false, gmlVersion, 
nullptr );
 
 2239        layerElement.appendChild( elem );
 
 2243        const auto values = identifyResult.
results();
 
 2244        for ( 
auto it = values.constBegin(); it != values.constEnd(); ++it )
 
 2246          QVariant value = it.value();
 
 2247          if ( value.userType() == QMetaType::Type::Bool && !value.toBool() )
 
 2253          if ( value.userType() == QMetaType::Type::QString )
 
 2264            for ( 
const QgsFeature &feature : storeFeatures )
 
 2266              QDomElement elem = createFeatureGML(
 
 2267                                   &feature, 
nullptr, infoDocument, layerCrs, mapSettings, 
typeName, 
false, gmlVersion, 
nullptr );
 
 2268              layerElement.appendChild( elem );
 
 2278        for ( 
auto it = attributes.constBegin(); it != attributes.constEnd(); ++it )
 
 2280          QDomElement attributeElement = infoDocument.createElement( QStringLiteral( 
"Attribute" ) );
 
 2281          attributeElement.setAttribute( QStringLiteral( 
"name" ), layer->
bandName( it.key() ) );
 
 2286            value  = QString::number( it.value().toDouble() );
 
 2289          attributeElement.setAttribute( QStringLiteral( 
"value" ), value );
 
 2290          layerElement.appendChild( attributeElement );
 
 2295        const auto values = identifyResult.
results();
 
 2296        for ( 
auto it = values.constBegin(); it != values.constEnd(); ++it )
 
 2298          QVariant value = it.value();
 
 2299          if ( value.userType() == QMetaType::Type::Bool && !value.toBool() )
 
 2305          if ( value.userType() == QMetaType::Type::QString )
 
 2315            for ( 
const QgsFeature &feature : storeFeatures )
 
 2317              for ( 
const auto &fld : feature.fields() )
 
 2319                const auto val { feature.
attribute( fld.name() )};
 
 2320                if ( val.isValid() )
 
 2322                  QDomElement attributeElement = infoDocument.createElement( QStringLiteral( 
"Attribute" ) );
 
 2323                  attributeElement.setAttribute( QStringLiteral( 
"name" ), fld.name() );
 
 2324                  attributeElement.setAttribute( QStringLiteral( 
"value" ), val.toString() );
 
 2325                  layerElement.appendChild( attributeElement );
 
 2336        QDomElement maptipElem = infoDocument.createElement( QStringLiteral( 
"Attribute" ) );
 
 2337        maptipElem.setAttribute( QStringLiteral( 
"name" ), QStringLiteral( 
"maptip" ) );
 
 2341        context.appendScope( scope );
 
 2343        layerElement.appendChild( maptipElem );
 
 2349  bool QgsRenderer::testFilterStringSafety( 
const QString &filter )
 const 
 2352    if ( filter.contains( QLatin1String( 
";" ) ) )
 
 2357    QStringList tokens = filter.split( 
' ', Qt::SkipEmptyParts );
 
 2358    groupStringList( tokens, QStringLiteral( 
"'" ) );
 
 2359    groupStringList( tokens, QStringLiteral( 
"\"" ) );
 
 2361    for ( 
auto tokenIt = tokens.constBegin() ; tokenIt != tokens.constEnd(); ++tokenIt )
 
 2364      if ( tokenIt->compare( QLatin1String( 
"," ) ) == 0
 
 2365           || tokenIt->compare( QLatin1String( 
"(" ) ) == 0
 
 2366           || tokenIt->compare( QLatin1String( 
")" ) ) == 0
 
 2367           || tokenIt->compare( QLatin1String( 
"=" ) ) == 0
 
 2368           || tokenIt->compare( QLatin1String( 
"!=" ) ) == 0
 
 2369           || tokenIt->compare( QLatin1String( 
"<" ) ) == 0
 
 2370           || tokenIt->compare( QLatin1String( 
"<=" ) ) == 0
 
 2371           || tokenIt->compare( QLatin1String( 
">" ) ) == 0
 
 2372           || tokenIt->compare( QLatin1String( 
">=" ) ) == 0
 
 2373           || tokenIt->compare( QLatin1String( 
"%" ) ) == 0
 
 2374           || tokenIt->compare( QLatin1String( 
"IS" ), Qt::CaseInsensitive ) == 0
 
 2375           || tokenIt->compare( QLatin1String( 
"NOT" ), Qt::CaseInsensitive ) == 0
 
 2376           || tokenIt->compare( QLatin1String( 
"NULL" ), Qt::CaseInsensitive ) == 0
 
 2377           || tokenIt->compare( QLatin1String( 
"AND" ), Qt::CaseInsensitive ) == 0
 
 2378           || tokenIt->compare( QLatin1String( 
"OR" ), Qt::CaseInsensitive ) == 0
 
 2379           || tokenIt->compare( QLatin1String( 
"IN" ), Qt::CaseInsensitive ) == 0
 
 2380           || tokenIt->compare( QLatin1String( 
"LIKE" ), Qt::CaseInsensitive ) == 0
 
 2381           || tokenIt->compare( QLatin1String( 
"ILIKE" ), Qt::CaseInsensitive ) == 0
 
 2382           || tokenIt->compare( QLatin1String( 
"DMETAPHONE" ), Qt::CaseInsensitive ) == 0
 
 2383           || tokenIt->compare( QLatin1String( 
"SOUNDEX" ), Qt::CaseInsensitive ) == 0
 
 2391      tokenIt->toDouble( &isNumeric );
 
 2400      if ( *tokenIt == QLatin1String( 
"''" ) )
 
 2406      if ( tokenIt->size() > 2
 
 2407           && ( *tokenIt )[0] == QChar( 
'\'' )
 
 2408           && ( *tokenIt )[tokenIt->size() - 1] == QChar( 
'\'' )
 
 2409           && ( *tokenIt )[1] != QChar( 
'\'' )
 
 2410           && ( *tokenIt )[tokenIt->size() - 2] != QChar( 
'\'' ) )
 
 2416      if ( tokenIt->size() > 2
 
 2417           && ( *tokenIt )[0] == QChar( 
'"' )
 
 2418           && ( *tokenIt )[tokenIt->size() - 1] == QChar( 
'"' )
 
 2419           && ( *tokenIt )[1] != QChar( 
'"' )
 
 2420           && ( *tokenIt )[tokenIt->size() - 2] != QChar( 
'"' ) )
 
 2431  void QgsRenderer::groupStringList( QStringList &list, 
const QString &groupString )
 
 2434    bool groupActive = 
false;
 
 2435    int startGroup = -1;
 
 2436    QString concatString;
 
 2438    for ( 
int i = 0; i < list.size(); ++i )
 
 2440      QString &
str = list[i];
 
 2441      if ( 
str.startsWith( groupString ) )
 
 2445        concatString.clear();
 
 2450        if ( i != startGroup )
 
 2452          concatString.append( 
" " );
 
 2454        concatString.append( 
str );
 
 2457      if ( 
str.endsWith( groupString ) )
 
 2460        groupActive = 
false;
 
 2462        if ( startGroup != -1 )
 
 2464          list[startGroup] = concatString;
 
 2465          for ( 
int j = startGroup + 1; j <= endGroup; ++j )
 
 2467            list.removeAt( startGroup + 1 );
 
 2472        concatString.clear();
 
 2478  void QgsRenderer::convertFeatureInfoToSia2045( QDomDocument &doc )
 const 
 2480    QDomDocument SIAInfoDoc;
 
 2481    QDomElement infoDocElement = doc.documentElement();
 
 2482    QDomElement SIAInfoDocElement = SIAInfoDoc.importNode( infoDocElement, 
false ).toElement();
 
 2483    SIAInfoDoc.appendChild( SIAInfoDocElement );
 
 2485    QString currentAttributeName;
 
 2486    QString currentAttributeValue;
 
 2487    QDomElement currentAttributeElem;
 
 2488    QString currentLayerName;
 
 2489    QDomElement currentLayerElem;
 
 2490    QDomNodeList layerNodeList = infoDocElement.elementsByTagName( QStringLiteral( 
"Layer" ) );
 
 2491    for ( 
int i = 0; i < layerNodeList.size(); ++i )
 
 2493      currentLayerElem = layerNodeList.at( i ).toElement();
 
 2494      currentLayerName = currentLayerElem.attribute( QStringLiteral( 
"name" ) );
 
 2496      QDomElement currentFeatureElem;
 
 2498      QDomNodeList featureList = currentLayerElem.elementsByTagName( QStringLiteral( 
"Feature" ) );
 
 2499      if ( featureList.isEmpty() )
 
 2502        QDomNodeList attributeList = currentLayerElem.elementsByTagName( QStringLiteral( 
"Attribute" ) );
 
 2503        QDomElement rasterLayerElem;
 
 2504        if ( !attributeList.isEmpty() )
 
 2506          rasterLayerElem = SIAInfoDoc.createElement( currentLayerName );
 
 2508        for ( 
int j = 0; j < attributeList.size(); ++j )
 
 2510          currentAttributeElem = attributeList.at( j ).toElement();
 
 2511          currentAttributeName = currentAttributeElem.attribute( QStringLiteral( 
"name" ) );
 
 2512          currentAttributeValue = currentAttributeElem.attribute( QStringLiteral( 
"value" ) );
 
 2513          QDomElement outAttributeElem = SIAInfoDoc.createElement( currentAttributeName );
 
 2514          QDomText outAttributeText = SIAInfoDoc.createTextNode( currentAttributeValue );
 
 2515          outAttributeElem.appendChild( outAttributeText );
 
 2516          rasterLayerElem.appendChild( outAttributeElem );
 
 2518        if ( !attributeList.isEmpty() )
 
 2520          SIAInfoDocElement.appendChild( rasterLayerElem );
 
 2526        QSet<QString> layerPropertyAttributes;
 
 2527        QString currentLayerId = currentLayerElem.attribute( QStringLiteral( 
"id" ) );
 
 2528        if ( !currentLayerId.isEmpty() )
 
 2533            QString WMSPropertyAttributesString = currentLayer->
customProperty( QStringLiteral( 
"WMSPropertyAttributes" ) ).toString();
 
 2534            if ( !WMSPropertyAttributesString.isEmpty() )
 
 2536              QStringList propertyList = WMSPropertyAttributesString.split( QStringLiteral( 
"//" ) );
 
 2537              for ( 
auto propertyIt = propertyList.constBegin() ; propertyIt != propertyList.constEnd(); ++propertyIt )
 
 2539                layerPropertyAttributes.insert( *propertyIt );
 
 2545        QDomElement propertyRefChild; 
 
 2546        for ( 
int j = 0; j < featureList.size(); ++j )
 
 2548          QDomElement SIAFeatureElem = SIAInfoDoc.createElement( currentLayerName );
 
 2549          currentFeatureElem = featureList.at( j ).toElement();
 
 2550          QDomNodeList attributeList = currentFeatureElem.elementsByTagName( QStringLiteral( 
"Attribute" ) );
 
 2552          for ( 
int k = 0; k < attributeList.size(); ++k )
 
 2554            currentAttributeElem = attributeList.at( k ).toElement();
 
 2555            currentAttributeName = currentAttributeElem.attribute( QStringLiteral( 
"name" ) );
 
 2556            currentAttributeValue = currentAttributeElem.attribute( QStringLiteral( 
"value" ) );
 
 2557            if ( layerPropertyAttributes.contains( currentAttributeName ) )
 
 2559              QDomElement propertyElem = SIAInfoDoc.createElement( QStringLiteral( 
"property" ) );
 
 2560              QDomElement identifierElem = SIAInfoDoc.createElement( QStringLiteral( 
"identifier" ) );
 
 2561              QDomText identifierText = SIAInfoDoc.createTextNode( currentAttributeName );
 
 2562              identifierElem.appendChild( identifierText );
 
 2563              QDomElement valueElem = SIAInfoDoc.createElement( QStringLiteral( 
"value" ) );
 
 2564              QDomText valueText = SIAInfoDoc.createTextNode( currentAttributeValue );
 
 2565              valueElem.appendChild( valueText );
 
 2566              propertyElem.appendChild( identifierElem );
 
 2567              propertyElem.appendChild( valueElem );
 
 2568              if ( propertyRefChild.isNull() )
 
 2570                SIAFeatureElem.insertBefore( propertyElem, QDomNode() );
 
 2571                propertyRefChild = propertyElem;
 
 2575                SIAFeatureElem.insertAfter( propertyElem, propertyRefChild );
 
 2580              QDomElement SIAAttributeElem = SIAInfoDoc.createElement( currentAttributeName );
 
 2581              QDomText SIAAttributeText = SIAInfoDoc.createTextNode( currentAttributeValue );
 
 2582              SIAAttributeElem.appendChild( SIAAttributeText );
 
 2583              SIAFeatureElem.appendChild( SIAAttributeElem );
 
 2586          SIAInfoDocElement.appendChild( SIAFeatureElem );
 
 2593  QByteArray QgsRenderer::convertFeatureInfoToHtml( 
const QDomDocument &doc )
 const 
 2596    QString featureInfoString = QStringLiteral( 
"    <!DOCTYPE html>" );
 
 2599      featureInfoString.append( QStringLiteral( R
"HTML( 
 2602      <title>Information</title> 
 2603      <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> 
 2606          font-family: "Open Sans", "Calluna Sans", "Gill Sans MT", "Calibri", "Trebuchet MS", sans-serif; 
 2613          border: 1px solid black; 
 2614          border-collapse: collapse; 
 2635    const QDomNodeList layerList = doc.elementsByTagName( QStringLiteral( 
"Layer" ) );
 
 2638    for ( 
int i = 0; i < layerList.size(); ++i )
 
 2640      const QDomElement layerElem = layerList.at( i ).toElement();
 
 2643      const QDomNodeList featureNodeList = layerElem.elementsByTagName( QStringLiteral( 
"Feature" ) );
 
 2644      const QDomElement currentFeatureElement;
 
 2646      if ( !featureNodeList.isEmpty() ) 
 
 2650          const QString featureInfoLayerTitleString = QStringLiteral( 
"  <div class='layer-title'>%1</div>" ).arg( layerElem.attribute( QStringLiteral( 
"title" ) ).toHtmlEscaped() );
 
 2651          featureInfoString.append( featureInfoLayerTitleString );
 
 2654        for ( 
int j = 0; j < featureNodeList.size(); ++j )
 
 2656          const QDomElement featureElement = featureNodeList.at( j ).toElement();
 
 2659            featureInfoString.append( QStringLiteral( R
"HTML( 
 2664          const QDomNodeList attributeNodeList = featureElement.elementsByTagName( QStringLiteral( 
"Attribute" ) );
 
 2665          for ( 
int k = 0; k < attributeNodeList.size(); ++k )
 
 2667            const QDomElement attributeElement = attributeNodeList.at( k ).toElement();
 
 2668            const QString name = attributeElement.attribute( QStringLiteral( 
"name" ) ).toHtmlEscaped();
 
 2669            QString value = attributeElement.attribute( QStringLiteral( 
"value" ) );
 
 2670            if ( name != QLatin1String( 
"maptip" ) )
 
 2672              value = value.toHtmlEscaped();
 
 2677              const QString featureInfoAttributeString = QStringLiteral( R
"HTML( 
 2681        </tr>)HTML" ).arg( name, value ); 
 2683              featureInfoString.append( featureInfoAttributeString ); 
 2685            else if ( name == QLatin1String( 
"maptip" ) )
 
 2687              featureInfoString.append( QStringLiteral( R
"HTML( 
 2688      %1)HTML" ).arg( value ) ); 
 2695            featureInfoString.append( QStringLiteral( R
"HTML( 
 2702        const QDomNodeList attributeNodeList = layerElem.elementsByTagName( QStringLiteral( 
"Attribute" ) );
 
 2705        if ( !attributeNodeList.isEmpty() )
 
 2709            const QString featureInfoLayerTitleString = QStringLiteral( 
"  <div class='layer-title'>%1</div>" ).arg( layerElem.attribute( QStringLiteral( 
"title" ) ).toHtmlEscaped() );
 
 2710            featureInfoString.append( featureInfoLayerTitleString );
 
 2712            featureInfoString.append( QStringLiteral( R
"HTML( 
 2716          for ( 
int j = 0; j < attributeNodeList.size(); ++j )
 
 2718            const QDomElement attributeElement = attributeNodeList.at( j ).toElement();
 
 2719            const QString name = attributeElement.attribute( QStringLiteral( 
"name" ) ).toHtmlEscaped();
 
 2720            QString value = attributeElement.attribute( QStringLiteral( 
"value" ) );
 
 2721            if ( value.isEmpty() )
 
 2723              value = QStringLiteral( 
"no data" );
 
 2725            if ( name != QLatin1String( 
"maptip" ) )
 
 2727              value = value.toHtmlEscaped();
 
 2732              const QString featureInfoAttributeString = QStringLiteral( R
"HTML( 
 2736        </tr>)HTML" ).arg( name, value ); 
 2739              featureInfoString.append( featureInfoAttributeString ); 
 2741            else if ( name == QLatin1String( 
"maptip" ) )
 
 2743              featureInfoString.append( QStringLiteral( R
"HTML( 
 2744      %1)HTML" ).arg( value ) ); 
 2751            featureInfoString.append( QStringLiteral( R
"HTML( 
 2761      featureInfoString.append( QStringLiteral( R
"HTML( 
 2765    return featureInfoString.toUtf8();
 
 2768  QByteArray QgsRenderer::convertFeatureInfoToText( 
const QDomDocument &doc )
 const 
 2770    QString featureInfoString;
 
 2773    featureInfoString.append( 
"GetFeatureInfo results\n" );
 
 2774    featureInfoString.append( 
"\n" );
 
 2776    QDomNodeList layerList = doc.elementsByTagName( QStringLiteral( 
"Layer" ) );
 
 2779    for ( 
int i = 0; i < layerList.size(); ++i )
 
 2781      QDomElement layerElem = layerList.at( i ).toElement();
 
 2783      featureInfoString.append( 
"Layer '" + layerElem.attribute( QStringLiteral( 
"name" ) ) + 
"'\n" );
 
 2786      QDomNodeList featureNodeList = layerElem.elementsByTagName( QStringLiteral( 
"Feature" ) );
 
 2787      QDomElement currentFeatureElement;
 
 2789      if ( !featureNodeList.isEmpty() ) 
 
 2791        for ( 
int j = 0; j < featureNodeList.size(); ++j )
 
 2793          QDomElement featureElement = featureNodeList.at( j ).toElement();
 
 2794          featureInfoString.append( 
"Feature " + featureElement.attribute( QStringLiteral( 
"id" ) ) + 
"\n" );
 
 2797          QDomNodeList attributeNodeList = featureElement.elementsByTagName( QStringLiteral( 
"Attribute" ) );
 
 2798          for ( 
int k = 0; k < attributeNodeList.size(); ++k )
 
 2800            QDomElement attributeElement = attributeNodeList.at( k ).toElement();
 
 2801            featureInfoString.append( attributeElement.attribute( QStringLiteral( 
"name" ) ) + 
" = '" +
 
 2802                                      attributeElement.attribute( QStringLiteral( 
"value" ) ) + 
"'\n" );
 
 2808        QDomNodeList attributeNodeList = layerElem.elementsByTagName( QStringLiteral( 
"Attribute" ) );
 
 2809        for ( 
int j = 0; j < attributeNodeList.size(); ++j )
 
 2811          QDomElement attributeElement = attributeNodeList.at( j ).toElement();
 
 2812          QString value = attributeElement.attribute( QStringLiteral( 
"value" ) );
 
 2813          if ( value.isEmpty() )
 
 2815            value = QStringLiteral( 
"no data" );
 
 2817          featureInfoString.append( attributeElement.attribute( QStringLiteral( 
"name" ) ) + 
" = '" +
 
 2822      featureInfoString.append( 
"\n" );
 
 2825    return featureInfoString.toUtf8();
 
 2828  QByteArray QgsRenderer::convertFeatureInfoToJson( 
const QList<QgsMapLayer *> &layers, 
const QDomDocument &doc, 
const QgsCoordinateReferenceSystem &destCRS )
 const 
 2832      { 
"type", 
"FeatureCollection" },
 
 2833      { 
"features", json::array() },
 
 2837    const QDomNodeList layerList = doc.elementsByTagName( QStringLiteral( 
"Layer" ) );
 
 2838    for ( 
int i = 0; i < layerList.size(); ++i )
 
 2840      const QDomElement layerElem = layerList.at( i ).toElement();
 
 2841      const QString layerName = layerElem.attribute( QStringLiteral( 
"name" ) );
 
 2846        if ( mContext.
layerNickname( *l ).compare( layerName ) == 0 )
 
 2862        const QDomNodeList featuresNode = layerElem.elementsByTagName( QStringLiteral( 
"Feature" ) );
 
 2863        if ( featuresNode.isEmpty() )
 
 2866        QMap<QgsFeatureId, QString> fidMap;
 
 2868        for ( 
int j = 0; j < featuresNode.size(); ++j )
 
 2870          const QDomElement featureNode = featuresNode.at( j ).toElement();
 
 2871          const QString fid = featureNode.attribute( QStringLiteral( 
"id" ) );
 
 2874          if ( expression.isEmpty() )
 
 2876            feature = vl->
getFeature( fid.toLongLong() );
 
 2885          fidMap.insert( feature.
id(), fid );
 
 2890            const QDomNodeList attrs = featureNode.elementsByTagName( 
"Attribute" );
 
 2891            for ( 
int k = 0; k < attrs.count(); k++ )
 
 2893              const QDomElement elm = attrs.at( k ).toElement();
 
 2894              if ( elm.attribute( QStringLiteral( 
"name" ) ).compare( 
"geometry" ) == 0 )
 
 2896                wkt = elm.attribute( 
"value" );
 
 2901            if ( ! wkt.isEmpty() )
 
 2907          features << feature;
 
 2910          if ( !attributes.isEmpty() )
 
 2913          const QDomNodeList attributesNode = featureNode.elementsByTagName( QStringLiteral( 
"Attribute" ) );
 
 2914          for ( 
int k = 0; k < attributesNode.size(); ++k )
 
 2916            const QDomElement attributeElement = attributesNode.at( k ).toElement();
 
 2917            const QString fieldName = attributeElement.
attribute( QStringLiteral( 
"name" ) );
 
 2919            attributes << feature.fieldNameIndex( fieldName );
 
 2925        exporter.setAttributeDisplayName( 
true );
 
 2926        exporter.setAttributes( attributes );
 
 2927        exporter.setIncludeGeometry( withGeometry );
 
 2928        exporter.setTransformGeometries( 
false );
 
 2932        for ( 
const auto &feature : std::as_const( features ) )
 
 2934          const QString 
id = QStringLiteral( 
"%1.%2" ).arg( layerName ).arg( fidMap.value( feature.id() ) );
 
 2935          json[
"features"].push_back( exporter.exportFeatureToJsonObject( feature, QVariantMap(), 
id ) );
 
 2940        auto properties = json::object();
 
 2941        const QDomNodeList attributesNode = layerElem.elementsByTagName( QStringLiteral( 
"Attribute" ) );
 
 2942        for ( 
int j = 0; j < attributesNode.size(); ++j )
 
 2944          const QDomElement attrElmt = attributesNode.at( j ).toElement();
 
 2945          const QString name = attrElmt.attribute( QStringLiteral( 
"name" ) );
 
 2947          QString value = attrElmt.attribute( QStringLiteral( 
"value" ) );
 
 2948          if ( value.isEmpty() )
 
 2950            value = QStringLiteral( 
"null" );
 
 2953          properties[name.toStdString()] = value.toStdString();
 
 2956        json[
"features"].push_back(
 
 2958          {
"type", 
"Feature" },
 
 2959          {
"id", layerName.toStdString() },
 
 2960          {
"properties", properties }
 
 2966    return QByteArray::fromStdString( json.dump( 2 ) );
 
 2968    return QByteArray::fromStdString( json.dump() );
 
 2972  QDomElement QgsRenderer::createFeatureGML(
 
 2981    QStringList *attributes )
 const 
 2984    QDomElement typeNameElement = doc.createElement( 
"qgs:" + 
typeName  );
 
 2991    typeNameElement.setAttribute( QStringLiteral( 
"fid" ), QStringLiteral( 
"%1.%2" ).arg( 
typeName, fid ) );
 
 2994    if ( layer && layer->
crs() != 
crs )
 
 3027      QDomElement bbElem = doc.createElement( QStringLiteral( 
"gml:boundedBy" ) );
 
 3028      QDomElement boxElem;
 
 3040        boxElem.setAttribute( QStringLiteral( 
"srsName" ), 
crs.
authid() );
 
 3042      bbElem.appendChild( boxElem );
 
 3043      typeNameElement.appendChild( bbElem );
 
 3055      QDomElement geomElem = doc.createElement( QStringLiteral( 
"qgs:geometry" ) );
 
 3056      QDomElement gmlElem;
 
 3066      if ( !gmlElem.isNull() )
 
 3070          gmlElem.setAttribute( QStringLiteral( 
"srsName" ), 
crs.
authid() );
 
 3072        geomElem.appendChild( gmlElem );
 
 3073        typeNameElement.appendChild( geomElem );
 
 3080    for ( 
int i = 0; i < fields.
count(); ++i )
 
 3082      QString attributeName = fields.
at( i ).
name();
 
 3089      if ( attributes && !attributes->contains( attributeName ) )
 
 3094      QDomElement fieldElem = doc.createElement( 
"qgs:" + attributeName.replace( 
' ', 
'_' ) );
 
 3095      QString fieldTextString = featureAttributes.at( i ).toString();
 
 3100      QDomText fieldText = doc.createTextNode( fieldTextString );
 
 3101      fieldElem.appendChild( fieldText );
 
 3102      typeNameElement.appendChild( fieldElem );
 
 3113        QDomElement fieldElem = doc.createElement( QStringLiteral( 
"qgs:maptip" ) );
 
 3114        QDomText maptipText = doc.createTextNode( fieldTextString );
 
 3115        fieldElem.appendChild( maptipText );
 
 3116        typeNameElement.appendChild( fieldElem );
 
 3120    return typeNameElement;
 
 3123  QString QgsRenderer::replaceValueMapAndRelation( 
QgsVectorLayer *vl, 
int idx, 
const QVariant &attributeVal )
 
 3127    QString value( fieldFormatter->
representValue( vl, idx, setup.
config(), QVariant(), attributeVal ) );
 
 3129    if ( setup.
config().value( QStringLiteral( 
"AllowMulti" ) ).toBool() && value.startsWith( QLatin1Char( 
'{' ) ) && value.endsWith( QLatin1Char( 
'}' ) ) )
 
 3131      value = value.mid( 1, value.size() - 2 );
 
 3143    double mapUnitTolerance = 0.0;
 
 3153        mapUnitTolerance = mapSettings.
extent().
width() / 400.0;
 
 3165        mapUnitTolerance = mapSettings.
extent().
width() / 200.0;
 
 3177        mapUnitTolerance = mapSettings.
extent().
width() / 100.0;
 
 3181    QgsRectangle mapRectangle( infoPoint.
x() - mapUnitTolerance, infoPoint.
y() - mapUnitTolerance,
 
 3182                               infoPoint.
x() + mapUnitTolerance, infoPoint.
y() + mapUnitTolerance );
 
 3186  QList<QgsMapLayer *> QgsRenderer::highlightLayers( QList<QgsWmsParametersHighlightLayer> params )
 
 3188    QList<QgsMapLayer *> highlightLayers;
 
 3191    QString 
crs = mWmsParameters.
crs();
 
 3192    for ( 
const QgsWmsParametersHighlightLayer ¶m : params )
 
 3195      QDomDocument sldDoc;
 
 3199      if ( !sldDoc.setContent( param.mSld, 
true, &errorMsg, &errorLine, &errorColumn ) )
 
 3211      std::unique_ptr<QgsFeatureRenderer> renderer;
 
 3212      QDomElement el = sldDoc.documentElement();
 
 3223      if ( ! param.mLabel.isEmpty() )
 
 3225        url += 
"&field=label:string";
 
 3230      std::unique_ptr<QgsVectorLayer> layer = std::make_unique<QgsVectorLayer>( url, param.mName, QLatin1String( 
"memory" ), options );
 
 3231      if ( !layer->isValid() )
 
 3238      if ( ! param.mLabel.isEmpty() )
 
 3240        fet.setAttribute( 0, param.mLabel );
 
 3248        palSettings.
dist = param.mLabelDistance;
 
 3257        switch ( param.mGeom.type() )
 
 3270              QVariant x( pt.
x() );
 
 3273              QVariant y( pt.
y() );
 
 3290            QVariant x( pt.
x() );
 
 3294            QVariant y( pt.
y() );
 
 3298            QVariant hali( 
"Center" );
 
 3302            QVariant vali( 
"Half" );
 
 3317        if ( param.mColor.isValid() )
 
 3319          textFormat.
setColor( param.mColor );
 
 3322        if ( param.mSize > 0 )
 
 3324          textFormat.
setSize( param.mSize );
 
 3332        if ( ! param.mFont.isEmpty() )
 
 3334          textFormat.
setFont( param.mFont );
 
 3337        if ( param.mBufferColor.isValid() )
 
 3339          bufferSettings.
setColor( param.mBufferColor );
 
 3342        if ( param.mBufferSize > 0 )
 
 3345          bufferSettings.
setSize( 
static_cast<double>( param.mBufferSize ) );
 
 3352        layer->setLabeling( simpleLabeling );
 
 3353        layer->setLabelsEnabled( 
true );
 
 3355      fet.setGeometry( param.mGeom );
 
 3359      layer->setRenderer( renderer.release() );
 
 3362      if ( layer->isValid() )
 
 3364        highlightLayers.append( layer.release() );
 
 3368    mTemporaryLayers.append( highlightLayers );
 
 3369    return highlightLayers;
 
 3372  void QgsRenderer::removeTemporaryLayers()
 
 3374    qDeleteAll( mTemporaryLayers );
 
 3375    mTemporaryLayers.clear();
 
 3378  QPainter *QgsRenderer::layersRendering( 
const QgsMapSettings &mapSettings, QImage &image )
 const 
 3380    QPainter *painter = 
nullptr;
 
 3384#ifdef HAVE_SERVER_PYTHON_PLUGINS 
 3385    mContext.accessControl()->resolveFilterFeatures( mapSettings.
layers() );
 
 3390    renderJob.render( mapSettings, &image, mContext.
socketFeedback() );
 
 3391    painter = renderJob.takePainter();
 
 3393    if ( !renderJob.errors().isEmpty() )
 
 3397      QString layerWMSName;
 
 3404      QString errorMessage = QStringLiteral( 
"Rendering error : '%1'" ).arg( e.
message );
 
 3405      if ( ! layerWMSName.isEmpty() )
 
 3407        errorMessage = QStringLiteral( 
"Rendering error : '%1' in layer '%2'" ).arg( e.
message, layerWMSName );
 
 3415  void QgsRenderer::setLayerOpacity( 
QgsMapLayer *layer, 
int opacity )
 const 
 3417    if ( opacity >= 0 && opacity <= 255 )
 
 3419      switch ( layer->
type() )
 
 3438          rasterRenderer->
setOpacity( opacity / 255. );
 
 3460  void QgsRenderer::setLayerFilter( 
QgsMapLayer *layer, 
const QList<QgsWmsParametersFilter> &filters )
 
 3465      QgsVectorLayer *filteredLayer = qobject_cast<QgsVectorLayer *>( layer );
 
 3466      QStringList expList;
 
 3467      for ( 
const QgsWmsParametersFilter &filter : filters )
 
 3472          QDomDocument filterXml;
 
 3474          if ( !filterXml.setContent( filter.mFilter, 
true, &errorMsg ) )
 
 3477                                          QStringLiteral( 
"Filter string rejected. Error message: %1. The XML string was: %2" ).arg( errorMsg, filter.mFilter ) );
 
 3479          QDomElement filterElem = filterXml.firstChildElement();
 
 3484            expList << filterExp->dump();
 
 3490          if ( !testFilterStringSafety( filter.mFilter ) )
 
 3492            throw QgsSecurityException( QStringLiteral( 
"The filter string %1" 
 3493                                        " has been rejected because of security reasons." 
 3494                                        " Note: Text strings have to be enclosed in single or double quotes." 
 3495                                        " A space between each word / special character is mandatory." 
 3496                                        " Allowed Keywords and special characters are" 
 3497                                        " IS,NOT,NULL,AND,OR,IN,=,<,>=,>,>=,!=,',',(,),DMETAPHONE,SOUNDEX%2." 
 3498                                        " Not allowed are semicolons in the filter expression." ).arg(
 
 3501                                          mContext.settings().allowedExtraSqlTokens().join( 
',' ).prepend( 
',' ) ) );
 
 3504          QString newSubsetString = filter.mFilter;
 
 3507            newSubsetString.prepend( 
") AND (" );
 
 3508            newSubsetString.append( 
")" );
 
 3509            newSubsetString.prepend( filteredLayer->
subsetString() );
 
 3510            newSubsetString.prepend( 
"(" );
 
 3514            QgsMessageLog::logMessage( QStringLiteral( 
"Error setting subset string from filter for layer %1, filter: %2" ).arg( layer->
name(), newSubsetString ),
 
 3515                                       QStringLiteral( 
"Server" ),
 
 3518                                          QStringLiteral( 
"Filter not valid for layer %1: check the filter syntax and the field names." ).arg( layer->
name() ) );
 
 3524      expList.append( dimensionFilter( filteredLayer ) );
 
 3528      if ( expList.size() == 1 )
 
 3532      else if ( expList.size() > 1 )
 
 3534        exp = QStringLiteral( 
"( %1 )" ).arg( expList.join( QLatin1String( 
" ) AND ( " ) ) );
 
 3536      if ( !exp.isEmpty() )
 
 3538        std::unique_ptr<QgsExpression> expression( 
new QgsExpression( exp ) );
 
 3541          mFeatureFilter.
setFilter( filteredLayer, *expression );
 
 3547  QStringList QgsRenderer::dimensionFilter( 
QgsVectorLayer *layer )
 const 
 3549    QStringList expList;
 
 3552    const QList<QgsMapLayerServerProperties::WmsDimensionInfo> wmsDims = serverProperties->
wmsDimensions();
 
 3553    if ( wmsDims.isEmpty() )
 
 3568      if ( fieldIndex == -1 )
 
 3573      int endFieldIndex = -1;
 
 3574      if ( !dim.endFieldName.isEmpty() )
 
 3576        endFieldIndex = layer->
fields().
indexOf( dim.endFieldName );
 
 3577        if ( endFieldIndex == -1 )
 
 3583      if ( !dimParamValues.contains( dim.name.toUpper() ) )
 
 3587        if ( dim.defaultDisplayType == QgsMapLayerServerProperties::WmsDimensionInfo::AllValues )
 
 3591        else if ( dim.defaultDisplayType == QgsMapLayerServerProperties::WmsDimensionInfo::ReferenceValue )
 
 3593          defValue = dim.referenceValue;
 
 3598          QSet<QVariant> uniqueValues = layer->
uniqueValues( fieldIndex );
 
 3599          if ( endFieldIndex != -1 )
 
 3601            uniqueValues.unite( layer->
uniqueValues( endFieldIndex ) );
 
 3604          QList<QVariant> values = qgis::setToList( uniqueValues );
 
 3605          std::sort( values.begin(), values.end() );
 
 3606          if ( dim.defaultDisplayType == QgsMapLayerServerProperties::WmsDimensionInfo::MinValue )
 
 3608            defValue = values.first();
 
 3610          else if ( dim.defaultDisplayType == QgsMapLayerServerProperties::WmsDimensionInfo::MaxValue )
 
 3612            defValue = values.last();
 
 3616        if ( endFieldIndex == -1 )
 
 3622          QStringList expElems;
 
 3627          expList << expElems.join( 
' ' );
 
 3635        QString dimParamValue = dimParamValues[dim.name.toUpper()];
 
 3637        QStringList dimExplist;
 
 3639        QStringList dimValues = dimParamValue.split( 
',' );
 
 3640        for ( 
int i = 0; i < dimValues.size(); ++i )
 
 3642          QString dimValue = dimValues[i];
 
 3644          if ( dimValue.size() > 1 )
 
 3646            dimValue = dimValue.trimmed();
 
 3649          if ( dimValue.contains( 
'/' ) )
 
 3651            QStringList rangeValues = dimValue.split( 
'/' );
 
 3653            if ( rangeValues.size() != 2 )
 
 3658            QVariant rangeMin = QVariant( rangeValues[0] );
 
 3659            QVariant rangeMax = QVariant( rangeValues[1] );
 
 3670            QStringList expElems;
 
 3671            if ( endFieldIndex == -1 )
 
 3691                       << QStringLiteral( 
")" );
 
 3693            dimExplist << expElems.join( 
' ' );
 
 3697            QVariant dimVariant = QVariant( dimValue );
 
 3703            if ( endFieldIndex == -1 )
 
 3712              QStringList expElems;
 
 3717              dimExplist << expElems.join( 
' ' );
 
 3722        if ( dimExplist.size() == 1 )
 
 3724          expList << dimExplist;
 
 3726        else if ( dimExplist.size() > 1 )
 
 3728          expList << QStringLiteral( 
"( %1 )" ).arg( dimExplist.join( QLatin1String( 
" ) OR ( " ) ) );
 
 3735  void QgsRenderer::setLayerSelection( 
QgsMapLayer *layer, 
const QStringList &fids )
 const 
 3745      if ( selectedIds.empty() )
 
 3756  void QgsRenderer::setLayerAccessControlFilter( 
QgsMapLayer *layer )
 const 
 3758#ifdef HAVE_SERVER_PYTHON_PLUGINS 
 3776  void QgsRenderer::annotationsRendering( QPainter *painter, 
const QgsMapSettings &mapSettings )
 const 
 3779    const QList< QgsAnnotation * > annotations = annotationManager->
annotations();
 
 3789      if ( !annotation || !annotation->isVisible() )
 
 3795      if ( annotation->hasFixedMapPosition() )
 
 3797        QgsPointXY mapPos = annotation->mapPosition();
 
 3798        if ( mapSettings.
destinationCrs() != annotation->mapPositionCrs() )
 
 3803            mapPos = coordTransform.transform( mapPos );
 
 3811        offsetX = devicePos.
x();
 
 3812        offsetY = devicePos.
y();
 
 3816        const QPointF relativePos = annotation->relativePosition();
 
 3817        offsetX = mapSettings.
outputSize().width() * relativePos.x();
 
 3818        offsetY = mapSettings.
outputSize().height() * relativePos.y();
 
 3822      painter->translate( offsetX, offsetY );
 
 3823      annotation->render( renderContext );
 
 3828  QImage *QgsRenderer::scaleImage( 
const QImage *image )
 const 
 3833    QImage *scaledImage = 
nullptr;
 
 3834    const int width = mWmsParameters.
widthAsInt();
 
 3836    if ( width != image->width() || height != image->height() )
 
 3838      scaledImage = 
new QImage( image->scaled( width, height, Qt::IgnoreAspectRatio, Qt::SmoothTransformation ) );
 
 3844  void QgsRenderer::handlePrintErrors( 
const QgsLayout *layout )
 const 
 3850    QList< QgsLayoutItemMap * > mapList;
 
 3853    QList< QgsLayoutItemMap * >::const_iterator mapIt = mapList.constBegin();
 
 3854    for ( ; mapIt != mapList.constEnd(); ++mapIt )
 
 3856      if ( !( *mapIt )->renderingErrors().isEmpty() )
 
 3868    for ( 
auto layer : layers )
 
 3881          setLayerOpacity( layer, param.
mOpacity );
 
 3888        setLayerSld( layer, mContext.
sld( *layer ) );
 
 3892        setLayerStyle( layer, mContext.
style( *layer ) );
 
 3897        setLayerOpacity( layer, param.
mOpacity );
 
 3902        setLayerFilter( layer, param.
mFilter );
 
 3907        setLayerAccessControlFilter( layer );
 
 3912        setLayerSelection( layer, param.
mSelection );
 
 3917        updateExtent( layer, *settings );
 
 
 3927  void QgsRenderer::setLayerStyle( 
QgsMapLayer *layer, 
const QString &style )
 const 
 3929    if ( style.isEmpty() )
 
 3938                                    QStringLiteral( 
"Style '%1' does not exist for layer '%2'" ).arg( style, layer->
name() ) );
 
 3942  void QgsRenderer::setLayerSld( 
QgsMapLayer *layer, 
const QDomElement &sld )
 const 
 3947    QString sldStyleName = 
"__sld_style";
 
 3948    while ( styles.contains( sldStyleName ) )
 
 3950      sldStyleName.append( 
'@' );
 
 3963    if ( !mWmsParameters.
bbox().isEmpty() )
 
 3967      std::unique_ptr<QImage> tmp( createImage( mContext.
mapSize( 
false ) ) );
 
 3968      configureMapSettings( tmp.get(), mapSettings );
 
The Qgis class provides global constants for use throughout the application.
 
static QString version()
Version string.
 
@ MapOrientation
Signifies that the AboveLine and BelowLine flags should respect the map's orientation rather than the...
 
@ AboveLine
Labels can be placed above a line feature. Unless MapOrientation is also specified this mode respects...
 
@ Millimeters
Millimeters.
 
LabelPlacement
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'...
 
@ DragAndDrop
"Drag and drop" layout. Needs to be configured.
 
@ 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.
 
@ NoFlags
No flags are set.
 
@ Warning
Warning message.
 
@ Info
Information message.
 
QFlags< LabelLinePlacementFlag > LabelLinePlacementFlags
Line placement flags, which control how candidates are generated for a linear feature.
 
@ ShowRuleDetails
If set, the rule expression of a rule based renderer legend item will be added to the JSON.
 
@ IdentifyValue
Numerical values.
 
@ IdentifyFeature
WMS GML -> feature.
 
@ Group
Composite group layer. Added in QGIS 3.24.
 
@ Plugin
Plugin based layer.
 
@ TiledScene
Tiled scene layer. Added in QGIS 3.34.
 
@ Annotation
Contains freeform, georeferenced annotations. Added in QGIS 3.16.
 
@ VectorTile
Vector tile layer. Added in QGIS 3.14.
 
@ Mesh
Mesh layer. Added in QGIS 3.2.
 
@ PointCloud
Point cloud layer. Added in QGIS 3.18.
 
@ LosslessImageRendering
Render images losslessly whenever possible, instead of the default lossy jpeg rendering used for some...
 
@ Antialiasing
Use antialiasing while drawing.
 
@ HighQualityImageTransforms
Enable high quality image transformations, which results in better appearance of scaled or rotated ra...
 
@ RenderBlocking
Render and load remote sources in the same thread to ensure rendering remote sources (svg and images)...
 
QFlags< LegendJsonRenderFlag > LegendJsonRenderFlags
 
RasterIdentifyFormat
Raster identify formats.
 
@ Feature
WMS GML/JSON -> feature.
 
@ Value
Numerical pixel value.
 
@ HideFromWms
Field is not available if layer is served as WMS from QGIS server.
 
@ AllowOverlapIfRequired
Avoids overlapping labels when possible, but permit overlaps if labels for features cannot otherwise ...
 
@ Reverse
Reverse/inverse transform (from destination to source)
 
@ RenderMapTile
Draw map such that there are no problems between adjacent tiles.
 
@ RecordProfile
Enable run-time profiling while rendering (since QGIS 3.34)
 
@ 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)...
 
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.
 
Qgis::WkbType wkbType() const
Returns the WKB type of the geometry.
 
Abstract base class - its implementations define different approaches to the labeling of a vector lay...
 
virtual void multiplyOpacity(double opacityFactor)
Multiply opacity by opacityFactor.
 
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.
 
This is a container for attribute editors, used to group them visually in the attribute form if it is...
 
QList< QgsAttributeEditorElement * > children() const
Gets a list of the children elements of this container.
 
This is an abstract base class for any elements of a drag and drop form.
 
QString name() const
Returns the name of this element.
 
This element will load a field's widget onto the form.
 
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.
 
Qgis::DistanceUnit mapUnits
 
bool hasAxisInverted() const
Returns whether the axis order is inverted for the CRS compared to the order east/north (longitude/la...
 
Custom exception class for Coordinate Reference System related exceptions.
 
A server filter to apply a dimension filter to a request.
 
A general purpose distance and area calculator, capable of performing ellipsoid based calculations.
 
void setSourceCrs(const QgsCoordinateReferenceSystem &crs, const QgsCoordinateTransformContext &context)
Sets source spatial reference system crs.
 
bool setEllipsoid(const QString &ellipsoid)
Sets the ellipsoid by its acronym.
 
@ FlagHairlineWidthExport
 
@ FlagNoMText
Export text as TEXT elements. If not set, text will be exported as MTEXT elements.
 
Defines a QGIS exception class.
 
Single scope for storing variables and functions for use within a QgsExpressionContext.
 
void addVariable(const QgsExpressionContextScope::StaticVariable &variable)
Adds a variable into the context scope.
 
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").
 
bool prepare(const QgsExpressionContext *context)
Gets the expression ready for evaluation - find out column indexes.
 
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, QMetaType::Type fieldType=QMetaType::Type::UnknownType)
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)
 
QVariant evaluate()
Evaluate the feature and return the result.
 
bool isValid() const
Checks if this expression is valid.
 
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)
Fetch next feature and stores in f, returns true on success.
 
@ MoreSymbolsPerFeature
May use more than one symbol to render a feature: symbolsForFeature() will return them.
 
static QgsFeatureRenderer * loadSld(const QDomNode &node, Qgis::GeometryType geomType, QString &errorMessage)
Create a new renderer according to the information contained in the UserStyle element of a SLD style ...
 
virtual QgsFeatureRenderer * clone() const =0
Create a deep copy of this renderer.
 
This class wraps a request for features to a vector layer (or directly its vector data provider).
 
QgsFeatureRequest & setFlags(Qgis::FeatureRequestFlags flags)
Sets flags that affect how features will be fetched.
 
Qgis::FeatureRequestFlags flags() const
Returns the flags which affect how features are fetched.
 
QgsFeatureRequest & setSubsetOfAttributes(const QgsAttributeList &attrs)
Set a subset of attributes that will be fetched.
 
QgsExpression * filterExpression() const
Returns the filter expression (if set).
 
QgsFeatureRequest & setFilterExpression(const QString &expression)
Set the filter expression.
 
QgsCoordinateTransformContext transformContext() const
Returns the transform context, for use when a destinationCrs() has been set and reprojection is requi...
 
const QgsFeatureIds & filterFids() const
Returns the feature IDs that should be fetched.
 
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...
 
Q_INVOKABLE 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.
 
Q_INVOKABLE QVariant attribute(const QString &name) const
Lookup attribute value by attribute name.
 
void setGeometry(const QgsGeometry &geometry)
Set the feature's geometry.
 
bool isCanceled() const
Tells whether the operation has been canceled already.
 
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.
 
Qgis::FieldConfigurationFlags configurationFlags
 
Container of fields for a vector layer.
 
bool append(const QgsField &field, Qgis::FieldOrigin origin=Qgis::FieldOrigin::Provider, int originIndex=-1)
Appends a field.
 
Q_INVOKABLE int indexFromName(const QString &fieldName) const
Gets the field index from the field name.
 
Q_INVOKABLE int indexOf(const QString &fieldName) const
Gets the field index from the field name.
 
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.
 
QgsGeometry pointOnSurface() const
Returns a point guaranteed to lie on the surface of a geometry.
 
Qgis::GeometryOperationResult transform(const QgsCoordinateTransform &ct, Qgis::TransformDirection direction=Qgis::TransformDirection::Forward, bool transformZ=false)
Transforms this geometry as described by the coordinate transform ct.
 
const QgsAbstractGeometry * constGet() const
Returns a non-modifiable (const) reference to the underlying abstract geometry primitive.
 
static Q_INVOKABLE 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.
 
static QgsGeometry fromPointXY(const QgsPointXY &point)
Creates a new geometry from a QgsPointXY object.
 
void set(QgsAbstractGeometry *geometry)
Sets the underlying geometry store.
 
QgsRectangle boundingBox() const
Returns the bounding box of the geometry.
 
Q_INVOKABLE QString asWkt(int precision=17) const
Exports the geometry to WKT.
 
Handles exporting QgsFeature features to GeoJSON features.
 
static void addCrsInfo(json &value, const QgsCoordinateReferenceSystem &crs)
Add crs information entry in json object regarding old GeoJSON specification format if it differs fro...
 
void setPlacementFlags(Qgis::LabelLinePlacementFlags flags)
Returns the line placement flags, which dictate how line labels can be placed above or below the line...
 
void setOverlapHandling(Qgis::LabelOverlapHandling handling)
Sets the technique used to handle overlapping labels.
 
void setAllowDegradedPlacement(bool allow)
Sets whether labels can be placed in inferior fallback positions if they cannot otherwise be placed.
 
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 QVariant data(int role) const =0
Returns data associated with the item. Must be implemented in derived class.
 
@ RuleKey
Rule key of the node (QString)
 
virtual QJsonObject exportSymbolToJson(const QgsLegendSettings &settings, const QgsRenderContext &context) const
Adds a symbol in base64 string within a JSON object with the key "icon".
 
QgsLayerTreeLayer * layerNode() const
Returns pointer to the parent layer node.
 
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.
 
static QgsLayerTreeLayer * toLayer(QgsLayerTreeNode *node)
Cast node to a layer.
 
Class used to render QgsLayout as an atlas, by iterating over the features from an associated vector ...
 
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.
 
bool first()
Seeks to the first feature, returning false if no feature was found.
 
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.
 
QgsVectorLayer * coverageLayer() const
Returns the coverage layer used for the atlas features.
 
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.
 
@ ManualHtml
HTML content is manually set for the item.
 
@ Url
Using this mode item fetches its content via a url.
 
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.
 
@ FlagLosslessImageRendering
Render images losslessly whenever possible, instead of the default lossy jpeg rendering used for some...
 
@ FlagDisableTiledRasterLayerRenders
If set, then raster layers will not be drawn as separate tiles. This may improve the appearance in ex...
 
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.
 
static QVector< double > predefinedScales(const QgsLayout *layout)
Returns a list of predefined scales associated with a layout.
 
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.
 
void setJsonRenderFlags(const Qgis::LegendJsonRenderFlags &jsonRenderFlags)
Sets the the JSON export flags to jsonRenderFlags.
 
Manages QGIS Server properties for a map layer.
 
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
 
QgsMapLayerServerProperties * serverProperties()
Returns QGIS Server Properties for the map layer.
 
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
 
QList< QgsMapLayer * > layers(bool expandGroupLayers=false) const
Returns the list of layers which will be rendered in the map.
 
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
 
void setDpiTarget(double dpi)
Sets the target dpi (dots per inch) to be taken into consideration when rendering.
 
void setOutputDpi(double dpi)
Sets the dpi (dots per inch) used for conversion between real world units (e.g.
 
const QgsMapToPixel & mapToPixel() const
 
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.
 
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.
 
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 setFlag(Qgis::MapSettingsFlag flag, bool on=true)
Enable or disable a particular flag (other flags are not affected)
 
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...
 
QList< QgsMapThemeCollection::MapThemeLayerRecord > layerRecords() const
Returns a list of records for all visible layer belonging to the theme.
 
QgsMapThemeCollection::MapThemeRecord mapThemeState(const QString &name) const
Returns the recorded state of a map theme.
 
Perform transforms between map coordinates and device coordinates.
 
double mapUnitsPerPixel() const
Returns the current map units per pixel.
 
QgsPointXY transform(const QgsPointXY &p) const
Transforms a 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.
 
const QgsLabelPlacementSettings & placementSettings() const
Returns the label placement settings.
 
void setFormat(const QgsTextFormat &format)
Sets the label text formatting settings, e.g., font settings, buffer settings, etc.
 
Qgis::LabelPlacement placement
Label placement mode.
 
QgsPropertyCollection & dataDefinedProperties()
Returns a reference to the label's property collection, used for data defined overrides.
 
int priority
Label priority.
 
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.
 
Property
Data definable properties.
 
@ PositionX
X-coordinate data defined label position.
 
@ LabelRotation
Label rotation.
 
@ PositionY
Y-coordinate data defined label position.
 
@ Vali
Vertical alignment for data defined label position (Bottom, Base, Half, Cap, Top)
 
@ Hali
Horizontal alignment for data defined label position (Left, Center, Right)
 
QString fieldName
Name of field (or an expression) to use for label text.
 
A class to represent a 2D point.
 
void setY(double y)
Sets the y value of the point.
 
void setX(double x)
Sets the x 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...
 
QgsMapThemeCollection * mapThemeCollection
 
QgsAnnotationManager * annotationManager()
Returns pointer to the project's annotation manager.
 
QgsProjectMetadata metadata
 
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.
 
QMap< QString, QgsMapLayer * > mapLayers(const bool validOnly=false) const
Returns a map of all registered layers by layer ID.
 
void setProperty(int key, const QgsProperty &property)
Adds a property to the collection and takes ownership of it.
 
virtual QgsRasterIdentifyResult identify(const QgsPointXY &point, Qgis::RasterIdentifyFormat 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.
 
virtual Qgis::RasterInterfaceCapabilities capabilities() const
Returns the capabilities supported by the interface.
 
Represents a raster layer.
 
QgsRasterRenderer * renderer() const
Returns the raster's renderer.
 
QString bandName(int bandNoInt) const
Returns the name of a band given its number.
 
QgsRasterDataProvider * dataProvider() override
Returns the source data provider.
 
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.
 
bool contains(const QgsRectangle &rect) const
Returns true when rectangle contains other rectangle.
 
double xMinimum() const
Returns the x minimum value (left side of rectangle).
 
double yMinimum() const
Returns the y minimum value (bottom side of rectangle).
 
double width() const
Returns the width of the rectangle.
 
double xMaximum() const
Returns the x maximum value (right side of rectangle).
 
double yMaximum() const
Returns the y maximum value (top side of 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 has no area.
 
double height() const
Returns the height of the rectangle.
 
void invert()
Swap x/y coordinates in the 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.
 
void setDistanceArea(const QgsDistanceArea &distanceArea)
A general purpose distance and area calculator, capable of performing ellipsoid based calculations.
 
void setScaleFactor(double factor)
Sets the scaling factor for the render to convert painter units to physical sizes.
 
QgsExpressionContext & expressionContext()
Gets the expression context.
 
const QgsRectangle & extent() const
When rendering a map layer, calling this method returns the "clipping" extent for the layer (in the l...
 
void setFeedback(QgsFeedback *feedback)
Attach a feedback object that can be queried regularly during rendering to check if rendering should ...
 
void setFlag(Qgis::RenderContextFlag flag, bool on=true)
Enable or disable a particular flag (other flags are not affected)
 
const QgsMapToPixel & mapToPixel() const
Returns the context's map to pixel transform, which transforms between map coordinates and device coo...
 
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...
 
void setPainter(QPainter *p)
Sets the destination QPainter for the render operation.
 
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.
 
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.
 
Bad request error API exception.
 
static QgsDateTimeRange parseTemporalDateTimeInterval(const QString &interval)
Parses a datetime interval and returns a QgsDateTimeRange.
 
Exception base class for server exceptions.
 
int maxThreads() const
Returns the maximum number of threads to use.
 
bool logProfile() const
Returns true if profile information has to be added to the logs, default value is false.
 
QStringList allowedExtraSqlTokens() const
Returns the list of strings that represent the allowed extra SQL tokens accepted as components of a f...
 
bool parallelRendering() const
Returns parallel rendering setting.
 
const QList< QgsServerWmsDimensionProperties::WmsDimensionInfo > wmsDimensions() const
Returns the QGIS Server WMS Dimension list.
 
static QString symbolProperties(QgsSymbol *symbol)
Returns a string representing the symbol.
 
Abstract base class for all rendered symbols.
 
@ Hidden
Hide task from GUI (since QGIS 3.26)
 
bool isActive() const
Returns true if the temporal property is active.
 
void setIsActive(bool active)
Sets whether the temporal property is active.
 
void setIsTemporal(bool enabled)
Sets whether the temporal range is enabled (i.e.
 
void setTemporalRange(const QgsDateTimeRange &range)
Sets the temporal range for the object.
 
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.
 
static bool isNull(const QVariant &variant, bool silenceNullWarnings=false)
Returns true if the specified variant should be considered a NULL value.
 
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.
 
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.
 
bool labelsEnabled() const
Returns whether the layer contains labels which are enabled and should be drawn.
 
QgsMapLayerTemporalProperties * temporalProperties() override
Returns the layer's temporal properties.
 
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.
 
Q_INVOKABLE void selectByExpression(const QString &expression, Qgis::SelectBehavior behavior=Qgis::SelectBehavior::SetSelection, QgsExpressionContext *context=nullptr)
Selects matching features using an expression.
 
const QgsAbstractVectorLayerLabeling * labeling() const
Access to const labeling configuration.
 
Q_INVOKABLE Qgis::WkbType wkbType() const FINAL
Returns the WKBType or WKBUnknown in case of error.
 
QgsFeatureRenderer * renderer()
Returns the feature renderer used for rendering the features in the layer in 2D map views.
 
QString displayExpression
 
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 ...
 
Q_INVOKABLE void selectByIds(const QgsFeatureIds &ids, Qgis::SelectBehavior behavior=Qgis::SelectBehavior::SetSelection)
Selects matching features using a list of feature IDs.
 
Q_INVOKABLE Qgis::GeometryType geometryType() const
Returns point, line or polygon.
 
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.
 
QgsEditFormConfig editFormConfig
 
Q_INVOKABLE QgsFeature getFeature(QgsFeatureId fid) const
Queries the layer for the feature with the given id.
 
QSet< QVariant > uniqueValues(int fieldIndex, int limit=-1) const FINAL
Calculates a list of unique values contained within an attribute in the layer.
 
Implements a map layer that is dedicated to rendering of vector tiles.
 
static QString displayString(Qgis::WkbType type)
Returns a non-translated display string type for a WKB type, e.g., the geometry name used in WKT geom...
 
static bool isCurvedType(Qgis::WkbType type)
Returns true if the WKB type is a curved type or can contain curved geometries.
 
static Qgis::WkbType flatType(Qgis::WkbType type)
Returns the flat type for a WKB type.
 
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.
 
std::unique_ptr< QgsMapRendererTask > getPdf(const QString &tmpFileName)
Returns a configured pdf export task.
 
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).
 
QJsonObject getLegendGraphicsAsJson(QgsLayerTreeModel &model, const Qgis::LegendJsonRenderFlags &jsonRenderFlags=Qgis::LegendJsonRenderFlags())
Returns the map legend as a JSON object.
 
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.
 
bool htmlInfoOnlyMapTip() const
Returns true if only maptip information is requested for HTML feature info response.
 
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.
 
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.
 
DxfFormatOption
Options for DXF format.
 
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.
 
double dpiAsDouble() const
Returns DPI parameter as an int or its default value 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.
 
bool pdfLosslessImageCompression() const
Returns true if images embedded in pdf must be compressed using a lossless algorithm.
 
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.
 
QStringList pdfExportMapThemes() const
Returns map themes for GeoPDF export.
 
bool pdfUseOgcBestPracticeFormatGeoreferencing() const
Returns true if OGC best practice georeferencing shall be used.
 
bool pdfExportMetadata() const
Returns true if metadata shall be added to the pdf.
 
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.
 
bool pdfAppendGeoreference() const
Returns true if georeference info shall be added to the pdf.
 
int polygonToleranceAsInt() const
Returns FI_POLYGON_TOLERANCE parameter as an integer.
 
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.
 
bool pdfDisableTiledRasterRendering() const
Returns true if rasters shall be untiled in the pdf.
 
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.
 
bool pdfForceVectorOutput() const
Returns if pdf should be exported as vector.
 
bool pdfUseIso32000ExtensionFormatGeoreferencing() const
Returns true, if Iso32000 georeferencing shall be used.
 
QMap< QString, QString > dimensionValues() const
Returns the dimensions parameter.
 
bool withDisplayName() const
withDisplayName
 
int infoFormatVersion() const
Returns the infoFormat version for GML.
 
QgsLegendSettings legendSettings() const
Returns legend settings.
 
Qgis::TextRenderFormat pdfTextRenderFormat() const
Returns text render format for pdf export.
 
QStringList dxfLayerAttributes() const
Returns the DXF LAYERATTRIBUTES parameter.
 
bool writeGeoPdf() const
Returns if a GeoPDF shall be exported.
 
Qgis::FeatureSymbologyExport dxfMode() const
Returns the DXF MODE 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.
 
bool exportLinesWithZeroWidth() const
 
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.
 
QMap< T, QString > formatOptions() const
Returns the format options for an output format.
 
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.
 
QVector< qreal > pdfPredefinedMapScales() const
Returns list of map scales.
 
bool pdfSimplifyGeometries() const
Returns if geometries shall to be simplified.
 
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...
 
QgsFeedback * socketFeedback() const
Returns the response feedback if any.
 
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.
 
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 QStringList wmsRestrictedComposers(const QgsProject &project)
Returns the restricted composer list.
 
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.
 
QgsLayerTreeModelLegendNode * legendNode(const QString &rule, QgsLayerTreeModel &model)
 
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
 
CONSTLATIN1STRING geoNone()
Constant that holds the string representation for "No ellips/No CRS".
 
#define Q_NOWARN_DEPRECATED_POP
 
QString qgsDoubleToString(double a, int precision=17)
Returns a string representation of a double.
 
#define Q_NOWARN_DEPRECATED_PUSH
 
bool qgsDoubleNear(double a, double b, double epsilon=4 *std::numeric_limits< double >::epsilon())
Compare two doubles (but allow some difference)
 
QList< QgsFeature > QgsFeatureList
 
QSet< QgsFeatureId > QgsFeatureIds
 
#define FID_TO_STRING(fid)
 
QVector< QgsFeatureStore > QgsFeatureStoreList
 
QList< int > QgsAttributeList
 
#define QgsDebugMsgLevel(str, level)
 
QgsTemporalRange< QDateTime > QgsDateTimeRange
QgsRange which stores a range of date times.
 
const QgsCoordinateReferenceSystem & outputCrs
 
const QgsCoordinateReferenceSystem & crs
 
QgsAbstractMetadataBase::KeywordMap keywords
Metadata keyword map.
 
bool useIso32000ExtensionFormatGeoreferencing
true if ISO32000 extension format georeferencing should be used.
 
bool useOgcBestPracticeFormatGeoreferencing
true if OGC "best practice" format georeferencing should be used.
 
QDateTime creationDateTime
Metadata creation datetime.
 
QString author
Metadata author tag.
 
QString producer
Metadata producer tag.
 
QString creator
Metadata creator tag.
 
QString subject
Metadata subject tag.
 
QString title
Metadata title tag.
 
Layers and optional attribute index to split into multiple layers using attribute value as layer name...
 
Single variable definition for use within a QgsExpressionContextScope.
 
QPainter * painter
Painter.
 
Q_NOWARN_DEPRECATED_POP QgsRenderContext * context
Render context, if available.
 
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.
 
QVector< qreal > predefinedMapScales
A list of predefined scales to use with the layout.
 
Contains settings relating to exporting layouts to PDF.
 
bool useIso32000ExtensionFormatGeoreferencing
true if ISO3200 extension format georeferencing should be used.
 
bool forceVectorOutput
Set to true to force vector object exports, even when the resultant appearance will differ from the l...
 
bool rasterizeWholeImage
Set to true to force whole layout to be rasterized while exporting.
 
QStringList exportThemes
Optional list of map themes to export as GeoPDF layer groups.
 
bool appendGeoreference
Indicates whether PDF export should append georeference data.
 
QgsLayoutRenderContext::Flags flags
Layout context flags, which control how the export will be created.
 
bool writeGeoPdf
true if GeoPDF files should be created, instead of normal PDF files.
 
double dpi
Resolution to export layout at. If dpi <= 0 the default layout dpi will be used.
 
QVector< qreal > predefinedMapScales
A list of predefined scales to use with the layout.
 
bool simplifyGeometries
Indicates whether vector geometries should be simplified to avoid redundant extraneous detail,...
 
bool useOgcBestPracticeFormatGeoreferencing
true if OGC "best practice" format georeferencing should be used.
 
Qgis::TextRenderFormat textRenderFormat
Text rendering format, which controls how text should be rendered in the export (e....
 
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.
 
QVector< qreal > predefinedMapScales
A list of predefined scales to use with the layout.
 
Setting to define QGIS Server WMS Dimension.
 
Setting options for loading vector layers.
 
QList< QgsWmsParametersLayer > mLayers
 
QList< QgsWmsParametersHighlightLayer > mHighlightLayers
 
QList< QgsWmsParametersFilter > mFilter