75 #include <QStringList>
76 #include <QTemporaryFile>
79 #include <nlohmann/json.hpp>
104 : mContext( context )
109 mWmsParameters.
dump();
114 removeTemporaryLayers();
120 std::unique_ptr<QgsWmsRestorer> restorer;
132 std::unique_ptr<QImage> image;
135 const QSize size(
static_cast<int>( minSize.width() * dpmm ),
static_cast<int>( minSize.height() * dpmm ) );
140 image.reset( createImage( size ) );
143 QPainter painter( image.get() );
157 return image.release();
163 std::unique_ptr<QgsWmsRestorer> restorer;
177 std::unique_ptr<QImage> image( createImage( size ) );
181 std::unique_ptr<QPainter> painter;
182 painter.reset(
new QPainter( image.get() ) );
183 painter->setRenderHint( QPainter::Antialiasing,
true );
184 painter->scale( dpmm, dpmm );
190 nodeModel.
drawSymbol( settings, &ctx, size.height() / dpmm );
193 return image.release();
199 std::unique_ptr<QgsWmsRestorer> restorer;
215 void QgsRenderer::runHitTest(
const QgsMapSettings &mapSettings, HitTest &hitTest )
const
219 for (
const QString &
id : mapSettings.
layerIds() )
236 runHitTestLayer( vl, usedSymbols, context );
242 std::unique_ptr< QgsFeatureRenderer > r( vl->
renderer()->
clone() );
244 r->startRender( context, vl->
fields() );
252 if ( moreSymbolsPerFeature )
254 for (
QgsSymbol *s : r->originalSymbolsForFeature( f, context ) )
260 r->stopRender( context );
269 QStringLiteral(
"The requested map size is too large" ) );
273 std::unique_ptr<QgsWmsRestorer> restorer;
283 std::unique_ptr<QPainter> painter;
284 std::unique_ptr<QImage> image( createImage( mContext.
mapSize() ) );
287 configureMapSettings( image.get(), mapSettings );
294 runHitTest( mapSettings,
symbols );
302 std::unique_ptr<QgsWmsRestorer> restorer;
307 if ( templateName.isEmpty() )
331 QStringLiteral(
"The template has no pages" ) );
334 std::unique_ptr<QgsPrintLayout> layout( sourceLayout->
clone() );
338 QStringList atlasPk = mWmsParameters.
atlasPk();
339 if ( !atlasPk.isEmpty() )
341 atlas = layout->atlas();
342 if ( !atlas || !atlas->
enabled() )
346 QStringLiteral(
"The template has no atlas enabled" ) );
353 QStringLiteral(
"The atlas has no coverage layer" ) );
357 if ( atlasPk.size() == 1 && atlasPk.at( 0 ) == QLatin1String(
"*" ) )
361 if ( atlas->
count() > maxAtlasFeatures )
364 QString(
"The project configuration allows printing maximum %1 atlas features at a time" ).arg( maxAtlasFeatures ) );
370 if ( pkIndexes.size() == 0 )
372 QgsDebugMsgLevel( QStringLiteral(
"Atlas print: layer %1 has no primary key attributes" ).arg( cLayer->
name() ), 2 );
376 const int pkIndexesSize {std::max( pkIndexes.size(), 1 )};
378 QStringList pkAttributeNames;
379 for (
int pkIndex : std::as_const( pkIndexes ) )
381 pkAttributeNames.append( cLayer->
fields().
at( pkIndex ).
name() );
384 const int nAtlasFeatures = atlasPk.size() / pkIndexesSize;
385 if ( nAtlasFeatures * pkIndexesSize != atlasPk.size() )
388 QStringLiteral(
"Wrong number of ATLAS_PK parameters" ) );
392 if ( nAtlasFeatures > maxAtlasFeatures )
395 QString(
"%1 atlas features have been requested, but the project configuration only allows printing %2 atlas features at a time" )
396 .arg( nAtlasFeatures ).arg( maxAtlasFeatures ) );
399 QString filterString;
400 int currentAtlasPk = 0;
402 for (
int i = 0; i < nAtlasFeatures; ++i )
406 filterString.append(
" OR " );
409 filterString.append(
"( " );
412 if ( pkAttributeNames.isEmpty() )
414 filterString.append( QStringLiteral(
"$id = %1" ).arg( atlasPk.at( currentAtlasPk ) ) );
419 for (
int j = 0; j < pkIndexes.size(); ++j )
423 filterString.append(
" AND " );
430 filterString.append(
" )" );
436 if ( !errorString.isEmpty() )
438 throw QgsException( QStringLiteral(
"An error occurred during the Atlas print: %1" ).arg( errorString ) );
450 std::unique_ptr<QImage> image(
new QImage() );
451 configureMapSettings( image.get(), mapSettings );
457 configurePrintLayout( layout.get(), mapSettings, atlas );
461 const QList<QgsMapLayer *> lyrs = mapSettings.
layers();
463 #ifdef HAVE_SERVER_PYTHON_PLUGINS
464 mContext.accessControl()->resolveFilterFeatures( lyrs );
468 QMap<const QgsVectorLayer *, QStringList> fltrs;
473 fltrs.insert( vl, dimensionFilter( vl ) );
485 QTemporaryFile tempOutputFile( QDir::tempPath() +
'/' + QStringLiteral(
"XXXXXX.%1" ).arg( extension ) );
486 if ( !tempOutputFile.open() )
488 throw QgsException( QStringLiteral(
"Could not open temporary file for the GetPrint request." ) );
497 if ( !mWmsParameters.
dpi().isEmpty() )
500 double dpi( mWmsParameters.
dpi().toDouble( &ok ) );
502 exportSettings.
dpi = dpi;
513 atlasSvgExport.
exportToSvg( tempOutputFile.fileName(), exportSettings );
519 exporter.
exportToSvg( tempOutputFile.fileName(), exportSettings );
528 double dpi( layout->renderContext().dpi( ) );
529 if ( !mWmsParameters.
dpi().isEmpty() )
532 double _dpi = mWmsParameters.
dpi().toDouble( &ok );
536 exportSettings.
dpi = dpi;
540 QgsLayoutSize layoutSize( layout->pageCollection()->page( 0 )->sizeWithUnits() );
542 QgsLayoutMeasurement width( layout->convertFromLayoutUnits( layoutSize.
width(), QgsUnitTypes::LayoutUnit::LayoutMillimeters ) );
543 QgsLayoutMeasurement height( layout->convertFromLayoutUnits( layoutSize.
height(), QgsUnitTypes::LayoutUnit::LayoutMillimeters ) );
545 const QSize imageSize = QSize(
static_cast<int>( width.
length() * dpi / 25.4 ),
static_cast<int>( height.
length() * dpi / 25.4 ) );
547 const QString paramWidth = mWmsParameters.
width();
548 const QString paramHeight = mWmsParameters.
height();
553 if ( !paramWidth.isEmpty() && !paramHeight.isEmpty() )
555 exportSettings.
imageSize = QSize( paramWidth.toInt(), paramHeight.toInt() );
557 else if ( !paramWidth.isEmpty() && paramHeight.isEmpty() )
559 exportSettings.
imageSize = QSize( paramWidth.toInt(),
static_cast<double>( paramWidth.toInt() ) / imageSize.width() * imageSize.height() );
561 else if ( paramWidth.isEmpty() && !paramHeight.isEmpty() )
563 exportSettings.
imageSize = QSize(
static_cast<double>( paramHeight.toInt() ) / imageSize.height() * imageSize.width(), paramHeight.toInt() );
571 exportSettings.
pages.append( 0 );
579 atlasPngExport.
exportToImage( tempOutputFile.fileName(), exportSettings );
583 throw QgsServiceException( QStringLiteral(
"Bad request" ), QStringLiteral(
"Atlas error: empty atlas." ), QString(), 400 );
589 exporter.
exportToImage( tempOutputFile.fileName(), exportSettings );
597 if ( !mWmsParameters.
dpi().isEmpty() )
600 double dpi( mWmsParameters.
dpi().toDouble( &ok ) );
602 exportSettings.
dpi = dpi;
607 exportSettings.
rasterizeWholeImage = layout->customProperty( QStringLiteral(
"rasterize" ),
false ).toBool();
617 exporter.
exportToPdf( tempOutputFile.fileName(), exportSettings );
628 handlePrintErrors( atlas->
layout() );
632 handlePrintErrors( layout.get() );
635 return tempOutputFile.readAll();
643 QList<QgsLayoutItemMap *> maps;
649 for (
const auto &map : std::as_const( maps ) )
654 if ( !atlasPrint || !map->atlasDriven() )
660 c->removeLayoutItem( map );
678 if ( cMapParams.
mScale > 0 )
680 map->setScale(
static_cast<double>( cMapParams.
mScale ) );
686 map->setMapRotation( cMapParams.
mRotation );
690 if ( !map->keepLayerSet() )
692 QList<QgsMapLayer *> layerSet;
693 if ( cMapParams.
mLayers.isEmpty() )
695 layerSet = mapSettings.
layers();
699 for (
auto layer : cMapParams.
mLayers )
703 QList<QgsMapLayer *> layersFromGroup;
705 const QList<QgsMapLayer *> cLayersFromGroup = mContext.
layersFromGroup( layer.mNickname );
706 for (
QgsMapLayer *layerFromGroup : cLayersFromGroup )
709 if ( ! layerFromGroup )
714 layersFromGroup.push_front( layerFromGroup );
717 if ( !layersFromGroup.isEmpty() )
719 layerSet.append( layersFromGroup );
731 setLayerStyle( mlayer, layer.mStyle );
735 std::reverse( layerSet.begin(), layerSet.end() );
741 QMap<QString, QString> layersStyle;
742 if ( map->followVisibilityPreset() )
744 const QString presetName = map->followVisibilityPresetName();
745 if ( layerSet.isEmpty() )
749 layerSet = map->layersToRender( &ex );
752 map->setFollowVisibilityPreset(
false );
756 for (
const auto &layerMapThemeRecord : std::as_const( mapThemeRecords ) )
758 if ( layerSet.contains( layerMapThemeRecord.layer() ) )
760 layersStyle.insert( layerMapThemeRecord.layer()->id(),
761 layerMapThemeRecord.layer()->styleManager()->style( layerMapThemeRecord.currentStyle ).xmlData() );
767 const QList< QgsMapLayer *> highlights = highlightLayers( cMapParams.
mHighlightLayers );
768 for (
const auto &hl : std::as_const( highlights ) )
770 layerSet.prepend( hl );
773 map->setLayers( layerSet );
774 map->setKeepLayerSet(
true );
778 if ( !layersStyle.isEmpty() )
780 map->setLayerStyleOverrides( layersStyle );
781 map->setKeepLayerStyles(
true );
788 map->grid()->setIntervalX(
static_cast<double>( cMapParams.
mGridX ) );
789 map->grid()->setIntervalY(
static_cast<double>( cMapParams.
mGridY ) );
794 QList<QgsLayoutItemLabel *> labels;
796 for (
const auto &label : std::as_const( labels ) )
799 const QString labelId = label->
id();
800 const QString labelParam = mWmsParameters.
layoutParameter( labelId, ok );
805 if ( labelParam.isEmpty() )
809 c->removeItem( label );
814 label->setText( labelParam );
818 QList<QgsLayoutItemHtml *> htmls;
820 for (
const auto &html : std::as_const( htmls ) )
822 if ( html->frameCount() == 0 )
827 const QString htmlId = htmlFrame->
id();
840 c->removeMultiFrame( html );
846 html->setUrl( newUrl );
852 QList<QgsLayoutItemLegend *> legends;
854 for (
const auto &legend : std::as_const( legends ) )
856 if ( legend->autoUpdateModel() )
866 legend->setAutoUpdateModel(
false );
870 QStringList layerSet;
871 QList<QgsMapLayer *> mapLayers;
872 if ( map->
layers().isEmpty() )
876 mapLayers = mProject->
mapLayers(
true ).values();
880 mapLayers = map->
layers();
882 const QList<QgsMapLayer *> layerList = mapLayers;
883 for (
const auto &layer : layerList )
884 layerSet << layer->id();
896 for (
const auto &layerId : layerIds )
903 if ( !layerSet.contains( layerId ) )
905 qobject_cast<QgsLayerTreeGroup *>( nodeLayer->
parent() )->removeChildNode( nodeLayer );
912 qobject_cast<QgsLayerTreeGroup *>( nodeLayer->
parent() )->removeChildNode( nodeLayer );
928 QStringLiteral(
"The requested map size is too large" ) );
932 std::unique_ptr<QgsWmsRestorer> restorer;
943 std::unique_ptr<QPainter> painter;
944 std::unique_ptr<QImage> image( createImage( mContext.
mapSize() ) );
947 configureMapSettings( image.get(), mapSettings );
953 painter.reset( layersRendering( mapSettings, *image ) );
956 annotationsRendering( painter.get(), mapSettings );
962 QImage *scaledImage = scaleImage( image.get() );
964 image.reset( scaledImage );
967 return image.release();
973 std::unique_ptr<QgsWmsRestorer> restorer;
982 QList< QgsDxfExport::DxfLayer > dxfLayers;
994 int layerAttribute = -1;
995 if ( attributes.size() > layerIdx )
1006 QString
crs = mWmsParameters.
crs();
1007 if (
crs.compare( QStringLiteral(
"CRS:84" ), Qt::CaseInsensitive ) == 0 )
1009 crs = QStringLiteral(
"EPSG:4326" );
1012 else if (
crs.isEmpty() )
1014 crs = QStringLiteral(
"EPSG:4326" );
1048 std::unique_ptr<QgsDxfExport> dxf = std::make_unique<QgsDxfExport>();
1049 dxf->setExtent( mapExtent );
1050 dxf->setDestinationCrs( outputCRS );
1051 dxf->addLayers( dxfLayers );
1053 dxf->setSymbologyExport( mWmsParameters.
dxfMode() );
1054 if ( mWmsParameters.
dxfFormatOptions().contains( QgsWmsParameters::DxfFormatOption::SCALE ) )
1056 dxf->setSymbologyScale( mWmsParameters.
dxfScale() );
1059 dxf->setForce2d( mWmsParameters.
isForce2D() );
1060 QgsDxfExport::Flags flags;
1061 if ( mWmsParameters.
noMText() )
1062 flags.setFlag( QgsDxfExport::Flag::FlagNoMText );
1064 dxf->setFlags( flags );
1072 if ( i < 0 || i > mapSettings.
outputSize().width() )
1080 if ( j < 0 || j > mapSettings.
outputSize().height() )
1105 const bool ijDefined = !mWmsParameters.
i().isEmpty() && !mWmsParameters.
j().isEmpty();
1106 const bool xyDefined = !mWmsParameters.
x().isEmpty() && !mWmsParameters.
y().isEmpty();
1107 const bool filtersDefined = !mWmsParameters.
filters().isEmpty();
1108 const bool filterGeomDefined = !mWmsParameters.
filterGeom().isEmpty();
1110 if ( !ijDefined && !xyDefined && !filtersDefined && !filterGeomDefined )
1114 if ( mWmsParameters.
j().isEmpty() )
1121 if ( infoFormat == QgsWmsParameters::Format::NONE )
1128 std::unique_ptr<QImage> outputImage( createImage( mContext.
mapSize() ) );
1131 std::unique_ptr<QgsWmsRestorer> restorer;
1136 bool mandatoryCrsParam =
true;
1137 if ( filtersDefined && !ijDefined && !xyDefined && mWmsParameters.
crs().isEmpty() )
1139 mandatoryCrsParam =
false;
1145 configureMapSettings( outputImage.get(), mapSettings, mandatoryCrsParam );
1161 #ifdef HAVE_SERVER_PYTHON_PLUGINS
1162 mContext.accessControl()->resolveFilterFeatures( mapSettings.
layers() );
1165 QDomDocument result = featureInfoDocument( layers, mapSettings, outputImage.get(), version );
1169 if ( infoFormat == QgsWmsParameters::Format::TEXT )
1170 ba = convertFeatureInfoToText( result );
1171 else if ( infoFormat == QgsWmsParameters::Format::HTML )
1172 ba = convertFeatureInfoToHtml( result );
1173 else if ( infoFormat == QgsWmsParameters::Format::JSON )
1174 ba = convertFeatureInfoToJson( layers, result );
1176 ba = result.toByteArray();
1181 QImage *QgsRenderer::createImage(
const QSize &size )
const
1183 std::unique_ptr<QImage> image;
1191 image = std::make_unique<QImage>( size, QImage::Format_ARGB32_Premultiplied );
1196 image = std::make_unique<QImage>( size, QImage::Format_RGB32 );
1201 if ( image->isNull() )
1203 throw QgsException( QStringLiteral(
"createImage: image could not be created, check for out of memory conditions" ) );
1206 const int dpm =
static_cast<int>( mContext.
dotsPerMm() * 1000.0 );
1207 image->setDotsPerMeterX( dpm );
1208 image->setDotsPerMeterY( dpm );
1210 return image.release();
1213 void QgsRenderer::configureMapSettings(
const QPaintDevice *paintDevice,
QgsMapSettings &mapSettings,
bool mandatoryCrsParam )
const
1217 throw QgsException( QStringLiteral(
"configureMapSettings: no paint device" ) );
1220 mapSettings.
setOutputSize( QSize( paintDevice->width(), paintDevice->height() ) );
1227 if ( !mWmsParameters.
bbox().isEmpty() && mapExtent.
isEmpty() )
1233 QString
crs = mWmsParameters.
crs();
1234 if (
crs.compare(
"CRS:84", Qt::CaseInsensitive ) == 0 )
1236 crs = QString(
"EPSG:4326" );
1239 else if (
crs.isEmpty() && !mandatoryCrsParam )
1241 crs = QString(
"EPSG:4326" );
1251 QgsWmsParameter parameter;
1293 else if ( backgroundColor.isValid() )
1315 QDomDocument QgsRenderer::featureInfoDocument( QList<QgsMapLayer *> &layers,
const QgsMapSettings &mapSettings,
1316 const QImage *outputImage,
const QString &version )
const
1320 bool ijDefined = ( !mWmsParameters.
i().isEmpty() && !mWmsParameters.
j().isEmpty() );
1322 bool xyDefined = ( !mWmsParameters.
x().isEmpty() && !mWmsParameters.
y().isEmpty() );
1324 bool filtersDefined = !mWmsParameters.
filters().isEmpty();
1326 bool filterGeomDefined = !mWmsParameters.
filterGeom().isEmpty();
1329 if ( featureCount < 1 )
1334 int i = mWmsParameters.
iAsInt();
1335 int j = mWmsParameters.
jAsInt();
1336 if ( xyDefined && !ijDefined )
1338 i = mWmsParameters.
xAsInt();
1339 j = mWmsParameters.
yAsInt();
1343 if ( ( i != -1 && j != -1 && width != 0 && height != 0 ) && ( width != outputImage->width() || height != outputImage->height() ) )
1345 i *= ( outputImage->width() /
static_cast<double>( width ) );
1346 j *= ( outputImage->height() /
static_cast<double>( height ) );
1350 std::unique_ptr<QgsRectangle> featuresRect;
1351 std::unique_ptr<QgsGeometry> filterGeom;
1352 std::unique_ptr<QgsPointXY> infoPoint;
1354 if ( i != -1 && j != -1 )
1357 infoPointToMapCoordinates( i, j, infoPoint.get(), mapSettings );
1359 else if ( filtersDefined )
1363 else if ( filterGeomDefined )
1368 QDomDocument result;
1370 QDomElement getFeatureInfoElement;
1372 if ( infoFormat == QgsWmsParameters::Format::GML )
1374 getFeatureInfoElement = result.createElement( QStringLiteral(
"wfs:FeatureCollection" ) );
1375 getFeatureInfoElement.setAttribute( QStringLiteral(
"xmlns:wfs" ), QStringLiteral(
"http://www.opengis.net/wfs" ) );
1376 getFeatureInfoElement.setAttribute( QStringLiteral(
"xmlns:ogc" ), QStringLiteral(
"http://www.opengis.net/ogc" ) );
1377 getFeatureInfoElement.setAttribute( QStringLiteral(
"xmlns:gml" ), QStringLiteral(
"http://www.opengis.net/gml" ) );
1378 getFeatureInfoElement.setAttribute( QStringLiteral(
"xmlns:ows" ), QStringLiteral(
"http://www.opengis.net/ows" ) );
1379 getFeatureInfoElement.setAttribute( QStringLiteral(
"xmlns:xlink" ), QStringLiteral(
"http://www.w3.org/1999/xlink" ) );
1380 getFeatureInfoElement.setAttribute( QStringLiteral(
"xmlns:qgs" ), QStringLiteral(
"http://qgis.org/gml" ) );
1381 getFeatureInfoElement.setAttribute( QStringLiteral(
"xmlns:xsi" ), QStringLiteral(
"http://www.w3.org/2001/XMLSchema-instance" ) );
1382 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" ) );
1387 if ( featureInfoElemName.isEmpty() )
1389 featureInfoElemName = QStringLiteral(
"GetFeatureInfoResponse" );
1392 if ( featureInfoElemNs.isEmpty() )
1394 getFeatureInfoElement = result.createElement( featureInfoElemName );
1398 getFeatureInfoElement = result.createElementNS( featureInfoElemNs, featureInfoElemName );
1402 if ( !featureInfoSchema.isEmpty() )
1404 getFeatureInfoElement.setAttribute( QStringLiteral(
"xmlns:xsi" ), QStringLiteral(
"http://www.w3.org/2001/XMLSchema-instance" ) );
1405 getFeatureInfoElement.setAttribute( QStringLiteral(
"xsi:schemaLocation" ), featureInfoSchema );
1408 result.appendChild( getFeatureInfoElement );
1418 for (
const QString &queryLayer : queryLayers )
1420 bool validLayer =
false;
1421 bool queryableLayer =
true;
1422 for (
QgsMapLayer *layer : std::as_const( layers ) )
1428 if ( !queryableLayer )
1433 QDomElement layerElement;
1434 if ( infoFormat == QgsWmsParameters::Format::GML )
1436 layerElement = getFeatureInfoElement;
1440 layerElement = result.createElement( QStringLiteral(
"Layer" ) );
1441 QString layerName = queryLayer;
1444 QHash<QString, QString>::const_iterator layerAliasIt = layerAliasMap.constFind( layerName );
1445 if ( layerAliasIt != layerAliasMap.constEnd() )
1447 layerName = layerAliasIt.value();
1450 layerElement.setAttribute( QStringLiteral(
"name" ), layerName );
1451 getFeatureInfoElement.appendChild( layerElement );
1454 layerElement.setAttribute( QStringLiteral(
"id" ), layer->id() );
1460 QgsVectorLayer *vectorLayer = qobject_cast<QgsVectorLayer *>( layer );
1463 ( void )featureInfoFromVectorLayer( vectorLayer, infoPoint.get(), featureCount, result, layerElement, mapSettings, renderContext, version, featuresRect.get(), filterGeom.get() );
1469 QgsRasterLayer *rasterLayer = qobject_cast<QgsRasterLayer *>( layer );
1478 QgsPointXY layerInfoPoint = mapSettings.mapToLayerCoordinates( layer, *( infoPoint.get() ) );
1483 if ( infoFormat == QgsWmsParameters::Format::GML )
1485 layerElement = result.createElement( QStringLiteral(
"gml:featureMember" ) );
1486 getFeatureInfoElement.appendChild( layerElement );
1489 ( void )featureInfoFromRasterLayer( rasterLayer, mapSettings, &layerInfoPoint, result, layerElement, version );
1497 param.mValue = queryLayer;
1501 else if ( ( validLayer && !queryableLayer ) || ( !validLayer && mContext.
isValidGroup( queryLayer ) ) )
1504 param.mValue = queryLayer;
1506 bool hasGroupAndQueryable {
false };
1511 for (
const QString &ql : constNicks )
1515 const QList<QgsMapLayer *> constLayers { mContext.
layerGroups()[ql] };
1518 if ( ( ! ml->shortName().isEmpty() && ml->shortName() == queryLayer ) || ( ml->name() == queryLayer ) )
1524 hasGroupAndQueryable =
true;
1533 if ( ! hasGroupAndQueryable )
1543 if ( infoFormat == QgsWmsParameters::Format::GML )
1545 QDomElement bBoxElem = result.createElement( QStringLiteral(
"gml:boundedBy" ) );
1546 QDomElement boxElem;
1548 if ( gmlVersion < 3 )
1560 boxElem.setAttribute( QStringLiteral(
"srsName" ),
crs.
authid() );
1562 bBoxElem.appendChild( boxElem );
1563 getFeatureInfoElement.insertBefore( bBoxElem, QDomNode() );
1567 QDomElement bBoxElem = result.createElement( QStringLiteral(
"BoundingBox" ) );
1568 bBoxElem.setAttribute( QStringLiteral(
"CRS" ), mapSettings.destinationCrs().authid() );
1569 bBoxElem.setAttribute( QStringLiteral(
"minx" ),
qgsDoubleToString( featuresRect->xMinimum(), 8 ) );
1570 bBoxElem.setAttribute( QStringLiteral(
"maxx" ),
qgsDoubleToString( featuresRect->xMaximum(), 8 ) );
1571 bBoxElem.setAttribute( QStringLiteral(
"miny" ),
qgsDoubleToString( featuresRect->yMinimum(), 8 ) );
1572 bBoxElem.setAttribute( QStringLiteral(
"maxy" ),
qgsDoubleToString( featuresRect->yMaximum(), 8 ) );
1573 getFeatureInfoElement.insertBefore( bBoxElem, QDomNode() );
1577 if ( sia2045 && infoFormat == QgsWmsParameters::Format::XML )
1579 convertFeatureInfoToSia2045( result );
1585 bool QgsRenderer::featureInfoFromVectorLayer(
QgsVectorLayer *layer,
1588 QDomDocument &infoDocument,
1589 QDomElement &layerElement,
1592 const QString &version,
1604 std::unique_ptr<QgsGeometry> layerFilterGeom;
1607 layerFilterGeom.reset(
new QgsGeometry( *filterGeom ) );
1621 searchRect = featureInfoSearchRect( layer, mapSettings, renderContext, *infoPoint );
1623 else if ( layerFilterGeom )
1625 searchRect = layerFilterGeom->boundingBox();
1627 else if ( !mWmsParameters.
bbox().isEmpty() )
1629 searchRect = layerRect;
1636 int featureCounter = 0;
1655 if ( layerFilterGeom )
1657 fReq.
setFilterExpression( QString(
"intersects( $geometry, geom_from_wkt('%1') )" ).arg( layerFilterGeom->asWkt() ) );
1662 #ifdef HAVE_SERVER_PYTHON_PLUGINS
1663 mContext.accessControl()->filterFeatures( layer, fReq );
1665 QStringList attributes;
1670 attributes = mContext.accessControl()->layerAttributes( layer, attributes );
1675 std::unique_ptr< QgsFeatureRenderer > r2( layer->
renderer() ? layer->
renderer()->
clone() :
nullptr );
1678 r2->startRender( renderContext, layer->
fields() );
1681 bool featureBBoxInitialized =
false;
1690 if ( featureCounter > nFeatures )
1705 bool render = r2->willRenderFeature( feature, renderContext );
1718 if ( !featureBBoxInitialized && featureBBox->
isEmpty() )
1721 featureBBoxInitialized =
true;
1736 if ( mWmsParameters.
infoFormat() == QgsWmsParameters::Format::GML )
1741 QDomElement elem = createFeatureGML(
1743 #ifdef HAVE_SERVER_PYTHON_PLUGINS
1747 QDomElement featureMemberElem = infoDocument.createElement( QStringLiteral(
"gml:featureMember" ) );
1748 featureMemberElem.appendChild( elem );
1749 layerElement.appendChild( featureMemberElem );
1754 QDomElement featureElement = infoDocument.createElement( QStringLiteral(
"Feature" ) );
1756 layerElement.appendChild( featureElement );
1762 writeAttributesTabLayout( editConfig, layer, fields, featureAttributes, infoDocument, featureElement, renderContext
1763 #ifdef HAVE_SERVER_PYTHON_PLUGINS
1770 for (
int i = 0; i < featureAttributes.count(); ++i )
1772 writeVectorLayerAttribute( i, layer, fields, featureAttributes, infoDocument, featureElement, renderContext
1773 #ifdef HAVE_SERVER_PYTHON_PLUGINS
1782 if ( !mapTip.isEmpty() && mWmsParameters.
withMapTip() )
1784 QDomElement maptipElem = infoDocument.createElement( QStringLiteral(
"Attribute" ) );
1785 maptipElem.setAttribute( QStringLiteral(
"name" ), QStringLiteral(
"maptip" ) );
1787 featureElement.appendChild( maptipElem );
1794 QDomElement bBoxElem = infoDocument.createElement( QStringLiteral(
"BoundingBox" ) );
1795 bBoxElem.setAttribute( version == QLatin1String(
"1.1.1" ) ?
"SRS" :
"CRS",
outputCrs.
authid() );
1800 featureElement.appendChild( bBoxElem );
1816 if ( segmentizeWktGeometry )
1824 geom.
set( segmentizedGeom );
1828 QDomElement geometryElement = infoDocument.createElement( QStringLiteral(
"Attribute" ) );
1829 geometryElement.setAttribute( QStringLiteral(
"name" ), QStringLiteral(
"geometry" ) );
1830 geometryElement.setAttribute( QStringLiteral(
"value" ), geom.
asWkt( mContext.
precision() ) );
1831 geometryElement.setAttribute( QStringLiteral(
"type" ), QStringLiteral(
"derived" ) );
1832 featureElement.appendChild( geometryElement );
1839 r2->stopRender( renderContext );
1850 QString groupName = container->
name();
1851 QDomElement nameElem;
1853 if ( !groupName.isEmpty() )
1855 nameElem = doc.createElement( groupName );
1856 parentElem.appendChild( nameElem );
1859 const QList<QgsAttributeEditorElement *> children = container->
children();
1864 writeAttributesTabGroup( child, layer, fields, featureAttributes, doc, nameElem.isNull() ? parentElem : nameElem, renderContext );
1874 writeVectorLayerAttribute( idx, layer, fields, featureAttributes, doc, nameElem.isNull() ? parentElem : nameElem, renderContext, attributes );
1885 if ( !editorContainer )
1890 writeAttributesTabGroup( editorContainer, layer, fields, featureAttributes, doc, featureElem, renderContext, attributes );
1893 void QgsRenderer::writeVectorLayerAttribute(
int attributeIndex,
QgsVectorLayer *layer,
const QgsFields &fields,
QgsAttributes &featureAttributes, QDomDocument &doc, QDomElement &featureElem,
QgsRenderContext &renderContext, QStringList *attributes )
const
1895 #ifndef HAVE_SERVER_PYTHON_PLUGINS
1896 Q_UNUSED( attributes );
1909 #ifdef HAVE_SERVER_PYTHON_PLUGINS
1911 if ( attributes && !attributes->contains( fields.
at( attributeIndex ).
name() ) )
1918 QDomElement attributeElement = doc.createElement( QStringLiteral(
"Attribute" ) );
1919 attributeElement.setAttribute( QStringLiteral(
"name" ), attributeName );
1921 attributeElement.setAttribute( QStringLiteral(
"value" ),
1923 replaceValueMapAndRelation(
1924 layer, attributeIndex,
1925 featureAttributes[attributeIndex] ),
1928 featureElem.appendChild( attributeElement );
1931 bool QgsRenderer::featureInfoFromRasterLayer(
QgsRasterLayer *layer,
1934 QDomDocument &infoDocument,
1935 QDomElement &layerElement,
1936 const QString &version )
const
1955 ? QgsRaster::IdentifyFormat::IdentifyFormatFeature
1956 : QgsRaster::IdentifyFormat::IdentifyFormatValue );
1968 .arg( layer->
name() ) );
1977 if ( !identifyResult.
isValid() )
1980 QMap<int, QVariant> attributes = identifyResult.
results();
1982 if ( mWmsParameters.
infoFormat() == QgsWmsParameters::Format::GML )
1994 for (
auto it = attributes.constBegin(); it != attributes.constEnd(); ++it )
1997 feature.
setAttribute( index++, QString::number( it.value().toDouble() ) );
2000 QDomElement elem = createFeatureGML(
2001 &feature,
nullptr, infoDocument, layerCrs, mapSettings,
typeName,
false, gmlVersion,
nullptr );
2002 layerElement.appendChild( elem );
2006 const auto values = identifyResult.
results();
2007 for (
auto it = values.constBegin(); it != values.constEnd(); ++it )
2009 QVariant value = it.value();
2010 if ( value.type() == QVariant::Bool && !value.toBool() )
2016 if ( value.type() == QVariant::String )
2027 for (
const QgsFeature &feature : storeFeatures )
2029 QDomElement elem = createFeatureGML(
2030 &feature,
nullptr, infoDocument, layerCrs, mapSettings,
typeName,
false, gmlVersion,
nullptr );
2031 layerElement.appendChild( elem );
2041 for (
auto it = attributes.constBegin(); it != attributes.constEnd(); ++it )
2043 QDomElement attributeElement = infoDocument.createElement( QStringLiteral(
"Attribute" ) );
2044 attributeElement.setAttribute( QStringLiteral(
"name" ), layer->
bandName( it.key() ) );
2047 if ( ! it.value().isNull() )
2049 value = QString::number( it.value().toDouble() );
2052 attributeElement.setAttribute( QStringLiteral(
"value" ), value );
2053 layerElement.appendChild( attributeElement );
2058 const auto values = identifyResult.
results();
2059 for (
auto it = values.constBegin(); it != values.constEnd(); ++it )
2061 QVariant value = it.value();
2062 if ( value.type() == QVariant::Bool && !value.toBool() )
2068 if ( value.type() == QVariant::String )
2078 for (
const QgsFeature &feature : storeFeatures )
2080 for (
const auto &fld : feature.
fields() )
2082 const auto val { feature.
attribute( fld.name() )};
2083 if ( val.isValid() )
2085 QDomElement attributeElement = infoDocument.createElement( QStringLiteral(
"Attribute" ) );
2086 attributeElement.setAttribute( QStringLiteral(
"name" ), fld.name() );
2087 attributeElement.setAttribute( QStringLiteral(
"value" ), val.toString() );
2088 layerElement.appendChild( attributeElement );
2099 bool QgsRenderer::testFilterStringSafety(
const QString &filter )
const
2102 if ( filter.contains( QLatin1String(
";" ) ) )
2107 #if QT_VERSION < QT_VERSION_CHECK(5, 15, 0)
2108 QStringList tokens = filter.split(
' ', QString::SkipEmptyParts );
2110 QStringList tokens = filter.split(
' ', Qt::SkipEmptyParts );
2112 groupStringList( tokens, QStringLiteral(
"'" ) );
2113 groupStringList( tokens, QStringLiteral(
"\"" ) );
2115 for (
auto tokenIt = tokens.constBegin() ; tokenIt != tokens.constEnd(); ++tokenIt )
2118 if ( tokenIt->compare( QLatin1String(
"," ) ) == 0
2119 || tokenIt->compare( QLatin1String(
"(" ) ) == 0
2120 || tokenIt->compare( QLatin1String(
")" ) ) == 0
2121 || tokenIt->compare( QLatin1String(
"=" ) ) == 0
2122 || tokenIt->compare( QLatin1String(
"!=" ) ) == 0
2123 || tokenIt->compare( QLatin1String(
"<" ) ) == 0
2124 || tokenIt->compare( QLatin1String(
"<=" ) ) == 0
2125 || tokenIt->compare( QLatin1String(
">" ) ) == 0
2126 || tokenIt->compare( QLatin1String(
">=" ) ) == 0
2127 || tokenIt->compare( QLatin1String(
"%" ) ) == 0
2128 || tokenIt->compare( QLatin1String(
"IS" ), Qt::CaseInsensitive ) == 0
2129 || tokenIt->compare( QLatin1String(
"NOT" ), Qt::CaseInsensitive ) == 0
2130 || tokenIt->compare( QLatin1String(
"NULL" ), Qt::CaseInsensitive ) == 0
2131 || tokenIt->compare( QLatin1String(
"AND" ), Qt::CaseInsensitive ) == 0
2132 || tokenIt->compare( QLatin1String(
"OR" ), Qt::CaseInsensitive ) == 0
2133 || tokenIt->compare( QLatin1String(
"IN" ), Qt::CaseInsensitive ) == 0
2134 || tokenIt->compare( QLatin1String(
"LIKE" ), Qt::CaseInsensitive ) == 0
2135 || tokenIt->compare( QLatin1String(
"ILIKE" ), Qt::CaseInsensitive ) == 0
2136 || tokenIt->compare( QLatin1String(
"DMETAPHONE" ), Qt::CaseInsensitive ) == 0
2137 || tokenIt->compare( QLatin1String(
"SOUNDEX" ), Qt::CaseInsensitive ) == 0 )
2144 tokenIt->toDouble( &isNumeric );
2153 if ( *tokenIt == QLatin1String(
"''" ) )
2159 if ( tokenIt->size() > 2
2160 && ( *tokenIt )[0] == QChar(
'\'' )
2161 && ( *tokenIt )[tokenIt->size() - 1] == QChar(
'\'' )
2162 && ( *tokenIt )[1] != QChar(
'\'' )
2163 && ( *tokenIt )[tokenIt->size() - 2] != QChar(
'\'' ) )
2169 if ( tokenIt->size() > 2
2170 && ( *tokenIt )[0] == QChar(
'"' )
2171 && ( *tokenIt )[tokenIt->size() - 1] == QChar(
'"' )
2172 && ( *tokenIt )[1] != QChar(
'"' )
2173 && ( *tokenIt )[tokenIt->size() - 2] != QChar(
'"' ) )
2184 void QgsRenderer::groupStringList( QStringList &list,
const QString &groupString )
2187 bool groupActive =
false;
2188 int startGroup = -1;
2189 QString concatString;
2191 for (
int i = 0; i < list.size(); ++i )
2193 QString &
str = list[i];
2194 if (
str.startsWith( groupString ) )
2198 concatString.clear();
2203 if ( i != startGroup )
2205 concatString.append(
" " );
2207 concatString.append(
str );
2210 if (
str.endsWith( groupString ) )
2213 groupActive =
false;
2215 if ( startGroup != -1 )
2217 list[startGroup] = concatString;
2218 for (
int j = startGroup + 1; j <= endGroup; ++j )
2220 list.removeAt( startGroup + 1 );
2225 concatString.clear();
2231 void QgsRenderer::convertFeatureInfoToSia2045( QDomDocument &doc )
const
2233 QDomDocument SIAInfoDoc;
2234 QDomElement infoDocElement = doc.documentElement();
2235 QDomElement SIAInfoDocElement = SIAInfoDoc.importNode( infoDocElement,
false ).toElement();
2236 SIAInfoDoc.appendChild( SIAInfoDocElement );
2238 QString currentAttributeName;
2239 QString currentAttributeValue;
2240 QDomElement currentAttributeElem;
2241 QString currentLayerName;
2242 QDomElement currentLayerElem;
2243 QDomNodeList layerNodeList = infoDocElement.elementsByTagName( QStringLiteral(
"Layer" ) );
2244 for (
int i = 0; i < layerNodeList.size(); ++i )
2246 currentLayerElem = layerNodeList.at( i ).toElement();
2247 currentLayerName = currentLayerElem.attribute( QStringLiteral(
"name" ) );
2249 QDomElement currentFeatureElem;
2251 QDomNodeList featureList = currentLayerElem.elementsByTagName( QStringLiteral(
"Feature" ) );
2252 if ( featureList.isEmpty() )
2255 QDomNodeList attributeList = currentLayerElem.elementsByTagName( QStringLiteral(
"Attribute" ) );
2256 QDomElement rasterLayerElem;
2257 if ( !attributeList.isEmpty() )
2259 rasterLayerElem = SIAInfoDoc.createElement( currentLayerName );
2261 for (
int j = 0; j < attributeList.size(); ++j )
2263 currentAttributeElem = attributeList.at( j ).toElement();
2264 currentAttributeName = currentAttributeElem.attribute( QStringLiteral(
"name" ) );
2265 currentAttributeValue = currentAttributeElem.attribute( QStringLiteral(
"value" ) );
2266 QDomElement outAttributeElem = SIAInfoDoc.createElement( currentAttributeName );
2267 QDomText outAttributeText = SIAInfoDoc.createTextNode( currentAttributeValue );
2268 outAttributeElem.appendChild( outAttributeText );
2269 rasterLayerElem.appendChild( outAttributeElem );
2271 if ( !attributeList.isEmpty() )
2273 SIAInfoDocElement.appendChild( rasterLayerElem );
2279 QSet<QString> layerPropertyAttributes;
2280 QString currentLayerId = currentLayerElem.attribute( QStringLiteral(
"id" ) );
2281 if ( !currentLayerId.isEmpty() )
2286 QString WMSPropertyAttributesString = currentLayer->
customProperty( QStringLiteral(
"WMSPropertyAttributes" ) ).toString();
2287 if ( !WMSPropertyAttributesString.isEmpty() )
2289 QStringList propertyList = WMSPropertyAttributesString.split( QStringLiteral(
"//" ) );
2290 for (
auto propertyIt = propertyList.constBegin() ; propertyIt != propertyList.constEnd(); ++propertyIt )
2292 layerPropertyAttributes.insert( *propertyIt );
2298 QDomElement propertyRefChild;
2299 for (
int j = 0; j < featureList.size(); ++j )
2301 QDomElement SIAFeatureElem = SIAInfoDoc.createElement( currentLayerName );
2302 currentFeatureElem = featureList.at( j ).toElement();
2303 QDomNodeList attributeList = currentFeatureElem.elementsByTagName( QStringLiteral(
"Attribute" ) );
2305 for (
int k = 0; k < attributeList.size(); ++k )
2307 currentAttributeElem = attributeList.at( k ).toElement();
2308 currentAttributeName = currentAttributeElem.attribute( QStringLiteral(
"name" ) );
2309 currentAttributeValue = currentAttributeElem.attribute( QStringLiteral(
"value" ) );
2310 if ( layerPropertyAttributes.contains( currentAttributeName ) )
2312 QDomElement propertyElem = SIAInfoDoc.createElement( QStringLiteral(
"property" ) );
2313 QDomElement identifierElem = SIAInfoDoc.createElement( QStringLiteral(
"identifier" ) );
2314 QDomText identifierText = SIAInfoDoc.createTextNode( currentAttributeName );
2315 identifierElem.appendChild( identifierText );
2316 QDomElement valueElem = SIAInfoDoc.createElement( QStringLiteral(
"value" ) );
2317 QDomText valueText = SIAInfoDoc.createTextNode( currentAttributeValue );
2318 valueElem.appendChild( valueText );
2319 propertyElem.appendChild( identifierElem );
2320 propertyElem.appendChild( valueElem );
2321 if ( propertyRefChild.isNull() )
2323 SIAFeatureElem.insertBefore( propertyElem, QDomNode() );
2324 propertyRefChild = propertyElem;
2328 SIAFeatureElem.insertAfter( propertyElem, propertyRefChild );
2333 QDomElement SIAAttributeElem = SIAInfoDoc.createElement( currentAttributeName );
2334 QDomText SIAAttributeText = SIAInfoDoc.createTextNode( currentAttributeValue );
2335 SIAAttributeElem.appendChild( SIAAttributeText );
2336 SIAFeatureElem.appendChild( SIAAttributeElem );
2339 SIAInfoDocElement.appendChild( SIAFeatureElem );
2346 QByteArray QgsRenderer::convertFeatureInfoToHtml(
const QDomDocument &doc )
const
2348 QString featureInfoString;
2351 featureInfoString.append(
"<HEAD>\n" );
2352 featureInfoString.append(
"<TITLE> GetFeatureInfo results </TITLE>\n" );
2353 featureInfoString.append(
"<META http-equiv=\"Content-Type\" content=\"text/html;charset=utf-8\"/>\n" );
2354 featureInfoString.append(
"</HEAD>\n" );
2357 featureInfoString.append(
"<BODY>\n" );
2359 QDomNodeList layerList = doc.elementsByTagName( QStringLiteral(
"Layer" ) );
2362 for (
int i = 0; i < layerList.size(); ++i )
2364 QDomElement layerElem = layerList.at( i ).toElement();
2366 featureInfoString.append(
"<TABLE border=1 width=100%>\n" );
2367 featureInfoString.append(
"<TR><TH width=25%>Layer</TH><TD>" + layerElem.attribute( QStringLiteral(
"name" ) ) +
"</TD></TR>\n" );
2368 featureInfoString.append(
"</BR>" );
2371 QDomNodeList featureNodeList = layerElem.elementsByTagName( QStringLiteral(
"Feature" ) );
2372 QDomElement currentFeatureElement;
2374 if ( !featureNodeList.isEmpty() )
2376 for (
int j = 0; j < featureNodeList.size(); ++j )
2378 QDomElement featureElement = featureNodeList.at( j ).toElement();
2379 featureInfoString.append(
"<TABLE border=1 width=100%>\n" );
2380 featureInfoString.append(
"<TR><TH>Feature</TH><TD>" + featureElement.attribute( QStringLiteral(
"id" ) ) +
2384 QDomNodeList attributeNodeList = featureElement.elementsByTagName( QStringLiteral(
"Attribute" ) );
2385 for (
int k = 0; k < attributeNodeList.size(); ++k )
2387 QDomElement attributeElement = attributeNodeList.at( k ).toElement();
2388 featureInfoString.append(
"<TR><TH>" + attributeElement.attribute( QStringLiteral(
"name" ) ) +
2389 "</TH><TD>" + attributeElement.attribute( QStringLiteral(
"value" ) ) +
"</TD></TR>\n" );
2392 featureInfoString.append(
"</TABLE>\n</BR>\n" );
2397 QDomNodeList attributeNodeList = layerElem.elementsByTagName( QStringLiteral(
"Attribute" ) );
2398 for (
int j = 0; j < attributeNodeList.size(); ++j )
2400 QDomElement attributeElement = attributeNodeList.at( j ).toElement();
2401 QString value = attributeElement.attribute( QStringLiteral(
"value" ) );
2402 if ( value.isEmpty() )
2404 value = QStringLiteral(
"no data" );
2406 featureInfoString.append(
"<TR><TH>" + attributeElement.attribute( QStringLiteral(
"name" ) ) +
2407 "</TH><TD>" + value +
"</TD></TR>\n" );
2411 featureInfoString.append(
"</TABLE>\n<BR></BR>\n" );
2415 featureInfoString.append(
"</BODY>\n" );
2417 return featureInfoString.toUtf8();
2420 QByteArray QgsRenderer::convertFeatureInfoToText(
const QDomDocument &doc )
const
2422 QString featureInfoString;
2425 featureInfoString.append(
"GetFeatureInfo results\n" );
2426 featureInfoString.append(
"\n" );
2428 QDomNodeList layerList = doc.elementsByTagName( QStringLiteral(
"Layer" ) );
2431 for (
int i = 0; i < layerList.size(); ++i )
2433 QDomElement layerElem = layerList.at( i ).toElement();
2435 featureInfoString.append(
"Layer '" + layerElem.attribute( QStringLiteral(
"name" ) ) +
"'\n" );
2438 QDomNodeList featureNodeList = layerElem.elementsByTagName( QStringLiteral(
"Feature" ) );
2439 QDomElement currentFeatureElement;
2441 if ( !featureNodeList.isEmpty() )
2443 for (
int j = 0; j < featureNodeList.size(); ++j )
2445 QDomElement featureElement = featureNodeList.at( j ).toElement();
2446 featureInfoString.append(
"Feature " + featureElement.attribute( QStringLiteral(
"id" ) ) +
"\n" );
2449 QDomNodeList attributeNodeList = featureElement.elementsByTagName( QStringLiteral(
"Attribute" ) );
2450 for (
int k = 0; k < attributeNodeList.size(); ++k )
2452 QDomElement attributeElement = attributeNodeList.at( k ).toElement();
2453 featureInfoString.append( attributeElement.attribute( QStringLiteral(
"name" ) ) +
" = '" +
2454 attributeElement.attribute( QStringLiteral(
"value" ) ) +
"'\n" );
2460 QDomNodeList attributeNodeList = layerElem.elementsByTagName( QStringLiteral(
"Attribute" ) );
2461 for (
int j = 0; j < attributeNodeList.size(); ++j )
2463 QDomElement attributeElement = attributeNodeList.at( j ).toElement();
2464 QString value = attributeElement.attribute( QStringLiteral(
"value" ) );
2465 if ( value.isEmpty() )
2467 value = QStringLiteral(
"no data" );
2469 featureInfoString.append( attributeElement.attribute( QStringLiteral(
"name" ) ) +
" = '" +
2474 featureInfoString.append(
"\n" );
2477 return featureInfoString.toUtf8();
2480 QByteArray QgsRenderer::convertFeatureInfoToJson(
const QList<QgsMapLayer *> &layers,
const QDomDocument &doc )
const
2484 {
"type",
"FeatureCollection" },
2485 {
"features", json::array() },
2489 const QDomNodeList layerList = doc.elementsByTagName( QStringLiteral(
"Layer" ) );
2490 for (
int i = 0; i < layerList.size(); ++i )
2492 const QDomElement layerElem = layerList.at( i ).toElement();
2493 const QString layerName = layerElem.attribute( QStringLiteral(
"name" ) );
2498 if ( mContext.
layerNickname( *l ).compare( layerName ) == 0 )
2514 const QDomNodeList featuresNode = layerElem.elementsByTagName( QStringLiteral(
"Feature" ) );
2515 if ( featuresNode.isEmpty() )
2518 QMap<QgsFeatureId, QString> fidMap;
2520 for (
int j = 0; j < featuresNode.size(); ++j )
2522 const QDomElement featureNode = featuresNode.at( j ).toElement();
2523 const QString fid = featureNode.attribute( QStringLiteral(
"id" ) );
2526 if ( expression.isEmpty() )
2528 feature = vl->
getFeature( fid.toLongLong() );
2533 request.setFlags( QgsFeatureRequest::Flag::NoGeometry );
2537 fidMap.insert( feature.
id(), fid );
2542 const QDomNodeList attrs = featureNode.elementsByTagName(
"Attribute" );
2543 for (
int k = 0; k < attrs.count(); k++ )
2545 const QDomElement elm = attrs.at( k ).toElement();
2546 if ( elm.attribute( QStringLiteral(
"name" ) ).compare(
"geometry" ) == 0 )
2548 wkt = elm.attribute(
"value" );
2553 if ( ! wkt.isEmpty() )
2559 features << feature;
2562 if ( !attributes.isEmpty() )
2565 const QDomNodeList attributesNode = featureNode.elementsByTagName( QStringLiteral(
"Attribute" ) );
2566 for (
int k = 0; k < attributesNode.size(); ++k )
2568 const QDomElement attributeElement = attributesNode.at( k ).toElement();
2569 const QString fieldName = attributeElement.
attribute( QStringLiteral(
"name" ) );
2571 attributes << feature.fieldNameIndex( fieldName );
2577 exporter.setAttributeDisplayName(
true );
2578 exporter.setAttributes( attributes );
2579 exporter.setIncludeGeometry( withGeometry );
2580 exporter.setTransformGeometries(
false );
2582 for (
const auto &feature : std::as_const( features ) )
2584 const QString
id = QStringLiteral(
"%1.%2" ).arg( layerName ).arg( fidMap.value( feature.id() ) );
2585 json[
"features"].push_back( exporter.exportFeatureToJsonObject( feature, QVariantMap(),
id ) );
2590 auto properties = json::object();
2591 const QDomNodeList attributesNode = layerElem.elementsByTagName( QStringLiteral(
"Attribute" ) );
2592 for (
int j = 0; j < attributesNode.size(); ++j )
2594 const QDomElement attrElmt = attributesNode.at( j ).toElement();
2595 const QString name = attrElmt.attribute( QStringLiteral(
"name" ) );
2597 QString value = attrElmt.attribute( QStringLiteral(
"value" ) );
2598 if ( value.isEmpty() )
2600 value = QStringLiteral(
"null" );
2603 properties[name.toStdString()] = value.toStdString();
2606 json[
"features"].push_back(
2608 {
"type",
"Feature" },
2609 {
"id", layerName.toStdString() },
2610 {
"properties", properties }
2616 return QByteArray::fromStdString( json.dump( 2 ) );
2618 return QByteArray::fromStdString( json.dump() );
2622 QDomElement QgsRenderer::createFeatureGML(
2631 QStringList *attributes )
const
2634 QDomElement typeNameElement = doc.createElement(
"qgs:" +
typeName );
2641 typeNameElement.setAttribute( QStringLiteral(
"fid" ), QStringLiteral(
"%1.%2" ).arg(
typeName, fid ) );
2644 if ( layer && layer->
crs() !=
crs )
2677 QDomElement bbElem = doc.createElement( QStringLiteral(
"gml:boundedBy" ) );
2678 QDomElement boxElem;
2690 boxElem.setAttribute( QStringLiteral(
"srsName" ),
crs.
authid() );
2692 bbElem.appendChild( boxElem );
2693 typeNameElement.appendChild( bbElem );
2705 QDomElement geomElem = doc.createElement( QStringLiteral(
"qgs:geometry" ) );
2706 QDomElement gmlElem;
2716 if ( !gmlElem.isNull() )
2720 gmlElem.setAttribute( QStringLiteral(
"srsName" ),
crs.
authid() );
2722 geomElem.appendChild( gmlElem );
2723 typeNameElement.appendChild( geomElem );
2730 for (
int i = 0; i < fields.
count(); ++i )
2732 QString attributeName = fields.
at( i ).
name();
2739 if ( attributes && !attributes->contains( attributeName ) )
2744 QDomElement fieldElem = doc.createElement(
"qgs:" + attributeName.replace(
' ',
'_' ) );
2745 QString fieldTextString = featureAttributes.at( i ).toString();
2750 QDomText fieldText = doc.createTextNode( fieldTextString );
2751 fieldElem.appendChild( fieldText );
2752 typeNameElement.appendChild( fieldElem );
2760 if ( !mapTip.isEmpty() && mWmsParameters.
withMapTip() )
2763 QDomElement fieldElem = doc.createElement( QStringLiteral(
"qgs:maptip" ) );
2764 QDomText maptipText = doc.createTextNode( fieldTextString );
2765 fieldElem.appendChild( maptipText );
2766 typeNameElement.appendChild( fieldElem );
2770 return typeNameElement;
2773 QString QgsRenderer::replaceValueMapAndRelation(
QgsVectorLayer *vl,
int idx,
const QVariant &attributeVal )
2777 QString value( fieldFormatter->
representValue( vl, idx, setup.
config(), QVariant(), attributeVal ) );
2779 if ( setup.
config().value( QStringLiteral(
"AllowMulti" ) ).toBool() && value.startsWith( QLatin1Char(
'{' ) ) && value.endsWith( QLatin1Char(
'}' ) ) )
2781 value = value.mid( 1, value.size() - 2 );
2793 double mapUnitTolerance = 0.0;
2803 mapUnitTolerance = mapSettings.
extent().
width() / 400.0;
2815 mapUnitTolerance = mapSettings.
extent().
width() / 200.0;
2827 mapUnitTolerance = mapSettings.
extent().
width() / 100.0;
2831 QgsRectangle mapRectangle( infoPoint.
x() - mapUnitTolerance, infoPoint.
y() - mapUnitTolerance,
2832 infoPoint.
x() + mapUnitTolerance, infoPoint.
y() + mapUnitTolerance );
2836 QList<QgsMapLayer *> QgsRenderer::highlightLayers( QList<QgsWmsParametersHighlightLayer> params )
2838 QList<QgsMapLayer *> highlightLayers;
2841 QString
crs = mWmsParameters.
crs();
2842 for (
const QgsWmsParametersHighlightLayer ¶m : params )
2845 QDomDocument sldDoc;
2849 if ( !sldDoc.setContent( param.mSld,
true, &errorMsg, &errorLine, &errorColumn ) )
2856 QStringLiteral(
"Server" ), Qgis::MessageLevel::Warning );
2861 std::unique_ptr<QgsFeatureRenderer> renderer;
2862 QDomElement el = sldDoc.documentElement();
2873 if ( ! param.mLabel.isEmpty() )
2875 url +=
"&field=label:string";
2880 std::unique_ptr<QgsVectorLayer> layer = std::make_unique<QgsVectorLayer>( url, param.mName, QLatin1String(
"memory" ), options );
2881 if ( !layer->isValid() )
2888 if ( ! param.mLabel.isEmpty() )
2890 fet.setAttribute( 0, param.mLabel );
2899 switch ( param.mGeom.type() )
2904 palSettings.
dist = 2;
2915 QVariant x( pt.
x() );
2919 QVariant y( pt.
y() );
2923 QVariant hali(
"Center" );
2927 QVariant vali(
"Half" );
2934 palSettings.
dist = 2;
2943 if ( param.mColor.isValid() )
2945 textFormat.
setColor( param.mColor );
2948 if ( param.mSize > 0 )
2950 textFormat.
setSize( param.mSize );
2958 if ( ! param.mFont.isEmpty() )
2960 textFormat.
setFont( param.mFont );
2963 if ( param.mBufferColor.isValid() )
2965 bufferSettings.
setColor( param.mBufferColor );
2968 if ( param.mBufferSize > 0 )
2971 bufferSettings.
setSize(
static_cast<double>( param.mBufferSize ) );
2978 layer->setLabeling( simpleLabeling );
2979 layer->setLabelsEnabled(
true );
2981 fet.setGeometry( param.mGeom );
2985 layer->setRenderer( renderer.release() );
2988 if ( layer->isValid() )
2990 highlightLayers.append( layer.release() );
2994 mTemporaryLayers.append( highlightLayers );
2995 return highlightLayers;
2998 void QgsRenderer::removeTemporaryLayers()
3000 qDeleteAll( mTemporaryLayers );
3001 mTemporaryLayers.clear();
3004 QPainter *QgsRenderer::layersRendering(
const QgsMapSettings &mapSettings, QImage &image )
const
3006 QPainter *painter =
nullptr;
3010 #ifdef HAVE_SERVER_PYTHON_PLUGINS
3011 mContext.accessControl()->resolveFilterFeatures( mapSettings.
layers() );
3015 renderJob.render( mapSettings, &image );
3016 painter = renderJob.takePainter();
3018 if ( !renderJob.errors().isEmpty() )
3020 QString layerWMSName;
3021 QString firstErrorLayerId = renderJob.errors().at( 0 ).layerID;
3028 throw QgsException( QStringLiteral(
"Map rendering error in layer '%1'" ).arg( layerWMSName ) );
3034 void QgsRenderer::setLayerOpacity(
QgsMapLayer *layer,
int opacity )
const
3036 if ( opacity >= 0 && opacity <= 255 )
3038 switch ( layer->
type() )
3051 rasterRenderer->
setOpacity( opacity / 255. );
3066 void QgsRenderer::setLayerFilter(
QgsMapLayer *layer,
const QList<QgsWmsParametersFilter> &filters )
3070 QgsVectorLayer *filteredLayer = qobject_cast<QgsVectorLayer *>( layer );
3071 QStringList expList;
3072 for (
const QgsWmsParametersFilter &filter : filters )
3077 QDomDocument filterXml;
3079 if ( !filterXml.setContent( filter.mFilter,
true, &errorMsg ) )
3082 QStringLiteral(
"Filter string rejected. Error message: %1. The XML string was: %2" ).arg( errorMsg, filter.mFilter ) );
3084 QDomElement filterElem = filterXml.firstChildElement();
3089 expList << filterExp->dump();
3095 if ( !testFilterStringSafety( filter.mFilter ) )
3097 throw QgsSecurityException( QStringLiteral(
"The filter string %1"
3098 " has been rejected because of security reasons."
3099 " Note: Text strings have to be enclosed in single or double quotes."
3100 " A space between each word / special character is mandatory."
3101 " Allowed Keywords and special characters are "
3102 " IS,NOT,NULL,AND,OR,IN,=,<,>=,>,>=,!=,',',(,),DMETAPHONE,SOUNDEX."
3103 " Not allowed are semicolons in the filter expression." ).arg(
3107 QString newSubsetString = filter.mFilter;
3110 newSubsetString.prepend(
") AND (" );
3111 newSubsetString.append(
")" );
3112 newSubsetString.prepend( filteredLayer->
subsetString() );
3113 newSubsetString.prepend(
"(" );
3117 QgsMessageLog::logMessage( QStringLiteral(
"Error setting subset string from filter for layer %1, filter: %2" ).arg( layer->
name(), newSubsetString ),
3118 QStringLiteral(
"Server" ),
3119 Qgis::MessageLevel::Warning );
3121 QStringLiteral(
"Filter not valid for layer %1: check the filter syntax and the field names." ).arg( layer->
name() ) );
3127 expList.append( dimensionFilter( filteredLayer ) );
3131 if ( expList.size() == 1 )
3135 else if ( expList.size() > 1 )
3137 exp = QStringLiteral(
"( %1 )" ).arg( expList.join( QLatin1String(
" ) AND ( " ) ) );
3139 if ( !exp.isEmpty() )
3141 std::unique_ptr<QgsExpression> expression(
new QgsExpression( exp ) );
3144 mFeatureFilter.
setFilter( filteredLayer, *expression );
3150 QStringList QgsRenderer::dimensionFilter(
QgsVectorLayer *layer )
const
3152 QStringList expList;
3155 const QList<QgsMapLayerServerProperties::WmsDimensionInfo> wmsDims = serverProperties->
wmsDimensions();
3156 if ( wmsDims.isEmpty() )
3166 if ( fieldIndex == -1 )
3171 int endFieldIndex = -1;
3172 if ( !dim.endFieldName.isEmpty() )
3174 endFieldIndex = layer->
fields().
indexOf( dim.endFieldName );
3175 if ( endFieldIndex == -1 )
3181 if ( !dimParamValues.contains( dim.name.toUpper() ) )
3191 defValue = dim.referenceValue;
3196 QSet<QVariant> uniqueValues = layer->
uniqueValues( fieldIndex );
3197 if ( endFieldIndex != -1 )
3199 uniqueValues.unite( layer->
uniqueValues( endFieldIndex ) );
3202 QList<QVariant> values = qgis::setToList( uniqueValues );
3203 std::sort( values.begin(), values.end() );
3206 defValue = values.first();
3210 defValue = values.last();
3214 if ( endFieldIndex == -1 )
3220 QStringList expElems;
3225 expList << expElems.join(
' ' );
3233 QString dimParamValue = dimParamValues[dim.name.toUpper()];
3235 QStringList dimExplist;
3237 QStringList dimValues = dimParamValue.split(
',' );
3238 for (
int i = 0; i < dimValues.size(); ++i )
3240 QString dimValue = dimValues[i];
3242 if ( dimValue.size() > 1 )
3244 dimValue = dimValue.trimmed();
3247 if ( dimValue.contains(
'/' ) )
3249 QStringList rangeValues = dimValue.split(
'/' );
3251 if ( rangeValues.size() != 2 )
3256 QVariant rangeMin = QVariant( rangeValues[0] );
3257 QVariant rangeMax = QVariant( rangeValues[1] );
3268 QStringList expElems;
3269 if ( endFieldIndex == -1 )
3289 << QStringLiteral(
")" );
3291 dimExplist << expElems.join(
' ' );
3295 QVariant dimVariant = QVariant( dimValue );
3301 if ( endFieldIndex == -1 )
3310 QStringList expElems;
3315 dimExplist << expElems.join(
' ' );
3320 if ( dimExplist.size() == 1 )
3322 expList << dimExplist;
3324 else if ( dimExplist.size() > 1 )
3326 expList << QStringLiteral(
"( %1 )" ).arg( dimExplist.join( QLatin1String(
" ) OR ( " ) ) );
3333 void QgsRenderer::setLayerSelection(
QgsMapLayer *layer,
const QStringList &fids )
const
3343 if ( selectedIds.empty() )
3354 void QgsRenderer::setLayerAccessControlFilter(
QgsMapLayer *layer )
const
3356 #ifdef HAVE_SERVER_PYTHON_PLUGINS
3374 void QgsRenderer::annotationsRendering( QPainter *painter,
const QgsMapSettings &mapSettings )
const
3377 const QList< QgsAnnotation * > annotations = annotationManager->
annotations();
3383 if ( !annotation || !annotation->isVisible() )
3389 if ( annotation->hasFixedMapPosition() )
3391 QgsPointXY mapPos = annotation->mapPosition();
3392 if ( mapSettings.
destinationCrs() != annotation->mapPositionCrs() )
3397 mapPos = coordTransform.transform( mapPos );
3405 offsetX = devicePos.
x();
3406 offsetY = devicePos.
y();
3410 const QPointF relativePos = annotation->relativePosition();
3411 offsetX = mapSettings.
outputSize().width() * relativePos.x();
3412 offsetY = mapSettings.
outputSize().height() * relativePos.y();
3416 painter->translate( offsetX, offsetY );
3417 annotation->render( renderContext );
3422 QImage *QgsRenderer::scaleImage(
const QImage *image )
const
3427 QImage *scaledImage =
nullptr;
3428 const int width = mWmsParameters.
widthAsInt();
3430 if ( width != image->width() || height != image->height() )
3432 scaledImage =
new QImage( image->scaled( width, height, Qt::IgnoreAspectRatio, Qt::SmoothTransformation ) );
3438 void QgsRenderer::handlePrintErrors(
const QgsLayout *layout )
const
3444 QList< QgsLayoutItemMap * > mapList;
3447 QList< QgsLayoutItemMap * >::const_iterator mapIt = mapList.constBegin();
3448 for ( ; mapIt != mapList.constEnd(); ++mapIt )
3450 if ( !( *mapIt )->renderingErrors().isEmpty() )
3462 for (
auto layer : layers )
3475 setLayerOpacity( layer, param.
mOpacity );
3482 setLayerSld( layer, mContext.
sld( *layer ) );
3486 setLayerStyle( layer, mContext.
style( *layer ) );
3491 setLayerOpacity( layer, param.
mOpacity );
3496 setLayerFilter( layer, param.
mFilter );
3501 setLayerAccessControlFilter( layer );
3506 setLayerSelection( layer, param.
mSelection );
3511 updateExtent( layer, *settings );
3521 void QgsRenderer::setLayerStyle(
QgsMapLayer *layer,
const QString &style )
const
3523 if ( style.isEmpty() )
3532 QStringLiteral(
"Style '%1' does not exist for layer '%2'" ).arg( style, layer->
name() ) );
3536 void QgsRenderer::setLayerSld(
QgsMapLayer *layer,
const QDomElement &sld )
const
3541 QString sldStyleName =
"__sld_style";
3542 while ( styles.contains( sldStyleName ) )
3544 sldStyleName.append(
'@' );
3557 if ( !mWmsParameters.
bbox().isEmpty() )
3561 std::unique_ptr<QImage> tmp( createImage( mContext.
mapSize(
false ) ) );
3562 configureMapSettings( tmp.get(), mapSettings );
@ Antialiasing
Use antialiasing while drawing.
@ 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.
@ UseRenderingOptimization
Enable vector simplification and other rendering optimizations.
@ RenderBlocking
Render and load remote sources in the same thread to ensure rendering remote sources (svg and images)...
Abstract base class for all geometries.
virtual QgsAbstractGeometry * segmentize(double tolerance=M_PI/180., SegmentationToleranceType toleranceType=MaximumAngle) const
Returns a version of the geometry without curves.
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.
This is a container for attribute editors, used to group them visually in the attribute form if it is...
QList< QgsAttributeEditorElement * > children() const
Gets a list of the children elements of this container.
This is an abstract base class for any elements of a drag and drop form.
QString name() const
Returns the name of this element.
@ AeTypeContainer
A container.
This element will load a field's widget onto the form.
Exception thrown in case of malformed request.
This class represents a coordinate reference system (CRS).
static QgsCoordinateReferenceSystem fromOgcWmsCrs(const QString &ogcCrs)
Creates a CRS from a given OGC WMS-format Coordinate Reference System string.
bool isValid() const
Returns whether this CRS is correctly initialized and usable.
Q_GADGET 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.
A server filter to apply a dimension filter to a request.
Defines a QGIS exception class.
static QgsExpressionContextScope * projectScope(const QgsProject *project)
Creates a new scope which contains variables and functions relating to a QGIS project.
static QgsExpressionContextScope * mapSettingsScope(const QgsMapSettings &mapSettings)
Creates a new scope which contains variables and functions relating to a QgsMapSettings object.
static QgsExpressionContextScope * layerScope(const QgsMapLayer *layer)
Creates a new scope which contains variables and functions relating to a QgsMapLayer.
static QgsExpressionContextScope * globalScope()
Creates a new scope which contains variables and functions relating to the global QGIS context.
Expression contexts are used to encapsulate the parameters around which a QgsExpression should be eva...
void setFeature(const QgsFeature &feature)
Convenience function for setting a feature for the context.
Class for parsing and evaluation of expressions (formerly called "search strings").
QString expression() const
Returns the original, unmodified expression string.
static QString quotedValue(const QVariant &value)
Returns a string representation of a literal value, including appropriate quotations where required.
static QString createFieldEqualityExpression(const QString &fieldName, const QVariant &value, QVariant::Type fieldType=QVariant::Type::Invalid)
Create an expression allowing to evaluate if a field is equal to a value.
static QString replaceExpressionText(const QString &action, const QgsExpressionContext *context, const QgsDistanceArea *distanceArea=nullptr)
This function replaces each expression between [% and %] in the string with the result of its evaluat...
static QString quotedColumnRef(QString name)
Returns a quoted column reference (in double quotes)
A filter filter provider grouping several filter providers.
QgsFeatureFilterProviderGroup & addProvider(const QgsFeatureFilterProvider *provider)
Add another filter provider to the group.
void setFilter(const QgsVectorLayer *layer, const QgsExpression &expression)
Set a filter for the given layer.
void filterFeatures(const QgsVectorLayer *layer, QgsFeatureRequest &filterFeatures) const override
Filter the features of the layer.
Wrapper for iterator of features from vector data provider or vector layer.
bool nextFeature(QgsFeature &f)
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.
Flags flags() const
Returns the flags which affect how features are fetched.
QgsFeatureRequest & setSubsetOfAttributes(const QgsAttributeList &attrs)
Set a subset of attributes that will be fetched.
QgsFeatureRequest & setFilterExpression(const QString &expression)
Set the filter expression.
@ ExactIntersect
Use exact geometry intersection (slower) instead of bounding boxes.
@ NoGeometry
Geometry is not required. It may still be returned if e.g. required for a filter condition.
QgsCoordinateTransformContext transformContext() const
Returns the transform context, for use when a destinationCrs() has been set and reprojection is requi...
const QgsFeatureIds & filterFids() const
Returns the feature IDs that should be fetched.
QgsFeatureRequest & setFilterRect(const QgsRectangle &rectangle)
Sets the rectangle from which features will be taken.
A container for features with the same fields and crs.
The feature class encapsulates a single feature including its unique ID, geometry and a list of field...
bool setAttribute(int field, const QVariant &attr)
Sets an attribute's value by field index.
void initAttributes(int fieldCount)
Initialize this feature with the given number of fields.
void setFields(const QgsFields &fields, bool initAttributes=false)
Assigns a field map with the feature to allow attribute access by attribute name.
QVariant attribute(const QString &name) const
Lookup attribute value by attribute name.
void setGeometry(const QgsGeometry &geometry)
Set the feature's geometry.
Encapsulate a field in an attribute table or data source.
bool convertCompatible(QVariant &v, QString *errorMessage=nullptr) const
Converts the provided variant to a compatible format.
ConfigurationFlags configurationFlags
@ HideFromWms
Field is not available if layer is served as WMS from QGIS server.
Container of fields for a vector layer.
bool append(const QgsField &field, FieldOrigin origin=OriginProvider, int originIndex=-1)
Appends a field. The field must have unique name, otherwise it is rejected (returns false)
int indexFromName(const QString &fieldName) const
Gets the field index from the field name.
int indexOf(const QString &fieldName) const
Gets the field index from the field name.
int count() const
Returns number of items.
QgsField at(int i) const
Returns the field at particular index (must be in range 0..N-1).
A geometry is the spatial representation of a feature.
const QgsAbstractGeometry * constGet() const SIP_HOLDGIL
Returns a non-modifiable (const) reference to the underlying abstract geometry primitive.
QgsGeometry pointOnSurface() const
Returns a point guaranteed to lie on the surface of a geometry.
Qgis::GeometryOperationResult transform(const QgsCoordinateTransform &ct, Qgis::TransformDirection direction=Qgis::TransformDirection::Forward, bool transformZ=false) SIP_THROW(QgsCsException)
Transforms this geometry as described by the coordinate transform ct.
QgsPointXY asPoint() const
Returns the contents of the geometry as a 2-dimensional point.
QgsWkbTypes::GeometryType type
void set(QgsAbstractGeometry *geometry)
Sets the underlying geometry store.
static QgsGeometry fromWkt(const QString &wkt)
Creates a new geometry from a WKT string.
QgsRectangle boundingBox() const
Returns the bounding box of the geometry.
QString asWkt(int precision=17) const
Exports the geometry to WKT.
Handles exporting QgsFeature features to GeoJSON features.
void setPlacementFlags(QgsLabeling::LinePlacementFlags flags)
Returns the line placement flags, which dictate how line labels can be placed above or below the line...
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.
Manages QGIS Server properties for a map layer.
QStringList styles() const
Returns list of all defined style names.
bool setCurrentStyle(const QString &name)
Set a different style as the current style - will apply it to the layer.
bool addStyleFromLayer(const QString &name)
Add style by cloning the current one.
Base class for all map layer types.
bool isInScaleRange(double scale) const
Tests whether the layer should be visible at the specified scale.
virtual QgsRectangle extent() const
Returns the extent of the layer.
Q_INVOKABLE QVariant customProperty(const QString &value, const QVariant &defaultValue=QVariant()) const
Read a custom property from layer.
QgsCoordinateReferenceSystem crs
QgsMapLayerServerProperties * serverProperties()
Returns QGIS Server Properties for the map layer.
virtual void setOpacity(double opacity)
Sets the opacity for the layer, where opacity is a value between 0 (totally transparent) and 1....
Q_INVOKABLE void setCustomProperty(const QString &key, const QVariant &value)
Set a custom property for layer.
bool hasScaleBasedVisibility() const
Returns whether scale based visibility is enabled for the layer.
@ Identifiable
If the layer is identifiable using the identify map tool and as a WMS layer.
virtual bool readSld(const QDomNode &node, QString &errorMessage)
QgsMapLayerStyleManager * styleManager() const
Gets access to the layer's style manager.
virtual Q_INVOKABLE QgsDataProvider * dataProvider()
Returns the layer's data provider, it may be nullptr.
The QgsMapSettings class contains configuration for rendering of the map.
QgsPointXY layerToMapCoordinates(const QgsMapLayer *layer, QgsPointXY point) const
transform point coordinates from layer's CRS to output CRS
QList< QgsMapLayer * > layers(bool expandGroupLayers=false) const
Returns the list of layers which will be rendered in the map.
void setSelectionColor(const QColor &color)
Sets the color that is used for drawing of selected vector features.
void setLayers(const QList< QgsMapLayer * > &layers)
Sets the list of layers to render in the map.
double scale() const
Returns the calculated map scale.
QgsCoordinateTransform layerTransform(const QgsMapLayer *layer) const
Returns the coordinate transform from layer's CRS to destination CRS.
QgsRectangle layerExtentToOutputExtent(const QgsMapLayer *layer, QgsRectangle extent) const
transform bounding box from layer's CRS to output CRS
QStringList layerIds(bool expandGroupLayers=false) const
Returns the list of layer IDs which will be rendered in the map.
void setOutputDpi(double dpi)
Sets the dpi (dots per inch) used for conversion between real world units (e.g.
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.
void setOutputSize(QSize size)
Sets the size of the resulting map image, in pixels.
QgsPointXY mapToLayerCoordinates(const QgsMapLayer *layer, QgsPointXY point) const
transform point coordinates from output CRS to layer's CRS
void setBackgroundColor(const QColor &color)
Sets the background color of the map.
QgsCoordinateReferenceSystem destinationCrs() const
Returns the destination coordinate reference system for the map render.
void setFlag(Qgis::MapSettingsFlag flag, bool on=true)
Enable or disable a particular flag (other flags are not affected)
void setDestinationCrs(const QgsCoordinateReferenceSystem &crs)
Sets the destination crs (coordinate reference system) for the map render.
QgsCoordinateTransformContext transformContext() const
Returns the coordinate transform context, which stores various information regarding which datum tran...
QList< QgsMapThemeCollection::MapThemeLayerRecord > layerRecords() const
Returns a list of records for all visible layer belonging to the theme.
QgsMapThemeCollection::MapThemeRecord mapThemeState(const QString &name) const
Returns the recorded state of a map theme.
Perform transforms between map coordinates and device coordinates.
double mapUnitsPerPixel() const
Returns the current map units per pixel.
QgsPointXY transform(const QgsPointXY &p) const
Transforms a point p from map (world) coordinates to device coordinates.
static void logMessage(const QString &message, const QString &tag=QString(), Qgis::MessageLevel level=Qgis::MessageLevel::Warning, bool notifyUser=true)
Adds a message to the log instance (and creates it if necessary).
static void applyAccessControlLayerFilters(const QgsAccessControl *accessControl, QgsMapLayer *mapLayer, QHash< QgsMapLayer *, QString > &originalLayerFilters)
Apply filter from AccessControl.
static QDomElement geometryToGML(const QgsGeometry &geometry, QDomDocument &doc, QgsOgcUtils::GMLVersion gmlVersion, const QString &srsName, bool invertAxisOrientation, const QString &gmlIdBase, int precision=17)
Exports the geometry to GML.
static QDomElement rectangleToGMLEnvelope(QgsRectangle *env, QDomDocument &doc, int precision=17)
Exports the rectangle to GML3 Envelope.
static QgsExpression * expressionFromOgcFilter(const QDomElement &element, QgsVectorLayer *layer=nullptr)
Parse XML with OGC filter into QGIS expression.
static QDomElement rectangleToGMLBox(QgsRectangle *box, QDomDocument &doc, int precision=17)
Exports the rectangle to GML2 Box.
Contains settings for how a map layer will be labeled.
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...
QgsMapThemeCollection * mapThemeCollection
QgsAnnotationManager * annotationManager()
Returns pointer to the project's annotation manager.
QgsCoordinateTransformContext transformContext
const QgsLayoutManager * layoutManager() const
Returns the project's layout manager, which manages print layouts, atlases and reports within the pro...
const QgsLabelingEngineSettings & labelingEngineSettings() const
Returns project's global labeling engine settings.
QMap< QString, QgsMapLayer * > mapLayers(const bool validOnly=false) const
Returns a map of all registered layers by layer ID.
void setProperty(int key, const QgsProperty &property)
Adds a property to the collection and takes ownership of it.
virtual QgsRasterIdentifyResult identify(const QgsPointXY &point, 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.
QgsRasterRenderer * renderer() const
Returns the raster's renderer.
QString bandName(int bandNoInt) const
Returns the name of a band given its number.
QgsRasterDataProvider * dataProvider() override
Returns the source data provider.
Raster renderer pipe that applies colors to a raster.
void setOpacity(double opacity)
Sets the opacity for the renderer, where opacity is a value between 0 (totally transparent) and 1....
A rectangle specified with double values.
double yMaximum() const SIP_HOLDGIL
Returns the y maximum value (top side of rectangle).
double xMaximum() const SIP_HOLDGIL
Returns the x maximum value (right side of rectangle).
double xMinimum() const SIP_HOLDGIL
Returns the x minimum value (left side of rectangle).
double yMinimum() const SIP_HOLDGIL
Returns the y minimum value (bottom side of rectangle).
double height() const SIP_HOLDGIL
Returns the height of the rectangle.
double width() const SIP_HOLDGIL
Returns the width of the rectangle.
void combineExtentWith(const QgsRectangle &rect)
Expands the rectangle so that it covers both the original rectangle and the given rectangle.
bool isEmpty() const
Returns true if the rectangle is empty.
void invert()
Swap x/y coordinates in the rectangle.
bool contains(const QgsRectangle &rect) const SIP_HOLDGIL
Returns true when rectangle contains other rectangle.
Contains information about the context of a rendering operation.
double scaleFactor() const
Returns the scaling factor for the render to convert painter units to physical sizes.
void setCoordinateTransform(const QgsCoordinateTransform &t)
Sets the current coordinate transform for the context.
QgsExpressionContext & expressionContext()
Gets the expression context.
const QgsMapToPixel & mapToPixel() const
Returns the context's map to pixel transform, which transforms between map coordinates and device coo...
void setFlag(Qgis::RenderContextFlag 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...
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.
Exception base class for server exceptions.
int maxThreads() const
Returns the maximum number of threads to use.
bool parallelRendering() const
Returns parallel rendering setting.
const QList< QgsServerWmsDimensionProperties::WmsDimensionInfo > wmsDimensions() const
Returns the QGIS Server WMS Dimension list.
static QString symbolProperties(QgsSymbol *symbol)
Returns a string representing the symbol.
Abstract base class for all rendered symbols.
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.
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.
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.
QgsVectorDataProvider * dataProvider() FINAL
Returns the layer's data provider, it may be nullptr.
QgsEditorWidgetSetup editorWidgetSetup(int index) const
The editor widget setup defines which QgsFieldFormatter and editor widget will be used for the field ...
QgsFeature getFeature(QgsFeatureId fid) const
Queries the layer for the feature with the given id.
Q_INVOKABLE void selectByIds(const QgsFeatureIds &ids, Qgis::SelectBehavior behavior=Qgis::SelectBehavior::SetSelection)
Selects matching features using a list of feature IDs.
virtual bool setSubsetString(const QString &subset)
Sets the string (typically sql) used to define a subset of the layer.
Q_INVOKABLE void selectByExpression(const QString &expression, Qgis::SelectBehavior behavior=Qgis::SelectBehavior::SetSelection)
Selects matching features using an expression.
QgsAttributeList primaryKeyAttributes() const
Returns the list of attributes which make up the layer's primary keys.
QgsEditFormConfig editFormConfig
QSet< QVariant > uniqueValues(int fieldIndex, int limit=-1) const FINAL
Calculates a list of unique values contained within an attribute in the layer.
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
Point cloud layer. Added in QGIS 3.18.
@ MeshLayer
Mesh layer. Added in QGIS 3.2.
@ VectorLayer
Vector layer.
@ RasterLayer
Raster layer.
@ GroupLayer
Composite group layer. Added in QGIS 3.24.
@ VectorTileLayer
Vector tile layer. Added in QGIS 3.14.
@ AnnotationLayer
Contains freeform, georeferenced annotations. Added in QGIS 3.16.
@ PluginLayer
Plugin based layer.
SERVER_EXPORT QString getExpressionFromServerFid(const QString &serverFid, const QgsVectorDataProvider *provider)
Returns the expression feature id based on primary keys.
SERVER_EXPORT QgsFeatureRequest updateFeatureRequestFromServerFids(QgsFeatureRequest &featureRequest, const QStringList &serverFids, const QgsVectorDataProvider *provider)
Returns the feature request based on feature ids build with primary keys.
SERVER_EXPORT QString getServerFid(const QgsFeature &feature, const QgsAttributeList &pkAttributes)
Returns the feature id based on primary keys.
SERVER_EXPORT QString wmsFeatureInfoSchema(const QgsProject &project)
Returns the schema URL for XML GetFeatureInfo request.
SERVER_EXPORT bool wmsInfoFormatSia2045(const QgsProject &project)
Returns if the info format is SIA20145.
SERVER_EXPORT QString wmsFeatureInfoDocumentElementNs(const QgsProject &project)
Returns the document element namespace for XML GetFeatureInfo request.
SERVER_EXPORT QStringList wmsRestrictedComposers(const QgsProject &project)
Returns the restricted composer list.
SERVER_EXPORT bool wmsFeatureInfoSegmentizeWktGeometry(const QgsProject &project)
Returns if the geometry has to be segmentize in GetFeatureInfo request.
SERVER_EXPORT bool wmsFeatureInfoUseAttributeFormSettings(const QgsProject &project)
Returns if feature form settings should be considered for the format of the feature info response.
SERVER_EXPORT QHash< QString, QString > wmsFeatureInfoLayerAliasMap(const QgsProject &project)
Returns the mapping between layer name and wms layer name for GetFeatureInfo request.
SERVER_EXPORT bool wmsFeatureInfoAddWktGeometry(const QgsProject &project)
Returns if the geometry is displayed as Well Known Text in GetFeatureInfo request.
SERVER_EXPORT double wmsDefaultMapUnitsPerMm(const QgsProject &project)
Returns the default number of map units per millimeters in case of the scale is not given.
SERVER_EXPORT QString wmsFeatureInfoDocumentElement(const QgsProject &project)
Returns the document element name for XML GetFeatureInfo request.
SERVER_EXPORT int wmsMaxAtlasFeatures(const QgsProject &project)
Returns the maximum number of atlas features which can be printed in a request.
Median cut implementation.
As part of the API refactoring and improvements which landed in the Processing API was substantially reworked from the x version This was done in order to allow much of the underlying Processing framework to be ported into c
#define Q_NOWARN_DEPRECATED_POP
QString qgsDoubleToString(double a, int precision=17)
Returns a string representation of a double.
#define Q_NOWARN_DEPRECATED_PUSH
QList< QgsFeature > QgsFeatureList
QSet< QgsFeatureId > QgsFeatureIds
#define FID_TO_STRING(fid)
QVector< QgsFeatureStore > QgsFeatureStoreList
QList< int > QgsAttributeList
#define QgsDebugMsgLevel(str, level)
const QgsCoordinateReferenceSystem & outputCrs
const QgsCoordinateReferenceSystem & crs
Layers and optional attribute index to split into multiple layers using attribute value as layer name...
QPainter * painter
Painter.
Contains settings relating to exporting layouts to raster images.
QList< int > pages
List of specific pages to export, or an empty list to export all pages.
QSize imageSize
Manual size in pixels for output image.
QgsLayoutRenderContext::Flags flags
Layout context flags, which control how the export will be created.
double dpi
Resolution to export layout at. If dpi <= 0 the default layout dpi will be used.
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.
@ MinValue
Add selection to current selection.
@ MaxValue
Modify current selection to include only select features which match.
@ AllValues
Display all values of the dimension.
@ ReferenceValue
Remove from current selection.
Setting options for loading vector layers.
QList< QgsWmsParametersLayer > mLayers
QList< QgsWmsParametersHighlightLayer > mHighlightLayers
QList< QgsWmsParametersFilter > mFilter