78#include <QTemporaryFile>
81#include <QXmlStreamReader>
82#include <nlohmann/json.hpp>
106 : mContext( context )
111 mWmsParameters.
dump();
116 removeTemporaryLayers();
122 std::unique_ptr<QgsWmsRestorer> restorer;
135 for (
const auto &layer : std::as_const( layersToRender ) )
138 if ( layer->dataProvider()->name() == QLatin1String(
"wms" ) )
142 const auto image { layerNode->getLegendGraphicBlocking() };
143 if ( !image.isNull() )
148 const double w = image.width() / dpmm;
149 const double h = image.height() / dpmm;
150 const QSizeF newWmsSize { w, h };
163 if ( !mWmsParameters.
bbox().isEmpty() )
167 std::unique_ptr<QImage> tmp( createImage( mContext.
mapSize(
false ) ) );
168 configureMapSettings( tmp.get(), mapSettings );
174 context = configureDefaultRenderContext();
178 std::unique_ptr<QImage> image;
179 const QSizeF minSize = renderer.
minimumSize( &context );
180 const QSize size(
static_cast<int>( minSize.width() * dpmm ),
static_cast<int>( minSize.height() * dpmm ) );
185 image.reset( createImage( size ) );
188 QPainter painter( image.get() );
191 if ( painter.renderHints() & QPainter::SmoothPixmapTransform )
193 if ( painter.renderHints() & QPainter::LosslessImageRendering )
203 return image.release();
209 std::unique_ptr<QgsWmsRestorer> restorer;
223 std::unique_ptr<QImage> image( createImage( size ) );
227 std::unique_ptr<QPainter> painter;
228 painter.reset(
new QPainter( image.get() ) );
229 painter->setRenderHint( QPainter::Antialiasing,
true );
230 painter->scale( dpmm, dpmm );
241 nodeModel.
drawSymbol( settings, &ctx, size.height() / dpmm );
244 return image.release();
250 std::unique_ptr<QgsWmsRestorer> restorer;
270 std::unique_ptr<QgsWmsRestorer> restorer;
290 if ( vLayer->renderer() )
294 const QString ruleExp { vLayer->renderer()->legendKeyToExpression( ruleKey, vLayer, ok ) };
297 jsonSymbol[QStringLiteral(
"rule" )] = ruleExp;
306 void QgsRenderer::runHitTest(
const QgsMapSettings &mapSettings, HitTest &hitTest )
const
310 for (
const QString &
id : mapSettings.layerIds() )
327 runHitTestLayer( vl, usedSymbols, context );
333 std::unique_ptr<QgsFeatureRenderer> r( vl->
renderer()->
clone() );
335 r->startRender( context, vl->
fields() );
343 if ( moreSymbolsPerFeature )
345 for (
QgsSymbol *s : r->originalSymbolsForFeature( f, context ) )
351 r->stopRender( context );
363 std::unique_ptr<QgsWmsRestorer> restorer;
373 std::unique_ptr<QPainter> painter;
374 std::unique_ptr<QImage> image( createImage( mContext.
mapSize() ) );
377 configureMapSettings( image.get(), mapSettings );
384 runHitTest( mapSettings,
symbols );
392 std::unique_ptr<QgsWmsRestorer> restorer;
397 if ( templateName.isEmpty() )
420 std::unique_ptr<QgsPrintLayout> layout( sourceLayout->
clone() );
424 QStringList atlasPk = mWmsParameters.
atlasPk();
425 if ( !atlasPk.isEmpty() )
427 atlas = layout->atlas();
428 if ( !atlas || !atlas->
enabled() )
441 if ( atlasPk.size() == 1 && atlasPk.at( 0 ) == QLatin1String(
"*" ) )
445 if ( atlas->
count() > maxAtlasFeatures )
453 if ( pkIndexes.size() == 0 )
455 QgsDebugMsgLevel( QStringLiteral(
"Atlas print: layer %1 has no primary key attributes" ).arg( cLayer->
name() ), 2 );
459 const int pkIndexesSize { std::max<int>( pkIndexes.size(), 1 ) };
461 QStringList pkAttributeNames;
462 for (
int pkIndex : std::as_const( pkIndexes ) )
464 pkAttributeNames.append( cLayer->
fields().
at( pkIndex ).
name() );
467 const int nAtlasFeatures = atlasPk.size() / pkIndexesSize;
468 if ( nAtlasFeatures * pkIndexesSize != atlasPk.size() )
474 if ( nAtlasFeatures > maxAtlasFeatures )
479 QString filterString;
480 int currentAtlasPk = 0;
482 for (
int i = 0; i < nAtlasFeatures; ++i )
486 filterString.append(
" OR " );
489 filterString.append(
"( " );
492 if ( pkAttributeNames.isEmpty() )
494 filterString.append( QStringLiteral(
"$id = %1" ).arg( atlasPk.at( currentAtlasPk ) ) );
499 for (
int j = 0; j < pkIndexes.size(); ++j )
503 filterString.append(
" AND " );
510 filterString.append(
" )" );
518 if ( !errorString.isEmpty() )
520 throw QgsException( QStringLiteral(
"An error occurred during the Atlas print: %1" ).arg( errorString ) );
532 auto image = std::make_unique<QImage>();
533 configureMapSettings( image.get(), mapSettings );
539 configurePrintLayout( layout.get(), mapSettings, atlas );
543 const QList<QgsMapLayer *> lyrs = mapSettings.
layers();
545#ifdef HAVE_SERVER_PYTHON_PLUGINS
546 mContext.accessControl()->resolveFilterFeatures( lyrs );
550 QHash<const QgsVectorLayer *, QStringList> fltrs;
555 fltrs.insert( vl, dimensionFilter( vl ) );
567 QTemporaryFile tempOutputFile( QDir::tempPath() +
'/' + QStringLiteral(
"XXXXXX.%1" ).arg( extension ) );
568 if ( !tempOutputFile.open() )
570 throw QgsException( QStringLiteral(
"Could not open temporary file for the GetPrint request." ) );
578 if ( !mWmsParameters.
dpi().isEmpty() )
581 double dpi( mWmsParameters.
dpi().toDouble( &ok ) );
583 exportSettings.
dpi = dpi;
596 atlasSvgExport.
exportToSvg( tempOutputFile.fileName(), exportSettings );
602 exporter.
exportToSvg( tempOutputFile.fileName(), exportSettings );
611 double dpi( layout->renderContext().dpi() );
612 if ( !mWmsParameters.
dpi().isEmpty() )
615 double _dpi = mWmsParameters.
dpi().toDouble( &ok );
619 exportSettings.
dpi = dpi;
625 QgsLayoutSize layoutSize( layout->pageCollection()->page( 0 )->sizeWithUnits() );
630 const QSize imageSize = QSize(
static_cast<int>( width.
length() * dpi / 25.4 ),
static_cast<int>( height.
length() * dpi / 25.4 ) );
632 const QString paramWidth = mWmsParameters.
width();
633 const QString paramHeight = mWmsParameters.
height();
638 if ( !paramWidth.isEmpty() && !paramHeight.isEmpty() )
640 exportSettings.
imageSize = QSize( paramWidth.toInt(), paramHeight.toInt() );
642 else if ( !paramWidth.isEmpty() && paramHeight.isEmpty() )
644 exportSettings.
imageSize = QSize( paramWidth.toInt(),
static_cast<double>( paramWidth.toInt() ) / imageSize.width() * imageSize.height() );
646 else if ( paramWidth.isEmpty() && !paramHeight.isEmpty() )
648 exportSettings.
imageSize = QSize(
static_cast<double>( paramHeight.toInt() ) / imageSize.height() * imageSize.width(), paramHeight.toInt() );
656 exportSettings.
pages.append( 0 );
664 atlasPngExport.
exportToImage( tempOutputFile.fileName(), exportSettings );
668 throw QgsServiceException( QStringLiteral(
"Bad request" ), QStringLiteral(
"Atlas error: empty atlas." ), QString(), 400 );
674 exporter.
exportToImage( tempOutputFile.fileName(), exportSettings );
682 if ( !mWmsParameters.
dpi().isEmpty() )
685 double dpi( mWmsParameters.
dpi().toDouble( &ok ) );
687 exportSettings.
dpi = dpi;
692 exportSettings.
rasterizeWholeImage = layout->customProperty( QStringLiteral(
"rasterize" ),
false ).toBool();
695 if ( requestMapScales.size() > 0 )
705 if ( exportThemes.size() > 0 )
732 exporter.
exportToPdf( tempOutputFile.fileName(), exportSettings );
742 handlePrintErrors( atlas->
layout() );
746 handlePrintErrors( layout.get() );
749 return tempOutputFile.readAll();
756 QList<QgsLayoutItemMap *> maps;
762 for (
const auto &map : std::as_const( maps ) )
768 if ( cMapParams.
mLayers.isEmpty() )
773 if ( !atlas || !map->atlasDriven() )
779 c->removeLayoutItem( map );
796 if ( cMapParams.
mScale > 0 )
798 map->setScale(
static_cast<double>( cMapParams.
mScale ) );
804 map->setMapRotation( cMapParams.
mRotation );
808 if ( !map->keepLayerSet() )
810 QList<QgsMapLayer *> layerSet;
812 for (
const auto &layer : std::as_const( cMapParams.mLayers ) )
816 QList<QgsMapLayer *> layersFromGroup;
818 const QList<QgsMapLayer *> cLayersFromGroup = mContext.
layersFromGroup( layer.mNickname );
819 for (
QgsMapLayer *layerFromGroup : cLayersFromGroup )
821 if ( !layerFromGroup )
826 layersFromGroup.push_front( layerFromGroup );
829 if ( !layersFromGroup.isEmpty() )
831 layerSet.append( layersFromGroup );
843 setLayerStyle( mlayer, layer.mStyle );
848 std::reverse( layerSet.begin(), layerSet.end() );
853 QMap<QString, QString> layersStyle;
854 if ( map->followVisibilityPreset() )
864 const QString presetName = map->followVisibilityPresetName();
865 if ( layerSet.isEmpty() )
869 layerSet = map->layersToRender( &ex );
872 map->setFollowVisibilityPreset(
false );
876 for (
const auto &layerMapThemeRecord : std::as_const( mapThemeRecords ) )
878 if ( layerSet.contains( layerMapThemeRecord.layer() ) )
880 layersStyle.insert( layerMapThemeRecord.layer()->id(), layerMapThemeRecord.layer()->styleManager()->style( layerMapThemeRecord.currentStyle ).xmlData() );
886 const QList<QgsMapLayer *> highlights = highlightLayers( cMapParams.
mHighlightLayers );
887 for (
const auto &hl : std::as_const( highlights ) )
889 layerSet.prepend( hl );
892 map->setLayers( layerSet );
893 map->setKeepLayerSet(
true );
897 if ( !layersStyle.isEmpty() )
899 map->setLayerStyleOverrides( layersStyle );
900 map->setKeepLayerStyles(
true );
907 map->grid()->setIntervalX(
static_cast<double>( cMapParams.
mGridX ) );
908 map->grid()->setIntervalY(
static_cast<double>( cMapParams.
mGridY ) );
913 QList<QgsLayoutItemLabel *> labels;
915 for (
const auto &label : std::as_const( labels ) )
918 const QString labelId = label->
id();
919 const QString labelParam = mWmsParameters.
layoutParameter( labelId, ok );
924 if ( labelParam.isEmpty() )
928 c->removeItem( label );
933 label->setText( labelParam );
937 QList<QgsLayoutItemHtml *> htmls;
939 for (
const auto &html : std::as_const( htmls ) )
941 if ( html->frameCount() == 0 )
946 const QString htmlId = htmlFrame->
id();
947 const QString htmlValue = mWmsParameters.
layoutParameter( htmlId, ok );
957 if ( htmlValue.isEmpty() )
959 c->removeMultiFrame( html );
966 QUrl newUrl( htmlValue );
967 html->setUrl( newUrl );
971 html->setHtml( htmlValue );
978 QList<QgsLayoutItemLegend *> legends;
980 for (
const auto &legend : std::as_const( legends ) )
982 if ( legend->autoUpdateModel() )
992 legend->setAutoUpdateModel(
false );
996 QStringList layerSet;
997 QList<QgsMapLayer *> mapLayers;
998 if ( map->
layers().isEmpty() )
1002 mapLayers = mProject->
mapLayers(
true ).values();
1006 mapLayers = map->
layers();
1008 const QList<QgsMapLayer *> layerList = mapLayers;
1009 for (
const auto &layer : layerList )
1010 layerSet << layer->id();
1022 for (
const auto &layerId : layerIds )
1029 if ( !layerSet.contains( layerId ) )
1031 qobject_cast<QgsLayerTreeGroup *>( nodeLayer->
parent() )->removeChildNode( nodeLayer );
1038 qobject_cast<QgsLayerTreeGroup *>( nodeLayer->
parent() )->removeChildNode( nodeLayer );
1062 std::unique_ptr<QgsWmsRestorer> restorer;
1073 std::unique_ptr<QPainter> painter;
1074 std::unique_ptr<QImage> image( createImage( mContext.
mapSize() ) );
1077 configureMapSettings( image.get(), mapSettings );
1083 QPainter *renderedPainter = layersRendering( mapSettings, image.get() );
1084 if ( !renderedPainter )
1089 painter.reset( renderedPainter );
1092 annotationsRendering( painter.get(), mapSettings );
1098 QImage *scaledImage = scaleImage( image.get() );
1100 image.reset( scaledImage );
1118 QList<QgsDxfExport::DxfLayer> dxfLayers;
1130 int layerAttribute = -1;
1131 if ( attributes.size() > layerIdx )
1142 QString
crs = mWmsParameters.
crs();
1143 if (
crs.compare( QStringLiteral(
"CRS:84" ), Qt::CaseInsensitive ) == 0 )
1145 crs = QStringLiteral(
"EPSG:4326" );
1148 else if (
crs.isEmpty() )
1150 crs = QStringLiteral(
"EPSG:4326" );
1184 auto dxf = std::make_unique<QgsDxfExport>();
1185 dxf->setExtent( mapExtent );
1186 dxf->setDestinationCrs( outputCRS );
1187 dxf->addLayers( dxfLayers );
1189 dxf->setSymbologyExport( mWmsParameters.
dxfMode() );
1192 dxf->setSymbologyScale( mWmsParameters.
dxfScale() );
1195 dxf->setForce2d( mWmsParameters.
isForce2D() );
1197 if ( mWmsParameters.
noMText() )
1205 dxf->setFlags( flags );
1232 auto pdf = std::make_unique<QgsMapRendererTask>( ms, tmpFileName, QStringLiteral(
"PDF" ),
false,
QgsTask::Hidden, geospatialPdf, pdfExportDetails );
1235 pdf->setSaveWorldFile(
true );
1243 if ( i < 0 || i > mapSettings.
outputSize().width() )
1250 if ( j < 0 || j > mapSettings.
outputSize().height() )
1273 const bool ijDefined = !mWmsParameters.
i().isEmpty() && !mWmsParameters.
j().isEmpty();
1274 const bool xyDefined = !mWmsParameters.
x().isEmpty() && !mWmsParameters.
y().isEmpty();
1275 const bool filtersDefined = !mWmsParameters.
filters().isEmpty();
1276 const bool filterGeomDefined = !mWmsParameters.
filterGeom().isEmpty();
1278 if ( !ijDefined && !xyDefined && !filtersDefined && !filterGeomDefined )
1282 if ( mWmsParameters.
j().isEmpty() )
1295 std::unique_ptr<QImage> outputImage( createImage( mContext.
mapSize() ) );
1298 std::unique_ptr<QgsWmsRestorer> restorer;
1303 bool mandatoryCrsParam =
true;
1304 if ( filtersDefined && !ijDefined && !xyDefined && mWmsParameters.
crs().isEmpty() )
1306 mandatoryCrsParam =
false;
1312 configureMapSettings( outputImage.get(), mapSettings, mandatoryCrsParam );
1328#ifdef HAVE_SERVER_PYTHON_PLUGINS
1329 mContext.accessControl()->resolveFilterFeatures( mapSettings.
layers() );
1332 QDomDocument result = featureInfoDocument( layers, mapSettings, outputImage.get(), version );
1337 ba = convertFeatureInfoToText( result );
1339 ba = convertFeatureInfoToHtml( result );
1341 ba = convertFeatureInfoToJson( layers, result, mapSettings.
destinationCrs() );
1343 ba = result.toByteArray();
1348 QImage *QgsRenderer::createImage(
const QSize &size )
const
1350 std::unique_ptr<QImage> image;
1358 image = std::make_unique<QImage>( size, QImage::Format_ARGB32_Premultiplied );
1363 image = std::make_unique<QImage>( size, QImage::Format_RGB32 );
1368 if ( image->isNull() )
1370 throw QgsException( QStringLiteral(
"createImage: image could not be created, check for out of memory conditions" ) );
1373 const int dpm =
static_cast<int>( mContext.
dotsPerMm() * 1000.0 );
1374 image->setDotsPerMeterX( dpm );
1375 image->setDotsPerMeterY( dpm );
1377 return image.release();
1380 void QgsRenderer::configureMapSettings(
const QPaintDevice *paintDevice,
QgsMapSettings &mapSettings,
bool mandatoryCrsParam )
1384 throw QgsException( QStringLiteral(
"configureMapSettings: no paint device" ) );
1387 mapSettings.
setOutputSize( QSize( paintDevice->width(), paintDevice->height() ) );
1394 if ( !mWmsParameters.
bbox().isEmpty() && mapExtent.
isEmpty() )
1399 QString
crs = mWmsParameters.
crs();
1400 if (
crs.compare(
"CRS:84", Qt::CaseInsensitive ) == 0 )
1402 crs = QString(
"EPSG:4326" );
1405 else if (
crs.isEmpty() && !mandatoryCrsParam )
1407 crs = QString(
"EPSG:4326" );
1417 QgsWmsParameter parameter;
1461 else if ( backgroundColor.isValid() )
1492 const QString timeString { mWmsParameters.
dimensionValues().value( QStringLiteral(
"TIME" ), QString() ) };
1493 if ( !timeString.isEmpty() )
1495 bool isValidTemporalRange {
true };
1498 const QDateTime dt { QDateTime::fromString( timeString, Qt::DateFormat::ISODateWithMs ) };
1511 isValidTemporalRange =
false;
1516 if ( isValidTemporalRange )
1525 QgsRenderContext QgsRenderer::configureDefaultRenderContext( QPainter *painter )
1538 QDomDocument QgsRenderer::featureInfoDocument( QList<QgsMapLayer *> &layers,
const QgsMapSettings &mapSettings,
const QImage *outputImage,
const QString &version )
const
1542 bool ijDefined = ( !mWmsParameters.
i().isEmpty() && !mWmsParameters.
j().isEmpty() );
1544 bool xyDefined = ( !mWmsParameters.
x().isEmpty() && !mWmsParameters.
y().isEmpty() );
1546 bool filtersDefined = !mWmsParameters.
filters().isEmpty();
1548 bool filterGeomDefined = !mWmsParameters.
filterGeom().isEmpty();
1551 if ( featureCount < 1 )
1556 int i = mWmsParameters.
iAsInt();
1557 int j = mWmsParameters.
jAsInt();
1558 if ( xyDefined && !ijDefined )
1560 i = mWmsParameters.
xAsInt();
1561 j = mWmsParameters.
yAsInt();
1565 if ( ( i != -1 && j != -1 && width != 0 && height != 0 ) && ( width != outputImage->width() || height != outputImage->height() ) )
1567 i *= ( outputImage->width() /
static_cast<double>( width ) );
1568 j *= ( outputImage->height() /
static_cast<double>( height ) );
1572 std::unique_ptr<QgsRectangle> featuresRect;
1573 std::unique_ptr<QgsGeometry> filterGeom;
1574 std::unique_ptr<QgsPointXY> infoPoint;
1576 if ( i != -1 && j != -1 )
1579 infoPointToMapCoordinates( i, j, infoPoint.get(), mapSettings );
1581 else if ( filtersDefined )
1586 if ( filterGeomDefined )
1591 QDomDocument result;
1592 const QDomNode header = result.createProcessingInstruction( QStringLiteral(
"xml" ), QStringLiteral(
"version=\"1.0\" encoding=\"UTF-8\"" ) );
1593 result.appendChild( header );
1595 QDomElement getFeatureInfoElement;
1599 getFeatureInfoElement = result.createElement( QStringLiteral(
"wfs:FeatureCollection" ) );
1600 getFeatureInfoElement.setAttribute( QStringLiteral(
"xmlns:wfs" ), QStringLiteral(
"http://www.opengis.net/wfs" ) );
1601 getFeatureInfoElement.setAttribute( QStringLiteral(
"xmlns:ogc" ), QStringLiteral(
"http://www.opengis.net/ogc" ) );
1602 getFeatureInfoElement.setAttribute( QStringLiteral(
"xmlns:gml" ), QStringLiteral(
"http://www.opengis.net/gml" ) );
1603 getFeatureInfoElement.setAttribute( QStringLiteral(
"xmlns:ows" ), QStringLiteral(
"http://www.opengis.net/ows" ) );
1604 getFeatureInfoElement.setAttribute( QStringLiteral(
"xmlns:xlink" ), QStringLiteral(
"http://www.w3.org/1999/xlink" ) );
1605 getFeatureInfoElement.setAttribute( QStringLiteral(
"xmlns:qgs" ), QStringLiteral(
"http://qgis.org/gml" ) );
1606 getFeatureInfoElement.setAttribute( QStringLiteral(
"xmlns:xsi" ), QStringLiteral(
"http://www.w3.org/2001/XMLSchema-instance" ) );
1607 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" ) );
1612 if ( featureInfoElemName.isEmpty() )
1614 featureInfoElemName = QStringLiteral(
"GetFeatureInfoResponse" );
1617 if ( featureInfoElemNs.isEmpty() )
1619 getFeatureInfoElement = result.createElement( featureInfoElemName );
1623 getFeatureInfoElement = result.createElementNS( featureInfoElemNs, featureInfoElemName );
1627 if ( !featureInfoSchema.isEmpty() )
1629 getFeatureInfoElement.setAttribute( QStringLiteral(
"xmlns:xsi" ), QStringLiteral(
"http://www.w3.org/2001/XMLSchema-instance" ) );
1630 getFeatureInfoElement.setAttribute( QStringLiteral(
"xsi:schemaLocation" ), featureInfoSchema );
1633 result.appendChild( getFeatureInfoElement );
1643 for (
const QString &queryLayer : queryLayers )
1645 bool validLayer =
false;
1646 bool queryableLayer =
true;
1647 for (
QgsMapLayer *layer : std::as_const( layers ) )
1653 if ( !queryableLayer )
1658 QDomElement layerElement;
1661 layerElement = getFeatureInfoElement;
1665 layerElement = result.createElement( QStringLiteral(
"Layer" ) );
1666 QString layerName = queryLayer;
1669 QHash<QString, QString>::const_iterator layerAliasIt = layerAliasMap.constFind( layerName );
1670 if ( layerAliasIt != layerAliasMap.constEnd() )
1672 layerName = layerAliasIt.value();
1675 layerElement.setAttribute( QStringLiteral(
"name" ), layerName );
1676 const QString layerTitle = layer->serverProperties()->title();
1677 if ( !layerTitle.isEmpty() )
1679 layerElement.setAttribute( QStringLiteral(
"title" ), layerTitle );
1683 layerElement.setAttribute( QStringLiteral(
"title" ), layerName );
1685 getFeatureInfoElement.appendChild( layerElement );
1688 layerElement.setAttribute( QStringLiteral(
"id" ), layer->id() );
1694 QgsVectorLayer *vectorLayer = qobject_cast<QgsVectorLayer *>( layer );
1697 ( void ) featureInfoFromVectorLayer( vectorLayer, infoPoint.get(), featureCount, result, layerElement, mapSettings, renderContext, version, featuresRect.get(), filterGeom.get() );
1703 QgsRasterLayer *rasterLayer = qobject_cast<QgsRasterLayer *>( layer );
1712 QgsPointXY layerInfoPoint = mapSettings.mapToLayerCoordinates( layer, *( infoPoint.get() ) );
1719 layerElement = result.createElement( QStringLiteral(
"gml:featureMember" ) );
1720 getFeatureInfoElement.appendChild( layerElement );
1723 ( void ) featureInfoFromRasterLayer( rasterLayer, mapSettings, &layerInfoPoint, renderContext, result, layerElement, version );
1731 param.mValue = queryLayer;
1734 else if ( ( validLayer && !queryableLayer ) || ( !validLayer && mContext.
isValidGroup( queryLayer ) ) )
1737 param.mValue = queryLayer;
1739 bool hasGroupAndQueryable {
false };
1744 for (
const QString &ql : constNicks )
1748 const QList<QgsMapLayer *> constLayers { mContext.
layerGroups()[ql] };
1751 if ( ( !ml->serverProperties()->shortName().isEmpty() && ml->serverProperties()->shortName() == queryLayer ) || ( ml->name() == queryLayer ) )
1757 hasGroupAndQueryable =
true;
1766 if ( !hasGroupAndQueryable )
1773 if ( featuresRect && !featuresRect->isNull() )
1777 QDomElement bBoxElem = result.createElement( QStringLiteral(
"gml:boundedBy" ) );
1778 QDomElement boxElem;
1780 if ( gmlVersion < 3 )
1792 boxElem.setAttribute( QStringLiteral(
"srsName" ),
crs.
authid() );
1794 bBoxElem.appendChild( boxElem );
1795 getFeatureInfoElement.insertBefore( bBoxElem, QDomNode() );
1799 QDomElement bBoxElem = result.createElement( QStringLiteral(
"BoundingBox" ) );
1800 bBoxElem.setAttribute( QStringLiteral(
"CRS" ), mapSettings.destinationCrs().authid() );
1801 bBoxElem.setAttribute( QStringLiteral(
"minx" ),
qgsDoubleToString( featuresRect->xMinimum(), 8 ) );
1802 bBoxElem.setAttribute( QStringLiteral(
"maxx" ),
qgsDoubleToString( featuresRect->xMaximum(), 8 ) );
1803 bBoxElem.setAttribute( QStringLiteral(
"miny" ),
qgsDoubleToString( featuresRect->yMinimum(), 8 ) );
1804 bBoxElem.setAttribute( QStringLiteral(
"maxy" ),
qgsDoubleToString( featuresRect->yMaximum(), 8 ) );
1805 getFeatureInfoElement.insertBefore( bBoxElem, QDomNode() );
1811 convertFeatureInfoToSia2045( result );
1827 std::unique_ptr<QgsGeometry> layerFilterGeom;
1830 layerFilterGeom.reset(
new QgsGeometry( *filterGeom ) );
1844 searchRect = featureInfoSearchRect( layer, mapSettings, renderContext, *infoPoint );
1846 else if ( layerFilterGeom )
1848 searchRect = layerFilterGeom->boundingBox();
1850 else if ( !mWmsParameters.
bbox().isEmpty() )
1852 searchRect = layerRect;
1859 int featureCounter = 0;
1878 if ( layerFilterGeom )
1880 fReq.
setFilterExpression( QString(
"intersects( $geometry, geom_from_wkt('%1') )" ).arg( layerFilterGeom->asWkt() ) );
1885#ifdef HAVE_SERVER_PYTHON_PLUGINS
1886 mContext.accessControl()->filterFeatures( layer, fReq );
1888 QStringList attributes;
1889 for (
const QgsField &field : fields )
1891 attributes.append( field.name() );
1893 attributes = mContext.accessControl()->layerAttributes( layer, attributes );
1901 r2->startRender( renderContext, layer->
fields() );
1904 bool featureBBoxInitialized =
false;
1913 if ( featureCounter > nFeatures )
1928 bool render = r2->willRenderFeature( feature, renderContext );
1941 if ( !featureBBoxInitialized && featureBBox->
isEmpty() )
1944 featureBBoxInitialized =
true;
1964 QDomElement elem = createFeatureGML(
1966#ifdef HAVE_SERVER_PYTHON_PLUGINS
1971 QDomElement featureMemberElem = infoDocument.createElement( QStringLiteral(
"gml:featureMember" ) );
1972 featureMemberElem.appendChild( elem );
1973 layerElement.appendChild( featureMemberElem );
1978 QDomElement featureElement = infoDocument.createElement( QStringLiteral(
"Feature" ) );
1980 layerElement.appendChild( featureElement );
1986 writeAttributesTabLayout( editConfig, layer, fields, featureAttributes, infoDocument, featureElement, renderContext
1987#ifdef HAVE_SERVER_PYTHON_PLUGINS
1995 for (
int i = 0; i < featureAttributes.count(); ++i )
1997 writeVectorLayerAttribute( i, layer, fields, featureAttributes, infoDocument, featureElement, renderContext
1998#ifdef HAVE_SERVER_PYTHON_PLUGINS
2010 QDomElement maptipElem = infoDocument.createElement( QStringLiteral(
"Attribute" ) );
2011 maptipElem.setAttribute( QStringLiteral(
"name" ), QStringLiteral(
"maptip" ) );
2015 featureElement.appendChild( maptipElem );
2021 QDomElement displayElem = infoDocument.createElement( QStringLiteral(
"Attribute" ) );
2022 displayElem.setAttribute( QStringLiteral(
"name" ), QStringLiteral(
"displayName" ) );
2025 displayExpression.
prepare( &context );
2026 displayElem.setAttribute( QStringLiteral(
"value" ), displayExpression.
evaluate( &context ).toString() );
2027 featureElement.appendChild( displayElem );
2033 QDomElement bBoxElem = infoDocument.createElement( QStringLiteral(
"BoundingBox" ) );
2034 bBoxElem.setAttribute( version == QLatin1String(
"1.1.1" ) ?
"SRS" :
"CRS",
outputCrs.authid() );
2039 featureElement.appendChild( bBoxElem );
2055 if ( segmentizeWktGeometry )
2063 geom.
set( segmentizedGeom );
2067 QDomElement geometryElement = infoDocument.createElement( QStringLiteral(
"Attribute" ) );
2068 geometryElement.setAttribute( QStringLiteral(
"name" ), QStringLiteral(
"geometry" ) );
2069 geometryElement.setAttribute( QStringLiteral(
"value" ), geom.
asWkt( mContext.
precision() ) );
2070 geometryElement.setAttribute( QStringLiteral(
"type" ), QStringLiteral(
"derived" ) );
2071 featureElement.appendChild( geometryElement );
2078 r2->stopRender( renderContext );
2089 QString groupName = container->
name();
2090 QDomElement nameElem;
2092 if ( !groupName.isEmpty() )
2094 nameElem = doc.createElement( groupName );
2095 parentElem.appendChild( nameElem );
2098 const QList<QgsAttributeEditorElement *> children = container->
children();
2103 writeAttributesTabGroup( child, layer, fields, featureAttributes, doc, nameElem.isNull() ? parentElem : nameElem, renderContext );
2113 writeVectorLayerAttribute( idx, layer, fields, featureAttributes, doc, nameElem.isNull() ? parentElem : nameElem, renderContext, attributes );
2124 if ( !editorContainer )
2129 writeAttributesTabGroup( editorContainer, layer, fields, featureAttributes, doc, featureElem, renderContext, attributes );
2132 void QgsRenderer::writeVectorLayerAttribute(
int attributeIndex,
QgsVectorLayer *layer,
const QgsFields &fields,
QgsAttributes &featureAttributes, QDomDocument &doc, QDomElement &featureElem,
QgsRenderContext &renderContext, QStringList *attributes )
const
2134#ifndef HAVE_SERVER_PYTHON_PLUGINS
2135 Q_UNUSED( attributes );
2148#ifdef HAVE_SERVER_PYTHON_PLUGINS
2150 if ( attributes && !attributes->contains( fields.
at( attributeIndex ).
name() ) )
2157 QDomElement attributeElement = doc.createElement( QStringLiteral(
"Attribute" ) );
2158 attributeElement.setAttribute( QStringLiteral(
"name" ), attributeName );
2161 featureElem.appendChild( attributeElement );
2183 :
Qgis::RasterIdentifyFormat::Value
2202 if ( !identifyResult.
isValid() )
2205 QMap<int, QVariant> attributes = identifyResult.
results();
2219 for (
auto it = attributes.constBegin(); it != attributes.constEnd(); ++it )
2222 feature.
setAttribute( index++, QString::number( it.value().toDouble() ) );
2225 QDomElement elem = createFeatureGML(
2226 &feature,
nullptr, infoDocument, layerCrs, mapSettings,
typeName,
false, gmlVersion,
nullptr
2228 layerElement.appendChild( elem );
2232 const auto values = identifyResult.
results();
2233 for (
auto it = values.constBegin(); it != values.constEnd(); ++it )
2235 QVariant value = it.value();
2236 if ( value.userType() == QMetaType::Type::Bool && !value.toBool() )
2242 if ( value.userType() == QMetaType::Type::QString )
2253 for (
const QgsFeature &feature : storeFeatures )
2255 QDomElement elem = createFeatureGML(
2256 &feature,
nullptr, infoDocument, layerCrs, mapSettings,
typeName,
false, gmlVersion,
nullptr
2258 layerElement.appendChild( elem );
2268 for (
auto it = attributes.constBegin(); it != attributes.constEnd(); ++it )
2270 QDomElement attributeElement = infoDocument.createElement( QStringLiteral(
"Attribute" ) );
2271 attributeElement.setAttribute( QStringLiteral(
"name" ), layer->
bandName( it.key() ) );
2276 value = QString::number( it.value().toDouble() );
2279 attributeElement.setAttribute( QStringLiteral(
"value" ), value );
2280 layerElement.appendChild( attributeElement );
2285 const auto values = identifyResult.
results();
2286 for (
auto it = values.constBegin(); it != values.constEnd(); ++it )
2288 QVariant value = it.value();
2289 if ( value.userType() == QMetaType::Type::Bool && !value.toBool() )
2295 if ( value.userType() == QMetaType::Type::QString )
2305 for (
const QgsFeature &feature : storeFeatures )
2307 for (
const auto &fld : feature.fields() )
2309 const auto val { feature.
attribute( fld.name() ) };
2310 if ( val.isValid() )
2312 QDomElement attributeElement = infoDocument.createElement( QStringLiteral(
"Attribute" ) );
2313 attributeElement.setAttribute( QStringLiteral(
"name" ), fld.name() );
2314 attributeElement.setAttribute( QStringLiteral(
"value" ), val.toString() );
2315 layerElement.appendChild( attributeElement );
2326 QDomElement maptipElem = infoDocument.createElement( QStringLiteral(
"Attribute" ) );
2327 maptipElem.setAttribute( QStringLiteral(
"name" ), QStringLiteral(
"maptip" ) );
2331 context.appendScope( scope );
2333 layerElement.appendChild( maptipElem );
2339 bool QgsRenderer::testFilterStringSafety(
const QString &filter )
const
2342 if ( filter.contains( QLatin1String(
";" ) ) )
2347 QStringList tokens = filter.split(
' ', Qt::SkipEmptyParts );
2348 groupStringList( tokens, QStringLiteral(
"'" ) );
2349 groupStringList( tokens, QStringLiteral(
"\"" ) );
2351 for (
auto tokenIt = tokens.constBegin(); tokenIt != tokens.constEnd(); ++tokenIt )
2354 if ( tokenIt->compare( QLatin1String(
"," ) ) == 0
2355 || tokenIt->compare( QLatin1String(
"(" ) ) == 0
2356 || tokenIt->compare( QLatin1String(
")" ) ) == 0
2357 || tokenIt->compare( QLatin1String(
"=" ) ) == 0
2358 || tokenIt->compare( QLatin1String(
"!=" ) ) == 0
2359 || tokenIt->compare( QLatin1String(
"<" ) ) == 0
2360 || tokenIt->compare( QLatin1String(
"<=" ) ) == 0
2361 || tokenIt->compare( QLatin1String(
">" ) ) == 0
2362 || tokenIt->compare( QLatin1String(
">=" ) ) == 0
2363 || tokenIt->compare( QLatin1String(
"%" ) ) == 0
2364 || tokenIt->compare( QLatin1String(
"IS" ), Qt::CaseInsensitive ) == 0
2365 || tokenIt->compare( QLatin1String(
"NOT" ), Qt::CaseInsensitive ) == 0
2366 || tokenIt->compare( QLatin1String(
"NULL" ), Qt::CaseInsensitive ) == 0
2367 || tokenIt->compare( QLatin1String(
"AND" ), Qt::CaseInsensitive ) == 0
2368 || tokenIt->compare( QLatin1String(
"OR" ), Qt::CaseInsensitive ) == 0
2369 || tokenIt->compare( QLatin1String(
"IN" ), Qt::CaseInsensitive ) == 0
2370 || tokenIt->compare( QLatin1String(
"LIKE" ), Qt::CaseInsensitive ) == 0
2371 || tokenIt->compare( QLatin1String(
"ILIKE" ), Qt::CaseInsensitive ) == 0
2372 || tokenIt->compare( QLatin1String(
"DMETAPHONE" ), Qt::CaseInsensitive ) == 0
2373 || tokenIt->compare( QLatin1String(
"SOUNDEX" ), Qt::CaseInsensitive ) == 0
2381 ( void ) tokenIt->toDouble( &isNumeric );
2390 if ( *tokenIt == QLatin1String(
"''" ) )
2396 if ( tokenIt->size() > 2
2397 && ( *tokenIt )[0] == QChar(
'\'' )
2398 && ( *tokenIt )[tokenIt->size() - 1] == QChar(
'\'' )
2399 && ( *tokenIt )[1] != QChar(
'\'' )
2400 && ( *tokenIt )[tokenIt->size() - 2] != QChar(
'\'' ) )
2406 if ( tokenIt->size() > 2
2407 && ( *tokenIt )[0] == QChar(
'"' )
2408 && ( *tokenIt )[tokenIt->size() - 1] == QChar(
'"' )
2409 && ( *tokenIt )[1] != QChar(
'"' )
2410 && ( *tokenIt )[tokenIt->size() - 2] != QChar(
'"' ) )
2421 void QgsRenderer::groupStringList( QStringList &list,
const QString &groupString )
2424 bool groupActive =
false;
2425 int startGroup = -1;
2426 QString concatString;
2428 for (
int i = 0; i < list.size(); ++i )
2430 QString &str = list[i];
2431 if ( str.startsWith( groupString ) )
2435 concatString.clear();
2440 if ( i != startGroup )
2442 concatString.append(
" " );
2444 concatString.append( str );
2447 if ( str.endsWith( groupString ) )
2450 groupActive =
false;
2452 if ( startGroup != -1 )
2454 list[startGroup] = concatString;
2455 for (
int j = startGroup + 1; j <= endGroup; ++j )
2457 list.removeAt( startGroup + 1 );
2462 concatString.clear();
2468 void QgsRenderer::convertFeatureInfoToSia2045( QDomDocument &doc )
const
2470 QDomDocument SIAInfoDoc;
2471 QDomElement infoDocElement = doc.documentElement();
2472 QDomElement SIAInfoDocElement = SIAInfoDoc.importNode( infoDocElement,
false ).toElement();
2473 SIAInfoDoc.appendChild( SIAInfoDocElement );
2475 QString currentAttributeName;
2476 QString currentAttributeValue;
2477 QDomElement currentAttributeElem;
2478 QString currentLayerName;
2479 QDomElement currentLayerElem;
2480 QDomNodeList layerNodeList = infoDocElement.elementsByTagName( QStringLiteral(
"Layer" ) );
2481 for (
int i = 0; i < layerNodeList.size(); ++i )
2483 currentLayerElem = layerNodeList.at( i ).toElement();
2484 currentLayerName = currentLayerElem.attribute( QStringLiteral(
"name" ) );
2486 QDomElement currentFeatureElem;
2488 QDomNodeList featureList = currentLayerElem.elementsByTagName( QStringLiteral(
"Feature" ) );
2489 if ( featureList.isEmpty() )
2492 QDomNodeList attributeList = currentLayerElem.elementsByTagName( QStringLiteral(
"Attribute" ) );
2493 QDomElement rasterLayerElem;
2494 if ( !attributeList.isEmpty() )
2496 rasterLayerElem = SIAInfoDoc.createElement( currentLayerName );
2498 for (
int j = 0; j < attributeList.size(); ++j )
2500 currentAttributeElem = attributeList.at( j ).toElement();
2501 currentAttributeName = currentAttributeElem.attribute( QStringLiteral(
"name" ) );
2502 currentAttributeValue = currentAttributeElem.attribute( QStringLiteral(
"value" ) );
2503 QDomElement outAttributeElem = SIAInfoDoc.createElement( currentAttributeName );
2504 QDomText outAttributeText = SIAInfoDoc.createTextNode( currentAttributeValue );
2505 outAttributeElem.appendChild( outAttributeText );
2506 rasterLayerElem.appendChild( outAttributeElem );
2508 if ( !attributeList.isEmpty() )
2510 SIAInfoDocElement.appendChild( rasterLayerElem );
2516 QSet<QString> layerPropertyAttributes;
2517 QString currentLayerId = currentLayerElem.attribute( QStringLiteral(
"id" ) );
2518 if ( !currentLayerId.isEmpty() )
2523 QString WMSPropertyAttributesString = currentLayer->
customProperty( QStringLiteral(
"WMSPropertyAttributes" ) ).toString();
2524 if ( !WMSPropertyAttributesString.isEmpty() )
2526 QStringList propertyList = WMSPropertyAttributesString.split( QStringLiteral(
"//" ) );
2527 for (
auto propertyIt = propertyList.constBegin(); propertyIt != propertyList.constEnd(); ++propertyIt )
2529 layerPropertyAttributes.insert( *propertyIt );
2535 QDomElement propertyRefChild;
2536 for (
int j = 0; j < featureList.size(); ++j )
2538 QDomElement SIAFeatureElem = SIAInfoDoc.createElement( currentLayerName );
2539 currentFeatureElem = featureList.at( j ).toElement();
2540 QDomNodeList attributeList = currentFeatureElem.elementsByTagName( QStringLiteral(
"Attribute" ) );
2542 for (
int k = 0; k < attributeList.size(); ++k )
2544 currentAttributeElem = attributeList.at( k ).toElement();
2545 currentAttributeName = currentAttributeElem.attribute( QStringLiteral(
"name" ) );
2546 currentAttributeValue = currentAttributeElem.attribute( QStringLiteral(
"value" ) );
2547 if ( layerPropertyAttributes.contains( currentAttributeName ) )
2549 QDomElement propertyElem = SIAInfoDoc.createElement( QStringLiteral(
"property" ) );
2550 QDomElement identifierElem = SIAInfoDoc.createElement( QStringLiteral(
"identifier" ) );
2551 QDomText identifierText = SIAInfoDoc.createTextNode( currentAttributeName );
2552 identifierElem.appendChild( identifierText );
2553 QDomElement valueElem = SIAInfoDoc.createElement( QStringLiteral(
"value" ) );
2554 QDomText valueText = SIAInfoDoc.createTextNode( currentAttributeValue );
2555 valueElem.appendChild( valueText );
2556 propertyElem.appendChild( identifierElem );
2557 propertyElem.appendChild( valueElem );
2558 if ( propertyRefChild.isNull() )
2560 SIAFeatureElem.insertBefore( propertyElem, QDomNode() );
2561 propertyRefChild = propertyElem;
2565 SIAFeatureElem.insertAfter( propertyElem, propertyRefChild );
2570 QDomElement SIAAttributeElem = SIAInfoDoc.createElement( currentAttributeName );
2571 QDomText SIAAttributeText = SIAInfoDoc.createTextNode( currentAttributeValue );
2572 SIAAttributeElem.appendChild( SIAAttributeText );
2573 SIAFeatureElem.appendChild( SIAAttributeElem );
2576 SIAInfoDocElement.appendChild( SIAFeatureElem );
2583 QByteArray QgsRenderer::convertFeatureInfoToHtml(
const QDomDocument &doc )
const
2586 QString featureInfoString = QStringLiteral(
" <!DOCTYPE html>" );
2589 featureInfoString.append( QStringLiteral( R
"HTML(
2592 <title>Information</title>
2593 <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
2596 font-family: "Open Sans", "Calluna Sans", "Gill Sans MT", "Calibri", "Trebuchet MS", sans-serif;
2603 border: 1px solid black;
2604 border-collapse: collapse;
2625 const QDomNodeList layerList = doc.elementsByTagName( QStringLiteral(
"Layer" ) );
2628 for (
int i = 0; i < layerList.size(); ++i )
2630 const QDomElement layerElem = layerList.at( i ).toElement();
2633 const QDomNodeList featureNodeList = layerElem.elementsByTagName( QStringLiteral(
"Feature" ) );
2634 const QDomElement currentFeatureElement;
2636 if ( !featureNodeList.isEmpty() )
2640 const QString featureInfoLayerTitleString = QStringLiteral(
" <div class='layer-title'>%1</div>" ).arg( layerElem.attribute( QStringLiteral(
"title" ) ).toHtmlEscaped() );
2641 featureInfoString.append( featureInfoLayerTitleString );
2644 for (
int j = 0; j < featureNodeList.size(); ++j )
2646 const QDomElement featureElement = featureNodeList.at( j ).toElement();
2649 featureInfoString.append( QStringLiteral( R
"HTML(
2654 const QDomNodeList attributeNodeList = featureElement.elementsByTagName( QStringLiteral(
"Attribute" ) );
2655 for (
int k = 0; k < attributeNodeList.size(); ++k )
2657 const QDomElement attributeElement = attributeNodeList.at( k ).toElement();
2658 const QString name = attributeElement.attribute( QStringLiteral(
"name" ) ).toHtmlEscaped();
2659 QString value = attributeElement.attribute( QStringLiteral(
"value" ) );
2660 if ( name != QLatin1String(
"maptip" ) )
2662 value = value.toHtmlEscaped();
2667 const QString featureInfoAttributeString = QStringLiteral( R
"HTML(
2672 .arg( name, value );
2674 featureInfoString.append( featureInfoAttributeString );
2676 else if ( name == QLatin1String(
"maptip" ) )
2678 featureInfoString.append( QStringLiteral( R
"HTML(
2686 featureInfoString.append( QStringLiteral( R
"HTML(
2693 const QDomNodeList attributeNodeList = layerElem.elementsByTagName( QStringLiteral(
"Attribute" ) );
2696 if ( !attributeNodeList.isEmpty() )
2700 const QString featureInfoLayerTitleString = QStringLiteral(
" <div class='layer-title'>%1</div>" ).arg( layerElem.attribute( QStringLiteral(
"title" ) ).toHtmlEscaped() );
2701 featureInfoString.append( featureInfoLayerTitleString );
2703 featureInfoString.append( QStringLiteral( R
"HTML(
2707 for (
int j = 0; j < attributeNodeList.size(); ++j )
2709 const QDomElement attributeElement = attributeNodeList.at( j ).toElement();
2710 const QString name = attributeElement.attribute( QStringLiteral(
"name" ) ).toHtmlEscaped();
2711 QString value = attributeElement.attribute( QStringLiteral(
"value" ) );
2712 if ( value.isEmpty() )
2714 value = QStringLiteral(
"no data" );
2716 if ( name != QLatin1String(
"maptip" ) )
2718 value = value.toHtmlEscaped();
2723 const QString featureInfoAttributeString = QStringLiteral( R
"HTML(
2728 .arg( name, value );
2731 featureInfoString.append( featureInfoAttributeString );
2733 else if ( name == QLatin1String(
"maptip" ) )
2735 featureInfoString.append( QStringLiteral( R
"HTML(
2743 featureInfoString.append( QStringLiteral( R
"HTML(
2753 featureInfoString.append( QStringLiteral( R
"HTML(
2757 return featureInfoString.toUtf8();
2760 QByteArray QgsRenderer::convertFeatureInfoToText(
const QDomDocument &doc )
const
2762 QString featureInfoString;
2765 featureInfoString.append(
"GetFeatureInfo results\n" );
2766 featureInfoString.append(
"\n" );
2768 QDomNodeList layerList = doc.elementsByTagName( QStringLiteral(
"Layer" ) );
2771 for (
int i = 0; i < layerList.size(); ++i )
2773 QDomElement layerElem = layerList.at( i ).toElement();
2775 featureInfoString.append(
"Layer '" + layerElem.attribute( QStringLiteral(
"name" ) ) +
"'\n" );
2778 QDomNodeList featureNodeList = layerElem.elementsByTagName( QStringLiteral(
"Feature" ) );
2779 QDomElement currentFeatureElement;
2781 if ( !featureNodeList.isEmpty() )
2783 for (
int j = 0; j < featureNodeList.size(); ++j )
2785 QDomElement featureElement = featureNodeList.at( j ).toElement();
2786 featureInfoString.append(
"Feature " + featureElement.attribute( QStringLiteral(
"id" ) ) +
"\n" );
2789 QDomNodeList attributeNodeList = featureElement.elementsByTagName( QStringLiteral(
"Attribute" ) );
2790 for (
int k = 0; k < attributeNodeList.size(); ++k )
2792 QDomElement attributeElement = attributeNodeList.at( k ).toElement();
2793 featureInfoString.append( attributeElement.attribute( QStringLiteral(
"name" ) ) +
" = '" + attributeElement.attribute( QStringLiteral(
"value" ) ) +
"'\n" );
2799 QDomNodeList attributeNodeList = layerElem.elementsByTagName( QStringLiteral(
"Attribute" ) );
2800 for (
int j = 0; j < attributeNodeList.size(); ++j )
2802 QDomElement attributeElement = attributeNodeList.at( j ).toElement();
2803 QString value = attributeElement.attribute( QStringLiteral(
"value" ) );
2804 if ( value.isEmpty() )
2806 value = QStringLiteral(
"no data" );
2808 featureInfoString.append( attributeElement.attribute( QStringLiteral(
"name" ) ) +
" = '" + value +
"'\n" );
2812 featureInfoString.append(
"\n" );
2815 return featureInfoString.toUtf8();
2818 QByteArray QgsRenderer::convertFeatureInfoToJson(
const QList<QgsMapLayer *> &layers,
const QDomDocument &doc,
const QgsCoordinateReferenceSystem &destCRS )
const
2821 {
"type",
"FeatureCollection" },
2822 {
"features", json::array() },
2827 const QDomNodeList layerList = doc.elementsByTagName( QStringLiteral(
"Layer" ) );
2828 for (
int i = 0; i < layerList.size(); ++i )
2830 const QDomElement layerElem = layerList.at( i ).toElement();
2831 const QString layerName = layerElem.attribute( QStringLiteral(
"name" ) );
2836 if ( mContext.
layerNickname( *l ).compare( layerName ) == 0 )
2852 const QDomNodeList featuresNode = layerElem.elementsByTagName( QStringLiteral(
"Feature" ) );
2853 if ( featuresNode.isEmpty() )
2856 QMap<QgsFeatureId, QString> fidMap;
2857 QMap<QgsFeatureId, QString> fidDisplayNameMap;
2859 for (
int j = 0; j < featuresNode.size(); ++j )
2861 const QDomElement featureNode = featuresNode.at( j ).toElement();
2862 const QString fid = featureNode.attribute( QStringLiteral(
"id" ) );
2865 if ( expression.isEmpty() )
2867 feature = vl->
getFeature( fid.toLongLong() );
2876 fidMap.insert( feature.
id(), fid );
2881 const QDomNodeList attrs = featureNode.elementsByTagName(
"Attribute" );
2882 for (
int k = 0; k < attrs.count(); k++ )
2884 const QDomElement elm = attrs.at( k ).toElement();
2885 if ( elm.attribute( QStringLiteral(
"name" ) ).compare(
"geometry" ) == 0 )
2887 wkt = elm.attribute(
"value" );
2892 if ( !wkt.isEmpty() )
2900 if ( withDisplayName )
2902 QString displayName;
2903 const QDomNodeList attrs = featureNode.elementsByTagName(
"Attribute" );
2904 for (
int k = 0; k < attrs.count(); k++ )
2906 const QDomElement elm = attrs.at( k ).toElement();
2907 if ( elm.attribute( QStringLiteral(
"name" ) ).compare(
"displayName" ) == 0 )
2909 displayName = elm.attribute(
"value" );
2913 fidDisplayNameMap.insert( feature.
id(), displayName );
2916 features << feature;
2919 if ( !attributes.isEmpty() )
2922 const QDomNodeList attributesNode = featureNode.elementsByTagName( QStringLiteral(
"Attribute" ) );
2923 for (
int k = 0; k < attributesNode.size(); ++k )
2925 const QDomElement attributeElement = attributesNode.at( k ).toElement();
2926 const QString fieldName = attributeElement.
attribute( QStringLiteral(
"name" ) );
2927 attributes << feature.fieldNameIndex( fieldName );
2933 exporter.setAttributeDisplayName(
true );
2934 exporter.setAttributes( attributes );
2935 exporter.setIncludeGeometry( withGeometry );
2936 exporter.setTransformGeometries(
false );
2940 for (
const auto &feature : std::as_const( features ) )
2942 const QString
id = QStringLiteral(
"%1.%2" ).arg( layerName ).arg( fidMap.value( feature.id() ) );
2943 QVariantMap extraProperties;
2944 if ( withDisplayName )
2946 extraProperties.insert( QStringLiteral(
"display_name" ), fidDisplayNameMap.value( feature.id() ) );
2948 json[
"features"].push_back( exporter.exportFeatureToJsonObject( feature, extraProperties,
id ) );
2953 auto properties = json::object();
2954 const QDomNodeList attributesNode = layerElem.elementsByTagName( QStringLiteral(
"Attribute" ) );
2955 for (
int j = 0; j < attributesNode.size(); ++j )
2957 const QDomElement attrElmt = attributesNode.at( j ).toElement();
2958 const QString name = attrElmt.attribute( QStringLiteral(
"name" ) );
2960 QString value = attrElmt.attribute( QStringLiteral(
"value" ) );
2961 if ( value.isEmpty() )
2963 value = QStringLiteral(
"null" );
2966 properties[name.toStdString()] = value.toStdString();
2969 json[
"features"].push_back(
2970 { {
"type",
"Feature" },
2971 {
"id", layerName.toStdString() },
2972 {
"properties", properties }
2979 return QByteArray::fromStdString( json.dump( 2 ) );
2981 return QByteArray::fromStdString( json.dump() );
2985 QDomElement QgsRenderer::createFeatureGML(
2994 QStringList *attributes
2998 QDomElement typeNameElement = doc.createElement(
"qgs:" +
typeName );
3005 typeNameElement.setAttribute( QStringLiteral(
"fid" ), QStringLiteral(
"%1.%2" ).arg(
typeName, fid ) );
3008 if ( layer && layer->
crs() !=
crs )
3042 QDomElement bbElem = doc.createElement( QStringLiteral(
"gml:boundedBy" ) );
3043 QDomElement boxElem;
3055 boxElem.setAttribute( QStringLiteral(
"srsName" ),
crs.
authid() );
3057 bbElem.appendChild( boxElem );
3058 typeNameElement.appendChild( bbElem );
3063 findAttributeInTree = [&findAttributeInTree, &layer](
const QString &attributeName,
const QgsAttributeEditorElement *group ) ->
bool {
3067 const QList<QgsAttributeEditorElement *> children = container->
children();
3070 switch ( child->type() )
3074 if ( findAttributeInTree( attributeName, child ) )
3082 if ( child->name() == attributeName )
3091 if ( relationEditor )
3094 if ( relation.referencedLayer() == layer )
3097 for (
const auto &idx : std::as_const( referencedFields ) )
3100 if ( f.name() == attributeName )
3106 else if ( relation.referencingLayer() == layer )
3108 const QgsAttributeList &referencingFields { relation.referencingFields() };
3109 for (
const auto &idx : std::as_const( referencingFields ) )
3112 if ( f.name() == attributeName )
3138 QDomElement geomElem = doc.createElement( QStringLiteral(
"qgs:geometry" ) );
3139 QDomElement gmlElem;
3149 if ( !gmlElem.isNull() )
3153 gmlElem.setAttribute( QStringLiteral(
"srsName" ),
crs.
authid() );
3155 geomElem.appendChild( gmlElem );
3156 typeNameElement.appendChild( geomElem );
3163 for (
int i = 0; i < fields.
count(); ++i )
3165 QString attributeName = fields.
at( i ).
name();
3172 if ( attributes && !attributes->contains( attributeName ) )
3177 if ( honorFormConfig )
3180 if ( !editorContainer || !findAttributeInTree( attributeName, editorContainer ) )
3186 QDomElement fieldElem = doc.createElement(
"qgs:" + attributeName.replace(
' ',
'_' ) );
3187 QString fieldTextString = featureAttributes.at( i ).toString();
3192 QDomText fieldText = doc.createTextNode( fieldTextString );
3193 fieldElem.appendChild( fieldText );
3194 typeNameElement.appendChild( fieldElem );
3205 QDomElement fieldElem = doc.createElement( QStringLiteral(
"qgs:maptip" ) );
3206 QDomText maptipText = doc.createTextNode( fieldTextString );
3207 fieldElem.appendChild( maptipText );
3208 typeNameElement.appendChild( fieldElem );
3212 return typeNameElement;
3215 QString QgsRenderer::replaceValueMapAndRelation(
QgsVectorLayer *vl,
int idx,
const QVariant &attributeVal )
3219 QString value( fieldFormatter->
representValue( vl, idx, setup.
config(), QVariant(), attributeVal ) );
3221 if ( setup.
config().value( QStringLiteral(
"AllowMulti" ) ).toBool() && value.startsWith( QLatin1Char(
'{' ) ) && value.endsWith( QLatin1Char(
'}' ) ) )
3223 value = value.mid( 1, value.size() - 2 );
3235 double mapUnitTolerance = 0.0;
3245 mapUnitTolerance = mapSettings.
extent().
width() / 400.0;
3257 mapUnitTolerance = mapSettings.
extent().
width() / 200.0;
3269 mapUnitTolerance = mapSettings.
extent().
width() / 100.0;
3276 QgsRectangle mapRectangle( infoPoint.
x() - mapUnitTolerance, infoPoint.
y() - mapUnitTolerance, infoPoint.
x() + mapUnitTolerance, infoPoint.
y() + mapUnitTolerance );
3280 QList<QgsMapLayer *> QgsRenderer::highlightLayers( QList<QgsWmsParametersHighlightLayer> params )
3282 QList<QgsMapLayer *> highlightLayers;
3285 QString
crs = mWmsParameters.
crs();
3286 for (
const QgsWmsParametersHighlightLayer ¶m : params )
3289 QDomDocument sldDoc;
3293 if ( !sldDoc.setContent( param.mSld,
true, &errorMsg, &errorLine, &errorColumn ) )
3300 std::unique_ptr<QgsFeatureRenderer> renderer;
3301 QDomElement el = sldDoc.documentElement();
3312 if ( !param.mLabel.isEmpty() )
3314 url +=
"&field=label:string";
3319 auto layer = std::make_unique<QgsVectorLayer>( url, param.mName, QLatin1String(
"memory" ), options );
3327 if ( !param.mLabel.isEmpty() )
3329 fet.setAttribute( 0, param.mLabel );
3337 palSettings.
dist = param.mLabelDistance;
3346 switch ( param.mGeom.type() )
3359 QVariant x( pt.
x() );
3362 QVariant y( pt.
y() );
3379 QVariant x( pt.
x() );
3383 QVariant y( pt.
y() );
3387 QVariant hali(
"Center" );
3391 QVariant vali(
"Half" );
3406 if ( param.mColor.isValid() )
3408 textFormat.
setColor( param.mColor );
3411 if ( param.mSize > 0 )
3413 textFormat.
setSize( param.mSize );
3421 if ( !param.mFont.isEmpty() )
3423 textFormat.
setFont( param.mFont );
3426 if ( param.mBufferColor.isValid() )
3428 bufferSettings.
setColor( param.mBufferColor );
3431 if ( param.mBufferSize > 0 )
3434 bufferSettings.
setSize(
static_cast<double>( param.mBufferSize ) );
3444 fet.setGeometry( param.mGeom );
3453 highlightLayers.append( layer.release() );
3457 mTemporaryLayers.append( highlightLayers );
3458 return highlightLayers;
3461 void QgsRenderer::removeTemporaryLayers()
3463 qDeleteAll( mTemporaryLayers );
3464 mTemporaryLayers.clear();
3467 QPainter *QgsRenderer::layersRendering(
const QgsMapSettings &mapSettings, QImage *image )
const
3469 QPainter *painter =
nullptr;
3473#ifdef HAVE_SERVER_PYTHON_PLUGINS
3474 mContext.accessControl()->resolveFilterFeatures( mapSettings.
layers() );
3479 renderJob.render( mapSettings, image, mContext.
socketFeedback() );
3480 painter = renderJob.takePainter();
3482 if ( !renderJob.errors().isEmpty() )
3486 QString layerWMSName;
3493 QString errorMessage = QStringLiteral(
"Rendering error : '%1'" ).arg( e.
message );
3494 if ( !layerWMSName.isEmpty() )
3496 errorMessage = QStringLiteral(
"Rendering error : '%1' in layer '%2'" ).arg( e.
message, layerWMSName );
3504 void QgsRenderer::setLayerOpacity(
QgsMapLayer *layer,
int opacity )
const
3506 if ( opacity >= 0 && opacity <= 255 )
3508 switch ( layer->
type() )
3527 rasterRenderer->
setOpacity( opacity / 255. );
3549 void QgsRenderer::setLayerFilter(
QgsMapLayer *layer,
const QList<QgsWmsParametersFilter> &filters )
3553 QgsVectorLayer *filteredLayer = qobject_cast<QgsVectorLayer *>( layer );
3554 QStringList expList;
3555 for (
const QgsWmsParametersFilter &filter : filters )
3560 QDomDocument filterXml;
3563#if QT_VERSION < QT_VERSION_CHECK( 6, 5, 0 )
3564 if ( !filterXml.setContent( filter.mFilter,
true, &errorMsg ) )
3569 QXmlStreamReader xmlReader( filter.mFilter );
3570 xmlReader.addExtraNamespaceDeclaration( QXmlStreamNamespaceDeclaration( QStringLiteral(
"fes" ), QStringLiteral(
"http://www.opengis.net/fes/2.0" ) ) );
3571 xmlReader.addExtraNamespaceDeclaration( QXmlStreamNamespaceDeclaration( QStringLiteral(
"ogc" ), QStringLiteral(
"http://www.opengis.net/ogc" ) ) );
3572 if ( QDomDocument::ParseResult result = filterXml.setContent( &xmlReader, QDomDocument::ParseOption::UseNamespaceProcessing ); !result )
3577 QDomElement filterElem = filterXml.firstChildElement();
3582 expList << filterExp->dump();
3588 if ( !testFilterStringSafety( filter.mFilter ) )
3590 throw QgsSecurityException( QStringLiteral(
"The filter string %1"
3591 " has been rejected because of security reasons."
3592 " Note: Text strings have to be enclosed in single or double quotes."
3593 " A space between each word / special character is mandatory."
3594 " Allowed Keywords and special characters are"
3595 " IS,NOT,NULL,AND,OR,IN,=,<,>=,>,>=,!=,',',(,),DMETAPHONE,SOUNDEX%2."
3596 " Not allowed are semicolons in the filter expression." )
3598 filter.mFilter, mContext.
settings().
allowedExtraSqlTokens().isEmpty() ? QString() : mContext.settings().allowedExtraSqlTokens().join(
',' ).prepend(
',' )
3602 QString newSubsetString = filter.mFilter;
3605 newSubsetString.prepend(
") AND (" );
3606 newSubsetString.append(
")" );
3607 newSubsetString.prepend( filteredLayer->
subsetString() );
3608 newSubsetString.prepend(
"(" );
3618 expList.append( dimensionFilter( filteredLayer ) );
3622 if ( expList.size() == 1 )
3626 else if ( expList.size() > 1 )
3628 exp = QStringLiteral(
"( %1 )" ).arg( expList.join( QLatin1String(
" ) AND ( " ) ) );
3630 if ( !exp.isEmpty() )
3632 auto expression = std::make_unique<QgsExpression>( exp );
3635 mFeatureFilter.
setFilter( filteredLayer, *expression );
3641 QStringList QgsRenderer::dimensionFilter(
QgsVectorLayer *layer )
const
3643 QStringList expList;
3646 const QList<QgsMapLayerServerProperties::WmsDimensionInfo> wmsDims = serverProperties->
wmsDimensions();
3647 if ( wmsDims.isEmpty() )
3662 if ( fieldIndex == -1 )
3667 int endFieldIndex = -1;
3668 if ( !dim.endFieldName.isEmpty() )
3670 endFieldIndex = layer->
fields().
indexOf( dim.endFieldName );
3671 if ( endFieldIndex == -1 )
3677 if ( !dimParamValues.contains( dim.name.toUpper() ) )
3681 if ( dim.defaultDisplayType == QgsMapLayerServerProperties::WmsDimensionInfo::AllValues )
3685 else if ( dim.defaultDisplayType == QgsMapLayerServerProperties::WmsDimensionInfo::ReferenceValue )
3687 defValue = dim.referenceValue;
3692 QSet<QVariant> uniqueValues = layer->
uniqueValues( fieldIndex );
3693 if ( endFieldIndex != -1 )
3695 uniqueValues.unite( layer->
uniqueValues( endFieldIndex ) );
3698 QList<QVariant> values = qgis::setToList( uniqueValues );
3699 std::sort( values.begin(), values.end() );
3700 if ( dim.defaultDisplayType == QgsMapLayerServerProperties::WmsDimensionInfo::MinValue )
3702 defValue = values.first();
3704 else if ( dim.defaultDisplayType == QgsMapLayerServerProperties::WmsDimensionInfo::MaxValue )
3706 defValue = values.last();
3710 if ( endFieldIndex == -1 )
3716 QStringList expElems;
3721 expList << expElems.join(
' ' );
3729 QString dimParamValue = dimParamValues[dim.name.toUpper()];
3731 QStringList dimExplist;
3733 QStringList dimValues = dimParamValue.split(
',' );
3734 for (
int i = 0; i < dimValues.size(); ++i )
3736 QString dimValue = dimValues[i];
3738 if ( dimValue.size() > 1 )
3740 dimValue = dimValue.trimmed();
3743 if ( dimValue.contains(
'/' ) )
3745 QStringList rangeValues = dimValue.split(
'/' );
3747 if ( rangeValues.size() != 2 )
3752 QVariant rangeMin = QVariant( rangeValues[0] );
3753 QVariant rangeMax = QVariant( rangeValues[1] );
3764 QStringList expElems;
3765 if ( endFieldIndex == -1 )
3785 << QStringLiteral(
")" );
3787 dimExplist << expElems.join(
' ' );
3791 QVariant dimVariant = QVariant( dimValue );
3797 if ( endFieldIndex == -1 )
3806 QStringList expElems;
3811 dimExplist << expElems.join(
' ' );
3816 if ( dimExplist.size() == 1 )
3818 expList << dimExplist;
3820 else if ( dimExplist.size() > 1 )
3822 expList << QStringLiteral(
"( %1 )" ).arg( dimExplist.join( QLatin1String(
" ) OR ( " ) ) );
3829 void QgsRenderer::setLayerSelection(
QgsMapLayer *layer,
const QStringList &fids )
const
3839 if ( selectedIds.empty() )
3850 void QgsRenderer::setLayerAccessControlFilter(
QgsMapLayer *layer )
const
3852#ifdef HAVE_SERVER_PYTHON_PLUGINS
3870 void QgsRenderer::annotationsRendering( QPainter *painter,
const QgsMapSettings &mapSettings )
const
3873 const QList<QgsAnnotation *> annotations = annotationManager->
annotations();
3883 if ( !annotation || !annotation->isVisible() )
3889 if ( annotation->hasFixedMapPosition() )
3891 QgsPointXY mapPos = annotation->mapPosition();
3892 if ( mapSettings.
destinationCrs() != annotation->mapPositionCrs() )
3897 mapPos = coordTransform.transform( mapPos );
3905 offsetX = devicePos.
x();
3906 offsetY = devicePos.
y();
3910 const QPointF relativePos = annotation->relativePosition();
3911 offsetX = mapSettings.
outputSize().width() * relativePos.x();
3912 offsetY = mapSettings.
outputSize().height() * relativePos.y();
3916 painter->translate( offsetX, offsetY );
3917 annotation->render( renderContext );
3922 QImage *QgsRenderer::scaleImage(
const QImage *image )
const
3927 QImage *scaledImage =
nullptr;
3928 const int width = mWmsParameters.
widthAsInt();
3930 if ( width != image->width() || height != image->height() )
3932 scaledImage =
new QImage( image->scaled( width, height, Qt::IgnoreAspectRatio, Qt::SmoothTransformation ) );
3938 void QgsRenderer::handlePrintErrors(
const QgsLayout *layout )
const
3944 QList<QgsLayoutItemMap *> mapList;
3947 QList<QgsLayoutItemMap *>::const_iterator mapIt = mapList.constBegin();
3948 for ( ; mapIt != mapList.constEnd(); ++mapIt )
3950 if ( !( *mapIt )->renderingErrors().isEmpty() )
3962 for (
auto layer : layers )
3975 setLayerOpacity( layer, param.
mOpacity );
3982 setLayerSld( layer, mContext.
sld( *layer ) );
3986 setLayerStyle( layer, mContext.
style( *layer ) );
3991 setLayerOpacity( layer, param.
mOpacity );
3996 setLayerFilter( layer, param.
mFilter );
4001 setLayerAccessControlFilter( layer );
4006 setLayerSelection( layer, param.
mSelection );
4011 updateExtent( layer, *settings );
4021 void QgsRenderer::setLayerStyle(
QgsMapLayer *layer,
const QString &style )
const
4023 if ( style.isEmpty() )
4035 void QgsRenderer::setLayerSld(
QgsMapLayer *layer,
const QDomElement &sld )
const
4040 QString sldStyleName =
"__sld_style";
4041 while ( styles.contains( sldStyleName ) )
4043 sldStyleName.append(
'@' );
4056 if ( !mWmsParameters.
bbox().isEmpty() )
4060 std::unique_ptr<QImage> tmp( createImage( mContext.
mapSize(
false ) ) );
4061 configureMapSettings( tmp.get(), mapSettings );
Provides global constants and enumerations 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
static QString geoNone()
Constant that holds the string representation for "No ellipse/No CRS".
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.
A container for attribute editors, used to group them visually in the attribute form if it is set to ...
QList< QgsAttributeEditorElement * > children() const
Gets a list of the children elements of this container.
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.
This element will load a relation editor onto the form.
const QgsRelation & relation() const
Gets the id of the relation which shall be embedded.
Exception thrown in case of malformed requests.
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.
Handles 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.
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.
An abstract interface for legend items returned from QgsMapLayerLegend implementation.
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.
A model representing the layer tree, including layers and groups of layers.
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.
Used to render QgsLayout as an atlas, by iterating over the features from an associated vector layer.
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.
Provides a method of storing measurements for use in QGIS layouts using a variety of different measur...
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...
Provides a method of storing sizes, consisting of a width and height, for use in QGIS layouts.
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.
Stores the appearance and layout settings for legend drawing with QgsLegendRenderer.
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 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.
Contains configuration for rendering maps.
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 setScaleMethod(Qgis::ScaleCalculationMethod method)
Sets the method to use for scale calculations for the map.
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 setTransformContext(const QgsCoordinateTransformContext &context)
Sets the coordinate transform context, which stores various information regarding which datum transfo...
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, const char *file=__builtin_FILE(), const char *function=__builtin_FUNCTION(), int line=__builtin_LINE())
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 rectangleToGMLEnvelope(const QgsRectangle *env, QDomDocument &doc, int precision=17)
Exports the rectangle to GML3 Envelope.
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 QgsExpression * expressionFromOgcFilter(const QDomElement &element, QgsVectorLayer *layer=nullptr)
Parse XML with OGC filter into QGIS expression.
static QDomElement rectangleToGMLBox(const 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.
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.
Describes 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.
Qgis::ScaleCalculationMethod scaleMethod
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.
void combineExtentWith(const QgsRectangle &rect)
Expands the rectangle so that it covers both the original rectangle and the given rectangle.
void invert()
Swap x/y coordinates in the rectangle.
Represents a relationship between two vector layers.
QgsAttributeList referencedFields() const
Returns a list of attributes used to form the referenced fields (most likely primary key) on the refe...
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.
static QString getExpressionFromServerFid(const QString &serverFid, const QgsVectorDataProvider *provider)
Returns the expression feature id based on primary keys.
static QgsFeatureRequest updateFeatureRequestFromServerFids(QgsFeatureRequest &featureRequest, const QStringList &serverFids, const QgsVectorDataProvider *provider)
Returns the feature request based on feature ids build with primary keys.
static QString getServerFid(const QgsFeature &feature, const QgsAttributeList &pkAttributes)
Returns the feature id based on primary keys.
static QString wmsFeatureInfoSchema(const QgsProject &project)
Returns the schema URL for XML GetFeatureInfo request.
static bool wmsInfoFormatSia2045(const QgsProject &project)
Returns if the info format is SIA20145.
static QString wmsFeatureInfoDocumentElementNs(const QgsProject &project)
Returns the document element namespace for XML GetFeatureInfo request.
static QStringList wmsRestrictedComposers(const QgsProject &project)
Returns the restricted composer list.
static bool wmsFeatureInfoSegmentizeWktGeometry(const QgsProject &project)
Returns if the geometry has to be segmentize in GetFeatureInfo request.
static bool wmsFeatureInfoUseAttributeFormSettings(const QgsProject &project)
Returns if feature form settings should be considered for the format of the feature info response.
static QHash< QString, QString > wmsFeatureInfoLayerAliasMap(const QgsProject &project)
Returns the mapping between layer name and wms layer name for GetFeatureInfo request.
static bool wmsFeatureInfoAddWktGeometry(const QgsProject &project)
Returns if the geometry is displayed as Well Known Text in GetFeatureInfo request.
static double wmsDefaultMapUnitsPerMm(const QgsProject &project)
Returns the default number of map units per millimeters in case of the scale is not given.
static QString wmsFeatureInfoDocumentElement(const QgsProject &project)
Returns the document element name for XML GetFeatureInfo request.
static int wmsMaxAtlasFeatures(const QgsProject &project)
Returns the maximum number of atlas features which can be printed in a request.
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.
Base class for vector data providers.
virtual QgsAttributeList pkAttributeIndexes() const
Returns list of indexes of fields that make up the primary key.
bool addFeatures(QgsFeatureList &flist, QgsFeatureSink::Flags flags=QgsFeatureSink::Flags()) override
Adds a list of features to the sink.
Basic implementation of the labeling interface.
Represents a vector layer which manages a vector based dataset.
void setLabeling(QgsAbstractVectorLayerLabeling *labeling)
Sets labeling configuration.
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.
void setLabelsEnabled(bool enabled)
Sets whether labels should be enabled for the layer.
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.
void setRenderer(QgsFeatureRenderer *r)
Sets the feature renderer which will be invoked to represent this layer in 2D map views.
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).
std::unique_ptr< QImage > getMap()
Returns the map 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.
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 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.
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
#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.
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,...
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