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() )
326 QStringLiteral(
"The template has no pages" ) );
329 std::unique_ptr<QgsPrintLayout> layout( sourceLayout->
clone() );
333 QStringList atlasPk = mWmsParameters.
atlasPk();
334 if ( !atlasPk.isEmpty() )
336 atlas = layout->atlas();
337 if ( !atlas || !atlas->
enabled() )
341 QStringLiteral(
"The template has no atlas enabled" ) );
348 QStringLiteral(
"The atlas has no coverage layer" ) );
352 if ( atlasPk.size() == 1 && atlasPk.at( 0 ) == QLatin1String(
"*" ) )
356 if ( atlas->
count() > maxAtlasFeatures )
359 QString(
"The project configuration allows printing maximum %1 atlas features at a time" ).arg( maxAtlasFeatures ) );
365 if ( pkIndexes.size() == 0 )
367 QgsDebugMsgLevel( QStringLiteral(
"Atlas print: layer %1 has no primary key attributes" ).arg( cLayer->
name() ), 2 );
371 const int pkIndexesSize {std::max( pkIndexes.size(), 1 )};
373 QStringList pkAttributeNames;
374 for (
int pkIndex : std::as_const( pkIndexes ) )
376 pkAttributeNames.append( cLayer->
fields().
at( pkIndex ).
name() );
379 const int nAtlasFeatures = atlasPk.size() / pkIndexesSize;
380 if ( nAtlasFeatures * pkIndexesSize != atlasPk.size() )
383 QStringLiteral(
"Wrong number of ATLAS_PK parameters" ) );
387 if ( nAtlasFeatures > maxAtlasFeatures )
390 QString(
"%1 atlas features have been requested, but the project configuration only allows printing %2 atlas features at a time" )
391 .arg( nAtlasFeatures ).arg( maxAtlasFeatures ) );
394 QString filterString;
395 int currentAtlasPk = 0;
397 for (
int i = 0; i < nAtlasFeatures; ++i )
401 filterString.append(
" OR " );
404 filterString.append(
"( " );
407 if ( pkAttributeNames.isEmpty() )
409 filterString.append( QStringLiteral(
"$id = %1" ).arg( atlasPk.at( currentAtlasPk ) ) );
414 for (
int j = 0; j < pkIndexes.size(); ++j )
418 filterString.append(
" AND " );
425 filterString.append(
" )" );
431 if ( !errorString.isEmpty() )
433 throw QgsException( QStringLiteral(
"An error occurred during the Atlas print: %1" ).arg( errorString ) );
445 std::unique_ptr<QImage> image(
new QImage() );
446 configureMapSettings( image.get(), mapSettings );
452 configurePrintLayout( layout.get(), mapSettings, atlas );
456 const QList<QgsMapLayer *> lyrs = mapSettings.
layers();
458 #ifdef HAVE_SERVER_PYTHON_PLUGINS
459 mContext.accessControl()->resolveFilterFeatures( lyrs );
463 QMap<const QgsVectorLayer *, QStringList> fltrs;
468 fltrs.insert( vl, dimensionFilter( vl ) );
480 QTemporaryFile tempOutputFile( QDir::tempPath() +
'/' + QStringLiteral(
"XXXXXX.%1" ).arg( extension ) );
481 if ( !tempOutputFile.open() )
483 throw QgsException( QStringLiteral(
"Could not open temporary file for the GetPrint request." ) );
492 if ( !mWmsParameters.
dpi().isEmpty() )
495 double dpi( mWmsParameters.
dpi().toDouble( &ok ) );
497 exportSettings.
dpi = dpi;
508 atlasSvgExport.
exportToSvg( tempOutputFile.fileName(), exportSettings );
514 exporter.
exportToSvg( tempOutputFile.fileName(), exportSettings );
523 double dpi( layout->renderContext().dpi( ) );
524 if ( !mWmsParameters.
dpi().isEmpty() )
527 double _dpi = mWmsParameters.
dpi().toDouble( &ok );
531 exportSettings.
dpi = dpi;
535 QgsLayoutSize layoutSize( layout->pageCollection()->page( 0 )->sizeWithUnits() );
537 QgsLayoutMeasurement width( layout->convertFromLayoutUnits( layoutSize.
width(), QgsUnitTypes::LayoutUnit::LayoutMillimeters ) );
538 QgsLayoutMeasurement height( layout->convertFromLayoutUnits( layoutSize.
height(), QgsUnitTypes::LayoutUnit::LayoutMillimeters ) );
540 const QSize imageSize = QSize(
static_cast<int>( width.
length() * dpi / 25.4 ),
static_cast<int>( height.
length() * dpi / 25.4 ) );
542 const QString paramWidth = mWmsParameters.
width();
543 const QString paramHeight = mWmsParameters.
height();
548 if ( !paramWidth.isEmpty() && !paramHeight.isEmpty() )
550 exportSettings.
imageSize = QSize( paramWidth.toInt(), paramHeight.toInt() );
552 else if ( !paramWidth.isEmpty() && paramHeight.isEmpty() )
554 exportSettings.
imageSize = QSize( paramWidth.toInt(),
static_cast<double>( paramWidth.toInt() ) / imageSize.width() * imageSize.height() );
556 else if ( paramWidth.isEmpty() && !paramHeight.isEmpty() )
558 exportSettings.
imageSize = QSize(
static_cast<double>( paramHeight.toInt() ) / imageSize.height() * imageSize.width(), paramHeight.toInt() );
566 exportSettings.
pages.append( 0 );
574 atlasPngExport.
exportToImage( tempOutputFile.fileName(), exportSettings );
578 throw QgsServiceException( QStringLiteral(
"Bad request" ), QStringLiteral(
"Atlas error: empty atlas." ), QString(), 400 );
584 exporter.
exportToImage( tempOutputFile.fileName(), exportSettings );
592 if ( !mWmsParameters.
dpi().isEmpty() )
595 double dpi( mWmsParameters.
dpi().toDouble( &ok ) );
597 exportSettings.
dpi = dpi;
602 exportSettings.
rasterizeWholeImage = layout->customProperty( QStringLiteral(
"rasterize" ),
false ).toBool();
608 exporter.
exportToPdf( atlas, tempOutputFile.fileName(), exportSettings, exportError );
612 exporter.
exportToPdf( tempOutputFile.fileName(), exportSettings );
623 handlePrintErrors( atlas->
layout() );
627 handlePrintErrors( layout.get() );
630 return tempOutputFile.readAll();
638 QList<QgsLayoutItemMap *> maps;
644 for (
const auto &map : std::as_const( maps ) )
649 if ( !atlasPrint || !map->atlasDriven() )
655 c->removeLayoutItem( map );
673 if ( cMapParams.
mScale > 0 )
675 map->setScale(
static_cast<double>( cMapParams.
mScale ) );
681 map->setMapRotation( cMapParams.
mRotation );
685 if ( !map->keepLayerSet() )
687 QList<QgsMapLayer *> layerSet;
688 if ( cMapParams.
mLayers.isEmpty() )
690 layerSet = mapSettings.
layers();
694 for (
auto layer : cMapParams.
mLayers )
698 QList<QgsMapLayer *> layersFromGroup;
700 const QList<QgsMapLayer *> cLayersFromGroup = mContext.
layersFromGroup( layer.mNickname );
701 for (
QgsMapLayer *layerFromGroup : cLayersFromGroup )
704 if ( ! layerFromGroup )
709 layersFromGroup.push_front( layerFromGroup );
712 if ( !layersFromGroup.isEmpty() )
714 layerSet.append( layersFromGroup );
726 setLayerStyle( mlayer, layer.mStyle );
730 std::reverse( layerSet.begin(), layerSet.end() );
736 QMap<QString, QString> layersStyle;
737 if ( map->followVisibilityPreset() )
739 const QString presetName = map->followVisibilityPresetName();
740 if ( layerSet.isEmpty() )
744 layerSet = map->layersToRender( &ex );
747 map->setFollowVisibilityPreset(
false );
751 for (
const auto &layerMapThemeRecord : std::as_const( mapThemeRecords ) )
753 if ( layerSet.contains( layerMapThemeRecord.layer() ) )
755 layersStyle.insert( layerMapThemeRecord.layer()->id(),
756 layerMapThemeRecord.layer()->styleManager()->style( layerMapThemeRecord.currentStyle ).xmlData() );
762 const QList< QgsMapLayer *> highlights = highlightLayers( cMapParams.
mHighlightLayers );
763 for (
const auto &hl : std::as_const( highlights ) )
765 layerSet.prepend( hl );
768 map->setLayers( layerSet );
769 map->setKeepLayerSet(
true );
773 if ( !layersStyle.isEmpty() )
775 map->setLayerStyleOverrides( layersStyle );
776 map->setKeepLayerStyles(
true );
783 map->grid()->setIntervalX(
static_cast<double>( cMapParams.
mGridX ) );
784 map->grid()->setIntervalY(
static_cast<double>( cMapParams.
mGridY ) );
789 QList<QgsLayoutItemLabel *> labels;
791 for (
const auto &label : std::as_const( labels ) )
794 const QString labelId = label->
id();
795 const QString labelParam = mWmsParameters.
layoutParameter( labelId, ok );
800 if ( labelParam.isEmpty() )
804 c->removeItem( label );
809 label->setText( labelParam );
813 QList<QgsLayoutItemHtml *> htmls;
815 for (
const auto &html : std::as_const( htmls ) )
817 if ( html->frameCount() == 0 )
822 const QString htmlId = htmlFrame->
id();
835 c->removeMultiFrame( html );
841 html->setUrl( newUrl );
847 QList<QgsLayoutItemLegend *> legends;
849 for (
const auto &legend : std::as_const( legends ) )
851 if ( legend->autoUpdateModel() )
861 legend->setAutoUpdateModel(
false );
865 QStringList layerSet;
866 QList<QgsMapLayer *> mapLayers;
867 if ( map->
layers().isEmpty() )
871 mapLayers = mProject->
mapLayers(
true ).values();
875 mapLayers = map->
layers();
877 const QList<QgsMapLayer *> layerList = mapLayers;
878 for (
const auto &layer : layerList )
879 layerSet << layer->id();
891 for (
const auto &layerId : layerIds )
898 if ( !layerSet.contains( layerId ) )
900 qobject_cast<QgsLayerTreeGroup *>( nodeLayer->
parent() )->removeChildNode( nodeLayer );
907 qobject_cast<QgsLayerTreeGroup *>( nodeLayer->
parent() )->removeChildNode( nodeLayer );
923 QStringLiteral(
"The requested map size is too large" ) );
927 std::unique_ptr<QgsWmsRestorer> restorer;
938 std::unique_ptr<QPainter> painter;
939 std::unique_ptr<QImage> image( createImage( mContext.
mapSize() ) );
942 configureMapSettings( image.get(), mapSettings );
948 painter.reset( layersRendering( mapSettings, *image ) );
951 annotationsRendering( painter.get(), mapSettings );
957 QImage *scaledImage = scaleImage( image.get() );
959 image.reset( scaledImage );
962 return image.release();
968 std::unique_ptr<QgsWmsRestorer> restorer;
977 QList< QgsDxfExport::DxfLayer > dxfLayers;
989 int layerAttribute = -1;
990 if ( attributes.size() > layerIdx )
1001 QString
crs = mWmsParameters.
crs();
1002 if (
crs.compare( QStringLiteral(
"CRS:84" ), Qt::CaseInsensitive ) == 0 )
1004 crs = QStringLiteral(
"EPSG:4326" );
1007 else if (
crs.isEmpty() )
1009 crs = QStringLiteral(
"EPSG:4326" );
1043 std::unique_ptr<QgsDxfExport> dxf = std::make_unique<QgsDxfExport>();
1044 dxf->setExtent( mapExtent );
1045 dxf->setDestinationCrs( outputCRS );
1046 dxf->addLayers( dxfLayers );
1048 dxf->setSymbologyExport( mWmsParameters.
dxfMode() );
1049 if ( mWmsParameters.
dxfFormatOptions().contains( QgsWmsParameters::DxfFormatOption::SCALE ) )
1051 dxf->setSymbologyScale( mWmsParameters.
dxfScale() );
1054 dxf->setForce2d( mWmsParameters.
isForce2D() );
1055 QgsDxfExport::Flags flags;
1056 if ( mWmsParameters.
noMText() )
1057 flags.setFlag( QgsDxfExport::Flag::FlagNoMText );
1059 dxf->setFlags( flags );
1067 if ( i < 0 || i > mapSettings.
outputSize().width() )
1075 if ( j < 0 || j > mapSettings.
outputSize().height() )
1100 const bool ijDefined = !mWmsParameters.
i().isEmpty() && !mWmsParameters.
j().isEmpty();
1101 const bool xyDefined = !mWmsParameters.
x().isEmpty() && !mWmsParameters.
y().isEmpty();
1102 const bool filtersDefined = !mWmsParameters.
filters().isEmpty();
1103 const bool filterGeomDefined = !mWmsParameters.
filterGeom().isEmpty();
1105 if ( !ijDefined && !xyDefined && !filtersDefined && !filterGeomDefined )
1109 if ( mWmsParameters.
j().isEmpty() )
1116 if ( infoFormat == QgsWmsParameters::Format::NONE )
1123 std::unique_ptr<QImage> outputImage( createImage( mContext.
mapSize() ) );
1126 std::unique_ptr<QgsWmsRestorer> restorer;
1131 bool mandatoryCrsParam =
true;
1132 if ( filtersDefined && !ijDefined && !xyDefined && mWmsParameters.
crs().isEmpty() )
1134 mandatoryCrsParam =
false;
1140 configureMapSettings( outputImage.get(), mapSettings, mandatoryCrsParam );
1156 #ifdef HAVE_SERVER_PYTHON_PLUGINS
1157 mContext.accessControl()->resolveFilterFeatures( mapSettings.
layers() );
1160 QDomDocument result = featureInfoDocument( layers, mapSettings, outputImage.get(), version );
1164 if ( infoFormat == QgsWmsParameters::Format::TEXT )
1165 ba = convertFeatureInfoToText( result );
1166 else if ( infoFormat == QgsWmsParameters::Format::HTML )
1167 ba = convertFeatureInfoToHtml( result );
1168 else if ( infoFormat == QgsWmsParameters::Format::JSON )
1169 ba = convertFeatureInfoToJson( layers, result );
1171 ba = result.toByteArray();
1176 QImage *QgsRenderer::createImage(
const QSize &size )
const
1178 std::unique_ptr<QImage> image;
1186 image = std::make_unique<QImage>( size, QImage::Format_ARGB32_Premultiplied );
1191 image = std::make_unique<QImage>( size, QImage::Format_RGB32 );
1196 if ( image->isNull() )
1198 throw QgsException( QStringLiteral(
"createImage: image could not be created, check for out of memory conditions" ) );
1201 const int dpm =
static_cast<int>( mContext.
dotsPerMm() * 1000.0 );
1202 image->setDotsPerMeterX( dpm );
1203 image->setDotsPerMeterY( dpm );
1205 return image.release();
1208 void QgsRenderer::configureMapSettings(
const QPaintDevice *paintDevice,
QgsMapSettings &mapSettings,
bool mandatoryCrsParam )
const
1212 throw QgsException( QStringLiteral(
"configureMapSettings: no paint device" ) );
1215 mapSettings.
setOutputSize( QSize( paintDevice->width(), paintDevice->height() ) );
1222 if ( !mWmsParameters.
bbox().isEmpty() && mapExtent.
isEmpty() )
1228 QString
crs = mWmsParameters.
crs();
1229 if (
crs.compare(
"CRS:84", Qt::CaseInsensitive ) == 0 )
1231 crs = QString(
"EPSG:4326" );
1234 else if (
crs.isEmpty() && !mandatoryCrsParam )
1236 crs = QString(
"EPSG:4326" );
1246 QgsWmsParameter parameter;
1288 else if ( backgroundColor.isValid() )
1310 QDomDocument QgsRenderer::featureInfoDocument( QList<QgsMapLayer *> &layers,
const QgsMapSettings &mapSettings,
1311 const QImage *outputImage,
const QString &version )
const
1315 bool ijDefined = ( !mWmsParameters.
i().isEmpty() && !mWmsParameters.
j().isEmpty() );
1317 bool xyDefined = ( !mWmsParameters.
x().isEmpty() && !mWmsParameters.
y().isEmpty() );
1319 bool filtersDefined = !mWmsParameters.
filters().isEmpty();
1321 bool filterGeomDefined = !mWmsParameters.
filterGeom().isEmpty();
1324 if ( featureCount < 1 )
1329 int i = mWmsParameters.
iAsInt();
1330 int j = mWmsParameters.
jAsInt();
1331 if ( xyDefined && !ijDefined )
1333 i = mWmsParameters.
xAsInt();
1334 j = mWmsParameters.
yAsInt();
1338 if ( ( i != -1 && j != -1 && width != 0 && height != 0 ) && ( width != outputImage->width() || height != outputImage->height() ) )
1340 i *= ( outputImage->width() /
static_cast<double>( width ) );
1341 j *= ( outputImage->height() /
static_cast<double>( height ) );
1345 std::unique_ptr<QgsRectangle> featuresRect;
1346 std::unique_ptr<QgsGeometry> filterGeom;
1347 std::unique_ptr<QgsPointXY> infoPoint;
1349 if ( i != -1 && j != -1 )
1352 infoPointToMapCoordinates( i, j, infoPoint.get(), mapSettings );
1354 else if ( filtersDefined )
1358 else if ( filterGeomDefined )
1363 QDomDocument result;
1365 QDomElement getFeatureInfoElement;
1367 if ( infoFormat == QgsWmsParameters::Format::GML )
1369 getFeatureInfoElement = result.createElement( QStringLiteral(
"wfs:FeatureCollection" ) );
1370 getFeatureInfoElement.setAttribute( QStringLiteral(
"xmlns:wfs" ), QStringLiteral(
"http://www.opengis.net/wfs" ) );
1371 getFeatureInfoElement.setAttribute( QStringLiteral(
"xmlns:ogc" ), QStringLiteral(
"http://www.opengis.net/ogc" ) );
1372 getFeatureInfoElement.setAttribute( QStringLiteral(
"xmlns:gml" ), QStringLiteral(
"http://www.opengis.net/gml" ) );
1373 getFeatureInfoElement.setAttribute( QStringLiteral(
"xmlns:ows" ), QStringLiteral(
"http://www.opengis.net/ows" ) );
1374 getFeatureInfoElement.setAttribute( QStringLiteral(
"xmlns:xlink" ), QStringLiteral(
"http://www.w3.org/1999/xlink" ) );
1375 getFeatureInfoElement.setAttribute( QStringLiteral(
"xmlns:qgs" ), QStringLiteral(
"http://qgis.org/gml" ) );
1376 getFeatureInfoElement.setAttribute( QStringLiteral(
"xmlns:xsi" ), QStringLiteral(
"http://www.w3.org/2001/XMLSchema-instance" ) );
1377 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" ) );
1382 if ( featureInfoElemName.isEmpty() )
1384 featureInfoElemName = QStringLiteral(
"GetFeatureInfoResponse" );
1387 if ( featureInfoElemNs.isEmpty() )
1389 getFeatureInfoElement = result.createElement( featureInfoElemName );
1393 getFeatureInfoElement = result.createElementNS( featureInfoElemNs, featureInfoElemName );
1397 if ( !featureInfoSchema.isEmpty() )
1399 getFeatureInfoElement.setAttribute( QStringLiteral(
"xmlns:xsi" ), QStringLiteral(
"http://www.w3.org/2001/XMLSchema-instance" ) );
1400 getFeatureInfoElement.setAttribute( QStringLiteral(
"xsi:schemaLocation" ), featureInfoSchema );
1403 result.appendChild( getFeatureInfoElement );
1413 for (
const QString &queryLayer : queryLayers )
1415 bool validLayer =
false;
1416 bool queryableLayer =
true;
1417 for (
QgsMapLayer *layer : std::as_const( layers ) )
1423 if ( !queryableLayer )
1428 QDomElement layerElement;
1429 if ( infoFormat == QgsWmsParameters::Format::GML )
1431 layerElement = getFeatureInfoElement;
1435 layerElement = result.createElement( QStringLiteral(
"Layer" ) );
1436 QString layerName = queryLayer;
1439 QHash<QString, QString>::const_iterator layerAliasIt = layerAliasMap.constFind( layerName );
1440 if ( layerAliasIt != layerAliasMap.constEnd() )
1442 layerName = layerAliasIt.value();
1445 layerElement.setAttribute( QStringLiteral(
"name" ), layerName );
1446 getFeatureInfoElement.appendChild( layerElement );
1449 layerElement.setAttribute( QStringLiteral(
"id" ), layer->id() );
1455 QgsVectorLayer *vectorLayer = qobject_cast<QgsVectorLayer *>( layer );
1458 ( void )featureInfoFromVectorLayer( vectorLayer, infoPoint.get(), featureCount, result, layerElement, mapSettings, renderContext, version, featuresRect.get(), filterGeom.get() );
1464 QgsRasterLayer *rasterLayer = qobject_cast<QgsRasterLayer *>( layer );
1473 QgsPointXY layerInfoPoint = mapSettings.mapToLayerCoordinates( layer, *( infoPoint.get() ) );
1478 if ( infoFormat == QgsWmsParameters::Format::GML )
1480 layerElement = result.createElement( QStringLiteral(
"gml:featureMember" ) );
1481 getFeatureInfoElement.appendChild( layerElement );
1484 ( void )featureInfoFromRasterLayer( rasterLayer, mapSettings, &layerInfoPoint, result, layerElement, version );
1492 param.mValue = queryLayer;
1496 else if ( ( validLayer && !queryableLayer ) || ( !validLayer && mContext.
isValidGroup( queryLayer ) ) )
1499 param.mValue = queryLayer;
1501 bool hasGroupAndQueryable {
false };
1506 for (
const QString &ql : constNicks )
1510 const QList<QgsMapLayer *> constLayers { mContext.
layerGroups()[ql] };
1513 if ( ( ! ml->shortName().isEmpty() && ml->shortName() == queryLayer ) || ( ml->name() == queryLayer ) )
1519 hasGroupAndQueryable =
true;
1528 if ( ! hasGroupAndQueryable )
1538 if ( infoFormat == QgsWmsParameters::Format::GML )
1540 QDomElement bBoxElem = result.createElement( QStringLiteral(
"gml:boundedBy" ) );
1541 QDomElement boxElem;
1543 if ( gmlVersion < 3 )
1555 boxElem.setAttribute( QStringLiteral(
"srsName" ),
crs.
authid() );
1557 bBoxElem.appendChild( boxElem );
1558 getFeatureInfoElement.insertBefore( bBoxElem, QDomNode() );
1562 QDomElement bBoxElem = result.createElement( QStringLiteral(
"BoundingBox" ) );
1563 bBoxElem.setAttribute( QStringLiteral(
"CRS" ), mapSettings.destinationCrs().authid() );
1564 bBoxElem.setAttribute( QStringLiteral(
"minx" ),
qgsDoubleToString( featuresRect->xMinimum(), 8 ) );
1565 bBoxElem.setAttribute( QStringLiteral(
"maxx" ),
qgsDoubleToString( featuresRect->xMaximum(), 8 ) );
1566 bBoxElem.setAttribute( QStringLiteral(
"miny" ),
qgsDoubleToString( featuresRect->yMinimum(), 8 ) );
1567 bBoxElem.setAttribute( QStringLiteral(
"maxy" ),
qgsDoubleToString( featuresRect->yMaximum(), 8 ) );
1568 getFeatureInfoElement.insertBefore( bBoxElem, QDomNode() );
1572 if ( sia2045 && infoFormat == QgsWmsParameters::Format::XML )
1574 convertFeatureInfoToSia2045( result );
1580 bool QgsRenderer::featureInfoFromVectorLayer(
QgsVectorLayer *layer,
1583 QDomDocument &infoDocument,
1584 QDomElement &layerElement,
1587 const QString &version,
1599 std::unique_ptr<QgsGeometry> layerFilterGeom;
1602 layerFilterGeom.reset(
new QgsGeometry( *filterGeom ) );
1616 searchRect = featureInfoSearchRect( layer, mapSettings, renderContext, *infoPoint );
1618 else if ( layerFilterGeom )
1620 searchRect = layerFilterGeom->boundingBox();
1622 else if ( !mWmsParameters.
bbox().isEmpty() )
1624 searchRect = layerRect;
1631 int featureCounter = 0;
1650 if ( layerFilterGeom )
1652 fReq.
setFilterExpression( QString(
"intersects( $geometry, geom_from_wkt('%1') )" ).arg( layerFilterGeom->asWkt() ) );
1657 #ifdef HAVE_SERVER_PYTHON_PLUGINS
1658 mContext.accessControl()->filterFeatures( layer, fReq );
1660 QStringList attributes;
1665 attributes = mContext.accessControl()->layerAttributes( layer, attributes );
1670 std::unique_ptr< QgsFeatureRenderer > r2( layer->
renderer() ? layer->
renderer()->
clone() :
nullptr );
1673 r2->startRender( renderContext, layer->
fields() );
1676 bool featureBBoxInitialized =
false;
1685 if ( featureCounter > nFeatures )
1700 bool render = r2->willRenderFeature( feature, renderContext );
1713 if ( !featureBBoxInitialized && featureBBox->
isEmpty() )
1716 featureBBoxInitialized =
true;
1731 if ( mWmsParameters.
infoFormat() == QgsWmsParameters::Format::GML )
1736 QDomElement elem = createFeatureGML(
1738 #ifdef HAVE_SERVER_PYTHON_PLUGINS
1742 QDomElement featureMemberElem = infoDocument.createElement( QStringLiteral(
"gml:featureMember" ) );
1743 featureMemberElem.appendChild( elem );
1744 layerElement.appendChild( featureMemberElem );
1749 QDomElement featureElement = infoDocument.createElement( QStringLiteral(
"Feature" ) );
1751 layerElement.appendChild( featureElement );
1757 writeAttributesTabLayout( editConfig, layer, fields, featureAttributes, infoDocument, featureElement, renderContext
1758 #ifdef HAVE_SERVER_PYTHON_PLUGINS
1765 for (
int i = 0; i < featureAttributes.count(); ++i )
1767 writeVectorLayerAttribute( i, layer, fields, featureAttributes, infoDocument, featureElement, renderContext
1768 #ifdef HAVE_SERVER_PYTHON_PLUGINS
1777 if ( !mapTip.isEmpty() && mWmsParameters.
withMapTip() )
1779 QDomElement maptipElem = infoDocument.createElement( QStringLiteral(
"Attribute" ) );
1780 maptipElem.setAttribute( QStringLiteral(
"name" ), QStringLiteral(
"maptip" ) );
1782 featureElement.appendChild( maptipElem );
1789 QDomElement bBoxElem = infoDocument.createElement( QStringLiteral(
"BoundingBox" ) );
1790 bBoxElem.setAttribute( version == QLatin1String(
"1.1.1" ) ?
"SRS" :
"CRS",
outputCrs.
authid() );
1795 featureElement.appendChild( bBoxElem );
1811 if ( segmentizeWktGeometry )
1819 geom.
set( segmentizedGeom );
1823 QDomElement geometryElement = infoDocument.createElement( QStringLiteral(
"Attribute" ) );
1824 geometryElement.setAttribute( QStringLiteral(
"name" ), QStringLiteral(
"geometry" ) );
1825 geometryElement.setAttribute( QStringLiteral(
"value" ), geom.
asWkt( mContext.
precision() ) );
1826 geometryElement.setAttribute( QStringLiteral(
"type" ), QStringLiteral(
"derived" ) );
1827 featureElement.appendChild( geometryElement );
1834 r2->stopRender( renderContext );
1845 QString groupName = container->
name();
1846 QDomElement nameElem;
1848 if ( !groupName.isEmpty() )
1850 nameElem = doc.createElement( groupName );
1851 parentElem.appendChild( nameElem );
1854 const QList<QgsAttributeEditorElement *> children = container->
children();
1859 writeAttributesTabGroup( child, layer, fields, featureAttributes, doc, nameElem.isNull() ? parentElem : nameElem, renderContext );
1866 writeVectorLayerAttribute( editorField->
idx(), layer, fields, featureAttributes, doc, nameElem.isNull() ? parentElem : nameElem, renderContext, attributes );
1876 if ( !editorContainer )
1881 writeAttributesTabGroup( editorContainer, layer, fields, featureAttributes, doc, featureElem, renderContext, attributes );
1884 void QgsRenderer::writeVectorLayerAttribute(
int attributeIndex,
QgsVectorLayer *layer,
const QgsFields &fields,
QgsAttributes &featureAttributes, QDomDocument &doc, QDomElement &featureElem,
QgsRenderContext &renderContext, QStringList *attributes )
const
1886 #ifndef HAVE_SERVER_PYTHON_PLUGINS
1887 Q_UNUSED( attributes );
1900 #ifdef HAVE_SERVER_PYTHON_PLUGINS
1902 if ( attributes && !attributes->contains( fields.
at( attributeIndex ).
name() ) )
1909 QDomElement attributeElement = doc.createElement( QStringLiteral(
"Attribute" ) );
1910 attributeElement.setAttribute( QStringLiteral(
"name" ), attributeName );
1912 attributeElement.setAttribute( QStringLiteral(
"value" ),
1914 replaceValueMapAndRelation(
1915 layer, attributeIndex,
1916 featureAttributes[attributeIndex] ),
1919 featureElem.appendChild( attributeElement );
1922 bool QgsRenderer::featureInfoFromRasterLayer(
QgsRasterLayer *layer,
1925 QDomDocument &infoDocument,
1926 QDomElement &layerElement,
1927 const QString &version )
const
1946 ? QgsRaster::IdentifyFormat::IdentifyFormatFeature
1947 : QgsRaster::IdentifyFormat::IdentifyFormatValue );
1959 .arg( layer->
name() ) );
1968 if ( !identifyResult.
isValid() )
1971 QMap<int, QVariant> attributes = identifyResult.
results();
1973 if ( mWmsParameters.
infoFormat() == QgsWmsParameters::Format::GML )
1985 for (
auto it = attributes.constBegin(); it != attributes.constEnd(); ++it )
1988 feature.
setAttribute( index++, QString::number( it.value().toDouble() ) );
1991 QDomElement elem = createFeatureGML(
1992 &feature,
nullptr, infoDocument, layerCrs, mapSettings,
typeName,
false, gmlVersion,
nullptr );
1993 layerElement.appendChild( elem );
1997 const auto values = identifyResult.
results();
1998 for (
auto it = values.constBegin(); it != values.constEnd(); ++it )
2000 QVariant value = it.value();
2001 if ( value.type() == QVariant::Bool && !value.toBool() )
2007 if ( value.type() == QVariant::String )
2018 for (
const QgsFeature &feature : storeFeatures )
2020 QDomElement elem = createFeatureGML(
2021 &feature,
nullptr, infoDocument, layerCrs, mapSettings,
typeName,
false, gmlVersion,
nullptr );
2022 layerElement.appendChild( elem );
2032 for (
auto it = attributes.constBegin(); it != attributes.constEnd(); ++it )
2034 QDomElement attributeElement = infoDocument.createElement( QStringLiteral(
"Attribute" ) );
2035 attributeElement.setAttribute( QStringLiteral(
"name" ), layer->
bandName( it.key() ) );
2038 if ( ! it.value().isNull() )
2040 value = QString::number( it.value().toDouble() );
2043 attributeElement.setAttribute( QStringLiteral(
"value" ), value );
2044 layerElement.appendChild( attributeElement );
2049 const auto values = identifyResult.
results();
2050 for (
auto it = values.constBegin(); it != values.constEnd(); ++it )
2052 QVariant value = it.value();
2053 if ( value.type() == QVariant::Bool && !value.toBool() )
2059 if ( value.type() == QVariant::String )
2069 for (
const QgsFeature &feature : storeFeatures )
2071 for (
const auto &fld : feature.
fields() )
2073 const auto val { feature.
attribute( fld.name() )};
2074 if ( val.isValid() )
2076 QDomElement attributeElement = infoDocument.createElement( QStringLiteral(
"Attribute" ) );
2077 attributeElement.setAttribute( QStringLiteral(
"name" ), fld.name() );
2078 attributeElement.setAttribute( QStringLiteral(
"value" ), val.toString() );
2079 layerElement.appendChild( attributeElement );
2090 bool QgsRenderer::testFilterStringSafety(
const QString &filter )
const
2093 if ( filter.contains( QLatin1String(
";" ) ) )
2098 #if QT_VERSION < QT_VERSION_CHECK(5, 15, 0)
2099 QStringList tokens = filter.split(
' ', QString::SkipEmptyParts );
2101 QStringList tokens = filter.split(
' ', Qt::SkipEmptyParts );
2103 groupStringList( tokens, QStringLiteral(
"'" ) );
2104 groupStringList( tokens, QStringLiteral(
"\"" ) );
2106 for (
auto tokenIt = tokens.constBegin() ; tokenIt != tokens.constEnd(); ++tokenIt )
2109 if ( tokenIt->compare( QLatin1String(
"," ) ) == 0
2110 || tokenIt->compare( QLatin1String(
"(" ) ) == 0
2111 || tokenIt->compare( QLatin1String(
")" ) ) == 0
2112 || tokenIt->compare( QLatin1String(
"=" ) ) == 0
2113 || tokenIt->compare( QLatin1String(
"!=" ) ) == 0
2114 || tokenIt->compare( QLatin1String(
"<" ) ) == 0
2115 || tokenIt->compare( QLatin1String(
"<=" ) ) == 0
2116 || tokenIt->compare( QLatin1String(
">" ) ) == 0
2117 || tokenIt->compare( QLatin1String(
">=" ) ) == 0
2118 || tokenIt->compare( QLatin1String(
"%" ) ) == 0
2119 || tokenIt->compare( QLatin1String(
"IS" ), Qt::CaseInsensitive ) == 0
2120 || tokenIt->compare( QLatin1String(
"NOT" ), Qt::CaseInsensitive ) == 0
2121 || tokenIt->compare( QLatin1String(
"NULL" ), Qt::CaseInsensitive ) == 0
2122 || tokenIt->compare( QLatin1String(
"AND" ), Qt::CaseInsensitive ) == 0
2123 || tokenIt->compare( QLatin1String(
"OR" ), Qt::CaseInsensitive ) == 0
2124 || tokenIt->compare( QLatin1String(
"IN" ), Qt::CaseInsensitive ) == 0
2125 || tokenIt->compare( QLatin1String(
"LIKE" ), Qt::CaseInsensitive ) == 0
2126 || tokenIt->compare( QLatin1String(
"ILIKE" ), Qt::CaseInsensitive ) == 0
2127 || tokenIt->compare( QLatin1String(
"DMETAPHONE" ), Qt::CaseInsensitive ) == 0
2128 || tokenIt->compare( QLatin1String(
"SOUNDEX" ), Qt::CaseInsensitive ) == 0 )
2135 tokenIt->toDouble( &isNumeric );
2144 if ( *tokenIt == QLatin1String(
"''" ) )
2150 if ( tokenIt->size() > 2
2151 && ( *tokenIt )[0] == QChar(
'\'' )
2152 && ( *tokenIt )[tokenIt->size() - 1] == QChar(
'\'' )
2153 && ( *tokenIt )[1] != QChar(
'\'' )
2154 && ( *tokenIt )[tokenIt->size() - 2] != QChar(
'\'' ) )
2160 if ( tokenIt->size() > 2
2161 && ( *tokenIt )[0] == QChar(
'"' )
2162 && ( *tokenIt )[tokenIt->size() - 1] == QChar(
'"' )
2163 && ( *tokenIt )[1] != QChar(
'"' )
2164 && ( *tokenIt )[tokenIt->size() - 2] != QChar(
'"' ) )
2175 void QgsRenderer::groupStringList( QStringList &list,
const QString &groupString )
2178 bool groupActive =
false;
2179 int startGroup = -1;
2180 QString concatString;
2182 for (
int i = 0; i < list.size(); ++i )
2184 QString &
str = list[i];
2185 if (
str.startsWith( groupString ) )
2189 concatString.clear();
2194 if ( i != startGroup )
2196 concatString.append(
" " );
2198 concatString.append(
str );
2201 if (
str.endsWith( groupString ) )
2204 groupActive =
false;
2206 if ( startGroup != -1 )
2208 list[startGroup] = concatString;
2209 for (
int j = startGroup + 1; j <= endGroup; ++j )
2211 list.removeAt( startGroup + 1 );
2216 concatString.clear();
2222 void QgsRenderer::convertFeatureInfoToSia2045( QDomDocument &doc )
const
2224 QDomDocument SIAInfoDoc;
2225 QDomElement infoDocElement = doc.documentElement();
2226 QDomElement SIAInfoDocElement = SIAInfoDoc.importNode( infoDocElement,
false ).toElement();
2227 SIAInfoDoc.appendChild( SIAInfoDocElement );
2229 QString currentAttributeName;
2230 QString currentAttributeValue;
2231 QDomElement currentAttributeElem;
2232 QString currentLayerName;
2233 QDomElement currentLayerElem;
2234 QDomNodeList layerNodeList = infoDocElement.elementsByTagName( QStringLiteral(
"Layer" ) );
2235 for (
int i = 0; i < layerNodeList.size(); ++i )
2237 currentLayerElem = layerNodeList.at( i ).toElement();
2238 currentLayerName = currentLayerElem.attribute( QStringLiteral(
"name" ) );
2240 QDomElement currentFeatureElem;
2242 QDomNodeList featureList = currentLayerElem.elementsByTagName( QStringLiteral(
"Feature" ) );
2243 if ( featureList.isEmpty() )
2246 QDomNodeList attributeList = currentLayerElem.elementsByTagName( QStringLiteral(
"Attribute" ) );
2247 QDomElement rasterLayerElem;
2248 if ( !attributeList.isEmpty() )
2250 rasterLayerElem = SIAInfoDoc.createElement( currentLayerName );
2252 for (
int j = 0; j < attributeList.size(); ++j )
2254 currentAttributeElem = attributeList.at( j ).toElement();
2255 currentAttributeName = currentAttributeElem.attribute( QStringLiteral(
"name" ) );
2256 currentAttributeValue = currentAttributeElem.attribute( QStringLiteral(
"value" ) );
2257 QDomElement outAttributeElem = SIAInfoDoc.createElement( currentAttributeName );
2258 QDomText outAttributeText = SIAInfoDoc.createTextNode( currentAttributeValue );
2259 outAttributeElem.appendChild( outAttributeText );
2260 rasterLayerElem.appendChild( outAttributeElem );
2262 if ( !attributeList.isEmpty() )
2264 SIAInfoDocElement.appendChild( rasterLayerElem );
2270 QSet<QString> layerPropertyAttributes;
2271 QString currentLayerId = currentLayerElem.attribute( QStringLiteral(
"id" ) );
2272 if ( !currentLayerId.isEmpty() )
2277 QString WMSPropertyAttributesString = currentLayer->
customProperty( QStringLiteral(
"WMSPropertyAttributes" ) ).toString();
2278 if ( !WMSPropertyAttributesString.isEmpty() )
2280 QStringList propertyList = WMSPropertyAttributesString.split( QStringLiteral(
"//" ) );
2281 for (
auto propertyIt = propertyList.constBegin() ; propertyIt != propertyList.constEnd(); ++propertyIt )
2283 layerPropertyAttributes.insert( *propertyIt );
2289 QDomElement propertyRefChild;
2290 for (
int j = 0; j < featureList.size(); ++j )
2292 QDomElement SIAFeatureElem = SIAInfoDoc.createElement( currentLayerName );
2293 currentFeatureElem = featureList.at( j ).toElement();
2294 QDomNodeList attributeList = currentFeatureElem.elementsByTagName( QStringLiteral(
"Attribute" ) );
2296 for (
int k = 0; k < attributeList.size(); ++k )
2298 currentAttributeElem = attributeList.at( k ).toElement();
2299 currentAttributeName = currentAttributeElem.attribute( QStringLiteral(
"name" ) );
2300 currentAttributeValue = currentAttributeElem.attribute( QStringLiteral(
"value" ) );
2301 if ( layerPropertyAttributes.contains( currentAttributeName ) )
2303 QDomElement propertyElem = SIAInfoDoc.createElement( QStringLiteral(
"property" ) );
2304 QDomElement identifierElem = SIAInfoDoc.createElement( QStringLiteral(
"identifier" ) );
2305 QDomText identifierText = SIAInfoDoc.createTextNode( currentAttributeName );
2306 identifierElem.appendChild( identifierText );
2307 QDomElement valueElem = SIAInfoDoc.createElement( QStringLiteral(
"value" ) );
2308 QDomText valueText = SIAInfoDoc.createTextNode( currentAttributeValue );
2309 valueElem.appendChild( valueText );
2310 propertyElem.appendChild( identifierElem );
2311 propertyElem.appendChild( valueElem );
2312 if ( propertyRefChild.isNull() )
2314 SIAFeatureElem.insertBefore( propertyElem, QDomNode() );
2315 propertyRefChild = propertyElem;
2319 SIAFeatureElem.insertAfter( propertyElem, propertyRefChild );
2324 QDomElement SIAAttributeElem = SIAInfoDoc.createElement( currentAttributeName );
2325 QDomText SIAAttributeText = SIAInfoDoc.createTextNode( currentAttributeValue );
2326 SIAAttributeElem.appendChild( SIAAttributeText );
2327 SIAFeatureElem.appendChild( SIAAttributeElem );
2330 SIAInfoDocElement.appendChild( SIAFeatureElem );
2337 QByteArray QgsRenderer::convertFeatureInfoToHtml(
const QDomDocument &doc )
const
2339 QString featureInfoString;
2342 featureInfoString.append(
"<HEAD>\n" );
2343 featureInfoString.append(
"<TITLE> GetFeatureInfo results </TITLE>\n" );
2344 featureInfoString.append(
"<META http-equiv=\"Content-Type\" content=\"text/html;charset=utf-8\"/>\n" );
2345 featureInfoString.append(
"</HEAD>\n" );
2348 featureInfoString.append(
"<BODY>\n" );
2350 QDomNodeList layerList = doc.elementsByTagName( QStringLiteral(
"Layer" ) );
2353 for (
int i = 0; i < layerList.size(); ++i )
2355 QDomElement layerElem = layerList.at( i ).toElement();
2357 featureInfoString.append(
"<TABLE border=1 width=100%>\n" );
2358 featureInfoString.append(
"<TR><TH width=25%>Layer</TH><TD>" + layerElem.attribute( QStringLiteral(
"name" ) ) +
"</TD></TR>\n" );
2359 featureInfoString.append(
"</BR>" );
2362 QDomNodeList featureNodeList = layerElem.elementsByTagName( QStringLiteral(
"Feature" ) );
2363 QDomElement currentFeatureElement;
2365 if ( !featureNodeList.isEmpty() )
2367 for (
int j = 0; j < featureNodeList.size(); ++j )
2369 QDomElement featureElement = featureNodeList.at( j ).toElement();
2370 featureInfoString.append(
"<TABLE border=1 width=100%>\n" );
2371 featureInfoString.append(
"<TR><TH>Feature</TH><TD>" + featureElement.attribute( QStringLiteral(
"id" ) ) +
2375 QDomNodeList attributeNodeList = featureElement.elementsByTagName( QStringLiteral(
"Attribute" ) );
2376 for (
int k = 0; k < attributeNodeList.size(); ++k )
2378 QDomElement attributeElement = attributeNodeList.at( k ).toElement();
2379 featureInfoString.append(
"<TR><TH>" + attributeElement.attribute( QStringLiteral(
"name" ) ) +
2380 "</TH><TD>" + attributeElement.attribute( QStringLiteral(
"value" ) ) +
"</TD></TR>\n" );
2383 featureInfoString.append(
"</TABLE>\n</BR>\n" );
2388 QDomNodeList attributeNodeList = layerElem.elementsByTagName( QStringLiteral(
"Attribute" ) );
2389 for (
int j = 0; j < attributeNodeList.size(); ++j )
2391 QDomElement attributeElement = attributeNodeList.at( j ).toElement();
2392 QString value = attributeElement.attribute( QStringLiteral(
"value" ) );
2393 if ( value.isEmpty() )
2395 value = QStringLiteral(
"no data" );
2397 featureInfoString.append(
"<TR><TH>" + attributeElement.attribute( QStringLiteral(
"name" ) ) +
2398 "</TH><TD>" + value +
"</TD></TR>\n" );
2402 featureInfoString.append(
"</TABLE>\n<BR></BR>\n" );
2406 featureInfoString.append(
"</BODY>\n" );
2408 return featureInfoString.toUtf8();
2411 QByteArray QgsRenderer::convertFeatureInfoToText(
const QDomDocument &doc )
const
2413 QString featureInfoString;
2416 featureInfoString.append(
"GetFeatureInfo results\n" );
2417 featureInfoString.append(
"\n" );
2419 QDomNodeList layerList = doc.elementsByTagName( QStringLiteral(
"Layer" ) );
2422 for (
int i = 0; i < layerList.size(); ++i )
2424 QDomElement layerElem = layerList.at( i ).toElement();
2426 featureInfoString.append(
"Layer '" + layerElem.attribute( QStringLiteral(
"name" ) ) +
"'\n" );
2429 QDomNodeList featureNodeList = layerElem.elementsByTagName( QStringLiteral(
"Feature" ) );
2430 QDomElement currentFeatureElement;
2432 if ( !featureNodeList.isEmpty() )
2434 for (
int j = 0; j < featureNodeList.size(); ++j )
2436 QDomElement featureElement = featureNodeList.at( j ).toElement();
2437 featureInfoString.append(
"Feature " + featureElement.attribute( QStringLiteral(
"id" ) ) +
"\n" );
2440 QDomNodeList attributeNodeList = featureElement.elementsByTagName( QStringLiteral(
"Attribute" ) );
2441 for (
int k = 0; k < attributeNodeList.size(); ++k )
2443 QDomElement attributeElement = attributeNodeList.at( k ).toElement();
2444 featureInfoString.append( attributeElement.attribute( QStringLiteral(
"name" ) ) +
" = '" +
2445 attributeElement.attribute( QStringLiteral(
"value" ) ) +
"'\n" );
2451 QDomNodeList attributeNodeList = layerElem.elementsByTagName( QStringLiteral(
"Attribute" ) );
2452 for (
int j = 0; j < attributeNodeList.size(); ++j )
2454 QDomElement attributeElement = attributeNodeList.at( j ).toElement();
2455 QString value = attributeElement.attribute( QStringLiteral(
"value" ) );
2456 if ( value.isEmpty() )
2458 value = QStringLiteral(
"no data" );
2460 featureInfoString.append( attributeElement.attribute( QStringLiteral(
"name" ) ) +
" = '" +
2465 featureInfoString.append(
"\n" );
2468 return featureInfoString.toUtf8();
2471 QByteArray QgsRenderer::convertFeatureInfoToJson(
const QList<QgsMapLayer *> &layers,
const QDomDocument &doc )
const
2475 {
"type",
"FeatureCollection" },
2476 {
"features", json::array() },
2480 const QDomNodeList layerList = doc.elementsByTagName( QStringLiteral(
"Layer" ) );
2481 for (
int i = 0; i < layerList.size(); ++i )
2483 const QDomElement layerElem = layerList.at( i ).toElement();
2484 const QString layerName = layerElem.attribute( QStringLiteral(
"name" ) );
2489 if ( mContext.
layerNickname( *l ).compare( layerName ) == 0 )
2505 const QDomNodeList featuresNode = layerElem.elementsByTagName( QStringLiteral(
"Feature" ) );
2506 if ( featuresNode.isEmpty() )
2509 QMap<QgsFeatureId, QString> fidMap;
2511 for (
int j = 0; j < featuresNode.size(); ++j )
2513 const QDomElement featureNode = featuresNode.at( j ).toElement();
2514 const QString fid = featureNode.attribute( QStringLiteral(
"id" ) );
2517 if ( expression.isEmpty() )
2519 feature = vl->
getFeature( fid.toLongLong() );
2524 request.setFlags( QgsFeatureRequest::Flag::NoGeometry );
2528 fidMap.insert( feature.
id(), fid );
2533 const QDomNodeList attrs = featureNode.elementsByTagName(
"Attribute" );
2534 for (
int k = 0; k < attrs.count(); k++ )
2536 const QDomElement elm = attrs.at( k ).toElement();
2537 if ( elm.attribute( QStringLiteral(
"name" ) ).compare(
"geometry" ) == 0 )
2539 wkt = elm.attribute(
"value" );
2544 if ( ! wkt.isEmpty() )
2550 features << feature;
2553 if ( !attributes.isEmpty() )
2556 const QDomNodeList attributesNode = featureNode.elementsByTagName( QStringLiteral(
"Attribute" ) );
2557 for (
int k = 0; k < attributesNode.size(); ++k )
2559 const QDomElement attributeElement = attributesNode.at( k ).toElement();
2560 const QString fieldName = attributeElement.
attribute( QStringLiteral(
"name" ) );
2562 attributes << feature.fieldNameIndex( fieldName );
2568 exporter.setAttributeDisplayName(
true );
2569 exporter.setAttributes( attributes );
2570 exporter.setIncludeGeometry( withGeometry );
2571 exporter.setTransformGeometries(
false );
2573 for (
const auto &feature : std::as_const( features ) )
2575 const QString
id = QStringLiteral(
"%1.%2" ).arg( layerName ).arg( fidMap.value( feature.id() ) );
2576 json[
"features"].push_back( exporter.exportFeatureToJsonObject( feature, QVariantMap(),
id ) );
2581 auto properties = json::object();
2582 const QDomNodeList attributesNode = layerElem.elementsByTagName( QStringLiteral(
"Attribute" ) );
2583 for (
int j = 0; j < attributesNode.size(); ++j )
2585 const QDomElement attrElmt = attributesNode.at( j ).toElement();
2586 const QString name = attrElmt.attribute( QStringLiteral(
"name" ) );
2588 QString value = attrElmt.attribute( QStringLiteral(
"value" ) );
2589 if ( value.isEmpty() )
2591 value = QStringLiteral(
"null" );
2594 properties[name.toStdString()] = value.toStdString();
2597 json[
"features"].push_back(
2599 {
"type",
"Feature" },
2600 {
"id", layerName.toStdString() },
2601 {
"properties", properties }
2607 return QByteArray::fromStdString( json.dump( 2 ) );
2609 return QByteArray::fromStdString( json.dump() );
2613 QDomElement QgsRenderer::createFeatureGML(
2622 QStringList *attributes )
const
2625 QDomElement typeNameElement = doc.createElement(
"qgs:" +
typeName );
2632 typeNameElement.setAttribute( QStringLiteral(
"fid" ), QStringLiteral(
"%1.%2" ).arg(
typeName, fid ) );
2635 if ( layer && layer->
crs() !=
crs )
2668 QDomElement bbElem = doc.createElement( QStringLiteral(
"gml:boundedBy" ) );
2669 QDomElement boxElem;
2681 boxElem.setAttribute( QStringLiteral(
"srsName" ),
crs.
authid() );
2683 bbElem.appendChild( boxElem );
2684 typeNameElement.appendChild( bbElem );
2696 QDomElement geomElem = doc.createElement( QStringLiteral(
"qgs:geometry" ) );
2697 QDomElement gmlElem;
2707 if ( !gmlElem.isNull() )
2711 gmlElem.setAttribute( QStringLiteral(
"srsName" ),
crs.
authid() );
2713 geomElem.appendChild( gmlElem );
2714 typeNameElement.appendChild( geomElem );
2721 for (
int i = 0; i < fields.
count(); ++i )
2723 QString attributeName = fields.
at( i ).
name();
2730 if ( attributes && !attributes->contains( attributeName ) )
2735 QDomElement fieldElem = doc.createElement(
"qgs:" + attributeName.replace(
' ',
'_' ) );
2736 QString fieldTextString = featureAttributes.at( i ).toString();
2741 QDomText fieldText = doc.createTextNode( fieldTextString );
2742 fieldElem.appendChild( fieldText );
2743 typeNameElement.appendChild( fieldElem );
2751 if ( !mapTip.isEmpty() && mWmsParameters.
withMapTip() )
2754 QDomElement fieldElem = doc.createElement( QStringLiteral(
"qgs:maptip" ) );
2755 QDomText maptipText = doc.createTextNode( fieldTextString );
2756 fieldElem.appendChild( maptipText );
2757 typeNameElement.appendChild( fieldElem );
2761 return typeNameElement;
2764 QString QgsRenderer::replaceValueMapAndRelation(
QgsVectorLayer *vl,
int idx,
const QVariant &attributeVal )
2768 QString value( fieldFormatter->
representValue( vl, idx, setup.
config(), QVariant(), attributeVal ) );
2770 if ( setup.
config().value( QStringLiteral(
"AllowMulti" ) ).toBool() && value.startsWith( QLatin1Char(
'{' ) ) && value.endsWith( QLatin1Char(
'}' ) ) )
2772 value = value.mid( 1, value.size() - 2 );
2784 double mapUnitTolerance = 0.0;
2794 mapUnitTolerance = mapSettings.
extent().
width() / 400.0;
2806 mapUnitTolerance = mapSettings.
extent().
width() / 200.0;
2818 mapUnitTolerance = mapSettings.
extent().
width() / 100.0;
2822 QgsRectangle mapRectangle( infoPoint.
x() - mapUnitTolerance, infoPoint.
y() - mapUnitTolerance,
2823 infoPoint.
x() + mapUnitTolerance, infoPoint.
y() + mapUnitTolerance );
2827 QList<QgsMapLayer *> QgsRenderer::highlightLayers( QList<QgsWmsParametersHighlightLayer> params )
2829 QList<QgsMapLayer *> highlightLayers;
2832 QString
crs = mWmsParameters.
crs();
2833 for (
const QgsWmsParametersHighlightLayer ¶m : params )
2836 QDomDocument sldDoc;
2840 if ( !sldDoc.setContent( param.mSld,
true, &errorMsg, &errorLine, &errorColumn ) )
2847 QStringLiteral(
"Server" ), Qgis::MessageLevel::Warning );
2852 std::unique_ptr<QgsFeatureRenderer> renderer;
2853 QDomElement el = sldDoc.documentElement();
2864 if ( ! param.mLabel.isEmpty() )
2866 url +=
"&field=label:string";
2871 std::unique_ptr<QgsVectorLayer> layer = std::make_unique<QgsVectorLayer>( url, param.mName, QLatin1String(
"memory" ), options );
2872 if ( !layer->isValid() )
2879 if ( ! param.mLabel.isEmpty() )
2881 fet.setAttribute( 0, param.mLabel );
2890 switch ( param.mGeom.type() )
2895 palSettings.
dist = 2;
2906 QVariant x( pt.
x() );
2910 QVariant y( pt.
y() );
2914 QVariant hali(
"Center" );
2918 QVariant vali(
"Half" );
2925 palSettings.
dist = 2;
2934 if ( param.mColor.isValid() )
2936 textFormat.
setColor( param.mColor );
2939 if ( param.mSize > 0 )
2941 textFormat.
setSize( param.mSize );
2949 if ( ! param.mFont.isEmpty() )
2951 textFormat.
setFont( param.mFont );
2954 if ( param.mBufferColor.isValid() )
2956 bufferSettings.
setColor( param.mBufferColor );
2959 if ( param.mBufferSize > 0 )
2962 bufferSettings.
setSize(
static_cast<double>( param.mBufferSize ) );
2969 layer->setLabeling( simpleLabeling );
2970 layer->setLabelsEnabled(
true );
2972 fet.setGeometry( param.mGeom );
2976 layer->setRenderer( renderer.release() );
2979 if ( layer->isValid() )
2981 highlightLayers.append( layer.release() );
2985 mTemporaryLayers.append( highlightLayers );
2986 return highlightLayers;
2989 void QgsRenderer::removeTemporaryLayers()
2991 qDeleteAll( mTemporaryLayers );
2992 mTemporaryLayers.clear();
2995 QPainter *QgsRenderer::layersRendering(
const QgsMapSettings &mapSettings, QImage &image )
const
2997 QPainter *painter =
nullptr;
3001 #ifdef HAVE_SERVER_PYTHON_PLUGINS
3002 mContext.accessControl()->resolveFilterFeatures( mapSettings.
layers() );
3006 renderJob.render( mapSettings, &image );
3007 painter = renderJob.takePainter();
3009 if ( !renderJob.errors().isEmpty() )
3011 QString layerWMSName;
3012 QString firstErrorLayerId = renderJob.errors().at( 0 ).layerID;
3019 throw QgsException( QStringLiteral(
"Map rendering error in layer '%1'" ).arg( layerWMSName ) );
3025 void QgsRenderer::setLayerOpacity(
QgsMapLayer *layer,
int opacity )
const
3027 if ( opacity >= 0 && opacity <= 255 )
3029 switch ( layer->
type() )
3042 rasterRenderer->
setOpacity( opacity / 255. );
3056 void QgsRenderer::setLayerFilter(
QgsMapLayer *layer,
const QList<QgsWmsParametersFilter> &filters )
3060 QgsVectorLayer *filteredLayer = qobject_cast<QgsVectorLayer *>( layer );
3061 QStringList expList;
3062 for (
const QgsWmsParametersFilter &filter : filters )
3067 QDomDocument filterXml;
3069 if ( !filterXml.setContent( filter.mFilter,
true, &errorMsg ) )
3072 QStringLiteral(
"Filter string rejected. Error message: %1. The XML string was: %2" ).arg( errorMsg, filter.mFilter ) );
3074 QDomElement filterElem = filterXml.firstChildElement();
3079 expList << filterExp->dump();
3085 if ( !testFilterStringSafety( filter.mFilter ) )
3087 throw QgsSecurityException( QStringLiteral(
"The filter string %1"
3088 " has been rejected because of security reasons."
3089 " Note: Text strings have to be enclosed in single or double quotes."
3090 " A space between each word / special character is mandatory."
3091 " Allowed Keywords and special characters are "
3092 " IS,NOT,NULL,AND,OR,IN,=,<,>=,>,>=,!=,',',(,),DMETAPHONE,SOUNDEX."
3093 " Not allowed are semicolons in the filter expression." ).arg(
3097 QString newSubsetString = filter.mFilter;
3100 newSubsetString.prepend(
") AND (" );
3101 newSubsetString.append(
")" );
3102 newSubsetString.prepend( filteredLayer->
subsetString() );
3103 newSubsetString.prepend(
"(" );
3107 QgsMessageLog::logMessage( QStringLiteral(
"Error setting subset string from filter for layer %1, filter: %2" ).arg( layer->
name(), newSubsetString ),
3108 QStringLiteral(
"Server" ),
3109 Qgis::MessageLevel::Warning );
3111 QStringLiteral(
"Filter not valid for layer %1: check the filter syntax and the field names." ).arg( layer->
name() ) );
3117 expList.append( dimensionFilter( filteredLayer ) );
3121 if ( expList.size() == 1 )
3125 else if ( expList.size() > 1 )
3127 exp = QStringLiteral(
"( %1 )" ).arg( expList.join( QLatin1String(
" ) AND ( " ) ) );
3129 if ( !exp.isEmpty() )
3131 std::unique_ptr<QgsExpression> expression(
new QgsExpression( exp ) );
3134 mFeatureFilter.
setFilter( filteredLayer, *expression );
3140 QStringList QgsRenderer::dimensionFilter(
QgsVectorLayer *layer )
const
3142 QStringList expList;
3145 const QList<QgsMapLayerServerProperties::WmsDimensionInfo> wmsDims = serverProperties->
wmsDimensions();
3146 if ( wmsDims.isEmpty() )
3156 if ( fieldIndex == -1 )
3161 int endFieldIndex = -1;
3162 if ( !dim.endFieldName.isEmpty() )
3164 endFieldIndex = layer->
fields().
indexOf( dim.endFieldName );
3165 if ( endFieldIndex == -1 )
3171 if ( !dimParamValues.contains( dim.name.toUpper() ) )
3181 defValue = dim.referenceValue;
3186 QSet<QVariant> uniqueValues = layer->
uniqueValues( fieldIndex );
3187 if ( endFieldIndex != -1 )
3189 uniqueValues.unite( layer->
uniqueValues( endFieldIndex ) );
3192 QList<QVariant> values = qgis::setToList( uniqueValues );
3193 std::sort( values.begin(), values.end() );
3196 defValue = values.first();
3200 defValue = values.last();
3204 if ( endFieldIndex == -1 )
3210 QStringList expElems;
3215 expList << expElems.join(
' ' );
3223 QString dimParamValue = dimParamValues[dim.name.toUpper()];
3225 QStringList dimExplist;
3227 QStringList dimValues = dimParamValue.split(
',' );
3228 for (
int i = 0; i < dimValues.size(); ++i )
3230 QString dimValue = dimValues[i];
3232 if ( dimValue.size() > 1 )
3234 dimValue = dimValue.trimmed();
3237 if ( dimValue.contains(
'/' ) )
3239 QStringList rangeValues = dimValue.split(
'/' );
3241 if ( rangeValues.size() != 2 )
3246 QVariant rangeMin = QVariant( rangeValues[0] );
3247 QVariant rangeMax = QVariant( rangeValues[1] );
3258 QStringList expElems;
3259 if ( endFieldIndex == -1 )
3279 << QStringLiteral(
")" );
3281 dimExplist << expElems.join(
' ' );
3285 QVariant dimVariant = QVariant( dimValue );
3291 if ( endFieldIndex == -1 )
3300 QStringList expElems;
3305 dimExplist << expElems.join(
' ' );
3310 if ( dimExplist.size() == 1 )
3312 expList << dimExplist;
3314 else if ( dimExplist.size() > 1 )
3316 expList << QStringLiteral(
"( %1 )" ).arg( dimExplist.join( QLatin1String(
" ) OR ( " ) ) );
3323 void QgsRenderer::setLayerSelection(
QgsMapLayer *layer,
const QStringList &fids )
const
3333 if ( selectedIds.empty() )
3344 void QgsRenderer::setLayerAccessControlFilter(
QgsMapLayer *layer )
const
3346 #ifdef HAVE_SERVER_PYTHON_PLUGINS
3364 void QgsRenderer::annotationsRendering( QPainter *painter,
const QgsMapSettings &mapSettings )
const
3367 const QList< QgsAnnotation * > annotations = annotationManager->
annotations();
3373 if ( !annotation || !annotation->isVisible() )
3379 if ( annotation->hasFixedMapPosition() )
3381 QgsPointXY mapPos = annotation->mapPosition();
3382 if ( mapSettings.
destinationCrs() != annotation->mapPositionCrs() )
3387 mapPos = coordTransform.transform( mapPos );
3395 offsetX = devicePos.
x();
3396 offsetY = devicePos.
y();
3400 const QPointF relativePos = annotation->relativePosition();
3401 offsetX = mapSettings.
outputSize().width() * relativePos.x();
3402 offsetY = mapSettings.
outputSize().height() * relativePos.y();
3406 painter->translate( offsetX, offsetY );
3407 annotation->render( renderContext );
3412 QImage *QgsRenderer::scaleImage(
const QImage *image )
const
3417 QImage *scaledImage =
nullptr;
3418 const int width = mWmsParameters.
widthAsInt();
3420 if ( width != image->width() || height != image->height() )
3422 scaledImage =
new QImage( image->scaled( width, height, Qt::IgnoreAspectRatio, Qt::SmoothTransformation ) );
3428 void QgsRenderer::handlePrintErrors(
const QgsLayout *layout )
const
3434 QList< QgsLayoutItemMap * > mapList;
3437 QList< QgsLayoutItemMap * >::const_iterator mapIt = mapList.constBegin();
3438 for ( ; mapIt != mapList.constEnd(); ++mapIt )
3440 if ( !( *mapIt )->renderingErrors().isEmpty() )
3452 for (
auto layer : layers )
3465 setLayerOpacity( layer, param.
mOpacity );
3472 setLayerSld( layer, mContext.
sld( *layer ) );
3476 setLayerStyle( layer, mContext.
style( *layer ) );
3481 setLayerOpacity( layer, param.
mOpacity );
3486 setLayerFilter( layer, param.
mFilter );
3491 setLayerAccessControlFilter( layer );
3496 setLayerSelection( layer, param.
mSelection );
3501 updateExtent( layer, *settings );
3511 void QgsRenderer::setLayerStyle(
QgsMapLayer *layer,
const QString &style )
const
3513 if ( style.isEmpty() )
3522 QStringLiteral(
"Style '%1' does not exist for layer '%2'" ).arg( style, layer->
name() ) );
3526 void QgsRenderer::setLayerSld(
QgsMapLayer *layer,
const QDomElement &sld )
const
3531 QString sldStyleName =
"__sld_style";
3532 while ( styles.contains( sldStyleName ) )
3534 sldStyleName.append(
'@' );
3547 if ( !mWmsParameters.
bbox().isEmpty() )
3551 std::unique_ptr<QImage> tmp( createImage( mContext.
mapSize(
false ) ) );
3552 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.
int idx() const
Returns the index of the field.
Exception thrown in case of malformed request.
This class represents a coordinate reference system (CRS).
static QgsCoordinateReferenceSystem fromOgcWmsCrs(const QString &ogcCrs)
Creates a CRS from a given OGC WMS-format Coordinate Reference System string.
bool isValid() const
Returns whether this CRS is correctly initialized and usable.
QString authid() const
Returns the authority identifier for the CRS.
Q_GADGET QgsUnitTypes::DistanceUnit mapUnits
bool hasAxisInverted() const
Returns whether axis is inverted (e.g., for WMS 1.3) for the CRS.
Custom exception class for Coordinate Reference System related exceptions.
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 replaceExpressionText(const QString &action, const QgsExpressionContext *context, const QgsDistanceArea *distanceArea=nullptr)
This function replaces each expression between [% and %] in the string with the result of its evaluat...
static QString createFieldEqualityExpression(const QString &fieldName, const QVariant &value)
Create an expression allowing to evaluate if a field is equal to a value.
static QString quotedColumnRef(QString name)
Returns a quoted column reference (in double quotes)
A filter filter provider grouping several filter providers.
QgsFeatureFilterProviderGroup & addProvider(const QgsFeatureFilterProvider *provider)
Add another filter provider to the group.
void setFilter(const QgsVectorLayer *layer, const QgsExpression &expression)
Set a filter for the given layer.
void filterFeatures(const QgsVectorLayer *layer, QgsFeatureRequest &filterFeatures) const override
Filter the features of the layer.
Wrapper for iterator of features from vector data provider or vector layer.
bool nextFeature(QgsFeature &f)
virtual QgsFeatureRenderer * clone() const =0
Create a deep copy of this renderer.
static QgsFeatureRenderer * loadSld(const QDomNode &node, QgsWkbTypes::GeometryType geomType, QString &errorMessage)
Create a new renderer according to the information contained in the UserStyle element of a SLD style ...
@ MoreSymbolsPerFeature
May use more than one symbol to render a feature: symbolsForFeature() will return them.
This class wraps a request for features to a vector layer (or directly its vector data provider).
QgsExpression * filterExpression() const
Returns the filter expression (if set).
QgsFeatureRequest & setFlags(QgsFeatureRequest::Flags flags)
Sets flags that affect how features will be fetched.
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
Fields is available if layer is served as WMS from QGIS server.
Container of fields for a vector layer.
bool append(const QgsField &field, FieldOrigin origin=OriginProvider, int originIndex=-1)
Appends a field. The field must have unique name, otherwise it is rejected (returns false)
int indexFromName(const QString &fieldName) const
Gets the field index from the field name.
int indexOf(const QString &fieldName) const
Gets the field index from the field name.
int count() const
Returns number of items.
QgsField at(int i) const
Returns the field at particular index (must be in range 0..N-1).
A geometry is the spatial representation of a feature.
const QgsAbstractGeometry * constGet() const SIP_HOLDGIL
Returns a non-modifiable (const) reference to the underlying abstract geometry primitive.
QgsGeometry pointOnSurface() const
Returns a point guaranteed to lie on the surface of a geometry.
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.
static QgsGeometry fromWkt(const QString &wkt)
Creates a new geometry from a WKT string.
QgsPointXY asPoint() const
Returns the contents of the geometry as a 2-dimensional point.
QgsWkbTypes::GeometryType type
void set(QgsAbstractGeometry *geometry)
Sets the underlying geometry store.
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
void setSelectionColor(const QColor &color)
Sets the color that is used for drawing of selected vector features.
void setLayers(const QList< QgsMapLayer * > &layers)
Sets the list of layers to render in the map.
double scale() const
Returns the calculated map scale.
QgsCoordinateTransform layerTransform(const QgsMapLayer *layer) const
Returns the coordinate transform from layer's CRS to destination CRS.
QgsRectangle layerExtentToOutputExtent(const QgsMapLayer *layer, QgsRectangle extent) const
transform bounding box from layer's CRS to output CRS
QStringList layerIds() const
Returns the list of layer IDs which will be rendered in the map.
void setOutputDpi(double dpi)
Sets the dpi (dots per inch) used for conversion between real world units (e.g.
double mapUnitsPerPixel() const
Returns the distance in geographical coordinates that equals to one pixel in the map.
QSize outputSize() const
Returns the size of the resulting map image, in pixels.
QgsRectangle extent() const
Returns geographical coordinates of the rectangle that should be rendered.
void setExtent(const QgsRectangle &rect, bool magnified=true)
Sets the coordinates of the rectangle which should be rendered.
void setExpressionContext(const QgsExpressionContext &context)
Sets the expression context.
const QgsMapToPixel & mapToPixel() const
QColor selectionColor() const
Returns the color that is used for drawing of selected vector features.
void setExtentBuffer(double buffer)
Sets the buffer in map units to use around the visible extent for rendering symbols whose correspondi...
void setLabelingEngineSettings(const QgsLabelingEngineSettings &settings)
Sets the global configuration of the labeling engine.
QList< QgsMapLayer * > layers() const
Returns the list of layers which will be rendered in the map.
void 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
Added in 3.18.
@ VectorTileLayer
Added in 3.14.
@ AnnotationLayer
Contains freeform, georeferenced annotations. Added in QGIS 3.16.
SERVER_EXPORT QString getExpressionFromServerFid(const QString &serverFid, const QgsVectorDataProvider *provider)
Returns the expression feature id based on primary keys.
SERVER_EXPORT QgsFeatureRequest updateFeatureRequestFromServerFids(QgsFeatureRequest &featureRequest, const QStringList &serverFids, const QgsVectorDataProvider *provider)
Returns the feature request based on feature ids build with primary keys.
SERVER_EXPORT QString getServerFid(const QgsFeature &feature, const QgsAttributeList &pkAttributes)
Returns the feature id based on primary keys.
SERVER_EXPORT QString wmsFeatureInfoSchema(const QgsProject &project)
Returns the schema URL for XML GetFeatureInfo request.
SERVER_EXPORT bool wmsInfoFormatSia2045(const QgsProject &project)
Returns if the info format is SIA20145.
SERVER_EXPORT QString wmsFeatureInfoDocumentElementNs(const QgsProject &project)
Returns the document element namespace for XML GetFeatureInfo request.
SERVER_EXPORT bool wmsFeatureInfoSegmentizeWktGeometry(const QgsProject &project)
Returns if the geometry has to be segmentize in GetFeatureInfo request.
SERVER_EXPORT bool wmsFeatureInfoUseAttributeFormSettings(const QgsProject &project)
Returns if feature form settings should be considered for the format of the feature info response.
SERVER_EXPORT QHash< QString, QString > wmsFeatureInfoLayerAliasMap(const QgsProject &project)
Returns the mapping between layer name and wms layer name for GetFeatureInfo request.
SERVER_EXPORT bool wmsFeatureInfoAddWktGeometry(const QgsProject &project)
Returns if the geometry is displayed as Well Known Text in GetFeatureInfo request.
SERVER_EXPORT double wmsDefaultMapUnitsPerMm(const QgsProject &project)
Returns the default number of map units per millimeters in case of the scale is not given.
SERVER_EXPORT QString wmsFeatureInfoDocumentElement(const QgsProject &project)
Returns the document element name for XML GetFeatureInfo request.
SERVER_EXPORT int wmsMaxAtlasFeatures(const QgsProject &project)
Returns the maximum number of atlas features which can be printed in a request.
Median cut implementation.
As part of the API refactoring and improvements which landed in the Processing API was substantially reworked from the x version This was done in order to allow much of the underlying Processing framework to be ported into c
#define Q_NOWARN_DEPRECATED_POP
QString qgsDoubleToString(double a, int precision=17)
Returns a string representation of a double.
#define Q_NOWARN_DEPRECATED_PUSH
QList< QgsFeature > QgsFeatureList
QSet< QgsFeatureId > QgsFeatureIds
#define FID_TO_STRING(fid)
QVector< QgsFeatureStore > QgsFeatureStoreList
QList< int > QgsAttributeList
#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