77#include <QTemporaryFile>
80#include <nlohmann/json.hpp>
104 : mContext( context )
109 mWmsParameters.
dump();
114 removeTemporaryLayers();
120 std::unique_ptr<QgsWmsRestorer> restorer;
133 for (
const auto &layer : std::as_const( layersToRender ) )
136 if ( layer->dataProvider()->name() == QLatin1String(
"wms" ) )
140 const auto image { layerNode->getLegendGraphicBlocking( ) };
141 if ( ! image.isNull() )
146 const double w = image.width() / dpmm;
147 const double h = image.height() / dpmm;
148 const QSizeF newWmsSize { w, h };
161 if ( !mWmsParameters.
bbox().isEmpty() )
165 std::unique_ptr<QImage> tmp( createImage( mContext.
mapSize(
false ) ) );
166 configureMapSettings( tmp.get(), mapSettings );
172 context = configureDefaultRenderContext();
176 std::unique_ptr<QImage> image;
177 const QSizeF minSize = renderer.
minimumSize( &context );
178 const QSize size(
static_cast<int>( minSize.width() * dpmm ),
static_cast<int>( minSize.height() * dpmm ) );
183 image.reset( createImage( size ) );
186 QPainter painter( image.get() );
189 if ( painter.renderHints() & QPainter::SmoothPixmapTransform )
191 if ( painter.renderHints() & QPainter::LosslessImageRendering )
201 return image.release();
207 std::unique_ptr<QgsWmsRestorer> restorer;
221 std::unique_ptr<QImage> image( createImage( size ) );
225 std::unique_ptr<QPainter> painter;
226 painter.reset(
new QPainter( image.get() ) );
227 painter->setRenderHint( QPainter::Antialiasing,
true );
228 painter->scale( dpmm, dpmm );
239 nodeModel.
drawSymbol( settings, &ctx, size.height() / dpmm );
242 return image.release();
248 std::unique_ptr<QgsWmsRestorer> restorer;
268 std::unique_ptr<QgsWmsRestorer> restorer;
288 if ( vLayer->renderer() )
292 const QString ruleExp { vLayer->renderer()->legendKeyToExpression( ruleKey, vLayer, ok ) };
295 jsonSymbol[ QStringLiteral(
"rule" ) ] = ruleExp;
304 void QgsRenderer::runHitTest(
const QgsMapSettings &mapSettings, HitTest &hitTest )
const
308 for (
const QString &
id : mapSettings.layerIds() )
325 runHitTestLayer( vl, usedSymbols, context );
331 std::unique_ptr< QgsFeatureRenderer > r( vl->
renderer()->
clone() );
333 r->startRender( context, vl->
fields() );
341 if ( moreSymbolsPerFeature )
343 for (
QgsSymbol *s : r->originalSymbolsForFeature( f, context ) )
349 r->stopRender( context );
358 QStringLiteral(
"The requested map size is too large" ) );
362 std::unique_ptr<QgsWmsRestorer> restorer;
372 std::unique_ptr<QPainter> painter;
373 std::unique_ptr<QImage> image( createImage( mContext.
mapSize() ) );
376 configureMapSettings( image.get(), mapSettings );
383 runHitTest( mapSettings,
symbols );
391 std::unique_ptr<QgsWmsRestorer> restorer;
396 if ( templateName.isEmpty() )
420 QStringLiteral(
"The template has no pages" ) );
423 std::unique_ptr<QgsPrintLayout> layout( sourceLayout->
clone() );
427 QStringList atlasPk = mWmsParameters.
atlasPk();
428 if ( !atlasPk.isEmpty() )
430 atlas = layout->atlas();
431 if ( !atlas || !atlas->
enabled() )
435 QStringLiteral(
"The template has no atlas enabled" ) );
442 QStringLiteral(
"The atlas has no coverage layer" ) );
446 if ( atlasPk.size() == 1 && atlasPk.at( 0 ) == QLatin1String(
"*" ) )
450 if ( atlas->
count() > maxAtlasFeatures )
453 QString(
"The project configuration allows printing maximum %1 atlas features at a time" ).arg( maxAtlasFeatures ) );
459 if ( pkIndexes.size() == 0 )
461 QgsDebugMsgLevel( QStringLiteral(
"Atlas print: layer %1 has no primary key attributes" ).arg( cLayer->
name() ), 2 );
465 const int pkIndexesSize {std::max< int >( pkIndexes.size(), 1 )};
467 QStringList pkAttributeNames;
468 for (
int pkIndex : std::as_const( pkIndexes ) )
470 pkAttributeNames.append( cLayer->
fields().
at( pkIndex ).
name() );
473 const int nAtlasFeatures = atlasPk.size() / pkIndexesSize;
474 if ( nAtlasFeatures * pkIndexesSize != atlasPk.size() )
477 QStringLiteral(
"Wrong number of ATLAS_PK parameters" ) );
481 if ( nAtlasFeatures > maxAtlasFeatures )
484 QString(
"%1 atlas features have been requested, but the project configuration only allows printing %2 atlas features at a time" )
485 .arg( nAtlasFeatures ).arg( maxAtlasFeatures ) );
488 QString filterString;
489 int currentAtlasPk = 0;
491 for (
int i = 0; i < nAtlasFeatures; ++i )
495 filterString.append(
" OR " );
498 filterString.append(
"( " );
501 if ( pkAttributeNames.isEmpty() )
503 filterString.append( QStringLiteral(
"$id = %1" ).arg( atlasPk.at( currentAtlasPk ) ) );
508 for (
int j = 0; j < pkIndexes.size(); ++j )
512 filterString.append(
" AND " );
519 filterString.append(
" )" );
528 if ( !errorString.isEmpty() )
530 throw QgsException( QStringLiteral(
"An error occurred during the Atlas print: %1" ).arg( errorString ) );
543 std::unique_ptr<QImage> image(
new QImage() );
544 configureMapSettings( image.get(), mapSettings );
550 configurePrintLayout( layout.get(), mapSettings, atlas );
554 const QList<QgsMapLayer *> lyrs = mapSettings.
layers();
556#ifdef HAVE_SERVER_PYTHON_PLUGINS
557 mContext.accessControl()->resolveFilterFeatures( lyrs );
561 QHash<const QgsVectorLayer *, QStringList> fltrs;
566 fltrs.insert( vl, dimensionFilter( vl ) );
578 QTemporaryFile tempOutputFile( QDir::tempPath() +
'/' + QStringLiteral(
"XXXXXX.%1" ).arg( extension ) );
579 if ( !tempOutputFile.open() )
581 throw QgsException( QStringLiteral(
"Could not open temporary file for the GetPrint request." ) );
590 if ( !mWmsParameters.
dpi().isEmpty() )
593 double dpi( mWmsParameters.
dpi().toDouble( &ok ) );
595 exportSettings.
dpi = dpi;
608 atlasSvgExport.
exportToSvg( tempOutputFile.fileName(), exportSettings );
614 exporter.
exportToSvg( tempOutputFile.fileName(), exportSettings );
623 double dpi( layout->renderContext().dpi( ) );
624 if ( !mWmsParameters.
dpi().isEmpty() )
627 double _dpi = mWmsParameters.
dpi().toDouble( &ok );
631 exportSettings.
dpi = dpi;
637 QgsLayoutSize layoutSize( layout->pageCollection()->page( 0 )->sizeWithUnits() );
642 const QSize imageSize = QSize(
static_cast<int>( width.
length() * dpi / 25.4 ),
static_cast<int>( height.
length() * dpi / 25.4 ) );
644 const QString paramWidth = mWmsParameters.
width();
645 const QString paramHeight = mWmsParameters.
height();
650 if ( !paramWidth.isEmpty() && !paramHeight.isEmpty() )
652 exportSettings.
imageSize = QSize( paramWidth.toInt(), paramHeight.toInt() );
654 else if ( !paramWidth.isEmpty() && paramHeight.isEmpty() )
656 exportSettings.
imageSize = QSize( paramWidth.toInt(),
static_cast<double>( paramWidth.toInt() ) / imageSize.width() * imageSize.height() );
658 else if ( paramWidth.isEmpty() && !paramHeight.isEmpty() )
660 exportSettings.
imageSize = QSize(
static_cast<double>( paramHeight.toInt() ) / imageSize.height() * imageSize.width(), paramHeight.toInt() );
668 exportSettings.
pages.append( 0 );
676 atlasPngExport.
exportToImage( tempOutputFile.fileName(), exportSettings );
680 throw QgsServiceException( QStringLiteral(
"Bad request" ), QStringLiteral(
"Atlas error: empty atlas." ), QString(), 400 );
686 exporter.
exportToImage( tempOutputFile.fileName(), exportSettings );
694 if ( !mWmsParameters.
dpi().isEmpty() )
697 double dpi( mWmsParameters.
dpi().toDouble( &ok ) );
699 exportSettings.
dpi = dpi;
704 exportSettings.
rasterizeWholeImage = layout->customProperty( QStringLiteral(
"rasterize" ),
false ).toBool();
707 if ( requestMapScales.size() > 0 )
717 if ( exportThemes.size() > 0 )
745 exporter.
exportToPdf( tempOutputFile.fileName(), exportSettings );
756 handlePrintErrors( atlas->
layout() );
760 handlePrintErrors( layout.get() );
763 return tempOutputFile.readAll();
771 QList<QgsLayoutItemMap *> maps;
777 for (
const auto &map : std::as_const( maps ) )
783 if ( cMapParams.
mLayers.isEmpty() )
788 if ( !atlas || !map->atlasDriven() )
794 c->removeLayoutItem( map );
812 if ( cMapParams.
mScale > 0 )
814 map->setScale(
static_cast<double>( cMapParams.
mScale ) );
820 map->setMapRotation( cMapParams.
mRotation );
824 if ( !map->keepLayerSet() )
827 QList<QgsMapLayer *> layerSet;
829 for (
const auto &layer : std::as_const( cMapParams.mLayers ) )
833 QList<QgsMapLayer *> layersFromGroup;
835 const QList<QgsMapLayer *> cLayersFromGroup = mContext.
layersFromGroup( layer.mNickname );
836 for (
QgsMapLayer *layerFromGroup : cLayersFromGroup )
839 if ( ! layerFromGroup )
844 layersFromGroup.push_front( layerFromGroup );
847 if ( !layersFromGroup.isEmpty() )
849 layerSet.append( layersFromGroup );
861 setLayerStyle( mlayer, layer.mStyle );
866 std::reverse( layerSet.begin(), layerSet.end() );
871 QMap<QString, QString> layersStyle;
872 if ( map->followVisibilityPreset() )
883 const QString presetName = map->followVisibilityPresetName();
884 if ( layerSet.isEmpty() )
888 layerSet = map->layersToRender( &ex );
891 map->setFollowVisibilityPreset(
false );
895 for (
const auto &layerMapThemeRecord : std::as_const( mapThemeRecords ) )
897 if ( layerSet.contains( layerMapThemeRecord.layer() ) )
899 layersStyle.insert( layerMapThemeRecord.layer()->id(),
900 layerMapThemeRecord.layer()->styleManager()->style( layerMapThemeRecord.currentStyle ).xmlData() );
906 const QList< QgsMapLayer *> highlights = highlightLayers( cMapParams.
mHighlightLayers );
907 for (
const auto &hl : std::as_const( highlights ) )
909 layerSet.prepend( hl );
912 map->setLayers( layerSet );
913 map->setKeepLayerSet(
true );
917 if ( !layersStyle.isEmpty() )
919 map->setLayerStyleOverrides( layersStyle );
920 map->setKeepLayerStyles(
true );
927 map->grid()->setIntervalX(
static_cast<double>( cMapParams.
mGridX ) );
928 map->grid()->setIntervalY(
static_cast<double>( cMapParams.
mGridY ) );
933 QList<QgsLayoutItemLabel *> labels;
935 for (
const auto &label : std::as_const( labels ) )
938 const QString labelId = label->
id();
939 const QString labelParam = mWmsParameters.
layoutParameter( labelId, ok );
944 if ( labelParam.isEmpty() )
948 c->removeItem( label );
953 label->setText( labelParam );
957 QList<QgsLayoutItemHtml *> htmls;
959 for (
const auto &html : std::as_const( htmls ) )
961 if ( html->frameCount() == 0 )
966 const QString htmlId = htmlFrame->
id();
967 const QString htmlValue = mWmsParameters.
layoutParameter( htmlId, ok );
977 if ( htmlValue.isEmpty() )
979 c->removeMultiFrame( html );
986 QUrl newUrl( htmlValue );
987 html->setUrl( newUrl );
991 html->setHtml( htmlValue );
998 QList<QgsLayoutItemLegend *> legends;
1000 for (
const auto &legend : std::as_const( legends ) )
1002 if ( legend->autoUpdateModel() )
1012 legend->setAutoUpdateModel(
false );
1016 QStringList layerSet;
1017 QList<QgsMapLayer *> mapLayers;
1018 if ( map->
layers().isEmpty() )
1022 mapLayers = mProject->
mapLayers(
true ).values();
1026 mapLayers = map->
layers();
1028 const QList<QgsMapLayer *> layerList = mapLayers;
1029 for (
const auto &layer : layerList )
1030 layerSet << layer->id();
1042 for (
const auto &layerId : layerIds )
1049 if ( !layerSet.contains( layerId ) )
1051 qobject_cast<QgsLayerTreeGroup *>( nodeLayer->
parent() )->removeChildNode( nodeLayer );
1058 qobject_cast<QgsLayerTreeGroup *>( nodeLayer->
parent() )->removeChildNode( nodeLayer );
1074 QStringLiteral(
"The requested map size is too large" ) );
1078 std::unique_ptr<QgsWmsRestorer> restorer;
1089 std::unique_ptr<QPainter> painter;
1090 std::unique_ptr<QImage> image( createImage( mContext.
mapSize() ) );
1093 configureMapSettings( image.get(), mapSettings );
1099 QPainter *renderedPainter = layersRendering( mapSettings, *image );
1100 if ( !renderedPainter )
1105 painter.reset( renderedPainter );
1108 annotationsRendering( painter.get(), mapSettings );
1114 QImage *scaledImage = scaleImage( image.get() );
1116 image.reset( scaledImage );
1119 return image.release();
1130 QList< QgsDxfExport::DxfLayer > dxfLayers;
1142 int layerAttribute = -1;
1143 if ( attributes.size() > layerIdx )
1154 QString
crs = mWmsParameters.
crs();
1155 if (
crs.compare( QStringLiteral(
"CRS:84" ), Qt::CaseInsensitive ) == 0 )
1157 crs = QStringLiteral(
"EPSG:4326" );
1160 else if (
crs.isEmpty() )
1162 crs = QStringLiteral(
"EPSG:4326" );
1196 std::unique_ptr<QgsDxfExport> dxf = std::make_unique<QgsDxfExport>();
1197 dxf->setExtent( mapExtent );
1198 dxf->setDestinationCrs( outputCRS );
1199 dxf->addLayers( dxfLayers );
1201 dxf->setSymbologyExport( mWmsParameters.
dxfMode() );
1204 dxf->setSymbologyScale( mWmsParameters.
dxfScale() );
1207 dxf->setForce2d( mWmsParameters.
isForce2D() );
1209 if ( mWmsParameters.
noMText() )
1217 dxf->setFlags( flags );
1245 std::unique_ptr<QgsMapRendererTask> pdf = std::make_unique<QgsMapRendererTask>( ms, tmpFileName, QStringLiteral(
"PDF" ),
false,
QgsTask::Hidden, geospatialPdf, pdfExportDetails );
1248 pdf->setSaveWorldFile(
true );
1256 if ( i < 0 || i > mapSettings.
outputSize().width() )
1264 if ( j < 0 || j > mapSettings.
outputSize().height() )
1289 const bool ijDefined = !mWmsParameters.
i().isEmpty() && !mWmsParameters.
j().isEmpty();
1290 const bool xyDefined = !mWmsParameters.
x().isEmpty() && !mWmsParameters.
y().isEmpty();
1291 const bool filtersDefined = !mWmsParameters.
filters().isEmpty();
1292 const bool filterGeomDefined = !mWmsParameters.
filterGeom().isEmpty();
1294 if ( !ijDefined && !xyDefined && !filtersDefined && !filterGeomDefined )
1298 if ( mWmsParameters.
j().isEmpty() )
1312 std::unique_ptr<QImage> outputImage( createImage( mContext.
mapSize() ) );
1315 std::unique_ptr<QgsWmsRestorer> restorer;
1320 bool mandatoryCrsParam =
true;
1321 if ( filtersDefined && !ijDefined && !xyDefined && mWmsParameters.
crs().isEmpty() )
1323 mandatoryCrsParam =
false;
1329 configureMapSettings( outputImage.get(), mapSettings, mandatoryCrsParam );
1345#ifdef HAVE_SERVER_PYTHON_PLUGINS
1346 mContext.accessControl()->resolveFilterFeatures( mapSettings.
layers() );
1349 QDomDocument result = featureInfoDocument( layers, mapSettings, outputImage.get(), version );
1354 ba = convertFeatureInfoToText( result );
1356 ba = convertFeatureInfoToHtml( result );
1358 ba = convertFeatureInfoToJson( layers, result, mapSettings.
destinationCrs() );
1360 ba = result.toByteArray();
1365 QImage *QgsRenderer::createImage(
const QSize &size )
const
1367 std::unique_ptr<QImage> image;
1375 image = std::make_unique<QImage>( size, QImage::Format_ARGB32_Premultiplied );
1380 image = std::make_unique<QImage>( size, QImage::Format_RGB32 );
1385 if ( image->isNull() )
1387 throw QgsException( QStringLiteral(
"createImage: image could not be created, check for out of memory conditions" ) );
1390 const int dpm =
static_cast<int>( mContext.
dotsPerMm() * 1000.0 );
1391 image->setDotsPerMeterX( dpm );
1392 image->setDotsPerMeterY( dpm );
1394 return image.release();
1397 void QgsRenderer::configureMapSettings(
const QPaintDevice *paintDevice,
QgsMapSettings &mapSettings,
bool mandatoryCrsParam )
1401 throw QgsException( QStringLiteral(
"configureMapSettings: no paint device" ) );
1404 mapSettings.
setOutputSize( QSize( paintDevice->width(), paintDevice->height() ) );
1411 if ( !mWmsParameters.
bbox().isEmpty() && mapExtent.
isEmpty() )
1417 QString
crs = mWmsParameters.
crs();
1418 if (
crs.compare(
"CRS:84", Qt::CaseInsensitive ) == 0 )
1420 crs = QString(
"EPSG:4326" );
1423 else if (
crs.isEmpty() && !mandatoryCrsParam )
1425 crs = QString(
"EPSG:4326" );
1435 QgsWmsParameter parameter;
1477 else if ( backgroundColor.isValid() )
1506 const QString timeString { mWmsParameters.
dimensionValues().value( QStringLiteral(
"TIME" ), QString() ) };
1507 if ( ! timeString.isEmpty() )
1509 bool isValidTemporalRange {
true };
1512 const QDateTime dt { QDateTime::fromString( timeString, Qt::DateFormat::ISODateWithMs ) };
1525 isValidTemporalRange =
false;
1530 if ( isValidTemporalRange )
1540 QgsRenderContext QgsRenderer::configureDefaultRenderContext( QPainter *painter )
1553 QDomDocument QgsRenderer::featureInfoDocument( QList<QgsMapLayer *> &layers,
const QgsMapSettings &mapSettings,
1554 const QImage *outputImage,
const QString &version )
const
1558 bool ijDefined = ( !mWmsParameters.
i().isEmpty() && !mWmsParameters.
j().isEmpty() );
1560 bool xyDefined = ( !mWmsParameters.
x().isEmpty() && !mWmsParameters.
y().isEmpty() );
1562 bool filtersDefined = !mWmsParameters.
filters().isEmpty();
1564 bool filterGeomDefined = !mWmsParameters.
filterGeom().isEmpty();
1567 if ( featureCount < 1 )
1572 int i = mWmsParameters.
iAsInt();
1573 int j = mWmsParameters.
jAsInt();
1574 if ( xyDefined && !ijDefined )
1576 i = mWmsParameters.
xAsInt();
1577 j = mWmsParameters.
yAsInt();
1581 if ( ( i != -1 && j != -1 && width != 0 && height != 0 ) && ( width != outputImage->width() || height != outputImage->height() ) )
1583 i *= ( outputImage->width() /
static_cast<double>( width ) );
1584 j *= ( outputImage->height() /
static_cast<double>( height ) );
1588 std::unique_ptr<QgsRectangle> featuresRect;
1589 std::unique_ptr<QgsGeometry> filterGeom;
1590 std::unique_ptr<QgsPointXY> infoPoint;
1592 if ( i != -1 && j != -1 )
1595 infoPointToMapCoordinates( i, j, infoPoint.get(), mapSettings );
1597 else if ( filtersDefined )
1602 if ( filterGeomDefined )
1607 QDomDocument result;
1608 const QDomNode header = result.createProcessingInstruction( QStringLiteral(
"xml" ), QStringLiteral(
"version=\"1.0\" encoding=\"UTF-8\"" ) );
1609 result.appendChild( header );
1611 QDomElement getFeatureInfoElement;
1615 getFeatureInfoElement = result.createElement( QStringLiteral(
"wfs:FeatureCollection" ) );
1616 getFeatureInfoElement.setAttribute( QStringLiteral(
"xmlns:wfs" ), QStringLiteral(
"http://www.opengis.net/wfs" ) );
1617 getFeatureInfoElement.setAttribute( QStringLiteral(
"xmlns:ogc" ), QStringLiteral(
"http://www.opengis.net/ogc" ) );
1618 getFeatureInfoElement.setAttribute( QStringLiteral(
"xmlns:gml" ), QStringLiteral(
"http://www.opengis.net/gml" ) );
1619 getFeatureInfoElement.setAttribute( QStringLiteral(
"xmlns:ows" ), QStringLiteral(
"http://www.opengis.net/ows" ) );
1620 getFeatureInfoElement.setAttribute( QStringLiteral(
"xmlns:xlink" ), QStringLiteral(
"http://www.w3.org/1999/xlink" ) );
1621 getFeatureInfoElement.setAttribute( QStringLiteral(
"xmlns:qgs" ), QStringLiteral(
"http://qgis.org/gml" ) );
1622 getFeatureInfoElement.setAttribute( QStringLiteral(
"xmlns:xsi" ), QStringLiteral(
"http://www.w3.org/2001/XMLSchema-instance" ) );
1623 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" ) );
1628 if ( featureInfoElemName.isEmpty() )
1630 featureInfoElemName = QStringLiteral(
"GetFeatureInfoResponse" );
1633 if ( featureInfoElemNs.isEmpty() )
1635 getFeatureInfoElement = result.createElement( featureInfoElemName );
1639 getFeatureInfoElement = result.createElementNS( featureInfoElemNs, featureInfoElemName );
1643 if ( !featureInfoSchema.isEmpty() )
1645 getFeatureInfoElement.setAttribute( QStringLiteral(
"xmlns:xsi" ), QStringLiteral(
"http://www.w3.org/2001/XMLSchema-instance" ) );
1646 getFeatureInfoElement.setAttribute( QStringLiteral(
"xsi:schemaLocation" ), featureInfoSchema );
1649 result.appendChild( getFeatureInfoElement );
1659 for (
const QString &queryLayer : queryLayers )
1661 bool validLayer =
false;
1662 bool queryableLayer =
true;
1663 for (
QgsMapLayer *layer : std::as_const( layers ) )
1669 if ( !queryableLayer )
1674 QDomElement layerElement;
1677 layerElement = getFeatureInfoElement;
1681 layerElement = result.createElement( QStringLiteral(
"Layer" ) );
1682 QString layerName = queryLayer;
1685 QHash<QString, QString>::const_iterator layerAliasIt = layerAliasMap.constFind( layerName );
1686 if ( layerAliasIt != layerAliasMap.constEnd() )
1688 layerName = layerAliasIt.value();
1691 layerElement.setAttribute( QStringLiteral(
"name" ), layerName );
1692 const QString layerTitle = layer->serverProperties()->title();
1693 if ( !layerTitle.isEmpty() )
1695 layerElement.setAttribute( QStringLiteral(
"title" ), layerTitle );
1699 layerElement.setAttribute( QStringLiteral(
"title" ), layerName );
1701 getFeatureInfoElement.appendChild( layerElement );
1704 layerElement.setAttribute( QStringLiteral(
"id" ), layer->id() );
1710 QgsVectorLayer *vectorLayer = qobject_cast<QgsVectorLayer *>( layer );
1713 ( void )featureInfoFromVectorLayer( vectorLayer, infoPoint.get(), featureCount, result, layerElement, mapSettings, renderContext, version, featuresRect.get(), filterGeom.get() );
1719 QgsRasterLayer *rasterLayer = qobject_cast<QgsRasterLayer *>( layer );
1728 QgsPointXY layerInfoPoint = mapSettings.mapToLayerCoordinates( layer, *( infoPoint.get() ) );
1735 layerElement = result.createElement( QStringLiteral(
"gml:featureMember" ) );
1736 getFeatureInfoElement.appendChild( layerElement );
1739 ( void )featureInfoFromRasterLayer( rasterLayer, mapSettings, &layerInfoPoint, renderContext, result, layerElement, version );
1747 param.mValue = queryLayer;
1751 else if ( ( validLayer && !queryableLayer ) || ( !validLayer && mContext.
isValidGroup( queryLayer ) ) )
1754 param.mValue = queryLayer;
1756 bool hasGroupAndQueryable {
false };
1761 for (
const QString &ql : constNicks )
1765 const QList<QgsMapLayer *> constLayers { mContext.
layerGroups()[ql] };
1768 if ( ( ! ml->serverProperties()->shortName().isEmpty() && ml->serverProperties()->shortName() == queryLayer ) || ( ml->name() == queryLayer ) )
1774 hasGroupAndQueryable =
true;
1783 if ( ! hasGroupAndQueryable )
1791 if ( featuresRect && ! featuresRect->isNull() )
1795 QDomElement bBoxElem = result.createElement( QStringLiteral(
"gml:boundedBy" ) );
1796 QDomElement boxElem;
1798 if ( gmlVersion < 3 )
1810 boxElem.setAttribute( QStringLiteral(
"srsName" ),
crs.
authid() );
1812 bBoxElem.appendChild( boxElem );
1813 getFeatureInfoElement.insertBefore( bBoxElem, QDomNode() );
1817 QDomElement bBoxElem = result.createElement( QStringLiteral(
"BoundingBox" ) );
1818 bBoxElem.setAttribute( QStringLiteral(
"CRS" ), mapSettings.destinationCrs().authid() );
1819 bBoxElem.setAttribute( QStringLiteral(
"minx" ),
qgsDoubleToString( featuresRect->xMinimum(), 8 ) );
1820 bBoxElem.setAttribute( QStringLiteral(
"maxx" ),
qgsDoubleToString( featuresRect->xMaximum(), 8 ) );
1821 bBoxElem.setAttribute( QStringLiteral(
"miny" ),
qgsDoubleToString( featuresRect->yMinimum(), 8 ) );
1822 bBoxElem.setAttribute( QStringLiteral(
"maxy" ),
qgsDoubleToString( featuresRect->yMaximum(), 8 ) );
1823 getFeatureInfoElement.insertBefore( bBoxElem, QDomNode() );
1829 convertFeatureInfoToSia2045( result );
1835 bool QgsRenderer::featureInfoFromVectorLayer(
QgsVectorLayer *layer,
1838 QDomDocument &infoDocument,
1839 QDomElement &layerElement,
1842 const QString &version,
1854 std::unique_ptr<QgsGeometry> layerFilterGeom;
1857 layerFilterGeom.reset(
new QgsGeometry( *filterGeom ) );
1871 searchRect = featureInfoSearchRect( layer, mapSettings, renderContext, *infoPoint );
1873 else if ( layerFilterGeom )
1875 searchRect = layerFilterGeom->boundingBox();
1877 else if ( !mWmsParameters.
bbox().isEmpty() )
1879 searchRect = layerRect;
1886 int featureCounter = 0;
1905 if ( layerFilterGeom )
1907 fReq.
setFilterExpression( QString(
"intersects( $geometry, geom_from_wkt('%1') )" ).arg( layerFilterGeom->asWkt() ) );
1912#ifdef HAVE_SERVER_PYTHON_PLUGINS
1913 mContext.accessControl()->filterFeatures( layer, fReq );
1915 QStringList attributes;
1916 for (
const QgsField &field : fields )
1918 attributes.append( field.name() );
1920 attributes = mContext.accessControl()->layerAttributes( layer, attributes );
1925 std::unique_ptr< QgsFeatureRenderer > r2( layer->
renderer() ? layer->
renderer()->
clone() : nullptr );
1928 r2->startRender( renderContext, layer->
fields() );
1931 bool featureBBoxInitialized =
false;
1940 if ( featureCounter > nFeatures )
1955 bool render = r2->willRenderFeature( feature, renderContext );
1968 if ( !featureBBoxInitialized && featureBBox->
isEmpty() )
1971 featureBBoxInitialized =
true;
1991 QDomElement elem = createFeatureGML(
1993#ifdef HAVE_SERVER_PYTHON_PLUGINS
1997 QDomElement featureMemberElem = infoDocument.createElement( QStringLiteral(
"gml:featureMember" ) );
1998 featureMemberElem.appendChild( elem );
1999 layerElement.appendChild( featureMemberElem );
2004 QDomElement featureElement = infoDocument.createElement( QStringLiteral(
"Feature" ) );
2006 layerElement.appendChild( featureElement );
2012 writeAttributesTabLayout( editConfig, layer, fields, featureAttributes, infoDocument, featureElement, renderContext
2013#ifdef HAVE_SERVER_PYTHON_PLUGINS
2020 for (
int i = 0; i < featureAttributes.count(); ++i )
2022 writeVectorLayerAttribute( i, layer, fields, featureAttributes, infoDocument, featureElement, renderContext
2023#ifdef HAVE_SERVER_PYTHON_PLUGINS
2034 QDomElement maptipElem = infoDocument.createElement( QStringLiteral(
"Attribute" ) );
2035 maptipElem.setAttribute( QStringLiteral(
"name" ), QStringLiteral(
"maptip" ) );
2039 featureElement.appendChild( maptipElem );
2045 QDomElement displayElem = infoDocument.createElement( QStringLiteral(
"Attribute" ) );
2046 displayElem.setAttribute( QStringLiteral(
"name" ), QStringLiteral(
"displayName" ) );
2049 displayExpression.
prepare( &context );
2050 displayElem.setAttribute( QStringLiteral(
"value" ), displayExpression.
evaluate( &context ).toString() );
2051 featureElement.appendChild( displayElem );
2058 QDomElement bBoxElem = infoDocument.createElement( QStringLiteral(
"BoundingBox" ) );
2059 bBoxElem.setAttribute( version == QLatin1String(
"1.1.1" ) ?
"SRS" :
"CRS",
outputCrs.authid() );
2064 featureElement.appendChild( bBoxElem );
2080 if ( segmentizeWktGeometry )
2088 geom.
set( segmentizedGeom );
2092 QDomElement geometryElement = infoDocument.createElement( QStringLiteral(
"Attribute" ) );
2093 geometryElement.setAttribute( QStringLiteral(
"name" ), QStringLiteral(
"geometry" ) );
2094 geometryElement.setAttribute( QStringLiteral(
"value" ), geom.
asWkt( mContext.
precision() ) );
2095 geometryElement.setAttribute( QStringLiteral(
"type" ), QStringLiteral(
"derived" ) );
2096 featureElement.appendChild( geometryElement );
2103 r2->stopRender( renderContext );
2114 QString groupName = container->
name();
2115 QDomElement nameElem;
2117 if ( !groupName.isEmpty() )
2119 nameElem = doc.createElement( groupName );
2120 parentElem.appendChild( nameElem );
2123 const QList<QgsAttributeEditorElement *> children = container->
children();
2128 writeAttributesTabGroup( child, layer, fields, featureAttributes, doc, nameElem.isNull() ? parentElem : nameElem, renderContext );
2138 writeVectorLayerAttribute( idx, layer, fields, featureAttributes, doc, nameElem.isNull() ? parentElem : nameElem, renderContext, attributes );
2149 if ( !editorContainer )
2154 writeAttributesTabGroup( editorContainer, layer, fields, featureAttributes, doc, featureElem, renderContext, attributes );
2157 void QgsRenderer::writeVectorLayerAttribute(
int attributeIndex,
QgsVectorLayer *layer,
const QgsFields &fields,
QgsAttributes &featureAttributes, QDomDocument &doc, QDomElement &featureElem,
QgsRenderContext &renderContext, QStringList *attributes )
const
2159#ifndef HAVE_SERVER_PYTHON_PLUGINS
2160 Q_UNUSED( attributes );
2173#ifdef HAVE_SERVER_PYTHON_PLUGINS
2175 if ( attributes && !attributes->contains( fields.
at( attributeIndex ).
name() ) )
2182 QDomElement attributeElement = doc.createElement( QStringLiteral(
"Attribute" ) );
2183 attributeElement.setAttribute( QStringLiteral(
"name" ), attributeName );
2185 attributeElement.setAttribute( QStringLiteral(
"value" ),
2187 replaceValueMapAndRelation(
2188 layer, attributeIndex,
2189 featureAttributes[attributeIndex] ),
2192 featureElem.appendChild( attributeElement );
2195 bool QgsRenderer::featureInfoFromRasterLayer(
QgsRasterLayer *layer,
2199 QDomDocument &infoDocument,
2200 QDomElement &layerElement,
2201 const QString &version )
const
2221 :
Qgis::RasterIdentifyFormat::Value );
2233 .arg( layer->
name() ) );
2242 if ( !identifyResult.
isValid() )
2245 QMap<int, QVariant> attributes = identifyResult.
results();
2259 for (
auto it = attributes.constBegin(); it != attributes.constEnd(); ++it )
2262 feature.
setAttribute( index++, QString::number( it.value().toDouble() ) );
2265 QDomElement elem = createFeatureGML(
2266 &feature,
nullptr, infoDocument, layerCrs, mapSettings,
typeName,
false, gmlVersion,
nullptr );
2267 layerElement.appendChild( elem );
2271 const auto values = identifyResult.
results();
2272 for (
auto it = values.constBegin(); it != values.constEnd(); ++it )
2274 QVariant value = it.value();
2275 if ( value.userType() == QMetaType::Type::Bool && !value.toBool() )
2281 if ( value.userType() == QMetaType::Type::QString )
2292 for (
const QgsFeature &feature : storeFeatures )
2294 QDomElement elem = createFeatureGML(
2295 &feature,
nullptr, infoDocument, layerCrs, mapSettings,
typeName,
false, gmlVersion,
nullptr );
2296 layerElement.appendChild( elem );
2306 for (
auto it = attributes.constBegin(); it != attributes.constEnd(); ++it )
2308 QDomElement attributeElement = infoDocument.createElement( QStringLiteral(
"Attribute" ) );
2309 attributeElement.setAttribute( QStringLiteral(
"name" ), layer->
bandName( it.key() ) );
2314 value = QString::number( it.value().toDouble() );
2317 attributeElement.setAttribute( QStringLiteral(
"value" ), value );
2318 layerElement.appendChild( attributeElement );
2323 const auto values = identifyResult.
results();
2324 for (
auto it = values.constBegin(); it != values.constEnd(); ++it )
2326 QVariant value = it.value();
2327 if ( value.userType() == QMetaType::Type::Bool && !value.toBool() )
2333 if ( value.userType() == QMetaType::Type::QString )
2343 for (
const QgsFeature &feature : storeFeatures )
2345 for (
const auto &fld : feature.fields() )
2347 const auto val { feature.
attribute( fld.name() )};
2348 if ( val.isValid() )
2350 QDomElement attributeElement = infoDocument.createElement( QStringLiteral(
"Attribute" ) );
2351 attributeElement.setAttribute( QStringLiteral(
"name" ), fld.name() );
2352 attributeElement.setAttribute( QStringLiteral(
"value" ), val.toString() );
2353 layerElement.appendChild( attributeElement );
2364 QDomElement maptipElem = infoDocument.createElement( QStringLiteral(
"Attribute" ) );
2365 maptipElem.setAttribute( QStringLiteral(
"name" ), QStringLiteral(
"maptip" ) );
2369 context.appendScope( scope );
2371 layerElement.appendChild( maptipElem );
2377 bool QgsRenderer::testFilterStringSafety(
const QString &filter )
const
2380 if ( filter.contains( QLatin1String(
";" ) ) )
2385 QStringList tokens = filter.split(
' ', Qt::SkipEmptyParts );
2386 groupStringList( tokens, QStringLiteral(
"'" ) );
2387 groupStringList( tokens, QStringLiteral(
"\"" ) );
2389 for (
auto tokenIt = tokens.constBegin() ; tokenIt != tokens.constEnd(); ++tokenIt )
2392 if ( tokenIt->compare( QLatin1String(
"," ) ) == 0
2393 || tokenIt->compare( QLatin1String(
"(" ) ) == 0
2394 || tokenIt->compare( QLatin1String(
")" ) ) == 0
2395 || tokenIt->compare( QLatin1String(
"=" ) ) == 0
2396 || tokenIt->compare( QLatin1String(
"!=" ) ) == 0
2397 || tokenIt->compare( QLatin1String(
"<" ) ) == 0
2398 || tokenIt->compare( QLatin1String(
"<=" ) ) == 0
2399 || tokenIt->compare( QLatin1String(
">" ) ) == 0
2400 || tokenIt->compare( QLatin1String(
">=" ) ) == 0
2401 || tokenIt->compare( QLatin1String(
"%" ) ) == 0
2402 || tokenIt->compare( QLatin1String(
"IS" ), Qt::CaseInsensitive ) == 0
2403 || tokenIt->compare( QLatin1String(
"NOT" ), Qt::CaseInsensitive ) == 0
2404 || tokenIt->compare( QLatin1String(
"NULL" ), Qt::CaseInsensitive ) == 0
2405 || tokenIt->compare( QLatin1String(
"AND" ), Qt::CaseInsensitive ) == 0
2406 || tokenIt->compare( QLatin1String(
"OR" ), Qt::CaseInsensitive ) == 0
2407 || tokenIt->compare( QLatin1String(
"IN" ), Qt::CaseInsensitive ) == 0
2408 || tokenIt->compare( QLatin1String(
"LIKE" ), Qt::CaseInsensitive ) == 0
2409 || tokenIt->compare( QLatin1String(
"ILIKE" ), Qt::CaseInsensitive ) == 0
2410 || tokenIt->compare( QLatin1String(
"DMETAPHONE" ), Qt::CaseInsensitive ) == 0
2411 || tokenIt->compare( QLatin1String(
"SOUNDEX" ), Qt::CaseInsensitive ) == 0
2419 ( void )tokenIt->toDouble( &isNumeric );
2428 if ( *tokenIt == QLatin1String(
"''" ) )
2434 if ( tokenIt->size() > 2
2435 && ( *tokenIt )[0] == QChar(
'\'' )
2436 && ( *tokenIt )[tokenIt->size() - 1] == QChar(
'\'' )
2437 && ( *tokenIt )[1] != QChar(
'\'' )
2438 && ( *tokenIt )[tokenIt->size() - 2] != QChar(
'\'' ) )
2444 if ( tokenIt->size() > 2
2445 && ( *tokenIt )[0] == QChar(
'"' )
2446 && ( *tokenIt )[tokenIt->size() - 1] == QChar(
'"' )
2447 && ( *tokenIt )[1] != QChar(
'"' )
2448 && ( *tokenIt )[tokenIt->size() - 2] != QChar(
'"' ) )
2459 void QgsRenderer::groupStringList( QStringList &list,
const QString &groupString )
2462 bool groupActive =
false;
2463 int startGroup = -1;
2464 QString concatString;
2466 for (
int i = 0; i < list.size(); ++i )
2468 QString &
str = list[i];
2469 if (
str.startsWith( groupString ) )
2473 concatString.clear();
2478 if ( i != startGroup )
2480 concatString.append(
" " );
2482 concatString.append(
str );
2485 if (
str.endsWith( groupString ) )
2488 groupActive =
false;
2490 if ( startGroup != -1 )
2492 list[startGroup] = concatString;
2493 for (
int j = startGroup + 1; j <= endGroup; ++j )
2495 list.removeAt( startGroup + 1 );
2500 concatString.clear();
2506 void QgsRenderer::convertFeatureInfoToSia2045( QDomDocument &doc )
const
2508 QDomDocument SIAInfoDoc;
2509 QDomElement infoDocElement = doc.documentElement();
2510 QDomElement SIAInfoDocElement = SIAInfoDoc.importNode( infoDocElement,
false ).toElement();
2511 SIAInfoDoc.appendChild( SIAInfoDocElement );
2513 QString currentAttributeName;
2514 QString currentAttributeValue;
2515 QDomElement currentAttributeElem;
2516 QString currentLayerName;
2517 QDomElement currentLayerElem;
2518 QDomNodeList layerNodeList = infoDocElement.elementsByTagName( QStringLiteral(
"Layer" ) );
2519 for (
int i = 0; i < layerNodeList.size(); ++i )
2521 currentLayerElem = layerNodeList.at( i ).toElement();
2522 currentLayerName = currentLayerElem.attribute( QStringLiteral(
"name" ) );
2524 QDomElement currentFeatureElem;
2526 QDomNodeList featureList = currentLayerElem.elementsByTagName( QStringLiteral(
"Feature" ) );
2527 if ( featureList.isEmpty() )
2530 QDomNodeList attributeList = currentLayerElem.elementsByTagName( QStringLiteral(
"Attribute" ) );
2531 QDomElement rasterLayerElem;
2532 if ( !attributeList.isEmpty() )
2534 rasterLayerElem = SIAInfoDoc.createElement( currentLayerName );
2536 for (
int j = 0; j < attributeList.size(); ++j )
2538 currentAttributeElem = attributeList.at( j ).toElement();
2539 currentAttributeName = currentAttributeElem.attribute( QStringLiteral(
"name" ) );
2540 currentAttributeValue = currentAttributeElem.attribute( QStringLiteral(
"value" ) );
2541 QDomElement outAttributeElem = SIAInfoDoc.createElement( currentAttributeName );
2542 QDomText outAttributeText = SIAInfoDoc.createTextNode( currentAttributeValue );
2543 outAttributeElem.appendChild( outAttributeText );
2544 rasterLayerElem.appendChild( outAttributeElem );
2546 if ( !attributeList.isEmpty() )
2548 SIAInfoDocElement.appendChild( rasterLayerElem );
2554 QSet<QString> layerPropertyAttributes;
2555 QString currentLayerId = currentLayerElem.attribute( QStringLiteral(
"id" ) );
2556 if ( !currentLayerId.isEmpty() )
2561 QString WMSPropertyAttributesString = currentLayer->
customProperty( QStringLiteral(
"WMSPropertyAttributes" ) ).toString();
2562 if ( !WMSPropertyAttributesString.isEmpty() )
2564 QStringList propertyList = WMSPropertyAttributesString.split( QStringLiteral(
"//" ) );
2565 for (
auto propertyIt = propertyList.constBegin() ; propertyIt != propertyList.constEnd(); ++propertyIt )
2567 layerPropertyAttributes.insert( *propertyIt );
2573 QDomElement propertyRefChild;
2574 for (
int j = 0; j < featureList.size(); ++j )
2576 QDomElement SIAFeatureElem = SIAInfoDoc.createElement( currentLayerName );
2577 currentFeatureElem = featureList.at( j ).toElement();
2578 QDomNodeList attributeList = currentFeatureElem.elementsByTagName( QStringLiteral(
"Attribute" ) );
2580 for (
int k = 0; k < attributeList.size(); ++k )
2582 currentAttributeElem = attributeList.at( k ).toElement();
2583 currentAttributeName = currentAttributeElem.attribute( QStringLiteral(
"name" ) );
2584 currentAttributeValue = currentAttributeElem.attribute( QStringLiteral(
"value" ) );
2585 if ( layerPropertyAttributes.contains( currentAttributeName ) )
2587 QDomElement propertyElem = SIAInfoDoc.createElement( QStringLiteral(
"property" ) );
2588 QDomElement identifierElem = SIAInfoDoc.createElement( QStringLiteral(
"identifier" ) );
2589 QDomText identifierText = SIAInfoDoc.createTextNode( currentAttributeName );
2590 identifierElem.appendChild( identifierText );
2591 QDomElement valueElem = SIAInfoDoc.createElement( QStringLiteral(
"value" ) );
2592 QDomText valueText = SIAInfoDoc.createTextNode( currentAttributeValue );
2593 valueElem.appendChild( valueText );
2594 propertyElem.appendChild( identifierElem );
2595 propertyElem.appendChild( valueElem );
2596 if ( propertyRefChild.isNull() )
2598 SIAFeatureElem.insertBefore( propertyElem, QDomNode() );
2599 propertyRefChild = propertyElem;
2603 SIAFeatureElem.insertAfter( propertyElem, propertyRefChild );
2608 QDomElement SIAAttributeElem = SIAInfoDoc.createElement( currentAttributeName );
2609 QDomText SIAAttributeText = SIAInfoDoc.createTextNode( currentAttributeValue );
2610 SIAAttributeElem.appendChild( SIAAttributeText );
2611 SIAFeatureElem.appendChild( SIAAttributeElem );
2614 SIAInfoDocElement.appendChild( SIAFeatureElem );
2621 QByteArray QgsRenderer::convertFeatureInfoToHtml(
const QDomDocument &doc )
const
2624 QString featureInfoString = QStringLiteral(
" <!DOCTYPE html>" );
2627 featureInfoString.append( QStringLiteral( R
"HTML(
2630 <title>Information</title>
2631 <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
2634 font-family: "Open Sans", "Calluna Sans", "Gill Sans MT", "Calibri", "Trebuchet MS", sans-serif;
2641 border: 1px solid black;
2642 border-collapse: collapse;
2663 const QDomNodeList layerList = doc.elementsByTagName( QStringLiteral(
"Layer" ) );
2666 for (
int i = 0; i < layerList.size(); ++i )
2668 const QDomElement layerElem = layerList.at( i ).toElement();
2671 const QDomNodeList featureNodeList = layerElem.elementsByTagName( QStringLiteral(
"Feature" ) );
2672 const QDomElement currentFeatureElement;
2674 if ( !featureNodeList.isEmpty() )
2678 const QString featureInfoLayerTitleString = QStringLiteral(
" <div class='layer-title'>%1</div>" ).arg( layerElem.attribute( QStringLiteral(
"title" ) ).toHtmlEscaped() );
2679 featureInfoString.append( featureInfoLayerTitleString );
2682 for (
int j = 0; j < featureNodeList.size(); ++j )
2684 const QDomElement featureElement = featureNodeList.at( j ).toElement();
2687 featureInfoString.append( QStringLiteral( R
"HTML(
2692 const QDomNodeList attributeNodeList = featureElement.elementsByTagName( QStringLiteral(
"Attribute" ) );
2693 for (
int k = 0; k < attributeNodeList.size(); ++k )
2695 const QDomElement attributeElement = attributeNodeList.at( k ).toElement();
2696 const QString name = attributeElement.attribute( QStringLiteral(
"name" ) ).toHtmlEscaped();
2697 QString value = attributeElement.attribute( QStringLiteral(
"value" ) );
2698 if ( name != QLatin1String(
"maptip" ) )
2700 value = value.toHtmlEscaped();
2705 const QString featureInfoAttributeString = QStringLiteral( R
"HTML(
2709 </tr>)HTML" ).arg( name, value );
2711 featureInfoString.append( featureInfoAttributeString );
2713 else if ( name == QLatin1String(
"maptip" ) )
2715 featureInfoString.append( QStringLiteral( R
"HTML(
2716 %1)HTML" ).arg( value ) );
2723 featureInfoString.append( QStringLiteral( R
"HTML(
2730 const QDomNodeList attributeNodeList = layerElem.elementsByTagName( QStringLiteral(
"Attribute" ) );
2733 if ( !attributeNodeList.isEmpty() )
2737 const QString featureInfoLayerTitleString = QStringLiteral(
" <div class='layer-title'>%1</div>" ).arg( layerElem.attribute( QStringLiteral(
"title" ) ).toHtmlEscaped() );
2738 featureInfoString.append( featureInfoLayerTitleString );
2740 featureInfoString.append( QStringLiteral( R
"HTML(
2744 for (
int j = 0; j < attributeNodeList.size(); ++j )
2746 const QDomElement attributeElement = attributeNodeList.at( j ).toElement();
2747 const QString name = attributeElement.attribute( QStringLiteral(
"name" ) ).toHtmlEscaped();
2748 QString value = attributeElement.attribute( QStringLiteral(
"value" ) );
2749 if ( value.isEmpty() )
2751 value = QStringLiteral(
"no data" );
2753 if ( name != QLatin1String(
"maptip" ) )
2755 value = value.toHtmlEscaped();
2760 const QString featureInfoAttributeString = QStringLiteral( R
"HTML(
2764 </tr>)HTML" ).arg( name, value );
2767 featureInfoString.append( featureInfoAttributeString );
2769 else if ( name == QLatin1String(
"maptip" ) )
2771 featureInfoString.append( QStringLiteral( R
"HTML(
2772 %1)HTML" ).arg( value ) );
2779 featureInfoString.append( QStringLiteral( R
"HTML(
2789 featureInfoString.append( QStringLiteral( R
"HTML(
2793 return featureInfoString.toUtf8();
2796 QByteArray QgsRenderer::convertFeatureInfoToText(
const QDomDocument &doc )
const
2798 QString featureInfoString;
2801 featureInfoString.append(
"GetFeatureInfo results\n" );
2802 featureInfoString.append(
"\n" );
2804 QDomNodeList layerList = doc.elementsByTagName( QStringLiteral(
"Layer" ) );
2807 for (
int i = 0; i < layerList.size(); ++i )
2809 QDomElement layerElem = layerList.at( i ).toElement();
2811 featureInfoString.append(
"Layer '" + layerElem.attribute( QStringLiteral(
"name" ) ) +
"'\n" );
2814 QDomNodeList featureNodeList = layerElem.elementsByTagName( QStringLiteral(
"Feature" ) );
2815 QDomElement currentFeatureElement;
2817 if ( !featureNodeList.isEmpty() )
2819 for (
int j = 0; j < featureNodeList.size(); ++j )
2821 QDomElement featureElement = featureNodeList.at( j ).toElement();
2822 featureInfoString.append(
"Feature " + featureElement.attribute( QStringLiteral(
"id" ) ) +
"\n" );
2825 QDomNodeList attributeNodeList = featureElement.elementsByTagName( QStringLiteral(
"Attribute" ) );
2826 for (
int k = 0; k < attributeNodeList.size(); ++k )
2828 QDomElement attributeElement = attributeNodeList.at( k ).toElement();
2829 featureInfoString.append( attributeElement.attribute( QStringLiteral(
"name" ) ) +
" = '" +
2830 attributeElement.attribute( QStringLiteral(
"value" ) ) +
"'\n" );
2836 QDomNodeList attributeNodeList = layerElem.elementsByTagName( QStringLiteral(
"Attribute" ) );
2837 for (
int j = 0; j < attributeNodeList.size(); ++j )
2839 QDomElement attributeElement = attributeNodeList.at( j ).toElement();
2840 QString value = attributeElement.attribute( QStringLiteral(
"value" ) );
2841 if ( value.isEmpty() )
2843 value = QStringLiteral(
"no data" );
2845 featureInfoString.append( attributeElement.attribute( QStringLiteral(
"name" ) ) +
" = '" +
2850 featureInfoString.append(
"\n" );
2853 return featureInfoString.toUtf8();
2856 QByteArray QgsRenderer::convertFeatureInfoToJson(
const QList<QgsMapLayer *> &layers,
const QDomDocument &doc,
const QgsCoordinateReferenceSystem &destCRS )
const
2860 {
"type",
"FeatureCollection" },
2861 {
"features", json::array() },
2865 const QDomNodeList layerList = doc.elementsByTagName( QStringLiteral(
"Layer" ) );
2866 for (
int i = 0; i < layerList.size(); ++i )
2868 const QDomElement layerElem = layerList.at( i ).toElement();
2869 const QString layerName = layerElem.attribute( QStringLiteral(
"name" ) );
2874 if ( mContext.
layerNickname( *l ).compare( layerName ) == 0 )
2890 const QDomNodeList featuresNode = layerElem.elementsByTagName( QStringLiteral(
"Feature" ) );
2891 if ( featuresNode.isEmpty() )
2894 QMap<QgsFeatureId, QString> fidMap;
2896 for (
int j = 0; j < featuresNode.size(); ++j )
2898 const QDomElement featureNode = featuresNode.at( j ).toElement();
2899 const QString fid = featureNode.attribute( QStringLiteral(
"id" ) );
2902 if ( expression.isEmpty() )
2904 feature = vl->
getFeature( fid.toLongLong() );
2913 fidMap.insert( feature.
id(), fid );
2918 const QDomNodeList attrs = featureNode.elementsByTagName(
"Attribute" );
2919 for (
int k = 0; k < attrs.count(); k++ )
2921 const QDomElement elm = attrs.at( k ).toElement();
2922 if ( elm.attribute( QStringLiteral(
"name" ) ).compare(
"geometry" ) == 0 )
2924 wkt = elm.attribute(
"value" );
2929 if ( ! wkt.isEmpty() )
2935 features << feature;
2938 if ( !attributes.isEmpty() )
2941 const QDomNodeList attributesNode = featureNode.elementsByTagName( QStringLiteral(
"Attribute" ) );
2942 for (
int k = 0; k < attributesNode.size(); ++k )
2944 const QDomElement attributeElement = attributesNode.at( k ).toElement();
2945 const QString fieldName = attributeElement.
attribute( QStringLiteral(
"name" ) );
2947 attributes << feature.fieldNameIndex( fieldName );
2953 exporter.setAttributeDisplayName(
true );
2954 exporter.setAttributes( attributes );
2955 exporter.setIncludeGeometry( withGeometry );
2956 exporter.setTransformGeometries(
false );
2960 for (
const auto &feature : std::as_const( features ) )
2962 const QString
id = QStringLiteral(
"%1.%2" ).arg( layerName ).arg( fidMap.value( feature.id() ) );
2963 json[
"features"].push_back( exporter.exportFeatureToJsonObject( feature, QVariantMap(),
id ) );
2968 auto properties = json::object();
2969 const QDomNodeList attributesNode = layerElem.elementsByTagName( QStringLiteral(
"Attribute" ) );
2970 for (
int j = 0; j < attributesNode.size(); ++j )
2972 const QDomElement attrElmt = attributesNode.at( j ).toElement();
2973 const QString name = attrElmt.attribute( QStringLiteral(
"name" ) );
2975 QString value = attrElmt.attribute( QStringLiteral(
"value" ) );
2976 if ( value.isEmpty() )
2978 value = QStringLiteral(
"null" );
2981 properties[name.toStdString()] = value.toStdString();
2984 json[
"features"].push_back(
2986 {
"type",
"Feature" },
2987 {
"id", layerName.toStdString() },
2988 {
"properties", properties }
2994 return QByteArray::fromStdString( json.dump( 2 ) );
2996 return QByteArray::fromStdString( json.dump() );
3000 QDomElement QgsRenderer::createFeatureGML(
3009 QStringList *attributes )
const
3012 QDomElement typeNameElement = doc.createElement(
"qgs:" +
typeName );
3019 typeNameElement.setAttribute( QStringLiteral(
"fid" ), QStringLiteral(
"%1.%2" ).arg(
typeName, fid ) );
3022 if ( layer && layer->
crs() !=
crs )
3055 QDomElement bbElem = doc.createElement( QStringLiteral(
"gml:boundedBy" ) );
3056 QDomElement boxElem;
3068 boxElem.setAttribute( QStringLiteral(
"srsName" ),
crs.
authid() );
3070 bbElem.appendChild( boxElem );
3071 typeNameElement.appendChild( bbElem );
3083 QDomElement geomElem = doc.createElement( QStringLiteral(
"qgs:geometry" ) );
3084 QDomElement gmlElem;
3094 if ( !gmlElem.isNull() )
3098 gmlElem.setAttribute( QStringLiteral(
"srsName" ),
crs.
authid() );
3100 geomElem.appendChild( gmlElem );
3101 typeNameElement.appendChild( geomElem );
3108 for (
int i = 0; i < fields.
count(); ++i )
3110 QString attributeName = fields.
at( i ).
name();
3117 if ( attributes && !attributes->contains( attributeName ) )
3122 QDomElement fieldElem = doc.createElement(
"qgs:" + attributeName.replace(
' ',
'_' ) );
3123 QString fieldTextString = featureAttributes.at( i ).toString();
3128 QDomText fieldText = doc.createTextNode( fieldTextString );
3129 fieldElem.appendChild( fieldText );
3130 typeNameElement.appendChild( fieldElem );
3141 QDomElement fieldElem = doc.createElement( QStringLiteral(
"qgs:maptip" ) );
3142 QDomText maptipText = doc.createTextNode( fieldTextString );
3143 fieldElem.appendChild( maptipText );
3144 typeNameElement.appendChild( fieldElem );
3148 return typeNameElement;
3151 QString QgsRenderer::replaceValueMapAndRelation(
QgsVectorLayer *vl,
int idx,
const QVariant &attributeVal )
3155 QString value( fieldFormatter->
representValue( vl, idx, setup.
config(), QVariant(), attributeVal ) );
3157 if ( setup.
config().value( QStringLiteral(
"AllowMulti" ) ).toBool() && value.startsWith( QLatin1Char(
'{' ) ) && value.endsWith( QLatin1Char(
'}' ) ) )
3159 value = value.mid( 1, value.size() - 2 );
3171 double mapUnitTolerance = 0.0;
3181 mapUnitTolerance = mapSettings.
extent().
width() / 400.0;
3193 mapUnitTolerance = mapSettings.
extent().
width() / 200.0;
3205 mapUnitTolerance = mapSettings.
extent().
width() / 100.0;
3209 QgsRectangle mapRectangle( infoPoint.
x() - mapUnitTolerance, infoPoint.
y() - mapUnitTolerance,
3210 infoPoint.
x() + mapUnitTolerance, infoPoint.
y() + mapUnitTolerance );
3214 QList<QgsMapLayer *> QgsRenderer::highlightLayers( QList<QgsWmsParametersHighlightLayer> params )
3216 QList<QgsMapLayer *> highlightLayers;
3219 QString
crs = mWmsParameters.
crs();
3220 for (
const QgsWmsParametersHighlightLayer ¶m : params )
3223 QDomDocument sldDoc;
3227 if ( !sldDoc.setContent( param.mSld,
true, &errorMsg, &errorLine, &errorColumn ) )
3239 std::unique_ptr<QgsFeatureRenderer> renderer;
3240 QDomElement el = sldDoc.documentElement();
3251 if ( ! param.mLabel.isEmpty() )
3253 url +=
"&field=label:string";
3258 std::unique_ptr<QgsVectorLayer> layer = std::make_unique<QgsVectorLayer>( url, param.mName, QLatin1String(
"memory" ), options );
3259 if ( !layer->isValid() )
3266 if ( ! param.mLabel.isEmpty() )
3268 fet.setAttribute( 0, param.mLabel );
3276 palSettings.
dist = param.mLabelDistance;
3285 switch ( param.mGeom.type() )
3298 QVariant x( pt.
x() );
3301 QVariant y( pt.
y() );
3318 QVariant x( pt.
x() );
3322 QVariant y( pt.
y() );
3326 QVariant hali(
"Center" );
3330 QVariant vali(
"Half" );
3345 if ( param.mColor.isValid() )
3347 textFormat.
setColor( param.mColor );
3350 if ( param.mSize > 0 )
3352 textFormat.
setSize( param.mSize );
3360 if ( ! param.mFont.isEmpty() )
3362 textFormat.
setFont( param.mFont );
3365 if ( param.mBufferColor.isValid() )
3367 bufferSettings.
setColor( param.mBufferColor );
3370 if ( param.mBufferSize > 0 )
3373 bufferSettings.
setSize(
static_cast<double>( param.mBufferSize ) );
3380 layer->setLabeling( simpleLabeling );
3381 layer->setLabelsEnabled(
true );
3383 fet.setGeometry( param.mGeom );
3387 layer->setRenderer( renderer.release() );
3390 if ( layer->isValid() )
3392 highlightLayers.append( layer.release() );
3396 mTemporaryLayers.append( highlightLayers );
3397 return highlightLayers;
3400 void QgsRenderer::removeTemporaryLayers()
3402 qDeleteAll( mTemporaryLayers );
3403 mTemporaryLayers.clear();
3406 QPainter *QgsRenderer::layersRendering(
const QgsMapSettings &mapSettings, QImage &image )
const
3408 QPainter *painter =
nullptr;
3412#ifdef HAVE_SERVER_PYTHON_PLUGINS
3413 mContext.accessControl()->resolveFilterFeatures( mapSettings.
layers() );
3418 renderJob.render( mapSettings, &image, mContext.
socketFeedback() );
3419 painter = renderJob.takePainter();
3421 if ( !renderJob.errors().isEmpty() )
3425 QString layerWMSName;
3432 QString errorMessage = QStringLiteral(
"Rendering error : '%1'" ).arg( e.
message );
3433 if ( ! layerWMSName.isEmpty() )
3435 errorMessage = QStringLiteral(
"Rendering error : '%1' in layer '%2'" ).arg( e.
message, layerWMSName );
3443 void QgsRenderer::setLayerOpacity(
QgsMapLayer *layer,
int opacity )
const
3445 if ( opacity >= 0 && opacity <= 255 )
3447 switch ( layer->
type() )
3466 rasterRenderer->
setOpacity( opacity / 255. );
3488 void QgsRenderer::setLayerFilter(
QgsMapLayer *layer,
const QList<QgsWmsParametersFilter> &filters )
3493 QgsVectorLayer *filteredLayer = qobject_cast<QgsVectorLayer *>( layer );
3494 QStringList expList;
3495 for (
const QgsWmsParametersFilter &filter : filters )
3500 QDomDocument filterXml;
3502 if ( !filterXml.setContent( filter.mFilter,
true, &errorMsg ) )
3505 QStringLiteral(
"Filter string rejected. Error message: %1. The XML string was: %2" ).arg( errorMsg, filter.mFilter ) );
3507 QDomElement filterElem = filterXml.firstChildElement();
3512 expList << filterExp->dump();
3518 if ( !testFilterStringSafety( filter.mFilter ) )
3520 throw QgsSecurityException( QStringLiteral(
"The filter string %1"
3521 " has been rejected because of security reasons."
3522 " Note: Text strings have to be enclosed in single or double quotes."
3523 " A space between each word / special character is mandatory."
3524 " Allowed Keywords and special characters are"
3525 " IS,NOT,NULL,AND,OR,IN,=,<,>=,>,>=,!=,',',(,),DMETAPHONE,SOUNDEX%2."
3526 " Not allowed are semicolons in the filter expression." ).arg(
3529 mContext.settings().allowedExtraSqlTokens().join(
',' ).prepend(
',' ) ) );
3532 QString newSubsetString = filter.mFilter;
3535 newSubsetString.prepend(
") AND (" );
3536 newSubsetString.append(
")" );
3537 newSubsetString.prepend( filteredLayer->
subsetString() );
3538 newSubsetString.prepend(
"(" );
3542 QgsMessageLog::logMessage( QStringLiteral(
"Error setting subset string from filter for layer %1, filter: %2" ).arg( layer->
name(), newSubsetString ),
3543 QStringLiteral(
"Server" ),
3546 QStringLiteral(
"Filter not valid for layer %1: check the filter syntax and the field names." ).arg( layer->
name() ) );
3552 expList.append( dimensionFilter( filteredLayer ) );
3556 if ( expList.size() == 1 )
3560 else if ( expList.size() > 1 )
3562 exp = QStringLiteral(
"( %1 )" ).arg( expList.join( QLatin1String(
" ) AND ( " ) ) );
3564 if ( !exp.isEmpty() )
3566 std::unique_ptr<QgsExpression> expression(
new QgsExpression( exp ) );
3569 mFeatureFilter.
setFilter( filteredLayer, *expression );
3575 QStringList QgsRenderer::dimensionFilter(
QgsVectorLayer *layer )
const
3577 QStringList expList;
3580 const QList<QgsMapLayerServerProperties::WmsDimensionInfo> wmsDims = serverProperties->
wmsDimensions();
3581 if ( wmsDims.isEmpty() )
3596 if ( fieldIndex == -1 )
3601 int endFieldIndex = -1;
3602 if ( !dim.endFieldName.isEmpty() )
3604 endFieldIndex = layer->
fields().
indexOf( dim.endFieldName );
3605 if ( endFieldIndex == -1 )
3611 if ( !dimParamValues.contains( dim.name.toUpper() ) )
3615 if ( dim.defaultDisplayType == QgsMapLayerServerProperties::WmsDimensionInfo::AllValues )
3619 else if ( dim.defaultDisplayType == QgsMapLayerServerProperties::WmsDimensionInfo::ReferenceValue )
3621 defValue = dim.referenceValue;
3626 QSet<QVariant> uniqueValues = layer->
uniqueValues( fieldIndex );
3627 if ( endFieldIndex != -1 )
3629 uniqueValues.unite( layer->
uniqueValues( endFieldIndex ) );
3632 QList<QVariant> values = qgis::setToList( uniqueValues );
3633 std::sort( values.begin(), values.end() );
3634 if ( dim.defaultDisplayType == QgsMapLayerServerProperties::WmsDimensionInfo::MinValue )
3636 defValue = values.first();
3638 else if ( dim.defaultDisplayType == QgsMapLayerServerProperties::WmsDimensionInfo::MaxValue )
3640 defValue = values.last();
3644 if ( endFieldIndex == -1 )
3650 QStringList expElems;
3655 expList << expElems.join(
' ' );
3663 QString dimParamValue = dimParamValues[dim.name.toUpper()];
3665 QStringList dimExplist;
3667 QStringList dimValues = dimParamValue.split(
',' );
3668 for (
int i = 0; i < dimValues.size(); ++i )
3670 QString dimValue = dimValues[i];
3672 if ( dimValue.size() > 1 )
3674 dimValue = dimValue.trimmed();
3677 if ( dimValue.contains(
'/' ) )
3679 QStringList rangeValues = dimValue.split(
'/' );
3681 if ( rangeValues.size() != 2 )
3686 QVariant rangeMin = QVariant( rangeValues[0] );
3687 QVariant rangeMax = QVariant( rangeValues[1] );
3698 QStringList expElems;
3699 if ( endFieldIndex == -1 )
3719 << QStringLiteral(
")" );
3721 dimExplist << expElems.join(
' ' );
3725 QVariant dimVariant = QVariant( dimValue );
3731 if ( endFieldIndex == -1 )
3740 QStringList expElems;
3745 dimExplist << expElems.join(
' ' );
3750 if ( dimExplist.size() == 1 )
3752 expList << dimExplist;
3754 else if ( dimExplist.size() > 1 )
3756 expList << QStringLiteral(
"( %1 )" ).arg( dimExplist.join( QLatin1String(
" ) OR ( " ) ) );
3763 void QgsRenderer::setLayerSelection(
QgsMapLayer *layer,
const QStringList &fids )
const
3773 if ( selectedIds.empty() )
3784 void QgsRenderer::setLayerAccessControlFilter(
QgsMapLayer *layer )
const
3786#ifdef HAVE_SERVER_PYTHON_PLUGINS
3804 void QgsRenderer::annotationsRendering( QPainter *painter,
const QgsMapSettings &mapSettings )
const
3807 const QList< QgsAnnotation * > annotations = annotationManager->
annotations();
3817 if ( !annotation || !annotation->isVisible() )
3823 if ( annotation->hasFixedMapPosition() )
3825 QgsPointXY mapPos = annotation->mapPosition();
3826 if ( mapSettings.
destinationCrs() != annotation->mapPositionCrs() )
3831 mapPos = coordTransform.transform( mapPos );
3839 offsetX = devicePos.
x();
3840 offsetY = devicePos.
y();
3844 const QPointF relativePos = annotation->relativePosition();
3845 offsetX = mapSettings.
outputSize().width() * relativePos.x();
3846 offsetY = mapSettings.
outputSize().height() * relativePos.y();
3850 painter->translate( offsetX, offsetY );
3851 annotation->render( renderContext );
3856 QImage *QgsRenderer::scaleImage(
const QImage *image )
const
3861 QImage *scaledImage =
nullptr;
3862 const int width = mWmsParameters.
widthAsInt();
3864 if ( width != image->width() || height != image->height() )
3866 scaledImage =
new QImage( image->scaled( width, height, Qt::IgnoreAspectRatio, Qt::SmoothTransformation ) );
3872 void QgsRenderer::handlePrintErrors(
const QgsLayout *layout )
const
3878 QList< QgsLayoutItemMap * > mapList;
3881 QList< QgsLayoutItemMap * >::const_iterator mapIt = mapList.constBegin();
3882 for ( ; mapIt != mapList.constEnd(); ++mapIt )
3884 if ( !( *mapIt )->renderingErrors().isEmpty() )
3896 for (
auto layer : layers )
3909 setLayerOpacity( layer, param.
mOpacity );
3916 setLayerSld( layer, mContext.
sld( *layer ) );
3920 setLayerStyle( layer, mContext.
style( *layer ) );
3925 setLayerOpacity( layer, param.
mOpacity );
3930 setLayerFilter( layer, param.
mFilter );
3935 setLayerAccessControlFilter( layer );
3940 setLayerSelection( layer, param.
mSelection );
3945 updateExtent( layer, *settings );
3955 void QgsRenderer::setLayerStyle(
QgsMapLayer *layer,
const QString &style )
const
3957 if ( style.isEmpty() )
3966 QStringLiteral(
"Style '%1' does not exist for layer '%2'" ).arg( style, layer->
name() ) );
3970 void QgsRenderer::setLayerSld(
QgsMapLayer *layer,
const QDomElement &sld )
const
3975 QString sldStyleName =
"__sld_style";
3976 while ( styles.contains( sldStyleName ) )
3978 sldStyleName.append(
'@' );
3991 if ( !mWmsParameters.
bbox().isEmpty() )
3995 std::unique_ptr<QImage> tmp( createImage( mContext.
mapSize(
false ) ) );
3996 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.
@ 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.
QgsLayerTreeModelLegendNode * findLegendNode(const QString &layerId, const QString &ruleKey) const
Searches through the layer tree to find a legend node with a matching layer ID and rule key.
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.
Handles automatic layout and rendering of legends.
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.
void setWmsLegendSize(QSizeF s)
Sets the desired size (in millimeters) of WMS legend graphics shown in the legend.
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.
Contains utility functions for working with symbols and symbol layers.
static QString symbolProperties(QgsSymbol *symbol)
Returns a string representing the symbol.
Abstract base class for all rendered symbols.
@ Hidden
Hide task from GUI.
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
Returns the editor widget setup for the field at the specified index.
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.
Implementation of legend node interface for displaying WMS legend entries.
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).
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 geospatial PDF 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 writeGeospatialPdf() const
Returns if a geospatial PDF shall be exported.
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.
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.
QString creator
Metadata creator tag.
bool useOgcBestPracticeFormatGeoreferencing
true if OGC "best practice" format georeferencing should be used.
QString author
Metadata author tag.
QString subject
Metadata subject tag.
QString title
Metadata title tag.
QDateTime creationDateTime
Metadata creation datetime.
QString producer
Metadata producer tag.
bool useIso32000ExtensionFormatGeoreferencing
true if ISO32000 extension format georeferencing should be used.
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 Geospatial PDF 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 geospatial PDF 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