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