76#include <QTemporaryFile>
79#include <nlohmann/json.hpp>
103 : mContext( context )
108 mWmsParameters.
dump();
113 removeTemporaryLayers();
119 std::unique_ptr<QgsWmsRestorer> restorer;
131 std::unique_ptr<QImage> image;
134 const QSize size(
static_cast<int>( minSize.width() * dpmm ),
static_cast<int>( minSize.height() * dpmm ) );
139 image.reset( createImage( size ) );
142 QPainter painter( image.get() );
156 return image.release();
162 std::unique_ptr<QgsWmsRestorer> restorer;
176 std::unique_ptr<QImage> image( createImage( size ) );
180 std::unique_ptr<QPainter> painter;
181 painter.reset(
new QPainter( image.get() ) );
182 painter->setRenderHint( QPainter::Antialiasing,
true );
183 painter->scale( dpmm, dpmm );
189 nodeModel.
drawSymbol( settings, &ctx, size.height() / dpmm );
192 return image.release();
198 std::unique_ptr<QgsWmsRestorer> restorer;
214 void QgsRenderer::runHitTest(
const QgsMapSettings &mapSettings, HitTest &hitTest )
const
218 for (
const QString &
id : mapSettings.
layerIds() )
235 runHitTestLayer( vl, usedSymbols, context );
241 std::unique_ptr< QgsFeatureRenderer > r( vl->
renderer()->
clone() );
243 r->startRender( context, vl->
fields() );
251 if ( moreSymbolsPerFeature )
253 for (
QgsSymbol *s : r->originalSymbolsForFeature( f, context ) )
259 r->stopRender( context );
268 QStringLiteral(
"The requested map size is too large" ) );
272 std::unique_ptr<QgsWmsRestorer> restorer;
282 std::unique_ptr<QPainter> painter;
283 std::unique_ptr<QImage> image( createImage( mContext.
mapSize() ) );
286 configureMapSettings( image.get(), mapSettings );
293 runHitTest( mapSettings,
symbols );
301 std::unique_ptr<QgsWmsRestorer> restorer;
306 if ( templateName.isEmpty() )
330 QStringLiteral(
"The template has no pages" ) );
333 std::unique_ptr<QgsPrintLayout> layout( sourceLayout->
clone() );
337 QStringList atlasPk = mWmsParameters.
atlasPk();
338 if ( !atlasPk.isEmpty() )
340 atlas = layout->atlas();
341 if ( !atlas || !atlas->
enabled() )
345 QStringLiteral(
"The template has no atlas enabled" ) );
352 QStringLiteral(
"The atlas has no coverage layer" ) );
356 if ( atlasPk.size() == 1 && atlasPk.at( 0 ) == QLatin1String(
"*" ) )
360 if ( atlas->
count() > maxAtlasFeatures )
363 QString(
"The project configuration allows printing maximum %1 atlas features at a time" ).arg( maxAtlasFeatures ) );
369 if ( pkIndexes.size() == 0 )
371 QgsDebugMsgLevel( QStringLiteral(
"Atlas print: layer %1 has no primary key attributes" ).arg( cLayer->
name() ), 2 );
375 const int pkIndexesSize {std::max< int >( pkIndexes.size(), 1 )};
377 QStringList pkAttributeNames;
378 for (
int pkIndex : std::as_const( pkIndexes ) )
380 pkAttributeNames.append( cLayer->
fields().
at( pkIndex ).
name() );
383 const int nAtlasFeatures = atlasPk.size() / pkIndexesSize;
384 if ( nAtlasFeatures * pkIndexesSize != atlasPk.size() )
387 QStringLiteral(
"Wrong number of ATLAS_PK parameters" ) );
391 if ( nAtlasFeatures > maxAtlasFeatures )
394 QString(
"%1 atlas features have been requested, but the project configuration only allows printing %2 atlas features at a time" )
395 .arg( nAtlasFeatures ).arg( maxAtlasFeatures ) );
398 QString filterString;
399 int currentAtlasPk = 0;
401 for (
int i = 0; i < nAtlasFeatures; ++i )
405 filterString.append(
" OR " );
408 filterString.append(
"( " );
411 if ( pkAttributeNames.isEmpty() )
413 filterString.append( QStringLiteral(
"$id = %1" ).arg( atlasPk.at( currentAtlasPk ) ) );
418 for (
int j = 0; j < pkIndexes.size(); ++j )
422 filterString.append(
" AND " );
429 filterString.append(
" )" );
435 if ( !errorString.isEmpty() )
437 throw QgsException( QStringLiteral(
"An error occurred during the Atlas print: %1" ).arg( errorString ) );
449 std::unique_ptr<QImage> image(
new QImage() );
450 configureMapSettings( image.get(), mapSettings );
456 configurePrintLayout( layout.get(), mapSettings, atlas );
460 const QList<QgsMapLayer *> lyrs = mapSettings.
layers();
462#ifdef HAVE_SERVER_PYTHON_PLUGINS
463 mContext.accessControl()->resolveFilterFeatures( lyrs );
467 QHash<const QgsVectorLayer *, QStringList> fltrs;
472 fltrs.insert( vl, dimensionFilter( vl ) );
484 QTemporaryFile tempOutputFile( QDir::tempPath() +
'/' + QStringLiteral(
"XXXXXX.%1" ).arg( extension ) );
485 if ( !tempOutputFile.open() )
487 throw QgsException( QStringLiteral(
"Could not open temporary file for the GetPrint request." ) );
496 if ( !mWmsParameters.
dpi().isEmpty() )
499 double dpi( mWmsParameters.
dpi().toDouble( &ok ) );
501 exportSettings.
dpi = dpi;
514 atlasSvgExport.
exportToSvg( tempOutputFile.fileName(), exportSettings );
520 exporter.
exportToSvg( tempOutputFile.fileName(), exportSettings );
529 double dpi( layout->renderContext().dpi( ) );
530 if ( !mWmsParameters.
dpi().isEmpty() )
533 double _dpi = mWmsParameters.
dpi().toDouble( &ok );
537 exportSettings.
dpi = dpi;
543 QgsLayoutSize layoutSize( layout->pageCollection()->page( 0 )->sizeWithUnits() );
548 const QSize imageSize = QSize(
static_cast<int>( width.
length() * dpi / 25.4 ),
static_cast<int>( height.
length() * dpi / 25.4 ) );
550 const QString paramWidth = mWmsParameters.
width();
551 const QString paramHeight = mWmsParameters.
height();
556 if ( !paramWidth.isEmpty() && !paramHeight.isEmpty() )
558 exportSettings.
imageSize = QSize( paramWidth.toInt(), paramHeight.toInt() );
560 else if ( !paramWidth.isEmpty() && paramHeight.isEmpty() )
562 exportSettings.
imageSize = QSize( paramWidth.toInt(),
static_cast<double>( paramWidth.toInt() ) / imageSize.width() * imageSize.height() );
564 else if ( paramWidth.isEmpty() && !paramHeight.isEmpty() )
566 exportSettings.
imageSize = QSize(
static_cast<double>( paramHeight.toInt() ) / imageSize.height() * imageSize.width(), paramHeight.toInt() );
574 exportSettings.
pages.append( 0 );
582 atlasPngExport.
exportToImage( tempOutputFile.fileName(), exportSettings );
586 throw QgsServiceException( QStringLiteral(
"Bad request" ), QStringLiteral(
"Atlas error: empty atlas." ), QString(), 400 );
592 exporter.
exportToImage( tempOutputFile.fileName(), exportSettings );
600 if ( !mWmsParameters.
dpi().isEmpty() )
603 double dpi( mWmsParameters.
dpi().toDouble( &ok ) );
605 exportSettings.
dpi = dpi;
610 exportSettings.
rasterizeWholeImage = layout->customProperty( QStringLiteral(
"rasterize" ),
false ).toBool();
622 exporter.
exportToPdf( tempOutputFile.fileName(), exportSettings );
633 handlePrintErrors( atlas->
layout() );
637 handlePrintErrors( layout.get() );
640 return tempOutputFile.readAll();
648 QList<QgsLayoutItemMap *> maps;
654 for (
const auto &map : std::as_const( maps ) )
660 if ( cMapParams.
mLayers.isEmpty() )
665 if ( !atlasPrint || !map->atlasDriven() )
671 c->removeLayoutItem( map );
689 if ( cMapParams.
mScale > 0 )
691 map->setScale(
static_cast<double>( cMapParams.
mScale ) );
697 map->setMapRotation( cMapParams.
mRotation );
701 if ( !map->keepLayerSet() )
703 QList<QgsMapLayer *> layerSet;
705 for (
const auto &layer : std::as_const( cMapParams.
mLayers ) )
709 QList<QgsMapLayer *> layersFromGroup;
711 const QList<QgsMapLayer *> cLayersFromGroup = mContext.
layersFromGroup( layer.mNickname );
712 for (
QgsMapLayer *layerFromGroup : cLayersFromGroup )
715 if ( ! layerFromGroup )
720 layersFromGroup.push_front( layerFromGroup );
723 if ( !layersFromGroup.isEmpty() )
725 layerSet.append( layersFromGroup );
737 setLayerStyle( mlayer, layer.mStyle );
742 std::reverse( layerSet.begin(), layerSet.end() );
747 QMap<QString, QString> layersStyle;
748 if ( map->followVisibilityPreset() )
750 const QString presetName = map->followVisibilityPresetName();
751 if ( layerSet.isEmpty() )
755 layerSet = map->layersToRender( &ex );
758 map->setFollowVisibilityPreset(
false );
762 for (
const auto &layerMapThemeRecord : std::as_const( mapThemeRecords ) )
764 if ( layerSet.contains( layerMapThemeRecord.layer() ) )
766 layersStyle.insert( layerMapThemeRecord.layer()->id(),
767 layerMapThemeRecord.layer()->styleManager()->style( layerMapThemeRecord.currentStyle ).xmlData() );
773 const QList< QgsMapLayer *> highlights = highlightLayers( cMapParams.
mHighlightLayers );
774 for (
const auto &hl : std::as_const( highlights ) )
776 layerSet.prepend( hl );
779 map->setLayers( layerSet );
780 map->setKeepLayerSet(
true );
784 if ( !layersStyle.isEmpty() )
786 map->setLayerStyleOverrides( layersStyle );
787 map->setKeepLayerStyles(
true );
794 map->grid()->setIntervalX(
static_cast<double>( cMapParams.
mGridX ) );
795 map->grid()->setIntervalY(
static_cast<double>( cMapParams.
mGridY ) );
800 QList<QgsLayoutItemLabel *> labels;
802 for (
const auto &label : std::as_const( labels ) )
805 const QString labelId = label->
id();
806 const QString labelParam = mWmsParameters.
layoutParameter( labelId, ok );
811 if ( labelParam.isEmpty() )
815 c->removeItem( label );
820 label->setText( labelParam );
824 QList<QgsLayoutItemHtml *> htmls;
826 for (
const auto &html : std::as_const( htmls ) )
828 if ( html->frameCount() == 0 )
833 const QString htmlId = htmlFrame->
id();
846 c->removeMultiFrame( html );
852 html->setUrl( newUrl );
858 QList<QgsLayoutItemLegend *> legends;
860 for (
const auto &legend : std::as_const( legends ) )
862 if ( legend->autoUpdateModel() )
872 legend->setAutoUpdateModel(
false );
876 QStringList layerSet;
877 QList<QgsMapLayer *> mapLayers;
878 if ( map->
layers().isEmpty() )
882 mapLayers = mProject->
mapLayers(
true ).values();
886 mapLayers = map->
layers();
888 const QList<QgsMapLayer *> layerList = mapLayers;
889 for (
const auto &layer : layerList )
890 layerSet << layer->id();
902 for (
const auto &layerId : layerIds )
909 if ( !layerSet.contains( layerId ) )
911 qobject_cast<QgsLayerTreeGroup *>( nodeLayer->
parent() )->removeChildNode( nodeLayer );
918 qobject_cast<QgsLayerTreeGroup *>( nodeLayer->
parent() )->removeChildNode( nodeLayer );
934 QStringLiteral(
"The requested map size is too large" ) );
938 std::unique_ptr<QgsWmsRestorer> restorer;
949 std::unique_ptr<QPainter> painter;
950 std::unique_ptr<QImage> image( createImage( mContext.
mapSize() ) );
953 configureMapSettings( image.get(), mapSettings );
959 painter.reset( layersRendering( mapSettings, *image ) );
962 annotationsRendering( painter.get(), mapSettings );
968 QImage *scaledImage = scaleImage( image.get() );
970 image.reset( scaledImage );
973 return image.release();
979 std::unique_ptr<QgsWmsRestorer> restorer;
988 QList< QgsDxfExport::DxfLayer > dxfLayers;
993 if ( layer->type() != Qgis::LayerType::Vector )
1000 int layerAttribute = -1;
1001 if ( attributes.size() > layerIdx )
1012 QString
crs = mWmsParameters.
crs();
1013 if (
crs.compare( QStringLiteral(
"CRS:84" ), Qt::CaseInsensitive ) == 0 )
1015 crs = QStringLiteral(
"EPSG:4326" );
1018 else if (
crs.isEmpty() )
1020 crs = QStringLiteral(
"EPSG:4326" );
1054 std::unique_ptr<QgsDxfExport> dxf = std::make_unique<QgsDxfExport>();
1055 dxf->setExtent( mapExtent );
1056 dxf->setDestinationCrs( outputCRS );
1057 dxf->addLayers( dxfLayers );
1059 dxf->setSymbologyExport( mWmsParameters.
dxfMode() );
1060 if ( mWmsParameters.
dxfFormatOptions().contains( QgsWmsParameters::DxfFormatOption::SCALE ) )
1062 dxf->setSymbologyScale( mWmsParameters.
dxfScale() );
1065 dxf->setForce2d( mWmsParameters.
isForce2D() );
1066 QgsDxfExport::Flags flags;
1067 if ( mWmsParameters.
noMText() )
1068 flags.setFlag( QgsDxfExport::Flag::FlagNoMText );
1070 dxf->setFlags( flags );
1078 if ( i < 0 || i > mapSettings.
outputSize().width() )
1086 if ( j < 0 || j > mapSettings.
outputSize().height() )
1111 const bool ijDefined = !mWmsParameters.
i().isEmpty() && !mWmsParameters.
j().isEmpty();
1112 const bool xyDefined = !mWmsParameters.
x().isEmpty() && !mWmsParameters.
y().isEmpty();
1113 const bool filtersDefined = !mWmsParameters.
filters().isEmpty();
1114 const bool filterGeomDefined = !mWmsParameters.
filterGeom().isEmpty();
1116 if ( !ijDefined && !xyDefined && !filtersDefined && !filterGeomDefined )
1120 if ( mWmsParameters.
j().isEmpty() )
1127 if ( infoFormat == QgsWmsParameters::Format::NONE )
1134 std::unique_ptr<QImage> outputImage( createImage( mContext.
mapSize() ) );
1137 std::unique_ptr<QgsWmsRestorer> restorer;
1142 bool mandatoryCrsParam =
true;
1143 if ( filtersDefined && !ijDefined && !xyDefined && mWmsParameters.
crs().isEmpty() )
1145 mandatoryCrsParam =
false;
1151 configureMapSettings( outputImage.get(), mapSettings, mandatoryCrsParam );
1167#ifdef HAVE_SERVER_PYTHON_PLUGINS
1168 mContext.accessControl()->resolveFilterFeatures( mapSettings.
layers() );
1171 QDomDocument result = featureInfoDocument( layers, mapSettings, outputImage.get(), version );
1175 if ( infoFormat == QgsWmsParameters::Format::TEXT )
1176 ba = convertFeatureInfoToText( result );
1177 else if ( infoFormat == QgsWmsParameters::Format::HTML )
1178 ba = convertFeatureInfoToHtml( result );
1179 else if ( infoFormat == QgsWmsParameters::Format::JSON )
1180 ba = convertFeatureInfoToJson( layers, result );
1182 ba = result.toByteArray();
1187 QImage *QgsRenderer::createImage(
const QSize &size )
const
1189 std::unique_ptr<QImage> image;
1197 image = std::make_unique<QImage>( size, QImage::Format_ARGB32_Premultiplied );
1202 image = std::make_unique<QImage>( size, QImage::Format_RGB32 );
1207 if ( image->isNull() )
1209 throw QgsException( QStringLiteral(
"createImage: image could not be created, check for out of memory conditions" ) );
1212 const int dpm =
static_cast<int>( mContext.
dotsPerMm() * 1000.0 );
1213 image->setDotsPerMeterX( dpm );
1214 image->setDotsPerMeterY( dpm );
1216 return image.release();
1219 void QgsRenderer::configureMapSettings(
const QPaintDevice *paintDevice,
QgsMapSettings &mapSettings,
bool mandatoryCrsParam )
1223 throw QgsException( QStringLiteral(
"configureMapSettings: no paint device" ) );
1226 mapSettings.
setOutputSize( QSize( paintDevice->width(), paintDevice->height() ) );
1233 if ( !mWmsParameters.
bbox().isEmpty() && mapExtent.
isEmpty() )
1239 QString
crs = mWmsParameters.
crs();
1240 if (
crs.compare(
"CRS:84", Qt::CaseInsensitive ) == 0 )
1242 crs = QString(
"EPSG:4326" );
1245 else if (
crs.isEmpty() && !mandatoryCrsParam )
1247 crs = QString(
"EPSG:4326" );
1257 QgsWmsParameter parameter;
1299 else if ( backgroundColor.isValid() )
1322 const QString timeString { mWmsParameters.
dimensionValues().value( QStringLiteral(
"TIME" ), QString() ) };
1323 if ( ! timeString.isEmpty() )
1325 bool isValidTemporalRange {
true };
1326 QgsDateTimeRange range;
1328 const QDateTime dt { QDateTime::fromString( timeString, Qt::DateFormat::ISODateWithMs ) };
1331 range = QgsDateTimeRange( dt, dt );
1341 isValidTemporalRange =
false;
1342 QgsMessageLog::logMessage( QStringLiteral(
"Could not parse TIME parameter into a temporal range" ),
"Server", Qgis::MessageLevel::Warning );
1346 if ( isValidTemporalRange )
1356 QDomDocument QgsRenderer::featureInfoDocument( QList<QgsMapLayer *> &layers,
const QgsMapSettings &mapSettings,
1357 const QImage *outputImage,
const QString &version )
const
1361 bool ijDefined = ( !mWmsParameters.
i().isEmpty() && !mWmsParameters.
j().isEmpty() );
1363 bool xyDefined = ( !mWmsParameters.
x().isEmpty() && !mWmsParameters.
y().isEmpty() );
1365 bool filtersDefined = !mWmsParameters.
filters().isEmpty();
1367 bool filterGeomDefined = !mWmsParameters.
filterGeom().isEmpty();
1370 if ( featureCount < 1 )
1375 int i = mWmsParameters.
iAsInt();
1376 int j = mWmsParameters.
jAsInt();
1377 if ( xyDefined && !ijDefined )
1379 i = mWmsParameters.
xAsInt();
1380 j = mWmsParameters.
yAsInt();
1384 if ( ( i != -1 && j != -1 && width != 0 && height != 0 ) && ( width != outputImage->width() || height != outputImage->height() ) )
1386 i *= ( outputImage->width() /
static_cast<double>( width ) );
1387 j *= ( outputImage->height() /
static_cast<double>( height ) );
1391 std::unique_ptr<QgsRectangle> featuresRect;
1392 std::unique_ptr<QgsGeometry> filterGeom;
1393 std::unique_ptr<QgsPointXY> infoPoint;
1395 if ( i != -1 && j != -1 )
1398 infoPointToMapCoordinates( i, j, infoPoint.get(), mapSettings );
1400 else if ( filtersDefined )
1404 else if ( filterGeomDefined )
1409 QDomDocument result;
1410 const QDomNode header = result.createProcessingInstruction( QStringLiteral(
"xml" ), QStringLiteral(
"version=\"1.0\" encoding=\"UTF-8\"" ) );
1411 result.appendChild( header );
1413 QDomElement getFeatureInfoElement;
1415 if ( infoFormat == QgsWmsParameters::Format::GML )
1417 getFeatureInfoElement = result.createElement( QStringLiteral(
"wfs:FeatureCollection" ) );
1418 getFeatureInfoElement.setAttribute( QStringLiteral(
"xmlns:wfs" ), QStringLiteral(
"http://www.opengis.net/wfs" ) );
1419 getFeatureInfoElement.setAttribute( QStringLiteral(
"xmlns:ogc" ), QStringLiteral(
"http://www.opengis.net/ogc" ) );
1420 getFeatureInfoElement.setAttribute( QStringLiteral(
"xmlns:gml" ), QStringLiteral(
"http://www.opengis.net/gml" ) );
1421 getFeatureInfoElement.setAttribute( QStringLiteral(
"xmlns:ows" ), QStringLiteral(
"http://www.opengis.net/ows" ) );
1422 getFeatureInfoElement.setAttribute( QStringLiteral(
"xmlns:xlink" ), QStringLiteral(
"http://www.w3.org/1999/xlink" ) );
1423 getFeatureInfoElement.setAttribute( QStringLiteral(
"xmlns:qgs" ), QStringLiteral(
"http://qgis.org/gml" ) );
1424 getFeatureInfoElement.setAttribute( QStringLiteral(
"xmlns:xsi" ), QStringLiteral(
"http://www.w3.org/2001/XMLSchema-instance" ) );
1425 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" ) );
1430 if ( featureInfoElemName.isEmpty() )
1432 featureInfoElemName = QStringLiteral(
"GetFeatureInfoResponse" );
1435 if ( featureInfoElemNs.isEmpty() )
1437 getFeatureInfoElement = result.createElement( featureInfoElemName );
1441 getFeatureInfoElement = result.createElementNS( featureInfoElemNs, featureInfoElemName );
1445 if ( !featureInfoSchema.isEmpty() )
1447 getFeatureInfoElement.setAttribute( QStringLiteral(
"xmlns:xsi" ), QStringLiteral(
"http://www.w3.org/2001/XMLSchema-instance" ) );
1448 getFeatureInfoElement.setAttribute( QStringLiteral(
"xsi:schemaLocation" ), featureInfoSchema );
1451 result.appendChild( getFeatureInfoElement );
1461 for (
const QString &queryLayer : queryLayers )
1463 bool validLayer =
false;
1464 bool queryableLayer =
true;
1465 for (
QgsMapLayer *layer : std::as_const( layers ) )
1471 if ( !queryableLayer )
1476 QDomElement layerElement;
1477 if ( infoFormat == QgsWmsParameters::Format::GML )
1479 layerElement = getFeatureInfoElement;
1483 layerElement = result.createElement( QStringLiteral(
"Layer" ) );
1484 QString layerName = queryLayer;
1487 QHash<QString, QString>::const_iterator layerAliasIt = layerAliasMap.constFind( layerName );
1488 if ( layerAliasIt != layerAliasMap.constEnd() )
1490 layerName = layerAliasIt.value();
1493 layerElement.setAttribute( QStringLiteral(
"name" ), layerName );
1494 getFeatureInfoElement.appendChild( layerElement );
1497 layerElement.setAttribute( QStringLiteral(
"id" ), layer->id() );
1501 if ( layer->type() == Qgis::LayerType::Vector )
1503 QgsVectorLayer *vectorLayer = qobject_cast<QgsVectorLayer *>( layer );
1506 ( void )featureInfoFromVectorLayer( vectorLayer, infoPoint.get(), featureCount, result, layerElement, mapSettings, renderContext, version, featuresRect.get(), filterGeom.get() );
1512 QgsRasterLayer *rasterLayer = qobject_cast<QgsRasterLayer *>( layer );
1521 QgsPointXY layerInfoPoint = mapSettings.mapToLayerCoordinates( layer, *( infoPoint.get() ) );
1526 if ( infoFormat == QgsWmsParameters::Format::GML )
1528 layerElement = result.createElement( QStringLiteral(
"gml:featureMember" ) );
1529 getFeatureInfoElement.appendChild( layerElement );
1532 ( void )featureInfoFromRasterLayer( rasterLayer, mapSettings, &layerInfoPoint, result, layerElement, version );
1540 param.mValue = queryLayer;
1544 else if ( ( validLayer && !queryableLayer ) || ( !validLayer && mContext.
isValidGroup( queryLayer ) ) )
1547 param.mValue = queryLayer;
1549 bool hasGroupAndQueryable {
false };
1554 for (
const QString &ql : constNicks )
1558 const QList<QgsMapLayer *> constLayers { mContext.
layerGroups()[ql] };
1561 if ( ( ! ml->shortName().isEmpty() && ml->shortName() == queryLayer ) || ( ml->name() == queryLayer ) )
1567 hasGroupAndQueryable =
true;
1576 if ( ! hasGroupAndQueryable )
1586 if ( infoFormat == QgsWmsParameters::Format::GML )
1588 QDomElement bBoxElem = result.createElement( QStringLiteral(
"gml:boundedBy" ) );
1589 QDomElement boxElem;
1591 if ( gmlVersion < 3 )
1603 boxElem.setAttribute( QStringLiteral(
"srsName" ),
crs.
authid() );
1605 bBoxElem.appendChild( boxElem );
1606 getFeatureInfoElement.insertBefore( bBoxElem, QDomNode() );
1610 QDomElement bBoxElem = result.createElement( QStringLiteral(
"BoundingBox" ) );
1611 bBoxElem.setAttribute( QStringLiteral(
"CRS" ), mapSettings.destinationCrs().authid() );
1612 bBoxElem.setAttribute( QStringLiteral(
"minx" ),
qgsDoubleToString( featuresRect->xMinimum(), 8 ) );
1613 bBoxElem.setAttribute( QStringLiteral(
"maxx" ),
qgsDoubleToString( featuresRect->xMaximum(), 8 ) );
1614 bBoxElem.setAttribute( QStringLiteral(
"miny" ),
qgsDoubleToString( featuresRect->yMinimum(), 8 ) );
1615 bBoxElem.setAttribute( QStringLiteral(
"maxy" ),
qgsDoubleToString( featuresRect->yMaximum(), 8 ) );
1616 getFeatureInfoElement.insertBefore( bBoxElem, QDomNode() );
1620 if ( sia2045 && infoFormat == QgsWmsParameters::Format::XML )
1622 convertFeatureInfoToSia2045( result );
1628 bool QgsRenderer::featureInfoFromVectorLayer(
QgsVectorLayer *layer,
1631 QDomDocument &infoDocument,
1632 QDomElement &layerElement,
1635 const QString &version,
1647 std::unique_ptr<QgsGeometry> layerFilterGeom;
1650 layerFilterGeom.reset(
new QgsGeometry( *filterGeom ) );
1664 searchRect = featureInfoSearchRect( layer, mapSettings, renderContext, *infoPoint );
1666 else if ( layerFilterGeom )
1668 searchRect = layerFilterGeom->boundingBox();
1670 else if ( !mWmsParameters.
bbox().isEmpty() )
1672 searchRect = layerRect;
1679 int featureCounter = 0;
1698 if ( layerFilterGeom )
1700 fReq.
setFilterExpression( QString(
"intersects( $geometry, geom_from_wkt('%1') )" ).arg( layerFilterGeom->asWkt() ) );
1705#ifdef HAVE_SERVER_PYTHON_PLUGINS
1706 mContext.accessControl()->filterFeatures( layer, fReq );
1708 QStringList attributes;
1713 attributes = mContext.accessControl()->layerAttributes( layer, attributes );
1718 std::unique_ptr< QgsFeatureRenderer > r2( layer->
renderer() ? layer->
renderer()->
clone() :
nullptr );
1721 r2->startRender( renderContext, layer->
fields() );
1724 bool featureBBoxInitialized =
false;
1733 if ( featureCounter > nFeatures )
1748 bool render = r2->willRenderFeature( feature, renderContext );
1761 if ( !featureBBoxInitialized && featureBBox->
isEmpty() )
1764 featureBBoxInitialized =
true;
1779 if ( mWmsParameters.
infoFormat() == QgsWmsParameters::Format::GML )
1784 QDomElement elem = createFeatureGML(
1786#ifdef HAVE_SERVER_PYTHON_PLUGINS
1790 QDomElement featureMemberElem = infoDocument.createElement( QStringLiteral(
"gml:featureMember" ) );
1791 featureMemberElem.appendChild( elem );
1792 layerElement.appendChild( featureMemberElem );
1797 QDomElement featureElement = infoDocument.createElement( QStringLiteral(
"Feature" ) );
1799 layerElement.appendChild( featureElement );
1805 writeAttributesTabLayout( editConfig, layer, fields, featureAttributes, infoDocument, featureElement, renderContext
1806#ifdef HAVE_SERVER_PYTHON_PLUGINS
1813 for (
int i = 0; i < featureAttributes.count(); ++i )
1815 writeVectorLayerAttribute( i, layer, fields, featureAttributes, infoDocument, featureElement, renderContext
1816#ifdef HAVE_SERVER_PYTHON_PLUGINS
1825 if ( !mapTip.isEmpty() && mWmsParameters.
withMapTip() )
1827 QDomElement maptipElem = infoDocument.createElement( QStringLiteral(
"Attribute" ) );
1828 maptipElem.setAttribute( QStringLiteral(
"name" ), QStringLiteral(
"maptip" ) );
1832 featureElement.appendChild( maptipElem );
1839 QDomElement bBoxElem = infoDocument.createElement( QStringLiteral(
"BoundingBox" ) );
1840 bBoxElem.setAttribute( version == QLatin1String(
"1.1.1" ) ?
"SRS" :
"CRS",
outputCrs.
authid() );
1845 featureElement.appendChild( bBoxElem );
1861 if ( segmentizeWktGeometry )
1869 geom.
set( segmentizedGeom );
1873 QDomElement geometryElement = infoDocument.createElement( QStringLiteral(
"Attribute" ) );
1874 geometryElement.setAttribute( QStringLiteral(
"name" ), QStringLiteral(
"geometry" ) );
1875 geometryElement.setAttribute( QStringLiteral(
"value" ), geom.
asWkt( mContext.
precision() ) );
1876 geometryElement.setAttribute( QStringLiteral(
"type" ), QStringLiteral(
"derived" ) );
1877 featureElement.appendChild( geometryElement );
1884 r2->stopRender( renderContext );
1895 QString groupName = container->
name();
1896 QDomElement nameElem;
1898 if ( !groupName.isEmpty() )
1900 nameElem = doc.createElement( groupName );
1901 parentElem.appendChild( nameElem );
1904 const QList<QgsAttributeEditorElement *> children = container->
children();
1909 writeAttributesTabGroup( child, layer, fields, featureAttributes, doc, nameElem.isNull() ? parentElem : nameElem, renderContext );
1919 writeVectorLayerAttribute( idx, layer, fields, featureAttributes, doc, nameElem.isNull() ? parentElem : nameElem, renderContext, attributes );
1930 if ( !editorContainer )
1935 writeAttributesTabGroup( editorContainer, layer, fields, featureAttributes, doc, featureElem, renderContext, attributes );
1938 void QgsRenderer::writeVectorLayerAttribute(
int attributeIndex,
QgsVectorLayer *layer,
const QgsFields &fields,
QgsAttributes &featureAttributes, QDomDocument &doc, QDomElement &featureElem,
QgsRenderContext &renderContext, QStringList *attributes )
const
1940#ifndef HAVE_SERVER_PYTHON_PLUGINS
1941 Q_UNUSED( attributes );
1954#ifdef HAVE_SERVER_PYTHON_PLUGINS
1956 if ( attributes && !attributes->contains( fields.
at( attributeIndex ).
name() ) )
1963 QDomElement attributeElement = doc.createElement( QStringLiteral(
"Attribute" ) );
1964 attributeElement.setAttribute( QStringLiteral(
"name" ), attributeName );
1966 attributeElement.setAttribute( QStringLiteral(
"value" ),
1968 replaceValueMapAndRelation(
1969 layer, attributeIndex,
1970 featureAttributes[attributeIndex] ),
1973 featureElem.appendChild( attributeElement );
1976 bool QgsRenderer::featureInfoFromRasterLayer(
QgsRasterLayer *layer,
1979 QDomDocument &infoDocument,
1980 QDomElement &layerElement,
1981 const QString &version )
const
2000 ? Qgis::RasterIdentifyFormat::Feature
2001 : Qgis::RasterIdentifyFormat::Value );
2013 .arg( layer->
name() ) );
2022 if ( !identifyResult.
isValid() )
2025 QMap<int, QVariant> attributes = identifyResult.
results();
2027 if ( mWmsParameters.
infoFormat() == QgsWmsParameters::Format::GML )
2035 if ( identifyFormat == Qgis::RasterIdentifyFormat::Value )
2039 for (
auto it = attributes.constBegin(); it != attributes.constEnd(); ++it )
2042 feature.
setAttribute( index++, QString::number( it.value().toDouble() ) );
2045 QDomElement elem = createFeatureGML(
2046 &feature,
nullptr, infoDocument, layerCrs, mapSettings,
typeName,
false, gmlVersion,
nullptr );
2047 layerElement.appendChild( elem );
2051 const auto values = identifyResult.
results();
2052 for (
auto it = values.constBegin(); it != values.constEnd(); ++it )
2054 QVariant value = it.value();
2055 if ( value.type() == QVariant::Bool && !value.toBool() )
2061 if ( value.type() == QVariant::String )
2072 for (
const QgsFeature &feature : storeFeatures )
2074 QDomElement elem = createFeatureGML(
2075 &feature,
nullptr, infoDocument, layerCrs, mapSettings,
typeName,
false, gmlVersion,
nullptr );
2076 layerElement.appendChild( elem );
2084 if ( identifyFormat == Qgis::RasterIdentifyFormat::Value )
2086 for (
auto it = attributes.constBegin(); it != attributes.constEnd(); ++it )
2088 QDomElement attributeElement = infoDocument.createElement( QStringLiteral(
"Attribute" ) );
2089 attributeElement.setAttribute( QStringLiteral(
"name" ), layer->
bandName( it.key() ) );
2094 value = QString::number( it.value().toDouble() );
2097 attributeElement.setAttribute( QStringLiteral(
"value" ), value );
2098 layerElement.appendChild( attributeElement );
2103 const auto values = identifyResult.
results();
2104 for (
auto it = values.constBegin(); it != values.constEnd(); ++it )
2106 QVariant value = it.value();
2107 if ( value.type() == QVariant::Bool && !value.toBool() )
2113 if ( value.type() == QVariant::String )
2123 for (
const QgsFeature &feature : storeFeatures )
2125 for (
const auto &fld : feature.
fields() )
2127 const auto val { feature.
attribute( fld.name() )};
2128 if ( val.isValid() )
2130 QDomElement attributeElement = infoDocument.createElement( QStringLiteral(
"Attribute" ) );
2131 attributeElement.setAttribute( QStringLiteral(
"name" ), fld.name() );
2132 attributeElement.setAttribute( QStringLiteral(
"value" ), val.toString() );
2133 layerElement.appendChild( attributeElement );
2144 bool QgsRenderer::testFilterStringSafety(
const QString &filter )
const
2147 if ( filter.contains( QLatin1String(
";" ) ) )
2152#if QT_VERSION < QT_VERSION_CHECK(5, 15, 0)
2153 QStringList tokens = filter.split(
' ', QString::SkipEmptyParts );
2155 QStringList tokens = filter.split(
' ', Qt::SkipEmptyParts );
2157 groupStringList( tokens, QStringLiteral(
"'" ) );
2158 groupStringList( tokens, QStringLiteral(
"\"" ) );
2160 for (
auto tokenIt = tokens.constBegin() ; tokenIt != tokens.constEnd(); ++tokenIt )
2163 if ( tokenIt->compare( QLatin1String(
"," ) ) == 0
2164 || tokenIt->compare( QLatin1String(
"(" ) ) == 0
2165 || tokenIt->compare( QLatin1String(
")" ) ) == 0
2166 || tokenIt->compare( QLatin1String(
"=" ) ) == 0
2167 || tokenIt->compare( QLatin1String(
"!=" ) ) == 0
2168 || tokenIt->compare( QLatin1String(
"<" ) ) == 0
2169 || tokenIt->compare( QLatin1String(
"<=" ) ) == 0
2170 || tokenIt->compare( QLatin1String(
">" ) ) == 0
2171 || tokenIt->compare( QLatin1String(
">=" ) ) == 0
2172 || tokenIt->compare( QLatin1String(
"%" ) ) == 0
2173 || tokenIt->compare( QLatin1String(
"IS" ), Qt::CaseInsensitive ) == 0
2174 || tokenIt->compare( QLatin1String(
"NOT" ), Qt::CaseInsensitive ) == 0
2175 || tokenIt->compare( QLatin1String(
"NULL" ), Qt::CaseInsensitive ) == 0
2176 || tokenIt->compare( QLatin1String(
"AND" ), Qt::CaseInsensitive ) == 0
2177 || tokenIt->compare( QLatin1String(
"OR" ), Qt::CaseInsensitive ) == 0
2178 || tokenIt->compare( QLatin1String(
"IN" ), Qt::CaseInsensitive ) == 0
2179 || tokenIt->compare( QLatin1String(
"LIKE" ), Qt::CaseInsensitive ) == 0
2180 || tokenIt->compare( QLatin1String(
"ILIKE" ), Qt::CaseInsensitive ) == 0
2181 || tokenIt->compare( QLatin1String(
"DMETAPHONE" ), Qt::CaseInsensitive ) == 0
2182 || tokenIt->compare( QLatin1String(
"SOUNDEX" ), Qt::CaseInsensitive ) == 0
2190 tokenIt->toDouble( &isNumeric );
2199 if ( *tokenIt == QLatin1String(
"''" ) )
2205 if ( tokenIt->size() > 2
2206 && ( *tokenIt )[0] == QChar(
'\'' )
2207 && ( *tokenIt )[tokenIt->size() - 1] == QChar(
'\'' )
2208 && ( *tokenIt )[1] != QChar(
'\'' )
2209 && ( *tokenIt )[tokenIt->size() - 2] != QChar(
'\'' ) )
2215 if ( tokenIt->size() > 2
2216 && ( *tokenIt )[0] == QChar(
'"' )
2217 && ( *tokenIt )[tokenIt->size() - 1] == QChar(
'"' )
2218 && ( *tokenIt )[1] != QChar(
'"' )
2219 && ( *tokenIt )[tokenIt->size() - 2] != QChar(
'"' ) )
2230 void QgsRenderer::groupStringList( QStringList &list,
const QString &groupString )
2233 bool groupActive =
false;
2234 int startGroup = -1;
2235 QString concatString;
2237 for (
int i = 0; i < list.size(); ++i )
2239 QString &
str = list[i];
2240 if (
str.startsWith( groupString ) )
2244 concatString.clear();
2249 if ( i != startGroup )
2251 concatString.append(
" " );
2253 concatString.append(
str );
2256 if (
str.endsWith( groupString ) )
2259 groupActive =
false;
2261 if ( startGroup != -1 )
2263 list[startGroup] = concatString;
2264 for (
int j = startGroup + 1; j <= endGroup; ++j )
2266 list.removeAt( startGroup + 1 );
2271 concatString.clear();
2277 void QgsRenderer::convertFeatureInfoToSia2045( QDomDocument &doc )
const
2279 QDomDocument SIAInfoDoc;
2280 QDomElement infoDocElement = doc.documentElement();
2281 QDomElement SIAInfoDocElement = SIAInfoDoc.importNode( infoDocElement,
false ).toElement();
2282 SIAInfoDoc.appendChild( SIAInfoDocElement );
2284 QString currentAttributeName;
2285 QString currentAttributeValue;
2286 QDomElement currentAttributeElem;
2287 QString currentLayerName;
2288 QDomElement currentLayerElem;
2289 QDomNodeList layerNodeList = infoDocElement.elementsByTagName( QStringLiteral(
"Layer" ) );
2290 for (
int i = 0; i < layerNodeList.size(); ++i )
2292 currentLayerElem = layerNodeList.at( i ).toElement();
2293 currentLayerName = currentLayerElem.attribute( QStringLiteral(
"name" ) );
2295 QDomElement currentFeatureElem;
2297 QDomNodeList featureList = currentLayerElem.elementsByTagName( QStringLiteral(
"Feature" ) );
2298 if ( featureList.isEmpty() )
2301 QDomNodeList attributeList = currentLayerElem.elementsByTagName( QStringLiteral(
"Attribute" ) );
2302 QDomElement rasterLayerElem;
2303 if ( !attributeList.isEmpty() )
2305 rasterLayerElem = SIAInfoDoc.createElement( currentLayerName );
2307 for (
int j = 0; j < attributeList.size(); ++j )
2309 currentAttributeElem = attributeList.at( j ).toElement();
2310 currentAttributeName = currentAttributeElem.attribute( QStringLiteral(
"name" ) );
2311 currentAttributeValue = currentAttributeElem.attribute( QStringLiteral(
"value" ) );
2312 QDomElement outAttributeElem = SIAInfoDoc.createElement( currentAttributeName );
2313 QDomText outAttributeText = SIAInfoDoc.createTextNode( currentAttributeValue );
2314 outAttributeElem.appendChild( outAttributeText );
2315 rasterLayerElem.appendChild( outAttributeElem );
2317 if ( !attributeList.isEmpty() )
2319 SIAInfoDocElement.appendChild( rasterLayerElem );
2325 QSet<QString> layerPropertyAttributes;
2326 QString currentLayerId = currentLayerElem.attribute( QStringLiteral(
"id" ) );
2327 if ( !currentLayerId.isEmpty() )
2332 QString WMSPropertyAttributesString = currentLayer->
customProperty( QStringLiteral(
"WMSPropertyAttributes" ) ).toString();
2333 if ( !WMSPropertyAttributesString.isEmpty() )
2335 QStringList propertyList = WMSPropertyAttributesString.split( QStringLiteral(
"//" ) );
2336 for (
auto propertyIt = propertyList.constBegin() ; propertyIt != propertyList.constEnd(); ++propertyIt )
2338 layerPropertyAttributes.insert( *propertyIt );
2344 QDomElement propertyRefChild;
2345 for (
int j = 0; j < featureList.size(); ++j )
2347 QDomElement SIAFeatureElem = SIAInfoDoc.createElement( currentLayerName );
2348 currentFeatureElem = featureList.at( j ).toElement();
2349 QDomNodeList attributeList = currentFeatureElem.elementsByTagName( QStringLiteral(
"Attribute" ) );
2351 for (
int k = 0; k < attributeList.size(); ++k )
2353 currentAttributeElem = attributeList.at( k ).toElement();
2354 currentAttributeName = currentAttributeElem.attribute( QStringLiteral(
"name" ) );
2355 currentAttributeValue = currentAttributeElem.attribute( QStringLiteral(
"value" ) );
2356 if ( layerPropertyAttributes.contains( currentAttributeName ) )
2358 QDomElement propertyElem = SIAInfoDoc.createElement( QStringLiteral(
"property" ) );
2359 QDomElement identifierElem = SIAInfoDoc.createElement( QStringLiteral(
"identifier" ) );
2360 QDomText identifierText = SIAInfoDoc.createTextNode( currentAttributeName );
2361 identifierElem.appendChild( identifierText );
2362 QDomElement valueElem = SIAInfoDoc.createElement( QStringLiteral(
"value" ) );
2363 QDomText valueText = SIAInfoDoc.createTextNode( currentAttributeValue );
2364 valueElem.appendChild( valueText );
2365 propertyElem.appendChild( identifierElem );
2366 propertyElem.appendChild( valueElem );
2367 if ( propertyRefChild.isNull() )
2369 SIAFeatureElem.insertBefore( propertyElem, QDomNode() );
2370 propertyRefChild = propertyElem;
2374 SIAFeatureElem.insertAfter( propertyElem, propertyRefChild );
2379 QDomElement SIAAttributeElem = SIAInfoDoc.createElement( currentAttributeName );
2380 QDomText SIAAttributeText = SIAInfoDoc.createTextNode( currentAttributeValue );
2381 SIAAttributeElem.appendChild( SIAAttributeText );
2382 SIAFeatureElem.appendChild( SIAAttributeElem );
2385 SIAInfoDocElement.appendChild( SIAFeatureElem );
2392 QByteArray QgsRenderer::convertFeatureInfoToHtml(
const QDomDocument &doc )
const
2394 QString featureInfoString;
2397 featureInfoString.append(
"<HEAD>\n" );
2398 featureInfoString.append(
"<TITLE> GetFeatureInfo results </TITLE>\n" );
2399 featureInfoString.append(
"<META http-equiv=\"Content-Type\" content=\"text/html;charset=utf-8\"/>\n" );
2400 featureInfoString.append(
"</HEAD>\n" );
2403 featureInfoString.append(
"<BODY>\n" );
2405 QDomNodeList layerList = doc.elementsByTagName( QStringLiteral(
"Layer" ) );
2408 for (
int i = 0; i < layerList.size(); ++i )
2410 QDomElement layerElem = layerList.at( i ).toElement();
2412 featureInfoString.append(
"<TABLE border=1 width=100%>\n" );
2413 featureInfoString.append(
"<TR><TH width=25%>Layer</TH><TD>" + layerElem.attribute( QStringLiteral(
"name" ) ) +
"</TD></TR>\n" );
2414 featureInfoString.append(
"</BR>" );
2417 QDomNodeList featureNodeList = layerElem.elementsByTagName( QStringLiteral(
"Feature" ) );
2418 QDomElement currentFeatureElement;
2420 if ( !featureNodeList.isEmpty() )
2422 for (
int j = 0; j < featureNodeList.size(); ++j )
2424 QDomElement featureElement = featureNodeList.at( j ).toElement();
2425 featureInfoString.append(
"<TABLE border=1 width=100%>\n" );
2426 featureInfoString.append(
"<TR><TH>Feature</TH><TD>" + featureElement.attribute( QStringLiteral(
"id" ) ) +
2430 QDomNodeList attributeNodeList = featureElement.elementsByTagName( QStringLiteral(
"Attribute" ) );
2431 for (
int k = 0; k < attributeNodeList.size(); ++k )
2433 QDomElement attributeElement = attributeNodeList.at( k ).toElement();
2434 featureInfoString.append(
"<TR><TH>" + attributeElement.attribute( QStringLiteral(
"name" ) ) +
2435 "</TH><TD>" + attributeElement.attribute( QStringLiteral(
"value" ) ) +
"</TD></TR>\n" );
2438 featureInfoString.append(
"</TABLE>\n</BR>\n" );
2443 QDomNodeList attributeNodeList = layerElem.elementsByTagName( QStringLiteral(
"Attribute" ) );
2444 for (
int j = 0; j < attributeNodeList.size(); ++j )
2446 QDomElement attributeElement = attributeNodeList.at( j ).toElement();
2447 QString value = attributeElement.attribute( QStringLiteral(
"value" ) );
2448 if ( value.isEmpty() )
2450 value = QStringLiteral(
"no data" );
2452 featureInfoString.append(
"<TR><TH>" + attributeElement.attribute( QStringLiteral(
"name" ) ) +
2453 "</TH><TD>" + value +
"</TD></TR>\n" );
2457 featureInfoString.append(
"</TABLE>\n<BR></BR>\n" );
2461 featureInfoString.append(
"</BODY>\n" );
2463 return featureInfoString.toUtf8();
2466 QByteArray QgsRenderer::convertFeatureInfoToText(
const QDomDocument &doc )
const
2468 QString featureInfoString;
2471 featureInfoString.append(
"GetFeatureInfo results\n" );
2472 featureInfoString.append(
"\n" );
2474 QDomNodeList layerList = doc.elementsByTagName( QStringLiteral(
"Layer" ) );
2477 for (
int i = 0; i < layerList.size(); ++i )
2479 QDomElement layerElem = layerList.at( i ).toElement();
2481 featureInfoString.append(
"Layer '" + layerElem.attribute( QStringLiteral(
"name" ) ) +
"'\n" );
2484 QDomNodeList featureNodeList = layerElem.elementsByTagName( QStringLiteral(
"Feature" ) );
2485 QDomElement currentFeatureElement;
2487 if ( !featureNodeList.isEmpty() )
2489 for (
int j = 0; j < featureNodeList.size(); ++j )
2491 QDomElement featureElement = featureNodeList.at( j ).toElement();
2492 featureInfoString.append(
"Feature " + featureElement.attribute( QStringLiteral(
"id" ) ) +
"\n" );
2495 QDomNodeList attributeNodeList = featureElement.elementsByTagName( QStringLiteral(
"Attribute" ) );
2496 for (
int k = 0; k < attributeNodeList.size(); ++k )
2498 QDomElement attributeElement = attributeNodeList.at( k ).toElement();
2499 featureInfoString.append( attributeElement.attribute( QStringLiteral(
"name" ) ) +
" = '" +
2500 attributeElement.attribute( QStringLiteral(
"value" ) ) +
"'\n" );
2506 QDomNodeList attributeNodeList = layerElem.elementsByTagName( QStringLiteral(
"Attribute" ) );
2507 for (
int j = 0; j < attributeNodeList.size(); ++j )
2509 QDomElement attributeElement = attributeNodeList.at( j ).toElement();
2510 QString value = attributeElement.attribute( QStringLiteral(
"value" ) );
2511 if ( value.isEmpty() )
2513 value = QStringLiteral(
"no data" );
2515 featureInfoString.append( attributeElement.attribute( QStringLiteral(
"name" ) ) +
" = '" +
2520 featureInfoString.append(
"\n" );
2523 return featureInfoString.toUtf8();
2526 QByteArray QgsRenderer::convertFeatureInfoToJson(
const QList<QgsMapLayer *> &layers,
const QDomDocument &doc )
const
2530 {
"type",
"FeatureCollection" },
2531 {
"features", json::array() },
2535 const QDomNodeList layerList = doc.elementsByTagName( QStringLiteral(
"Layer" ) );
2536 for (
int i = 0; i < layerList.size(); ++i )
2538 const QDomElement layerElem = layerList.at( i ).toElement();
2539 const QString layerName = layerElem.attribute( QStringLiteral(
"name" ) );
2544 if ( mContext.
layerNickname( *l ).compare( layerName ) == 0 )
2553 if ( layer->
type() == Qgis::LayerType::Vector )
2560 const QDomNodeList featuresNode = layerElem.elementsByTagName( QStringLiteral(
"Feature" ) );
2561 if ( featuresNode.isEmpty() )
2564 QMap<QgsFeatureId, QString> fidMap;
2566 for (
int j = 0; j < featuresNode.size(); ++j )
2568 const QDomElement featureNode = featuresNode.at( j ).toElement();
2569 const QString fid = featureNode.attribute( QStringLiteral(
"id" ) );
2572 if ( expression.isEmpty() )
2574 feature = vl->
getFeature( fid.toLongLong() );
2579 request.setFlags( QgsFeatureRequest::Flag::NoGeometry );
2583 fidMap.insert( feature.
id(), fid );
2588 const QDomNodeList attrs = featureNode.elementsByTagName(
"Attribute" );
2589 for (
int k = 0; k < attrs.count(); k++ )
2591 const QDomElement elm = attrs.at( k ).toElement();
2592 if ( elm.attribute( QStringLiteral(
"name" ) ).compare(
"geometry" ) == 0 )
2594 wkt = elm.attribute(
"value" );
2599 if ( ! wkt.isEmpty() )
2605 features << feature;
2608 if ( !attributes.isEmpty() )
2611 const QDomNodeList attributesNode = featureNode.elementsByTagName( QStringLiteral(
"Attribute" ) );
2612 for (
int k = 0; k < attributesNode.size(); ++k )
2614 const QDomElement attributeElement = attributesNode.at( k ).toElement();
2615 const QString fieldName = attributeElement.
attribute( QStringLiteral(
"name" ) );
2617 attributes << feature.fieldNameIndex( fieldName );
2623 exporter.setAttributeDisplayName(
true );
2624 exporter.setAttributes( attributes );
2625 exporter.setIncludeGeometry( withGeometry );
2626 exporter.setTransformGeometries(
false );
2628 for (
const auto &feature : std::as_const( features ) )
2630 const QString
id = QStringLiteral(
"%1.%2" ).arg( layerName ).arg( fidMap.value( feature.id() ) );
2631 json[
"features"].push_back( exporter.exportFeatureToJsonObject( feature, QVariantMap(),
id ) );
2636 auto properties = json::object();
2637 const QDomNodeList attributesNode = layerElem.elementsByTagName( QStringLiteral(
"Attribute" ) );
2638 for (
int j = 0; j < attributesNode.size(); ++j )
2640 const QDomElement attrElmt = attributesNode.at( j ).toElement();
2641 const QString name = attrElmt.attribute( QStringLiteral(
"name" ) );
2643 QString value = attrElmt.attribute( QStringLiteral(
"value" ) );
2644 if ( value.isEmpty() )
2646 value = QStringLiteral(
"null" );
2649 properties[name.toStdString()] = value.toStdString();
2652 json[
"features"].push_back(
2654 {
"type",
"Feature" },
2655 {
"id", layerName.toStdString() },
2656 {
"properties", properties }
2662 return QByteArray::fromStdString( json.dump( 2 ) );
2664 return QByteArray::fromStdString( json.dump() );
2668 QDomElement QgsRenderer::createFeatureGML(
2677 QStringList *attributes )
const
2680 QDomElement typeNameElement = doc.createElement(
"qgs:" +
typeName );
2687 typeNameElement.setAttribute( QStringLiteral(
"fid" ), QStringLiteral(
"%1.%2" ).arg(
typeName, fid ) );
2690 if ( layer && layer->
crs() !=
crs )
2707 !geom.
isNull() && geom.
type() != Qgis::GeometryType::Unknown &&
2708 geom.
type() != Qgis::GeometryType::Null )
2723 QDomElement bbElem = doc.createElement( QStringLiteral(
"gml:boundedBy" ) );
2724 QDomElement boxElem;
2736 boxElem.setAttribute( QStringLiteral(
"srsName" ),
crs.
authid() );
2738 bbElem.appendChild( boxElem );
2739 typeNameElement.appendChild( bbElem );
2751 QDomElement geomElem = doc.createElement( QStringLiteral(
"qgs:geometry" ) );
2752 QDomElement gmlElem;
2762 if ( !gmlElem.isNull() )
2766 gmlElem.setAttribute( QStringLiteral(
"srsName" ),
crs.
authid() );
2768 geomElem.appendChild( gmlElem );
2769 typeNameElement.appendChild( geomElem );
2776 for (
int i = 0; i < fields.
count(); ++i )
2778 QString attributeName = fields.
at( i ).
name();
2785 if ( attributes && !attributes->contains( attributeName ) )
2790 QDomElement fieldElem = doc.createElement(
"qgs:" + attributeName.replace(
' ',
'_' ) );
2791 QString fieldTextString = featureAttributes.at( i ).toString();
2796 QDomText fieldText = doc.createTextNode( fieldTextString );
2797 fieldElem.appendChild( fieldText );
2798 typeNameElement.appendChild( fieldElem );
2806 if ( !mapTip.isEmpty() && mWmsParameters.
withMapTip() )
2809 QDomElement fieldElem = doc.createElement( QStringLiteral(
"qgs:maptip" ) );
2810 QDomText maptipText = doc.createTextNode( fieldTextString );
2811 fieldElem.appendChild( maptipText );
2812 typeNameElement.appendChild( fieldElem );
2816 return typeNameElement;
2819 QString QgsRenderer::replaceValueMapAndRelation(
QgsVectorLayer *vl,
int idx,
const QVariant &attributeVal )
2823 QString value( fieldFormatter->
representValue( vl, idx, setup.
config(), QVariant(), attributeVal ) );
2825 if ( setup.
config().value( QStringLiteral(
"AllowMulti" ) ).toBool() && value.startsWith( QLatin1Char(
'{' ) ) && value.endsWith( QLatin1Char(
'}' ) ) )
2827 value = value.mid( 1, value.size() - 2 );
2839 double mapUnitTolerance = 0.0;
2840 if ( ml->
geometryType() == Qgis::GeometryType::Polygon )
2849 mapUnitTolerance = mapSettings.
extent().
width() / 400.0;
2852 else if ( ml->
geometryType() == Qgis::GeometryType::Line )
2861 mapUnitTolerance = mapSettings.
extent().
width() / 200.0;
2873 mapUnitTolerance = mapSettings.
extent().
width() / 100.0;
2877 QgsRectangle mapRectangle( infoPoint.
x() - mapUnitTolerance, infoPoint.
y() - mapUnitTolerance,
2878 infoPoint.
x() + mapUnitTolerance, infoPoint.
y() + mapUnitTolerance );
2882 QList<QgsMapLayer *> QgsRenderer::highlightLayers( QList<QgsWmsParametersHighlightLayer> params )
2884 QList<QgsMapLayer *> highlightLayers;
2887 QString
crs = mWmsParameters.
crs();
2888 for (
const QgsWmsParametersHighlightLayer ¶m : params )
2891 QDomDocument sldDoc;
2895 if ( !sldDoc.setContent( param.mSld,
true, &errorMsg, &errorLine, &errorColumn ) )
2902 QStringLiteral(
"Server" ), Qgis::MessageLevel::Warning );
2907 std::unique_ptr<QgsFeatureRenderer> renderer;
2908 QDomElement el = sldDoc.documentElement();
2919 if ( ! param.mLabel.isEmpty() )
2921 url +=
"&field=label:string";
2926 std::unique_ptr<QgsVectorLayer> layer = std::make_unique<QgsVectorLayer>( url, param.mName, QLatin1String(
"memory" ), options );
2927 if ( !layer->isValid() )
2934 if ( ! param.mLabel.isEmpty() )
2936 fet.setAttribute( 0, param.mLabel );
2944 palSettings.
dist = param.mLabelDistance;
2953 switch ( param.mGeom.type() )
2955 case Qgis::GeometryType::Point:
2966 QVariant x( pt.
x() );
2969 QVariant y( pt.
y() );
2979 case Qgis::GeometryType::Polygon:
2986 QVariant x( pt.
x() );
2990 QVariant y( pt.
y() );
2994 QVariant hali(
"Center" );
2998 QVariant vali(
"Half" );
3013 if ( param.mColor.isValid() )
3015 textFormat.
setColor( param.mColor );
3018 if ( param.mSize > 0 )
3020 textFormat.
setSize( param.mSize );
3028 if ( ! param.mFont.isEmpty() )
3030 textFormat.
setFont( param.mFont );
3033 if ( param.mBufferColor.isValid() )
3035 bufferSettings.
setColor( param.mBufferColor );
3038 if ( param.mBufferSize > 0 )
3041 bufferSettings.
setSize(
static_cast<double>( param.mBufferSize ) );
3048 layer->setLabeling( simpleLabeling );
3049 layer->setLabelsEnabled(
true );
3051 fet.setGeometry( param.mGeom );
3055 layer->setRenderer( renderer.release() );
3058 if ( layer->isValid() )
3060 highlightLayers.append( layer.release() );
3064 mTemporaryLayers.append( highlightLayers );
3065 return highlightLayers;
3068 void QgsRenderer::removeTemporaryLayers()
3070 qDeleteAll( mTemporaryLayers );
3071 mTemporaryLayers.clear();
3074 QPainter *QgsRenderer::layersRendering(
const QgsMapSettings &mapSettings, QImage &image )
const
3076 QPainter *painter =
nullptr;
3080#ifdef HAVE_SERVER_PYTHON_PLUGINS
3081 mContext.accessControl()->resolveFilterFeatures( mapSettings.
layers() );
3085 renderJob.render( mapSettings, &image );
3086 painter = renderJob.takePainter();
3088 if ( !renderJob.errors().isEmpty() )
3092 QString layerWMSName;
3099 QString errorMessage = QStringLiteral(
"Rendering error : '%1'" ).arg( e.
message );
3100 if ( ! layerWMSName.isEmpty() )
3102 errorMessage = QStringLiteral(
"Rendering error : '%1' in layer '%2'" ).arg( e.
message, layerWMSName );
3110 void QgsRenderer::setLayerOpacity(
QgsMapLayer *layer,
int opacity )
const
3112 if ( opacity >= 0 && opacity <= 255 )
3114 switch ( layer->
type() )
3116 case Qgis::LayerType::Vector:
3123 case Qgis::LayerType::Raster:
3127 rasterRenderer->
setOpacity( opacity / 255. );
3131 case Qgis::LayerType::VectorTile:
3138 case Qgis::LayerType::Mesh:
3139 case Qgis::LayerType::Plugin:
3140 case Qgis::LayerType::Annotation:
3141 case Qgis::LayerType::PointCloud:
3142 case Qgis::LayerType::Group:
3148 void QgsRenderer::setLayerFilter(
QgsMapLayer *layer,
const QList<QgsWmsParametersFilter> &filters )
3151 if ( layer->
type() == Qgis::LayerType::Vector )
3153 QgsVectorLayer *filteredLayer = qobject_cast<QgsVectorLayer *>( layer );
3154 QStringList expList;
3155 for (
const QgsWmsParametersFilter &filter : filters )
3160 QDomDocument filterXml;
3162 if ( !filterXml.setContent( filter.mFilter,
true, &errorMsg ) )
3165 QStringLiteral(
"Filter string rejected. Error message: %1. The XML string was: %2" ).arg( errorMsg, filter.mFilter ) );
3167 QDomElement filterElem = filterXml.firstChildElement();
3172 expList << filterExp->dump();
3178 if ( !testFilterStringSafety( filter.mFilter ) )
3180 throw QgsSecurityException( QStringLiteral(
"The filter string %1"
3181 " has been rejected because of security reasons."
3182 " Note: Text strings have to be enclosed in single or double quotes."
3183 " A space between each word / special character is mandatory."
3184 " Allowed Keywords and special characters are"
3185 " IS,NOT,NULL,AND,OR,IN,=,<,>=,>,>=,!=,',',(,),DMETAPHONE,SOUNDEX%2."
3186 " Not allowed are semicolons in the filter expression." ).arg(
3192 QString newSubsetString = filter.mFilter;
3195 newSubsetString.prepend(
") AND (" );
3196 newSubsetString.append(
")" );
3197 newSubsetString.prepend( filteredLayer->
subsetString() );
3198 newSubsetString.prepend(
"(" );
3202 QgsMessageLog::logMessage( QStringLiteral(
"Error setting subset string from filter for layer %1, filter: %2" ).arg( layer->
name(), newSubsetString ),
3203 QStringLiteral(
"Server" ),
3204 Qgis::MessageLevel::Warning );
3206 QStringLiteral(
"Filter not valid for layer %1: check the filter syntax and the field names." ).arg( layer->
name() ) );
3212 expList.append( dimensionFilter( filteredLayer ) );
3216 if ( expList.size() == 1 )
3220 else if ( expList.size() > 1 )
3222 exp = QStringLiteral(
"( %1 )" ).arg( expList.join( QLatin1String(
" ) AND ( " ) ) );
3224 if ( !exp.isEmpty() )
3226 std::unique_ptr<QgsExpression> expression(
new QgsExpression( exp ) );
3229 mFeatureFilter.
setFilter( filteredLayer, *expression );
3235 QStringList QgsRenderer::dimensionFilter(
QgsVectorLayer *layer )
const
3237 QStringList expList;
3240 const QList<QgsMapLayerServerProperties::WmsDimensionInfo> wmsDims = serverProperties->
wmsDimensions();
3241 if ( wmsDims.isEmpty() )
3256 if ( fieldIndex == -1 )
3261 int endFieldIndex = -1;
3262 if ( !dim.endFieldName.isEmpty() )
3264 endFieldIndex = layer->
fields().
indexOf( dim.endFieldName );
3265 if ( endFieldIndex == -1 )
3271 if ( !dimParamValues.contains( dim.name.toUpper() ) )
3281 defValue = dim.referenceValue;
3286 QSet<QVariant> uniqueValues = layer->
uniqueValues( fieldIndex );
3287 if ( endFieldIndex != -1 )
3289 uniqueValues.unite( layer->
uniqueValues( endFieldIndex ) );
3292 QList<QVariant> values = qgis::setToList( uniqueValues );
3293 std::sort( values.begin(), values.end() );
3296 defValue = values.first();
3300 defValue = values.last();
3304 if ( endFieldIndex == -1 )
3310 QStringList expElems;
3315 expList << expElems.join(
' ' );
3323 QString dimParamValue = dimParamValues[dim.name.toUpper()];
3325 QStringList dimExplist;
3327 QStringList dimValues = dimParamValue.split(
',' );
3328 for (
int i = 0; i < dimValues.size(); ++i )
3330 QString dimValue = dimValues[i];
3332 if ( dimValue.size() > 1 )
3334 dimValue = dimValue.trimmed();
3337 if ( dimValue.contains(
'/' ) )
3339 QStringList rangeValues = dimValue.split(
'/' );
3341 if ( rangeValues.size() != 2 )
3346 QVariant rangeMin = QVariant( rangeValues[0] );
3347 QVariant rangeMax = QVariant( rangeValues[1] );
3358 QStringList expElems;
3359 if ( endFieldIndex == -1 )
3379 << QStringLiteral(
")" );
3381 dimExplist << expElems.join(
' ' );
3385 QVariant dimVariant = QVariant( dimValue );
3391 if ( endFieldIndex == -1 )
3400 QStringList expElems;
3405 dimExplist << expElems.join(
' ' );
3410 if ( dimExplist.size() == 1 )
3412 expList << dimExplist;
3414 else if ( dimExplist.size() > 1 )
3416 expList << QStringLiteral(
"( %1 )" ).arg( dimExplist.join( QLatin1String(
" ) OR ( " ) ) );
3423 void QgsRenderer::setLayerSelection(
QgsMapLayer *layer,
const QStringList &fids )
const
3425 if ( !fids.empty() && layer->
type() == Qgis::LayerType::Vector )
3433 if ( selectedIds.empty() )
3444 void QgsRenderer::setLayerAccessControlFilter(
QgsMapLayer *layer )
const
3446#ifdef HAVE_SERVER_PYTHON_PLUGINS
3464 void QgsRenderer::annotationsRendering( QPainter *painter,
const QgsMapSettings &mapSettings )
const
3467 const QList< QgsAnnotation * > annotations = annotationManager->
annotations();
3473 if ( !annotation || !annotation->isVisible() )
3479 if ( annotation->hasFixedMapPosition() )
3481 QgsPointXY mapPos = annotation->mapPosition();
3482 if ( mapSettings.
destinationCrs() != annotation->mapPositionCrs() )
3487 mapPos = coordTransform.transform( mapPos );
3495 offsetX = devicePos.
x();
3496 offsetY = devicePos.
y();
3500 const QPointF relativePos = annotation->relativePosition();
3501 offsetX = mapSettings.
outputSize().width() * relativePos.x();
3502 offsetY = mapSettings.
outputSize().height() * relativePos.y();
3506 painter->translate( offsetX, offsetY );
3507 annotation->render( renderContext );
3512 QImage *QgsRenderer::scaleImage(
const QImage *image )
const
3517 QImage *scaledImage =
nullptr;
3518 const int width = mWmsParameters.
widthAsInt();
3520 if ( width != image->width() || height != image->height() )
3522 scaledImage =
new QImage( image->scaled( width, height, Qt::IgnoreAspectRatio, Qt::SmoothTransformation ) );
3528 void QgsRenderer::handlePrintErrors(
const QgsLayout *layout )
const
3534 QList< QgsLayoutItemMap * > mapList;
3537 QList< QgsLayoutItemMap * >::const_iterator mapIt = mapList.constBegin();
3538 for ( ; mapIt != mapList.constEnd(); ++mapIt )
3540 if ( !( *mapIt )->renderingErrors().isEmpty() )
3552 for (
auto layer : layers )
3565 setLayerOpacity( layer, param.
mOpacity );
3572 setLayerSld( layer, mContext.
sld( *layer ) );
3576 setLayerStyle( layer, mContext.
style( *layer ) );
3581 setLayerOpacity( layer, param.
mOpacity );
3586 setLayerFilter( layer, param.
mFilter );
3591 setLayerAccessControlFilter( layer );
3596 setLayerSelection( layer, param.
mSelection );
3601 updateExtent( layer, *settings );
3611 void QgsRenderer::setLayerStyle(
QgsMapLayer *layer,
const QString &style )
const
3613 if ( style.isEmpty() )
3622 QStringLiteral(
"Style '%1' does not exist for layer '%2'" ).arg( style, layer->
name() ) );
3626 void QgsRenderer::setLayerSld(
QgsMapLayer *layer,
const QDomElement &sld )
const
3631 QString sldStyleName =
"__sld_style";
3632 while ( styles.contains( sldStyleName ) )
3634 sldStyleName.append(
'@' );
3647 if ( !mWmsParameters.
bbox().isEmpty() )
3651 std::unique_ptr<QImage> tmp( createImage( mContext.
mapSize(
false ) ) );
3652 configureMapSettings( tmp.get(), mapSettings );
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'...
@ Antialiasing
Use antialiasing while drawing.
@ RenderBlocking
Render and load remote sources in the same thread to ensure rendering remote sources (svg and images)...
RasterIdentifyFormat
Raster identify formats.
@ AllowOverlapIfRequired
Avoids overlapping labels when possible, but permit overlaps if labels for features cannot otherwise ...
@ RenderMapTile
Draw map such that there are no problems between adjacent tiles.
@ 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 SIP_HOLDGIL
Returns the WKB type of the geometry.
Manages storage of a set of QgsAnnotation annotation objects.
QList< QgsAnnotation * > annotations() const
Returns a list of all annotations contained in the manager.
Abstract base class for annotation items which are drawn over a map.
static QgsFieldFormatterRegistry * fieldFormatterRegistry()
Gets the registry of available field formatters.
This is a container for attribute editors, used to group them visually in the attribute form if it is...
QList< QgsAttributeEditorElement * > children() const
Gets a list of the children elements of this container.
This is an abstract base class for any elements of a drag and drop form.
QString name() const
Returns the name of this element.
@ AeTypeContainer
A container.
This element will load a field's widget onto the form.
Exception thrown in case of malformed request.
This class represents a coordinate reference system (CRS).
static QgsCoordinateReferenceSystem fromOgcWmsCrs(const QString &ogcCrs)
Creates a CRS from a given OGC WMS-format Coordinate Reference System string.
bool isValid() const
Returns whether this CRS is correctly initialized and usable.
Q_GADGET Qgis::DistanceUnit mapUnits
bool hasAxisInverted() const
Returns whether axis is inverted (e.g., for WMS 1.3) for the CRS.
Custom exception class for Coordinate Reference System related exceptions.
A server filter to apply a dimension filter to a request.
Defines a QGIS exception class.
static QgsExpressionContextScope * projectScope(const QgsProject *project)
Creates a new scope which contains variables and functions relating to a QGIS project.
static QgsExpressionContextScope * mapSettingsScope(const QgsMapSettings &mapSettings)
Creates a new scope which contains variables and functions relating to a QgsMapSettings object.
static QgsExpressionContextScope * layerScope(const QgsMapLayer *layer)
Creates a new scope which contains variables and functions relating to a QgsMapLayer.
static QgsExpressionContextScope * globalScope()
Creates a new scope which contains variables and functions relating to the global QGIS context.
Expression contexts are used to encapsulate the parameters around which a QgsExpression should be eva...
void appendScope(QgsExpressionContextScope *scope)
Appends a scope to the end of the context.
void setFeature(const QgsFeature &feature)
Convenience function for setting a feature for the context.
Class for parsing and evaluation of expressions (formerly called "search strings").
QString expression() const
Returns the original, unmodified expression string.
static QString quotedValue(const QVariant &value)
Returns a string representation of a literal value, including appropriate quotations where required.
static QString createFieldEqualityExpression(const QString &fieldName, const QVariant &value, QVariant::Type fieldType=QVariant::Type::Invalid)
Create an expression allowing to evaluate if a field is equal to a value.
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 quotedColumnRef(QString name)
Returns a quoted column reference (in double quotes)
A filter filter provider grouping several filter providers.
QgsFeatureFilterProviderGroup & addProvider(const QgsFeatureFilterProvider *provider)
Add another filter provider to the group.
void setFilter(const QgsVectorLayer *layer, const QgsExpression &expression)
Set a filter for the given layer.
void filterFeatures(const QgsVectorLayer *layer, QgsFeatureRequest &filterFeatures) const override
Filter the features of the layer.
Wrapper for iterator of features from vector data provider or vector layer.
bool nextFeature(QgsFeature &f)
@ MoreSymbolsPerFeature
May use more than one symbol to render a feature: symbolsForFeature() will return them.
static QgsFeatureRenderer * loadSld(const QDomNode &node, Qgis::GeometryType geomType, QString &errorMessage)
Create a new renderer according to the information contained in the UserStyle element of a SLD style ...
virtual QgsFeatureRenderer * clone() const =0
Create a deep copy of this renderer.
This class wraps a request for features to a vector layer (or directly its vector data provider).
QgsFeatureRequest & setFlags(QgsFeatureRequest::Flags flags)
Sets flags that affect how features will be fetched.
Flags 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.
@ ExactIntersect
Use exact geometry intersection (slower) instead of bounding boxes.
@ NoGeometry
Geometry is not required. It may still be returned if e.g. required for a filter condition.
QgsCoordinateTransformContext transformContext() const
Returns the transform context, for use when a destinationCrs() has been set and reprojection is requi...
const QgsFeatureIds & filterFids() const
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...
bool setAttribute(int field, const QVariant &attr)
Sets an attribute's value by field index.
void initAttributes(int fieldCount)
Initialize this feature with the given number of fields.
void setFields(const QgsFields &fields, bool initAttributes=false)
Assigns a field map with the feature to allow attribute access by attribute name.
QVariant attribute(const QString &name) const
Lookup attribute value by attribute name.
void setGeometry(const QgsGeometry &geometry)
Set the feature's geometry.
Encapsulate a field in an attribute table or data source.
bool convertCompatible(QVariant &v, QString *errorMessage=nullptr) const
Converts the provided variant to a compatible format.
ConfigurationFlags configurationFlags
@ HideFromWms
Field is not available if layer is served as WMS from QGIS server.
Container of fields for a vector layer.
bool append(const QgsField &field, FieldOrigin origin=OriginProvider, int originIndex=-1)
Appends a field. The field must have unique name, otherwise it is rejected (returns false)
int indexFromName(const QString &fieldName) const
Gets the field index from the field name.
int indexOf(const QString &fieldName) const
Gets the field index from the field name.
int count() const
Returns number of items.
QgsField at(int i) const
Returns the field at particular index (must be in range 0..N-1).
A geometry is the spatial representation of a feature.
const QgsAbstractGeometry * constGet() const SIP_HOLDGIL
Returns a non-modifiable (const) reference to the underlying abstract geometry primitive.
QgsGeometry pointOnSurface() const
Returns a point guaranteed to lie on the surface of a geometry.
Qgis::GeometryOperationResult transform(const QgsCoordinateTransform &ct, Qgis::TransformDirection direction=Qgis::TransformDirection::Forward, bool transformZ=false) SIP_THROW(QgsCsException)
Transforms this geometry as described by the coordinate transform ct.
QgsPointXY asPoint() const
Returns the contents of the geometry as a 2-dimensional point.
void set(QgsAbstractGeometry *geometry)
Sets the underlying geometry store.
static QgsGeometry fromWkt(const QString &wkt)
Creates a new geometry from a WKT string.
QgsRectangle boundingBox() const
Returns the bounding box of the geometry.
QString asWkt(int precision=17) const
Exports the geometry to WKT.
Handles exporting QgsFeature features to GeoJSON features.
void setPlacementFlags(QgsLabeling::LinePlacementFlags flags)
Returns the line placement flags, which dictate how line labels can be placed above or below the line...
void setOverlapHandling(Qgis::LabelOverlapHandling handling)
Sets the technique used to handle overlapping labels.
void setAllowDegradedPlacement(bool allow)
Sets whether labels can be placed in inferior fallback positions if they cannot otherwise be placed.
QStringList findLayerIds() const
Find layer IDs used in all layer nodes.
QgsLayerTreeLayer * findLayer(QgsMapLayer *layer) const
Find layer node representing the map layer.
void removeChildrenGroupWithoutLayers()
Remove all child group nodes without layers.
Layer tree node points to a map layer.
QgsMapLayer * layer() const
Returns the map layer associated with this node.
The QgsLegendRendererItem class is abstract interface for legend items returned from QgsMapLayerLegen...
virtual QSizeF drawSymbol(const QgsLegendSettings &settings, ItemContext *ctx, double itemHeight) const
Draws symbol on the left side of the item.
The QgsLayerTreeModel class is model implementation for Qt item views framework.
QgsLayerTree * rootGroup() const
Returns pointer to the root node of the layer tree. Always a non nullptr value.
QgsLayerTreeNode * parent()
Gets pointer to the parent. If parent is nullptr, the node is a root node.
Namespace with helper functions for layer tree operations.
Class used to render QgsLayout as an atlas, by iterating over the features from an associated vector ...
bool beginRender() override
Called when rendering begins, before iteration commences.
bool setFilterExpression(const QString &expression, QString &errorString)
Sets the expression used for filtering features in the coverage layer.
QgsLayout * layout() override
Returns the layout associated with the iterator.
bool enabled() const
Returns whether the atlas generation is enabled.
int count() const override
Returns the number of features to iterate over.
void setFilterFeatures(bool filtered)
Sets whether features should be filtered in the coverage layer.
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.
A layout item subclass for text labels.
A layout item subclass for map legends.
Layout graphical items for displaying a map.
double scale() const
Returns the map scale.
QList< QgsMapLayer * > layers() const
Returns the stored layer set.
QString id() const
Returns the item's ID name.
Manages storage of a set of layouts.
QgsMasterLayoutInterface * layoutByName(const QString &name) const
Returns the layout with a matching name, or nullptr if no matching layouts were found.
This class provides a method of storing measurements for use in QGIS layouts using a variety of diffe...
double length() const
Returns the length of the measurement.
int pageCount() const
Returns the number of pages in the collection.
Stores information relating to the current rendering settings for a layout.
void setFeatureFilterProvider(QgsFeatureFilterProvider *featureFilterProvider)
Sets feature filter provider to featureFilterProvider.
@ FlagDrawSelection
Draw selection.
This class provides a method of storing sizes, consisting of a width and height, for use in QGIS layo...
double height() const
Returns the height of the size.
double width() const
Returns the width of the size.
static QVector< double > predefinedScales(const QgsLayout *layout)
Returns a list of predefined scales associated with a layout.
Base class for layouts, which can contain items such as maps, labels, scalebars, etc.
QgsLayoutPageCollection * pageCollection()
Returns a pointer to the layout's page collection, which stores and manages page items in the layout.
void layoutItems(QList< T * > &itemList) const
Returns a list of layout items of a specific type.
Item model implementation based on layer tree model for layout legend.
The QgsLegendRenderer class handles automatic layout and rendering of legend.
QSizeF minimumSize(QgsRenderContext *renderContext=nullptr)
Runs the layout algorithm and returns the minimum size required for the legend.
QJsonObject exportLegendToJson(const QgsRenderContext &context)
Renders the legend in a json object.
Q_DECL_DEPRECATED void drawLegend(QPainter *painter)
Draws the legend with given painter.
The QgsLegendSettings class stores the appearance and layout settings for legend drawing with QgsLege...
Q_DECL_DEPRECATED void setMapScale(double scale)
Sets the legend map scale.
Q_DECL_DEPRECATED void setMapUnitsPerPixel(double mapUnitsPerPixel)
Sets the mmPerMapUnit calculated by mapUnitsPerPixel mostly taken from the map settings.
Q_DECL_DEPRECATED double mmPerMapUnit() const
Q_DECL_DEPRECATED double mapScale() const
Returns the legend map scale.
Manages QGIS Server properties for a map layer.
QStringList styles() const
Returns list of all defined style names.
bool setCurrentStyle(const QString &name)
Set a different style as the current style - will apply it to the layer.
bool addStyleFromLayer(const QString &name)
Add style by cloning the current one.
Base class for all map layer types.
bool isInScaleRange(double scale) const
Tests whether the layer should be visible at the specified scale.
virtual QgsRectangle extent() const
Returns the extent of the layer.
Q_INVOKABLE QVariant customProperty(const QString &value, const QVariant &defaultValue=QVariant()) const
Read a custom property from layer.
QgsCoordinateReferenceSystem crs
QgsMapLayerServerProperties * serverProperties()
Returns QGIS Server Properties for the map layer.
virtual void setOpacity(double opacity)
Sets the opacity for the layer, where opacity is a value between 0 (totally transparent) and 1....
Q_INVOKABLE void setCustomProperty(const QString &key, const QVariant &value)
Set a custom property for layer.
bool hasScaleBasedVisibility() const
Returns whether scale based visibility is enabled for the layer.
@ Identifiable
If the layer is identifiable using the identify map tool and as a WMS layer.
virtual bool readSld(const QDomNode &node, QString &errorMessage)
QgsMapLayerStyleManager * styleManager() const
Gets access to the layer's style manager.
virtual Q_INVOKABLE QgsDataProvider * dataProvider()
Returns the layer's data provider, it may be nullptr.
The QgsMapSettings class contains configuration for rendering of the map.
QgsPointXY layerToMapCoordinates(const QgsMapLayer *layer, QgsPointXY point) const
transform point coordinates from layer's CRS to output CRS
QList< QgsMapLayer * > layers(bool expandGroupLayers=false) const
Returns the list of layers which will be rendered in the map.
void setSelectionColor(const QColor &color)
Sets the color that is used for drawing of selected vector features.
void setLayers(const QList< QgsMapLayer * > &layers)
Sets the list of layers to render in the map.
double scale() const
Returns the calculated map scale.
QgsCoordinateTransform layerTransform(const QgsMapLayer *layer) const
Returns the coordinate transform from layer's CRS to destination CRS.
QgsRectangle layerExtentToOutputExtent(const QgsMapLayer *layer, QgsRectangle extent) const
transform bounding box from layer's CRS to output CRS
QStringList layerIds(bool expandGroupLayers=false) const
Returns the list of layer IDs which will be rendered in the map.
void setOutputDpi(double dpi)
Sets the dpi (dots per inch) used for conversion between real world units (e.g.
const QgsMapToPixel & mapToPixel() const
double mapUnitsPerPixel() const
Returns the distance in geographical coordinates that equals to one pixel in the map.
QSize outputSize() const
Returns the size of the resulting map image, in pixels.
QgsRectangle extent() const
Returns geographical coordinates of the rectangle that should be rendered.
void setExtent(const QgsRectangle &rect, bool magnified=true)
Sets the coordinates of the rectangle which should be rendered.
void setExpressionContext(const QgsExpressionContext &context)
Sets the expression context.
QColor selectionColor() const
Returns the color that is used for drawing of selected vector features.
void setExtentBuffer(double buffer)
Sets the buffer in map units to use around the visible extent for rendering symbols whose correspondi...
void setLabelingEngineSettings(const QgsLabelingEngineSettings &settings)
Sets the global configuration of the labeling engine.
void setOutputSize(QSize size)
Sets the size of the resulting map image, in pixels.
QgsPointXY mapToLayerCoordinates(const QgsMapLayer *layer, QgsPointXY point) const
transform point coordinates from output CRS to layer's CRS
void setBackgroundColor(const QColor &color)
Sets the background color of the map.
QgsCoordinateReferenceSystem destinationCrs() const
Returns the destination coordinate reference system for the map render.
void setFlag(Qgis::MapSettingsFlag flag, bool on=true)
Enable or disable a particular flag (other flags are not affected)
void setDestinationCrs(const QgsCoordinateReferenceSystem &crs)
Sets the destination crs (coordinate reference system) for the map render.
QgsCoordinateTransformContext transformContext() const
Returns the coordinate transform context, which stores various information regarding which datum tran...
QList< QgsMapThemeCollection::MapThemeLayerRecord > layerRecords() const
Returns a list of records for all visible layer belonging to the theme.
QgsMapThemeCollection::MapThemeRecord mapThemeState(const QString &name) const
Returns the recorded state of a map theme.
Perform transforms between map coordinates and device coordinates.
double mapUnitsPerPixel() const
Returns the current map units per pixel.
QgsPointXY transform(const QgsPointXY &p) const
Transforms a point p from map (world) coordinates to device coordinates.
static void logMessage(const QString &message, const QString &tag=QString(), Qgis::MessageLevel level=Qgis::MessageLevel::Warning, bool notifyUser=true)
Adds a message to the log instance (and creates it if necessary).
static void applyAccessControlLayerFilters(const QgsAccessControl *accessControl, QgsMapLayer *mapLayer, QHash< QgsMapLayer *, QString > &originalLayerFilters)
Apply filter from AccessControl.
static QDomElement geometryToGML(const QgsGeometry &geometry, QDomDocument &doc, QgsOgcUtils::GMLVersion gmlVersion, const QString &srsName, bool invertAxisOrientation, const QString &gmlIdBase, int precision=17)
Exports the geometry to GML.
static QDomElement rectangleToGMLEnvelope(QgsRectangle *env, QDomDocument &doc, int precision=17)
Exports the rectangle to GML3 Envelope.
static QgsExpression * expressionFromOgcFilter(const QDomElement &element, QgsVectorLayer *layer=nullptr)
Parse XML with OGC filter into QGIS expression.
static QDomElement rectangleToGMLBox(QgsRectangle *box, QDomDocument &doc, int precision=17)
Exports the rectangle to GML2 Box.
Contains settings for how a map layer will be labeled.
const QgsLabelPlacementSettings & placementSettings() const
Returns the label placement settings.
void setFormat(const QgsTextFormat &format)
Sets the label text formatting settings, e.g., font settings, buffer settings, etc.
Qgis::LabelPlacement placement
Label placement mode.
QgsPropertyCollection & dataDefinedProperties()
Returns a reference to the label's property collection, used for data defined overrides.
int priority
Label priority.
Property
Data definable properties.
@ LabelRotation
Label rotation.
@ PositionY
Y-coordinate data defined label position.
@ PositionX
X-coordinate data defined label position.
@ Hali
Horizontal alignment for data defined label position (Left, Center, Right)
@ Vali
Vertical alignment for data defined label position (Bottom, Base, Half, Cap, Top)
const QgsLabelLineSettings & lineSettings() const
Returns the label line settings, which contain settings related to how the label engine places and fo...
double dist
Distance from feature to the label.
QString fieldName
Name of field (or an expression) to use for label text.
A class to represent a 2D point.
void setX(double x) SIP_HOLDGIL
Sets the x value of the point.
void setY(double y) SIP_HOLDGIL
Sets the y value of the point.
Print layout, a QgsLayout subclass for static or atlas-based layouts.
QgsPrintLayout * clone() const override
Creates a clone of the layout.
A class to describe the version of a project.
static QgsProject * instance()
Returns the QgsProject singleton instance.
Q_INVOKABLE QgsMapLayer * mapLayer(const QString &layerId) const
Retrieve a pointer to a registered layer by layer ID.
QgsExpressionContext createExpressionContext() const override
This method needs to be reimplemented in all classes which implement this interface and return an exp...
QgsMapThemeCollection * mapThemeCollection
QgsAnnotationManager * annotationManager()
Returns pointer to the project's annotation manager.
QgsCoordinateTransformContext transformContext
const QgsLayoutManager * layoutManager() const
Returns the project's layout manager, which manages print layouts, atlases and reports within the pro...
const QgsLabelingEngineSettings & labelingEngineSettings() const
Returns project's global labeling engine settings.
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.
@ IdentifyValue
Numerical values.
@ IdentifyFeature
WMS GML -> feature.
virtual int capabilities() const
Returns a bitmask containing the supported capabilities.
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.
double yMaximum() const SIP_HOLDGIL
Returns the y maximum value (top side of rectangle).
double xMaximum() const SIP_HOLDGIL
Returns the x maximum value (right side of rectangle).
double xMinimum() const SIP_HOLDGIL
Returns the x minimum value (left side of rectangle).
double yMinimum() const SIP_HOLDGIL
Returns the y minimum value (bottom side of rectangle).
double height() const SIP_HOLDGIL
Returns the height of the rectangle.
double width() const SIP_HOLDGIL
Returns the width of the rectangle.
void combineExtentWith(const QgsRectangle &rect)
Expands the rectangle so that it covers both the original rectangle and the given rectangle.
bool isEmpty() const
Returns true if the rectangle is empty.
void invert()
Swap x/y coordinates in the rectangle.
bool contains(const QgsRectangle &rect) const SIP_HOLDGIL
Returns true when rectangle contains other rectangle.
Contains information about the context of a rendering operation.
double scaleFactor() const
Returns the scaling factor for the render to convert painter units to physical sizes.
void setCoordinateTransform(const QgsCoordinateTransform &t)
Sets the current coordinate transform for the context.
QgsExpressionContext & expressionContext()
Gets the expression context.
const QgsRectangle & extent() const
When rendering a map layer, calling this method returns the "clipping" extent for the layer (in the l...
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...
static QgsRenderContext fromMapSettings(const QgsMapSettings &mapSettings)
create initialized QgsRenderContext instance from given QgsMapSettings
static QgsRenderContext fromQPainter(QPainter *painter)
Creates a default render context given a pixel based QPainter destination.
void setRendererScale(double scale)
Sets the renderer map scale.
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) SIP_THROW(QgsServerApiBadRequestException)
Parses a datetime interval and returns a QgsDateTimeRange.
Exception base class for server exceptions.
int maxThreads() const
Returns the maximum number of threads to use.
QStringList allowedExtraSqlTokens() const
Returns the list of strings that represent the allowed extra SQL tokens accepted as components of a f...
bool parallelRendering() const
Returns parallel rendering setting.
const QList< QgsServerWmsDimensionProperties::WmsDimensionInfo > wmsDimensions() const
Returns the QGIS Server WMS Dimension list.
static QString symbolProperties(QgsSymbol *symbol)
Returns a string representing the symbol.
Abstract base class for all rendered symbols.
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)
Returns true if the specified variant should be considered a NULL value.
This is the base class for vector data providers.
virtual QgsAttributeList pkAttributeIndexes() const
Returns list of indexes of fields that make up the primary key.
Basic implementation of the labeling interface.
Represents a vector layer which manages a vector based data sets.
QString attributeDisplayName(int index) const
Convenience function that returns the attribute alias if defined or the field name else.
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.
QgsFields fields() const FINAL
Returns the list of fields of this layer.
Q_INVOKABLE void selectByExpression(const QString &expression, Qgis::SelectBehavior behavior=Qgis::SelectBehavior::SetSelection, QgsExpressionContext *context=nullptr)
Selects matching features using an expression.
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.
QgsVectorDataProvider * dataProvider() FINAL
Returns the layer's data provider, it may be nullptr.
QgsEditorWidgetSetup editorWidgetSetup(int index) const
The editor widget setup defines which QgsFieldFormatter and editor widget will be used for the field ...
QgsFeature getFeature(QgsFeatureId fid) const
Queries the layer for the feature with the given id.
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
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) SIP_HOLDGIL
Returns a non-translated display string type for a WKB type, e.g., the geometry name used in WKT geom...
static bool isCurvedType(Qgis::WkbType type) SIP_HOLDGIL
Returns true if the WKB type is a curved type or can contain curved geometries.
static Qgis::WkbType flatType(Qgis::WkbType type) SIP_HOLDGIL
Returns the flat type for a WKB type.
Exception thrown in case of malformed request.
QgsRenderer(const QgsWmsRenderContext &context)
Constructor for QgsRenderer.
QHash< QgsVectorLayer *, SymbolSet > HitTest
QByteArray getPrint()
Returns printed page as binary.
HitTest symbols()
Returns the hit test according to the current context.
std::unique_ptr< QgsDxfExport > getDxf()
Returns the map as DXF data.
QSet< QString > SymbolSet
void configureLayers(QList< QgsMapLayer * > &layers, QgsMapSettings *settings=nullptr)
Configures layers for rendering optionally considering the map settings.
QJsonObject getLegendGraphicsAsJson(QgsLayerTreeModel &model)
Returns the map legend as a JSON object.
QByteArray getFeatureInfo(const QString &version="1.3.0")
Creates an xml document that describes the result of the getFeatureInfo request.
QImage * getLegendGraphics(QgsLayerTreeModel &model)
Returns the map legend as an image (or nullptr in case of error).
QImage * getMap()
Returns the map as an image (or nullptr in case of error).
~QgsRenderer()
Destructor for QgsRenderer.
Exception class for WMS service exceptions.
ExceptionCode
Exception codes as defined in OGC scpecifications for WMS 1.1.1 and WMS 1.3.0.
@ QGIS_InvalidParameterValue
@ QGIS_MissingParameterValue
WMS parameter received from the client.
double dxfScale() const
Returns the DXF SCALE parameter.
bool transparentAsBool() const
Returns TRANSPARENT parameter as a bool or its default value if not defined.
QString x() const
Returns X parameter or an empty string if not defined.
QMap< DxfFormatOption, QString > dxfFormatOptions() const
Returns a map of DXF options defined within FORMAT_OPTIONS parameter.
QString formatAsString() const
Returns FORMAT parameter as a string.
QgsProjectVersion versionAsNumber() const
Returns VERSION parameter if defined or its default value.
QgsWmsParametersComposerMap composerMapParameters(int mapId) const
Returns the requested parameters for a composer map parameter.
QgsRectangle bboxAsRectangle() const
Returns BBOX as a rectangle if defined and valid.
bool withGeometry() const
Returns if the client wants the feature info response with geometry information.
QString pointTolerance() const
Returns FI_POINT_TOLERANCE parameter or an empty string if not defined.
QString filterGeom() const
Returns the filter geometry found in FILTER_GEOM parameter.
QString composerTemplate() const
Returns TEMPLATE parameter or an empty string if not defined.
Format infoFormat() const
Returns infoFormat.
QString y() const
Returns Y parameter or an empty string if not defined.
void dump() const
Dumps parameters.
int pointToleranceAsInt() const
Returns FI_POINT_TOLERANCE parameter as an integer.
bool withMapTip() const
withMapTip
QString polygonTolerance() const
Returns FI_POLYGON_TOLERANCE parameter or an empty string if not defined.
QString i() const
Returns I parameter or an empty string if not defined.
int lineToleranceAsInt() const
Returns FI_LINE_TOLERANCE parameter as an integer.
QString lineTolerance() const
Returns FI_LINE_TOLERANCE parameter or an empty string if not defined.
QString j() const
Returns J parameter or an empty string if not defined.
int xAsInt() const
Returns X parameter as an int or its default value if not defined.
QString bbox() const
Returns BBOX if defined or an empty string.
int heightAsInt() const
Returns HEIGHT parameter as an int or its default value if not defined.
QColor backgroundColorAsColor() const
Returns BGCOLOR parameter as a QColor or its default value if not defined.
Format format() const
Returns format.
QStringList atlasPk() const
Returns the ATLAS_PK parameter.
QList< QgsWmsParametersHighlightLayer > highlightLayersParameters() const
Returns parameters for each highlight layer.
int iAsInt() const
Returns I parameter as an int or its default value if not defined.
int polygonToleranceAsInt() const
Returns FI_POLYGON_TOLERANCE parameter as an integer.
QgsDxfExport::SymbologyExport dxfMode() const
Returns the DXF MODE parameter.
int widthAsInt() const
Returns WIDTH parameter as an int or its default value if not defined.
QString sldBody() const
Returns SLD_body if defined or an empty string.
QString layoutParameter(const QString &id, bool &ok) const
Returns a layout parameter thanks to its id.
bool dxfUseLayerTitleAsName() const
Returns the DXF USE_TITLE_AS_LAYERNAME parameter.
QMap< QString, QString > dimensionValues() const
Returns the dimensions parameter.
int infoFormatVersion() const
Returns the infoFormat version for GML.
QgsLegendSettings legendSettings() const
Returns legend settings.
QStringList dxfLayerAttributes() const
Returns the DXF LAYERATTRIBUTES parameter.
QString height() const
Returns HEIGHT parameter or an empty string if not defined.
QString crs() const
Returns CRS or an empty string if none is defined.
int featureCountAsInt() const
Returns FEATURE_COUNT as an integer.
int yAsInt() const
Returns Y parameter as an int or its default value if not defined.
Format
Output format for the response.
QString width() const
Returns WIDTH parameter or an empty string if not defined.
QStringList filters() const
Returns the list of filters found in FILTER parameter.
QString dpi() const
Returns DPI parameter or an empty string if not defined.
int jAsInt() const
Returns J parameter as an int or its default value if not defined.
QStringList queryLayersNickname() const
Returns nickname of layers found in QUERY_LAYERS parameter.
Rendering context for the WMS renderer.
QSize mapSize(bool aspectRatio=true) const
Returns the size (in pixels) of the map to render, according to width and height WMS parameters as we...
bool isExternalLayer(const QString &name) const
Returns true if the layer is an external layer, false otherwise.
bool isValidGroup(const QString &name) const
Returns true if name is a group.
QStringList flattenedQueryLayers(const QStringList &layerNames) const
Returns a list of query layer names where group names are replaced by the names of their layer compon...
QList< QgsMapLayer * > layersToRender() const
Returns a list of all layers to actually render according to the current configuration.
QgsMapLayer * layer(const QString &nickname) const
Returns the layer corresponding to the nickname, or a nullptr if not found or if the layer do not nee...
bool updateExtent() const
Returns true if the extent has to be updated before the rendering, false otherwise.
const QgsServerSettings & settings() const
Returns settings of the server.
bool isValidWidthHeight() const
Returns true if width and height are valid according to the maximum values defined within the project...
QList< QgsMapLayer * > layersFromGroup(const QString &nickname) const
Returns the group's layers list corresponding to the nickname, or an empty list if not found.
QgsWmsParameters parameters() const
Returns WMS parameters.
void setScaleDenominator(double scaleDenominator)
Sets a custom scale denominator.
QString style(const QgsMapLayer &layer) const
Returns a style's name for a specific layer.
QMap< QString, QList< QgsMapLayer * > > layerGroups() const
Returns a map having layer group names as keys and a list of layers as values.
double mapTileBuffer(int mapWidth) const
Returns the tile buffer in geographical units for the given map width in pixels.
QString layerNickname(const QgsMapLayer &layer) const
Returns the nickname (short name, id or name) of the layer according to the current configuration.
qreal dotsPerMm() const
Returns default dots per mm according to the current configuration.
bool testFlag(Flag flag) const
Returns the status of a rendering flag.
QDomElement sld(const QgsMapLayer &layer) const
Returns a SLD document for a specific layer.
bool isValidLayer(const QString &nickname) const
Returns true if the layer has to be rendered, false otherwise.
const QgsProject * project() const
Returns the project.
int precision() const
Returns the precision to use according to the current configuration.
bool renderMapTiles() const
Returns true if WMS requests should use the QgsMapSettings::RenderMapTile flag, so that no visible ar...
RAII class to restore the rendering context configuration on destruction.
SERVER_EXPORT QString getExpressionFromServerFid(const QString &serverFid, const QgsVectorDataProvider *provider)
Returns the expression feature id based on primary keys.
SERVER_EXPORT QgsFeatureRequest updateFeatureRequestFromServerFids(QgsFeatureRequest &featureRequest, const QStringList &serverFids, const QgsVectorDataProvider *provider)
Returns the feature request based on feature ids build with primary keys.
SERVER_EXPORT QString getServerFid(const QgsFeature &feature, const QgsAttributeList &pkAttributes)
Returns the feature id based on primary keys.
SERVER_EXPORT QString wmsFeatureInfoSchema(const QgsProject &project)
Returns the schema URL for XML GetFeatureInfo request.
SERVER_EXPORT bool wmsInfoFormatSia2045(const QgsProject &project)
Returns if the info format is SIA20145.
SERVER_EXPORT QString wmsFeatureInfoDocumentElementNs(const QgsProject &project)
Returns the document element namespace for XML GetFeatureInfo request.
SERVER_EXPORT QStringList wmsRestrictedComposers(const QgsProject &project)
Returns the restricted composer list.
SERVER_EXPORT bool wmsFeatureInfoSegmentizeWktGeometry(const QgsProject &project)
Returns if the geometry has to be segmentize in GetFeatureInfo request.
SERVER_EXPORT bool wmsFeatureInfoUseAttributeFormSettings(const QgsProject &project)
Returns if feature form settings should be considered for the format of the feature info response.
SERVER_EXPORT QHash< QString, QString > wmsFeatureInfoLayerAliasMap(const QgsProject &project)
Returns the mapping between layer name and wms layer name for GetFeatureInfo request.
SERVER_EXPORT bool wmsFeatureInfoAddWktGeometry(const QgsProject &project)
Returns if the geometry is displayed as Well Known Text in GetFeatureInfo request.
SERVER_EXPORT double wmsDefaultMapUnitsPerMm(const QgsProject &project)
Returns the default number of map units per millimeters in case of the scale is not given.
SERVER_EXPORT QString wmsFeatureInfoDocumentElement(const QgsProject &project)
Returns the document element name for XML GetFeatureInfo request.
SERVER_EXPORT int wmsMaxAtlasFeatures(const QgsProject &project)
Returns the maximum number of atlas features which can be printed in a request.
Median cut implementation.
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)
const QgsCoordinateReferenceSystem & outputCrs
const QgsCoordinateReferenceSystem & crs
Layers and optional attribute index to split into multiple layers using attribute value as layer name...
QPainter * painter
Painter.
Contains settings relating to exporting layouts to raster images.
QList< int > pages
List of specific pages to export, or an empty list to export all pages.
QSize imageSize
Manual size in pixels for output image.
QgsLayoutRenderContext::Flags flags
Layout context flags, which control how the export will be created.
double dpi
Resolution to export layout at. If dpi <= 0 the default layout dpi will be used.
QVector< qreal > predefinedMapScales
A list of predefined scales to use with the layout.
Contains settings relating to exporting layouts to PDF.
bool rasterizeWholeImage
Set to true to force whole layout to be rasterized while exporting.
QgsLayoutRenderContext::Flags flags
Layout context flags, which control how the export will be created.
double dpi
Resolution to export layout at. If dpi <= 0 the default layout dpi will be used.
QVector< qreal > predefinedMapScales
A list of predefined scales to use with the layout.
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.
@ MinValue
Add selection to current selection.
@ MaxValue
Modify current selection to include only select features which match.
@ AllValues
Display all values of the dimension.
@ ReferenceValue
Remove from current selection.
Setting options for loading vector layers.
QList< QgsWmsParametersLayer > mLayers
QList< QgsWmsParametersHighlightLayer > mHighlightLayers
QList< QgsWmsParametersFilter > mFilter