49#include <QApplication>
53#include <QStyleOptionGraphicsItem>
56#include "moc_qgslayoutitemmap.cpp"
58using namespace Qt::StringLiterals;
68 mBackgroundUpdateTimer =
new QTimer(
this );
69 mBackgroundUpdateTimer->setSingleShot(
true );
70 connect( mBackgroundUpdateTimer, &QTimer::timeout,
this, &QgsLayoutItemMap::recreateCachedImageInBackground );
74 setCacheMode( QGraphicsItem::NoCache );
78 mGridStack = std::make_unique< QgsLayoutItemMapGridStack >(
this );
79 mOverviewStack = std::make_unique< QgsLayoutItemMapOverviewStack >(
this );
87 crs.updateDefinition();
105 mPainterJob->cancel();
130 QList<QgsLayoutItemMap *> mapsList;
131 mLayout->layoutItems( mapsList );
140 if ( map->mMapId == mMapId )
143 maxId = std::max( maxId, map->mMapId );
148 mLayout->itemsModel()->updateItemDisplayName(
this );
160 return tr(
"Map %1" ).arg( mMapId );
172 mCachedLayerStyleOverridesPresetName.clear();
176 updateAtlasFeature();
181 if ( rect().isEmpty() || !
mLayout )
186 calculator.
setDpi( 25.4 );
190 calculator.
setMethod( project->scaleMethod() );
198 double currentScaleDenominator =
scale();
205 double scaleRatio = scaleDenominator / currentScaleDenominator;
206 mExtent.scale( scaleRatio );
208 if ( mAtlasDriven && mAtlasScalingMode ==
Fixed )
215 calculator.
setDpi( 25.4 );
221 calculator.
setMethod( project->scaleMethod() );
225 const double newScale = calculator.
calculate( mExtent, rect().width() );
228 scaleRatio = scaleDenominator / newScale;
229 mExtent.scale( scaleRatio );
254 if ( mExtent.isFinite() && !mExtent.isEmpty() )
256 const QRectF currentRect = rect();
257 const double newHeight = mExtent.width() == 0 ? 0 : currentRect.width() * mExtent.height() / mExtent.width();
269 double currentWidthHeightRatio = 1.0;
270 if ( !currentExtent.
isEmpty() )
271 currentWidthHeightRatio = currentExtent.
width() / currentExtent.
height();
273 currentWidthHeightRatio = rect().width() / rect().height();
275 if ( currentWidthHeightRatio != 0 && !std::isnan( currentWidthHeightRatio ) && !newExtent.
isEmpty() )
277 double newWidthHeightRatio = newExtent.
width() / newExtent.
height();
279 if ( currentWidthHeightRatio < newWidthHeightRatio )
282 double newHeight = newExtent.
width() / currentWidthHeightRatio;
283 double deltaHeight = newHeight - newExtent.
height();
290 double newWidth = currentWidthHeightRatio * newExtent.
height();
291 double deltaWidth = newWidth - newExtent.
width();
297 if ( mExtent == newExtent )
316QPolygonF QgsLayoutItemMap::calculateVisibleExtentPolygon(
bool includeClipping )
const
319 mapPolygon( mExtent, poly );
321 if ( includeClipping )
328 poly = poly.intersected( geom.asQPolygonF() );
332 if ( mItemClippingSettings->isActive() )
334 const QgsGeometry geom = mItemClippingSettings->clippedMapExtent();
347 return calculateVisibleExtentPolygon(
true );
352 if ( mCrs.isValid() )
355 return mLayout->project()->crs();
370 return _qgis_listRefToRaw( mLayers );
375 mGroupLayers.clear();
377 QList<QgsMapLayer *> layersCopy {
layers };
382 for (
auto it = layersCopy.begin(); it != layersCopy.end(); ++it )
384 if (
const QgsGroupLayer *groupLayer = qobject_cast<QgsGroupLayer *>( *it ) )
386 auto existingIt = mGroupLayers.find( groupLayer->id() );
387 if ( existingIt != mGroupLayers.end() )
389 *it = ( *existingIt ).second.get();
393 std::unique_ptr<QgsGroupLayer> groupLayerClone { groupLayer->clone() };
396 groupLayerClone->setId( groupLayer->id() );
397 mGroupLayers[groupLayer->id()] = std::move( groupLayerClone );
398 *it = mGroupLayers[groupLayer->id()].get();
402 mLayers = _qgis_listRawToRef( layersCopy );
407 if ( overrides == mLayerStyleOverrides )
410 mLayerStyleOverrides = overrides;
416 mLayerStyleOverrides.clear();
423 mLayerStyleOverrides.insert( layer->id(), style.
xmlData() );
430 if ( mFollowVisibilityPreset == follow )
433 mFollowVisibilityPreset = follow;
435 if ( !mFollowVisibilityPresetName.isEmpty() )
436 emit
themeChanged( mFollowVisibilityPreset ? mFollowVisibilityPresetName : QString() );
441 if ( name == mFollowVisibilityPresetName )
444 mFollowVisibilityPresetName = name;
445 if ( mFollowVisibilityPreset )
451 mLastRenderedImageOffsetX -= dx;
452 mLastRenderedImageOffsetY -= dy;
455 transformShift( dx, dy );
456 mExtent.setXMinimum( mExtent.xMinimum() + dx );
457 mExtent.setXMaximum( mExtent.xMaximum() + dx );
458 mExtent.setYMinimum( mExtent.yMinimum() + dy );
459 mExtent.setYMaximum( mExtent.yMaximum() + dy );
478 double mapX = mExtent.xMinimum() + ( point.x() / rect().width() ) * ( mExtent.xMaximum() - mExtent.xMinimum() );
479 double mapY = mExtent.yMinimum() + ( 1 - ( point.y() / rect().height() ) ) * ( mExtent.yMaximum() - mExtent.yMinimum() );
482 double centerX = ( mExtent.xMaximum() + mExtent.xMinimum() ) / 2;
483 double centerY = ( mExtent.yMaximum() + mExtent.yMinimum() ) / 2;
485 centerX = mapX + ( centerX - mapX ) * ( 1.0 / factor );
486 centerY = mapY + ( centerY - mapY ) * ( 1.0 / factor );
488 double newIntervalX, newIntervalY;
492 newIntervalX = ( mExtent.xMaximum() - mExtent.xMinimum() ) / factor;
493 newIntervalY = ( mExtent.yMaximum() - mExtent.yMinimum() ) / factor;
500 mExtent.setXMaximum( centerX + newIntervalX / 2 );
501 mExtent.setXMinimum( centerX - newIntervalX / 2 );
502 mExtent.setYMaximum( centerY + newIntervalY / 2 );
503 mExtent.setYMinimum( centerY - newIntervalY / 2 );
505 if ( mAtlasDriven && mAtlasScalingMode ==
Fixed )
512 calculator.
setDpi( 25.4 );
517 calculator.
setMethod( project->scaleMethod() );
521 const double newScale = calculator.
calculate( mExtent, rect().width() );
524 const double scaleRatio =
scale() / newScale;
525 mExtent.scale( scaleRatio );
542 if ( layer->dataProvider() && layer->providerType() ==
"wms"_L1 )
552 if (
blendMode() != QPainter::CompositionMode_SourceOver )
571 auto containsAdvancedEffectsIgnoreItemOpacity = [
this]() ->
bool {
580 if ( mOverviewStack->containsAdvancedEffects() )
588 if ( mGridStack->containsAdvancedEffects() )
601 if ( !containsAdvancedEffectsIgnoreItemOpacity() )
622 if ( mOverviewStack->containsAdvancedEffects() )
630 if ( mGridStack->containsAdvancedEffects() )
645 mMapRotation = rotation;
646 mEvaluatedMapRotation = mMapRotation;
659 mAtlasDriven = enabled;
676 double margin = mAtlasMargin;
684 margin = ddMargin / 100;
696 if ( mGridStack->size() < 1 )
699 mGridStack->addGrid(
grid );
701 return mGridStack->grid( 0 );
706 if ( mOverviewStack->size() < 1 )
709 mOverviewStack->addOverview(
overview );
711 return mOverviewStack->overview( 0 );
721 for (
int i = 0; i < mGridStack->size(); ++i )
724 if (
grid->mEvaluatedEnabled )
727 frameBleed = std::max( frameBleed,
grid->mEvaluatedGridFrameWidth +
grid->mEvaluatedGridFrameMargin +
grid->mEvaluatedGridFrameLineThickness / 2.0 );
742 mapElem.setAttribute( u
"keepLayerSet"_s, u
"true"_s );
746 mapElem.setAttribute( u
"keepLayerSet"_s, u
"false"_s );
749 if ( mDrawAnnotations )
751 mapElem.setAttribute( u
"drawCanvasItems"_s, u
"true"_s );
755 mapElem.setAttribute( u
"drawCanvasItems"_s, u
"false"_s );
759 QDomElement extentElem = doc.createElement( u
"Extent"_s );
764 mapElem.appendChild( extentElem );
766 if ( mCrs.isValid() )
768 QDomElement crsElem = doc.createElement( u
"crs"_s );
769 mCrs.writeXml( crsElem, doc );
770 mapElem.appendChild( crsElem );
774 mapElem.setAttribute( u
"followPreset"_s, mFollowVisibilityPreset ? u
"true"_s : u
"false"_s );
775 mapElem.setAttribute( u
"followPresetName"_s, mFollowVisibilityPresetName );
778 mapElem.setAttribute( u
"mapRotation"_s, QString::number( mMapRotation ) );
781 QDomElement layerSetElem = doc.createElement( u
"LayerSet"_s );
786 QDomElement layerElem = doc.createElement( u
"Layer"_s );
788 const auto it = std::find_if( mGroupLayers.cbegin(), mGroupLayers.cend(), [&layerRef](
const std::pair<
const QString, std::unique_ptr<QgsGroupLayer>> &groupLayer ) ->
bool {
789 return groupLayer.second.get() == layerRef.get();
792 if ( it != mGroupLayers.end() )
798 layerId = layerRef.layerId;
801 QDomText layerIdText = doc.createTextNode( layerId );
802 layerElem.appendChild( layerIdText );
804 layerElem.setAttribute( u
"name"_s, layerRef.name );
805 layerElem.setAttribute( u
"source"_s, layerRef.source );
806 layerElem.setAttribute( u
"provider"_s, layerRef.provider );
808 if ( it != mGroupLayers.end() )
810 const auto childLayers { it->second->childLayers() };
811 QDomElement childLayersElement = doc.createElement( u
"childLayers"_s );
812 for (
const QgsMapLayer *childLayer : std::as_const( childLayers ) )
814 QDomElement childElement = doc.createElement( u
"child"_s );
815 childElement.setAttribute( u
"layerid"_s, childLayer->id() );
816 childLayersElement.appendChild( childElement );
818 layerElem.appendChild( childLayersElement );
820 layerSetElem.appendChild( layerElem );
822 mapElem.appendChild( layerSetElem );
825 if ( mKeepLayerStyles )
827 QDomElement stylesElem = doc.createElement( u
"LayerStyles"_s );
828 for (
auto styleIt = mLayerStyleOverrides.constBegin(); styleIt != mLayerStyleOverrides.constEnd(); ++styleIt )
830 QDomElement styleElem = doc.createElement( u
"LayerStyle"_s );
835 styleElem.setAttribute( u
"layerid"_s, ref.
layerId );
836 styleElem.setAttribute( u
"name"_s, ref.
name );
837 styleElem.setAttribute( u
"source"_s, ref.
source );
838 styleElem.setAttribute( u
"provider"_s, ref.
provider );
842 stylesElem.appendChild( styleElem );
844 mapElem.appendChild( stylesElem );
848 mGridStack->writeXml( mapElem, doc, context );
851 mOverviewStack->writeXml( mapElem, doc, context );
854 QDomElement atlasElem = doc.createElement( u
"AtlasMap"_s );
855 atlasElem.setAttribute( u
"atlasDriven"_s, mAtlasDriven );
856 atlasElem.setAttribute( u
"scalingMode"_s, mAtlasScalingMode );
858 mapElem.appendChild( atlasElem );
860 mapElem.setAttribute( u
"labelMargin"_s, mLabelMargin.encodeMeasurement() );
861 mapElem.setAttribute( u
"mapFlags"_s,
static_cast< int>( mMapFlags ) );
863 QDomElement labelBlockingItemsElem = doc.createElement( u
"labelBlockingItems"_s );
864 for (
const auto &item : std::as_const( mBlockingLabelItems ) )
869 QDomElement blockingItemElem = doc.createElement( u
"item"_s );
870 blockingItemElem.setAttribute( u
"uuid"_s, item->uuid() );
871 labelBlockingItemsElem.appendChild( blockingItemElem );
873 mapElem.appendChild( labelBlockingItemsElem );
876 mapElem.setAttribute( u
"isTemporal"_s,
isTemporal() ? 1 : 0 );
879 mapElem.setAttribute( u
"temporalRangeBegin"_s,
temporalRange().begin().toString( Qt::ISODate ) );
880 mapElem.setAttribute( u
"temporalRangeEnd"_s,
temporalRange().end().toString( Qt::ISODate ) );
883 mapElem.setAttribute( u
"enableZRange"_s, mZRangeEnabled ? 1 : 0 );
884 if ( mZRange.lower() != std::numeric_limits< double >::lowest() )
886 if ( mZRange.upper() != std::numeric_limits< double >::max() )
889 mAtlasClippingSettings->writeXml( mapElem, doc, context );
890 mItemClippingSettings->writeXml( mapElem, doc, context );
897 mUpdatesEnabled =
false;
900 QDomNodeList extentNodeList = itemElem.elementsByTagName( u
"Extent"_s );
901 if ( !extentNodeList.isEmpty() )
903 QDomElement extentElem = extentNodeList.at( 0 ).toElement();
904 double xmin, xmax, ymin, ymax;
905 xmin = extentElem.attribute( u
"xmin"_s ).toDouble();
906 xmax = extentElem.attribute( u
"xmax"_s ).toDouble();
907 ymin = extentElem.attribute( u
"ymin"_s ).toDouble();
908 ymax = extentElem.attribute( u
"ymax"_s ).toDouble();
912 QDomNodeList crsNodeList = itemElem.elementsByTagName( u
"crs"_s );
914 if ( !crsNodeList.isEmpty() )
916 QDomElement crsElem = crsNodeList.at( 0 ).toElement();
917 crs.readXml( crsElem );
922 mMapRotation = itemElem.attribute( u
"mapRotation"_s, u
"0"_s ).toDouble();
923 mEvaluatedMapRotation = mMapRotation;
926 mFollowVisibilityPreset = itemElem.attribute( u
"followPreset"_s ).compare(
"true"_L1 ) == 0;
927 mFollowVisibilityPresetName = itemElem.attribute( u
"followPresetName"_s );
930 QString keepLayerSetFlag = itemElem.attribute( u
"keepLayerSet"_s );
931 if ( keepLayerSetFlag.compare(
"true"_L1, Qt::CaseInsensitive ) == 0 )
933 mKeepLayerSet =
true;
937 mKeepLayerSet =
false;
940 QString drawCanvasItemsFlag = itemElem.attribute( u
"drawCanvasItems"_s, u
"true"_s );
941 if ( drawCanvasItemsFlag.compare(
"true"_L1, Qt::CaseInsensitive ) == 0 )
943 mDrawAnnotations =
true;
947 mDrawAnnotations =
false;
950 mLayerStyleOverrides.clear();
952 QList<QgsMapLayerRef> layerSet;
953 QDomNodeList layerSetNodeList = itemElem.elementsByTagName( u
"LayerSet"_s );
954 if ( !layerSetNodeList.isEmpty() )
956 QDomElement layerSetElem = layerSetNodeList.at( 0 ).toElement();
957 QDomNodeList layerIdNodeList = layerSetElem.elementsByTagName( u
"Layer"_s );
958 layerSet.reserve( layerIdNodeList.size() );
959 for (
int i = 0; i < layerIdNodeList.size(); ++i )
961 QDomElement layerElem = layerIdNodeList.at( i ).toElement();
962 QString layerId = layerElem.text();
963 QString layerName = layerElem.attribute( u
"name"_s );
964 QString layerSource = layerElem.attribute( u
"source"_s );
965 QString layerProvider = layerElem.attribute( u
"provider"_s );
967 QgsMapLayerRef ref( layerId, layerName, layerSource, layerProvider );
975 setLayers( _qgis_listRefToRaw( layerSet ) );
978 if ( !layerSetNodeList.isEmpty() )
980 QDomElement layerSetElem = layerSetNodeList.at( 0 ).toElement();
981 QDomNodeList layerIdNodeList = layerSetElem.elementsByTagName( u
"Layer"_s );
982 for (
int i = 0; i < layerIdNodeList.size(); ++i )
984 QDomElement layerElem = layerIdNodeList.at( i ).toElement();
985 const QString layerId = layerElem.text();
986 const auto it = mGroupLayers.find( layerId );
987 if ( it != mGroupLayers.cend() )
989 QList<QgsMapLayerRef> childSet;
990 const QDomNodeList childLayersElements = layerElem.elementsByTagName( u
"childLayers"_s );
991 const QDomNodeList children = childLayersElements.at( 0 ).childNodes();
992 for (
int i = 0; i < children.size(); ++i )
994 const QDomElement childElement = children.at( i ).toElement();
995 const QString
id = childElement.attribute( u
"layerid"_s );
999 childSet.push_back( layerRef );
1002 it->second->setChildLayers( _qgis_listRefToRaw( childSet ) );
1009 QDomNodeList layerStylesNodeList = itemElem.elementsByTagName( u
"LayerStyles"_s );
1010 mKeepLayerStyles = !layerStylesNodeList.isEmpty();
1011 if ( mKeepLayerStyles )
1013 QDomElement layerStylesElem = layerStylesNodeList.at( 0 ).toElement();
1014 QDomNodeList layerStyleNodeList = layerStylesElem.elementsByTagName( u
"LayerStyle"_s );
1015 for (
int i = 0; i < layerStyleNodeList.size(); ++i )
1017 const QDomElement &layerStyleElement = layerStyleNodeList.at( i ).toElement();
1018 QString layerId = layerStyleElement.attribute( u
"layerid"_s );
1019 QString layerName = layerStyleElement.attribute( u
"name"_s );
1020 QString layerSource = layerStyleElement.attribute( u
"source"_s );
1021 QString layerProvider = layerStyleElement.attribute( u
"provider"_s );
1022 QgsMapLayerRef ref( layerId, layerName, layerSource, layerProvider );
1026 style.
readXml( layerStyleElement );
1032 mNumCachedLayers = 0;
1033 mCacheInvalidated =
true;
1036 mOverviewStack->readXml( itemElem, doc, context );
1039 mGridStack->readXml( itemElem, doc, context );
1042 QDomNodeList atlasNodeList = itemElem.elementsByTagName( u
"AtlasMap"_s );
1043 if ( !atlasNodeList.isEmpty() )
1045 QDomElement atlasElem = atlasNodeList.at( 0 ).toElement();
1046 mAtlasDriven = ( atlasElem.attribute( u
"atlasDriven"_s, u
"0"_s ) !=
"0"_L1 );
1047 if ( atlasElem.hasAttribute( u
"fixedScale"_s ) )
1049 mAtlasScalingMode = ( atlasElem.attribute( u
"fixedScale"_s, u
"0"_s ) !=
"0"_L1 ) ?
Fixed :
Auto;
1051 else if ( atlasElem.hasAttribute( u
"scalingMode"_s ) )
1053 mAtlasScalingMode =
static_cast<AtlasScalingMode>( atlasElem.attribute( u
"scalingMode"_s ).toInt() );
1055 mAtlasMargin = atlasElem.attribute( u
"margin"_s, u
"0.1"_s ).toDouble();
1060 mMapFlags =
static_cast< MapItemFlags>( itemElem.attribute( u
"mapFlags"_s,
nullptr ).toInt() );
1063 mBlockingLabelItems.clear();
1064 mBlockingLabelItemUuids.clear();
1065 QDomNodeList labelBlockingNodeList = itemElem.elementsByTagName( u
"labelBlockingItems"_s );
1066 if ( !labelBlockingNodeList.isEmpty() )
1068 QDomElement blockingItems = labelBlockingNodeList.at( 0 ).toElement();
1069 QDomNodeList labelBlockingNodeList = blockingItems.childNodes();
1070 for (
int i = 0; i < labelBlockingNodeList.size(); ++i )
1072 const QDomElement &itemBlockingElement = labelBlockingNodeList.at( i ).toElement();
1073 const QString itemUuid = itemBlockingElement.attribute( u
"uuid"_s );
1074 mBlockingLabelItemUuids << itemUuid;
1078 mAtlasClippingSettings->readXml( itemElem, doc, context );
1079 mItemClippingSettings->readXml( itemElem, doc, context );
1084 setIsTemporal( itemElem.attribute( u
"isTemporal"_s ).toInt() );
1087 const QDateTime begin = QDateTime::fromString( itemElem.attribute( u
"temporalRangeBegin"_s ), Qt::ISODate );
1088 const QDateTime end = QDateTime::fromString( itemElem.attribute( u
"temporalRangeEnd"_s ), Qt::ISODate );
1092 mZRangeEnabled = itemElem.attribute( u
"enableZRange"_s ).toInt();
1094 double zLower = itemElem.attribute( u
"zRangeLower"_s ).toDouble( &ok );
1097 zLower = std::numeric_limits< double >::lowest();
1099 double zUpper = itemElem.attribute( u
"zRangeUpper"_s ).toDouble( &ok );
1102 zUpper = std::numeric_limits< double >::max();
1106 mUpdatesEnabled =
true;
1110bool QgsLayoutItemMap::hasCustomFramePath()
const
1121 return mItemClippingSettings->isActive();
1126 QPainterPath customFramePath;
1127 if ( mAtlasClippingSettings->enabled() && mAtlasClippingSettings->clipItemShape() )
1132 QPolygonF visibleExtent = calculateVisibleExtentPolygon(
false );
1133 QPolygonF rectPoly = QPolygonF( QRectF( 0, 0, rect().width(), rect().height() ) );
1136 visibleExtent.pop_back();
1137 rectPoly.pop_back();
1140 QTransform transform;
1141 QTransform::quadToQuad( visibleExtent, rectPoly, transform );
1151 if ( mItemClippingSettings->isActive() )
1153 const QgsGeometry g = mItemClippingSettings->clipPathInMapItemCoordinates();
1156 if ( !customFramePath.isEmpty() )
1159 customFramePath.closeSubpath();
1173 if ( !
mLayout || !painter || !painter->device() || !mUpdatesEnabled )
1182 QRectF thisPaintRect = rect();
1188 if (
mLayout->renderContext().isPreviewRender() )
1190 bool renderInProgress =
false;
1191 mPreviewDevicePixelRatio = painter->device()->devicePixelRatioF();
1194 painter->setClipRect( thisPaintRect );
1195 if ( !mCacheFinalImage || mCacheFinalImage->isNull() )
1198 painter->setBrush( QBrush( QColor( 125, 125, 125, 125 ) ) );
1199 painter->drawRect( thisPaintRect );
1200 painter->setBrush( Qt::NoBrush );
1202 messageFont.setPointSize( 12 );
1203 painter->setFont( messageFont );
1204 painter->setPen( QColor( 255, 255, 255, 255 ) );
1205 painter->drawText( thisPaintRect, Qt::AlignCenter | Qt::AlignHCenter, tr(
"Rendering map" ) );
1206 if ( mPainterJob && mCacheInvalidated && !mDrawingPreview )
1210 mBackgroundUpdateTimer->start( 100 );
1212 else if ( !mPainterJob && !mDrawingPreview )
1216 mBackgroundUpdateTimer->start( 100 );
1218 renderInProgress =
true;
1222 if ( mCacheInvalidated && !mDrawingPreview )
1226 mBackgroundUpdateTimer->start( 100 );
1227 renderInProgress =
true;
1232 double imagePixelWidth = mCacheFinalImage->width();
1233 double scale = rect().width() / imagePixelWidth * mCacheFinalImage->devicePixelRatio();
1237 painter->translate( mLastRenderedImageOffsetX + mXOffset, mLastRenderedImageOffsetY + mYOffset );
1238 painter->setCompositionMode( blendModeForRender() );
1240 painter->drawImage( 0, 0, *mCacheFinalImage );
1245 painter->setClipRect( thisPaintRect, Qt::NoClip );
1247 mOverviewStack->drawItems( painter,
false );
1248 mGridStack->drawItems( painter );
1250 drawMapFrame( painter );
1252 if ( renderInProgress )
1263 QPaintDevice *paintDevice = painter->device();
1271 painter->setRenderHint( QPainter::LosslessImageRendering,
true );
1280 int widthInPixels =
static_cast< int >( std::round(
boundingRect().width() * layoutUnitsInInches * destinationDpi ) );
1281 int heightInPixels =
static_cast< int >( std::round(
boundingRect().height() * layoutUnitsInInches * destinationDpi ) );
1282 QImage image = QImage( widthInPixels, heightInPixels, QImage::Format_ARGB32 );
1284 image.fill( Qt::transparent );
1285 image.setDotsPerMeterX(
static_cast< int >( std::round( 1000 * destinationDpi / 25.4 ) ) );
1286 image.setDotsPerMeterY(
static_cast< int >( std::round( 1000 * destinationDpi / 25.4 ) ) );
1287 double dotsPerMM = destinationDpi / 25.4;
1288 QPainter p( &image );
1291 QRect imagePaintRect(
1292 static_cast< int >( std::round( tl.x() * dotsPerMM ) ),
1293 static_cast< int >( std::round( tl.y() * dotsPerMM ) ),
1294 static_cast< int >( std::round( thisPaintRect.width() * dotsPerMM ) ),
1295 static_cast< int >( std::round( thisPaintRect.height() * dotsPerMM ) )
1297 p.setClipRect( imagePaintRect );
1299 p.translate( imagePaintRect.topLeft() );
1303 if ( shouldDrawPart( Background ) )
1305 p.scale( dotsPerMM, dotsPerMM );
1306 drawMapBackground( &p );
1307 p.scale( 1.0 / dotsPerMM, 1.0 / dotsPerMM );
1310 drawMap( &p, cExtent, imagePaintRect.size(), image.logicalDpiX() );
1315 p.scale( dotsPerMM, dotsPerMM );
1317 if ( shouldDrawPart( OverviewMapExtent ) )
1319 mOverviewStack->drawItems( &p,
false );
1321 if ( shouldDrawPart( Grid ) )
1323 mGridStack->drawItems( &p );
1328 painter->setCompositionMode( blendModeForRender() );
1329 painter->scale( 1 / dotsPerMM, 1 / dotsPerMM );
1330 painter->drawImage( QPointF( -tl.x() * dotsPerMM, -tl.y() * dotsPerMM ), image );
1331 painter->scale( dotsPerMM, dotsPerMM );
1336 if ( shouldDrawPart( Background ) )
1338 drawMapBackground( painter );
1342 painter->setClipRect( thisPaintRect );
1347 painter->translate( mXOffset, mYOffset );
1349 double dotsPerMM = paintDevice->logicalDpiX() / 25.4;
1351 painter->scale( 1 / dotsPerMM, 1 / dotsPerMM );
1353 if ( mCurrentExportPart != NotLayered )
1355 if ( !mStagedRendererJob )
1357 createStagedRenderJob( cExtent, size, paintDevice->logicalDpiX() );
1360 mStagedRendererJob->renderCurrentPart( painter );
1364 drawMap( painter, cExtent, size, paintDevice->logicalDpiX() );
1368 painter->setClipRect( thisPaintRect, Qt::NoClip );
1370 if ( shouldDrawPart( OverviewMapExtent ) )
1372 mOverviewStack->drawItems( painter,
false );
1374 if ( shouldDrawPart( Grid ) )
1376 mGridStack->drawItems( painter );
1381 if ( shouldDrawPart( Frame ) )
1383 drawMapFrame( painter );
1394 + ( layerCount + ( layerCount ? 1 : 0 ) )
1395 + ( mGridStack->hasEnabledItems() ? 1 : 0 )
1396 + ( mOverviewStack->hasEnabledItems() ? 1 : 0 )
1402 mCurrentExportPart = Start;
1404 mExportThemes = !mFollowVisibilityPreset ?
mLayout->renderContext().exportThemes() : QStringList();
1405 mExportThemeIt = mExportThemes.begin();
1410 mCurrentExportPart = NotLayered;
1411 mExportThemes.clear();
1412 mExportThemeIt = mExportThemes.begin();
1417 switch ( mCurrentExportPart )
1422 mCurrentExportPart = Background;
1428 mCurrentExportPart = Layer;
1432 if ( mStagedRendererJob )
1434 if ( mStagedRendererJob->nextPart() )
1438 mExportLabelingResults.reset( mStagedRendererJob->takeLabelingResults() );
1439 mStagedRendererJob.reset();
1443 if ( mExportThemeIt != mExportThemes.end() && ++mExportThemeIt != mExportThemes.end() )
1449 if ( mGridStack->hasEnabledItems() )
1451 mCurrentExportPart = Grid;
1457 for (
int i = 0; i < mOverviewStack->size(); ++i )
1462 mCurrentExportPart = OverviewMapExtent;
1468 case OverviewMapExtent:
1471 mCurrentExportPart = Frame;
1478 if ( isSelected() && !
mLayout->renderContext().isPreviewRender() )
1480 mCurrentExportPart = SelectionBoxes;
1485 case SelectionBoxes:
1486 mCurrentExportPart = End;
1507 switch ( mCurrentExportPart )
1517 if ( !mExportThemes.empty() && mExportThemeIt != mExportThemes.end() )
1520 if ( mStagedRendererJob )
1522 switch ( mStagedRendererJob->currentStage() )
1526 detail.
mapLayerId = mStagedRendererJob->currentLayerId();
1527 detail.
compositionMode = mStagedRendererJob->currentLayerCompositionMode();
1528 detail.
opacity = mStagedRendererJob->currentLayerOpacity();
1536 else if (
mLayout->project()->mainAnnotationLayer()->id() == detail.
mapLayerId )
1547 const QList<QgsLayoutItemMapOverview *> res = mOverviewStack->asList();
1553 if ( item->mapLayer() && detail.
mapLayerId == item->mapLayer()->id() )
1558 detail.
name = u
"%1: %2"_s.arg(
displayName(), item->mapLayer()->name() );
1567 detail.
mapLayerId = mStagedRendererJob->currentLayerId();
1573 detail.
name = tr(
"%1: %2 (Labels)" ).arg(
displayName(), layer->name() );
1608 case OverviewMapExtent:
1616 case SelectionBoxes:
1631void QgsLayoutItemMap::drawMap( QPainter *painter,
const QgsRectangle &extent, QSizeF size,
double dpi )
1645 if ( shouldDrawPart( OverviewMapExtent ) )
1647 ms.setLayers( mOverviewStack->modifyMapLayerList( ms.layers() ) );
1650 QgsMapRendererCustomPainterJob job( ms, painter );
1651#ifdef HAVE_SERVER_PYTHON_PLUGINS
1652 job.setFeatureFilterProvider(
mLayout->renderContext().featureFilterProvider() );
1655 QgsGroupedFeatureFilterProvider jobFeatureFilter;
1658 jobFeatureFilter.
addProvider( mAtlasFeatureFilterProvider.get() );
1659 if ( job.featureFilterProvider() )
1661 jobFeatureFilter.
addProvider( job.featureFilterProvider() );
1663 job.setFeatureFilterProvider( &jobFeatureFilter );
1669 job.renderSynchronously();
1671 mExportLabelingResults.reset( job.takeLabelingResults() );
1673 mRenderingErrors = job.errors();
1677 mRenderingErrors.append( QgsMapRendererJob::Error( QString(), u
"Invalid layer(s)"_s ) );
1681void QgsLayoutItemMap::recreateCachedImageInBackground()
1686 QgsMapRendererCustomPainterJob *oldJob = mPainterJob.release();
1687 QPainter *oldPainter = mPainter.release();
1688 QImage *oldImage = mCacheRenderingImage.release();
1690 oldJob->deleteLater();
1698 mCacheRenderingImage.reset(
nullptr );
1702 Q_ASSERT( !mPainterJob );
1703 Q_ASSERT( !mPainter );
1704 Q_ASSERT( !mCacheRenderingImage );
1706 QgsRectangle ext =
extent();
1710 int w =
static_cast< int >( std::round( widthLayoutUnits * mPreviewScaleFactor ) );
1711 int h =
static_cast< int >( std::round( heightLayoutUnits * mPreviewScaleFactor ) );
1714 if ( w > 5000 || h > 5000 )
1719 h =
static_cast< int>( std::round( w * heightLayoutUnits / widthLayoutUnits ) );
1724 w =
static_cast< int >( std::round( h * widthLayoutUnits / heightLayoutUnits ) );
1728 if ( w <= 0 || h <= 0 )
1731 mCacheRenderingImage = std::make_unique<QImage>( w * mPreviewDevicePixelRatio, h * mPreviewDevicePixelRatio, QImage::Format_ARGB32 );
1734 mCacheRenderingImage->setDotsPerMeterX(
static_cast< int >( std::round( 1000 * w / widthLayoutUnits ) ) );
1735 mCacheRenderingImage->setDotsPerMeterY(
static_cast< int >( std::round( 1000 * h / heightLayoutUnits ) ) );
1736 mCacheRenderingImage->setDevicePixelRatio( mPreviewDevicePixelRatio );
1739 mCacheRenderingImage->fill( QColor( 255, 255, 255, 0 ).rgba() );
1744 if ( hasCustomFramePath() )
1746 QPainter p( mCacheRenderingImage.get() );
1748 p.setPen( Qt::NoPen );
1750 p.scale( mCacheRenderingImage->width() / widthLayoutUnits, mCacheRenderingImage->height() / heightLayoutUnits );
1760 mCacheInvalidated =
false;
1761 mPainter = std::make_unique<QPainter>( mCacheRenderingImage.get() );
1762 QgsMapSettings settings(
mapSettings( ext, QSizeF( w, h ), mCacheRenderingImage->logicalDpiX(),
true ) );
1764 if ( shouldDrawPart( OverviewMapExtent ) )
1766 settings.setLayers( mOverviewStack->modifyMapLayerList( settings.layers() ) );
1769 mPainterJob = std::make_unique<QgsMapRendererCustomPainterJob>( settings, mPainter.get() );
1772 mPainterJob->setFeatureFilterProvider( mAtlasFeatureFilterProvider.get() );
1775 mPainterJob->start();
1787 mDrawingPreview =
false;
1810 if (
layout()->renderContext().isPreviewRender() )
1813 jobMapSettings.
setDevicePixelRatio( mPainter ? mPainter->device()->devicePixelRatioF() : 1.0 );
1816 jobMapSettings.
setRotation( mEvaluatedMapRotation );
1824 if ( includeLayerSettings )
1829 if ( !
mLayout->project()->mainAnnotationLayer()->isEmpty() )
1832 layers.insert( 0,
mLayout->project()->mainAnnotationLayer() );
1839 if ( !
mLayout->renderContext().isPreviewRender() )
1888 if ( mEvaluatedLabelMargin.length() > 0 )
1891 visiblePoly.append( visiblePoly.at( 0 ) );
1892 const double layoutLabelMargin =
mLayout->convertToLayoutUnits( mEvaluatedLabelMargin );
1893 const double layoutLabelMarginInMapUnits = layoutLabelMargin / rect().width() * jobMapSettings.
extent().
width();
1895 mapBoundaryGeom = mapBoundaryGeom.
buffer( -layoutLabelMarginInMapUnits, 0 );
1896 labelBoundary = mapBoundaryGeom;
1899 if ( !mBlockingLabelItems.isEmpty() )
1912 if ( mZRangeEnabled )
1917 if ( mAtlasClippingSettings->enabled() &&
mLayout->reportContext().feature().isValid() )
1921 region.
setFeatureClip( mAtlasClippingSettings->featureClippingType() );
1926 if ( mAtlasClippingSettings->forceLabelsInsideFeature() )
1928 if ( !labelBoundary.
isEmpty() )
1930 labelBoundary = clipGeom.
intersection( labelBoundary );
1934 labelBoundary = clipGeom;
1939 if ( mItemClippingSettings->isActive() )
1941 const QgsGeometry clipGeom = mItemClippingSettings->clippedMapExtent();
1944 jobMapSettings.
addClippingRegion( mItemClippingSettings->toMapClippingRegion() );
1946 if ( mItemClippingSettings->forceLabelsInsideClipPath() )
1948 const double layoutLabelMargin =
mLayout->convertToLayoutUnits( mEvaluatedLabelMargin );
1949 const double layoutLabelMarginInMapUnits = layoutLabelMargin / rect().width() * jobMapSettings.
extent().
width();
1951 mapBoundaryGeom = mapBoundaryGeom.
buffer( -layoutLabelMarginInMapUnits, 0 );
1952 if ( !labelBoundary.
isEmpty() )
1954 labelBoundary = mapBoundaryGeom.
intersection( labelBoundary );
1958 labelBoundary = mapBoundaryGeom;
1964 if ( !labelBoundary.
isNull() )
1967 return jobMapSettings;
1974 mBlockingLabelItems.clear();
1975 for (
const QString &
uuid : std::as_const( mBlockingLabelItemUuids ) )
1984 mOverviewStack->finalizeRestoreFromXml();
1985 mGridStack->finalizeRestoreFromXml();
1986 mItemClippingSettings->finalizeRestoreFromXml();
1997 return mCurrentRectangle;
2011 const double mapScale =
scale();
2035 QVariantList layersIds;
2045 const QList<QgsMapLayer *> layersInMap =
layersToRender( &context );
2047 layersIds.reserve( layersInMap.count() );
2048 layers.reserve( layersInMap.count() );
2051 layersIds << layer->id();
2057 scope->
addFunction( u
"is_layer_visible"_s,
new QgsExpressionContextUtils::GetLayerVisibility( layersInMap,
scale() ) );
2079 if ( extentWidth <= 0 )
2083 return rect().width() / extentWidth;
2088 double dx = mXOffset;
2089 double dy = mYOffset;
2090 transformShift( dx, dy );
2091 QPolygonF poly = calculateVisibleExtentPolygon(
false );
2092 poly.translate( -dx, -dy );
2098 if ( !mBlockingLabelItems.contains( item ) )
2099 mBlockingLabelItems.append( item );
2106 mBlockingLabelItems.removeAll( item );
2113 return mBlockingLabelItems.contains( item );
2118 return mPreviewLabelingResults.get();
2127 if ( mOverviewStack )
2129 for (
int i = 0; i < mOverviewStack->size(); ++i )
2131 if ( mOverviewStack->item( i )->accept( visitor ) )
2138 for (
int i = 0; i < mGridStack->size(); ++i )
2140 if ( mGridStack->item( i )->accept( visitor ) )
2153 mRenderedFeatureHandlers.append( handler );
2158 mRenderedFeatureHandlers.removeAll( handler );
2164 if ( mapPoly.empty() )
2166 return QPointF( 0, 0 );
2171 double dx = mapCoords.x() - rotationPoint.
x();
2172 double dy = mapCoords.y() - rotationPoint.
y();
2174 QgsPointXY backRotatedCoords( rotationPoint.
x() + dx, rotationPoint.
y() + dy );
2177 double xItem = rect().width() * ( backRotatedCoords.
x() - unrotatedExtent.
xMinimum() ) / unrotatedExtent.
width();
2178 double yItem = rect().height() * ( 1 - ( backRotatedCoords.
y() - unrotatedExtent.
yMinimum() ) / unrotatedExtent.
height() );
2179 return QPointF( xItem, yItem );
2193 mapPolygon( newExtent, poly );
2194 QRectF bRect = poly.boundingRect();
2195 extent.setXMinimum( bRect.left() );
2196 extent.setXMaximum( bRect.right() );
2197 extent.setYMinimum( bRect.top() );
2198 extent.setYMaximum( bRect.bottom() );
2208 mCacheInvalidated =
true;
2214 QRectF rectangle = rect();
2215 double frameExtension =
frameEnabled() ? pen().widthF() / 2.0 : 0.0;
2217 double topExtension = 0.0;
2218 double rightExtension = 0.0;
2219 double bottomExtension = 0.0;
2220 double leftExtension = 0.0;
2223 mGridStack->calculateMaxGridExtension( topExtension, rightExtension, bottomExtension, leftExtension );
2225 topExtension = std::max( topExtension, frameExtension );
2226 rightExtension = std::max( rightExtension, frameExtension );
2227 bottomExtension = std::max( bottomExtension, frameExtension );
2228 leftExtension = std::max( leftExtension, frameExtension );
2230 rectangle.setLeft( rectangle.left() - leftExtension );
2231 rectangle.setRight( rectangle.right() + rightExtension );
2232 rectangle.setTop( rectangle.top() - topExtension );
2233 rectangle.setBottom( rectangle.bottom() + bottomExtension );
2234 if ( rectangle != mCurrentRectangle )
2236 prepareGeometryChange();
2237 mCurrentRectangle = rectangle;
2268 refreshMapExtents( &context );
2270 if ( mExtent != beforeExtent )
2277 refreshLabelMargin(
false );
2281 const QString previousTheme = mLastEvaluatedThemeName.isEmpty() ? mFollowVisibilityPresetName : mLastEvaluatedThemeName;
2283 if ( mLastEvaluatedThemeName != previousTheme )
2304 double zLower = mZRange.lower();
2305 double zUpper = mZRange.upper();
2316 mCacheInvalidated =
true;
2321void QgsLayoutItemMap::layersAboutToBeRemoved(
const QList<QgsMapLayer *> &layers )
2323 if ( !mLayers.isEmpty() || mLayerStyleOverrides.isEmpty() )
2327 mLayerStyleOverrides.remove( layer->id() );
2329 _qgis_removeLayers( mLayers,
layers );
2332 for ( QgsMapLayer *layer : std::as_const(
layers ) )
2335 if ( mGroupLayers.erase( layer->id() ) == 0 )
2338 for (
auto it = mGroupLayers.begin(); it != mGroupLayers.end(); ++it )
2340 QgsGroupLayer *groupLayer = it->second.get();
2341 if ( groupLayer->
childLayers().contains( layer ) )
2343 QList<QgsMapLayer *> childLayers { groupLayer->
childLayers() };
2344 childLayers.removeAll( layer );
2352void QgsLayoutItemMap::painterJobFinished()
2355 mPreviewLabelingResults.reset( mPainterJob->takeLabelingResults() );
2356 mPainterJob.reset(
nullptr );
2357 mPainter.reset(
nullptr );
2358 mCacheFinalImage = std::move( mCacheRenderingImage );
2359 mLastRenderedImageOffsetX = 0;
2360 mLastRenderedImageOffsetY = 0;
2366void QgsLayoutItemMap::shapeChanged()
2369 QgsPointXY oldCenter = mExtent.center();
2371 double w = rect().width();
2372 double h = rect().height();
2375 double newWidth = mExtent.width();
2377 double newHeight = newWidth * h / w;
2382 refreshMapExtents();
2389void QgsLayoutItemMap::mapThemeChanged(
const QString &theme )
2391 if ( theme == mCachedLayerStyleOverridesPresetName )
2392 mCachedLayerStyleOverridesPresetName.clear();
2395void QgsLayoutItemMap::currentMapThemeRenamed(
const QString &theme,
const QString &newTheme )
2397 if ( theme == mFollowVisibilityPresetName )
2399 mFollowVisibilityPresetName = newTheme;
2403void QgsLayoutItemMap::connectUpdateSlot()
2406 QgsProject *project =
mLayout->project();
2410 connect( project,
static_cast< void ( QgsProject::* )(
const QList<QgsMapLayer *> &
layers )
>( &
QgsProject::layersWillBeRemoved ),
this, &QgsLayoutItemMap::layersAboutToBeRemoved );
2413 if ( layers().isEmpty() )
2421 if ( !mCrs.isValid() )
2437 if ( mAtlasScalingMode == Predefined )
2438 updateAtlasFeature();
2444 QPolygonF thisExtent = calculateVisibleExtentPolygon(
false );
2445 QTransform mapTransform;
2446 QPolygonF thisRectPoly = QPolygonF( QRectF( 0, 0, rect().width(), rect().height() ) );
2448 thisRectPoly.pop_back();
2449 thisExtent.pop_back();
2451 QPolygonF thisItemPolyInLayout = mapToScene( thisRectPoly );
2454 QTransform::quadToQuad( thisItemPolyInLayout, thisExtent, mapTransform );
2455 return mapTransform;
2460 mZRangeEnabled = enabled;
2465 return mZRangeEnabled;
2478QList<QgsLabelBlockingRegion> QgsLayoutItemMap::createLabelBlockingRegions(
const QgsMapSettings & )
const
2481 QList< QgsLabelBlockingRegion > blockers;
2482 blockers.reserve( mBlockingLabelItems.count() );
2483 for (
const auto &item : std::as_const( mBlockingLabelItems ) )
2490 if ( item->property(
"wasVisible" ).isValid() )
2492 if ( !item->property(
"wasVisible" ).toBool() )
2495 else if ( !item->isVisible() )
2498 QPolygonF itemRectInMapCoordinates = mapTransform.map( item->mapToScene( item->rect() ) );
2499 itemRectInMapCoordinates.append( itemRectInMapCoordinates.at( 0 ) );
2501 blockers << QgsLabelBlockingRegion( blockingRegion );
2508 return mLabelMargin;
2513 mLabelMargin = margin;
2514 refreshLabelMargin(
false );
2517void QgsLayoutItemMap::updateToolTip()
2526 if ( mFollowVisibilityPreset )
2528 presetName = mFollowVisibilityPresetName;
2532 else if ( !mExportThemes.empty() && mExportThemeIt != mExportThemes.end() )
2533 presetName = *mExportThemeIt;
2544 QList<QgsMapLayer *> renderLayers;
2546 QString presetName = themeToRender( *evalContext );
2547 if ( !presetName.isEmpty() )
2549 if (
mLayout->project()->mapThemeCollection()->hasMapTheme( presetName ) )
2550 renderLayers =
mLayout->project()->mapThemeCollection()->mapThemeVisibleLayers( presetName );
2552 renderLayers =
mLayout->project()->mapThemeCollection()->masterVisibleLayers();
2554 else if ( !
layers().isEmpty() )
2560 renderLayers =
mLayout->project()->mapThemeCollection()->masterVisibleLayers();
2567 renderLayers.clear();
2569 const QStringList layerNames = ddLayers.split(
'|' );
2571 for (
const QString &name : layerNames )
2573 const QList< QgsMapLayer * > matchingLayers =
mLayout->project()->mapLayersByName( name );
2576 renderLayers << layer;
2585 int removeAt = renderLayers.indexOf(
mLayout->reportContext().layer() );
2586 if ( removeAt != -1 )
2588 renderLayers.removeAt( removeAt );
2593 if ( !includeInvalidLayers )
2595 renderLayers.erase( std::remove_if( renderLayers.begin(), renderLayers.end(), [](
QgsMapLayer *layer ) { return !layer || !layer->isValid(); } ), renderLayers.end() );
2598 return renderLayers;
2601QMap<QString, QString> QgsLayoutItemMap::layerStyleOverridesToRender(
const QgsExpressionContext &context )
const
2603 QString presetName = themeToRender( context );
2604 if ( !presetName.isEmpty() )
2606 if (
mLayout->project()->mapThemeCollection()->hasMapTheme( presetName ) )
2608 if ( presetName != mCachedLayerStyleOverridesPresetName )
2611 mCachedPresetLayerStyleOverrides =
mLayout->project()->mapThemeCollection()->mapThemeStyleOverrides( presetName );
2612 mCachedLayerStyleOverridesPresetName = presetName;
2615 return mCachedPresetLayerStyleOverrides;
2618 return QMap<QString, QString>();
2620 else if ( mFollowVisibilityPreset )
2622 QString presetName = mFollowVisibilityPresetName;
2625 if (
mLayout->project()->mapThemeCollection()->hasMapTheme( presetName ) )
2627 if ( presetName.isEmpty() || presetName != mCachedLayerStyleOverridesPresetName )
2630 mCachedPresetLayerStyleOverrides =
mLayout->project()->mapThemeCollection()->mapThemeStyleOverrides( presetName );
2631 mCachedLayerStyleOverridesPresetName = presetName;
2634 return mCachedPresetLayerStyleOverrides;
2637 return QMap<QString, QString>();
2639 else if ( mKeepLayerStyles )
2641 return mLayerStyleOverrides;
2645 return QMap<QString, QString>();
2649QgsRectangle QgsLayoutItemMap::transformedExtent()
const
2651 double dx = mXOffset;
2652 double dy = mYOffset;
2653 transformShift( dx, dy );
2654 return QgsRectangle( mExtent.xMinimum() - dx, mExtent.yMinimum() - dy, mExtent.xMaximum() - dx, mExtent.yMaximum() - dy );
2657void QgsLayoutItemMap::mapPolygon(
const QgsRectangle &extent, QPolygonF &poly )
const
2662 poly << QPointF(
extent.xMinimum(),
extent.yMaximum() );
2663 poly << QPointF(
extent.xMaximum(),
extent.yMaximum() );
2664 poly << QPointF(
extent.xMaximum(),
extent.yMinimum() );
2665 poly << QPointF(
extent.xMinimum(),
extent.yMinimum() );
2667 poly << QPointF( poly.at( 0 ) );
2672 QgsPointXY rotationPoint( (
extent.xMaximum() +
extent.xMinimum() ) / 2.0, (
extent.yMaximum() +
extent.yMinimum() ) / 2.0 );
2676 dx = rotationPoint.x() -
extent.xMinimum();
2677 dy = rotationPoint.y() -
extent.yMaximum();
2679 poly << QPointF( rotationPoint.x() - dx, rotationPoint.y() - dy );
2682 dx = rotationPoint.x() -
extent.xMaximum();
2683 dy = rotationPoint.y() -
extent.yMaximum();
2685 poly << QPointF( rotationPoint.x() - dx, rotationPoint.y() - dy );
2688 dx = rotationPoint.x() -
extent.xMaximum();
2689 dy = rotationPoint.y() -
extent.yMinimum();
2691 poly << QPointF( rotationPoint.x() - dx, rotationPoint.y() - dy );
2694 dx = rotationPoint.x() -
extent.xMinimum();
2695 dy = rotationPoint.y() -
extent.yMinimum();
2697 poly << QPointF( rotationPoint.x() - dx, rotationPoint.y() - dy );
2700 poly << QPointF( poly.at( 0 ) );
2703void QgsLayoutItemMap::transformShift(
double &xShift,
double &yShift )
const
2706 double dxScaled = xShift * mmToMapUnits;
2707 double dyScaled = -yShift * mmToMapUnits;
2722 const QList< QgsAnnotation * > annotations =
mLayout->project()->annotationManager()->annotations();
2723 if ( annotations.isEmpty() )
2732 for ( QgsAnnotation *annotation : annotations )
2734 if ( !annotation || !annotation->isVisible() )
2738 if ( annotation->mapLayer() && !
layers.contains( annotation->mapLayer() ) )
2741 drawAnnotation( annotation, rc );
2752 QgsScopedQPainterState painterState( context.
painter() );
2755 double itemX, itemY;
2758 QPointF mapPos = layoutMapPosForItem( annotation );
2767 context.
painter()->translate( itemX, itemY );
2770 double dotsPerMM = context.
painter()->device()->logicalDpiX() / 25.4;
2771 context.
painter()->scale( 1 / dotsPerMM, 1 / dotsPerMM );
2773 annotation->
render( context );
2776QPointF QgsLayoutItemMap::layoutMapPosForItem(
const QgsAnnotation *annotation )
const
2779 return QPointF( 0, 0 );
2786 QgsCoordinateReferenceSystem annotationCrs = annotation->
mapPositionCrs();
2788 if ( annotationCrs !=
crs() )
2791 QgsCoordinateTransform t( annotationCrs,
crs(),
mLayout->project() );
2795 t.transformInPlace( mapX, mapY, z );
2797 catch (
const QgsCsException & )
2804void QgsLayoutItemMap::drawMapFrame( QPainter *p )
2815void QgsLayoutItemMap::drawMapBackground( QPainter *p )
2826bool QgsLayoutItemMap::shouldDrawPart( QgsLayoutItemMap::PartType part )
const
2828 if ( mCurrentExportPart == NotLayered )
2846 return mCurrentExportPart == Layer;
2849 return mCurrentExportPart == Grid && mGridStack->hasEnabledItems();
2851 case OverviewMapExtent:
2852 return mCurrentExportPart == OverviewMapExtent && mOverviewStack->hasEnabledItems();
2857 case SelectionBoxes:
2858 return mCurrentExportPart == SelectionBoxes && isSelected();
2869 QgsExpressionContext scopedContext;
2874 const QgsExpressionContext *evalContext = context ? context : &scopedContext;
2878 QgsRectangle newExtent =
extent();
2879 bool useDdXMin =
false;
2880 bool useDdXMax =
false;
2881 bool useDdYMin =
false;
2882 bool useDdYMax =
false;
2913 if ( newExtent != mExtent )
2919 double currentWidthHeightRatio = mExtent.width() / mExtent.height();
2920 double newWidthHeightRatio = newExtent.
width() / newExtent.
height();
2922 if ( currentWidthHeightRatio < newWidthHeightRatio )
2925 double newHeight = newExtent.
width() / currentWidthHeightRatio;
2926 double deltaHeight = newHeight - newExtent.
height();
2933 double newWidth = currentWidthHeightRatio * newExtent.
height();
2934 double deltaWidth = newWidth - newExtent.
width();
2939 mExtent = newExtent;
2949 newExtent = mExtent;
2952 if ( useDdXMax || useDdXMin || useDdYMax || useDdYMin )
2956 if ( useDdXMin && !useDdXMax )
2958 double xMax = mExtent.xMaximum() - ( mExtent.xMinimum() - minXD );
2962 else if ( !useDdXMin && useDdXMax )
2964 double xMin = mExtent.xMinimum() - ( mExtent.xMaximum() - maxXD );
2968 if ( useDdYMin && !useDdYMax )
2970 double yMax = mExtent.yMaximum() - ( mExtent.yMinimum() - minYD );
2974 else if ( !useDdYMin && useDdYMax )
2976 double yMin = mExtent.yMinimum() - ( mExtent.yMaximum() - maxYD );
2981 if ( newExtent != mExtent )
2983 mExtent = newExtent;
3000void QgsLayoutItemMap::refreshLabelMargin(
bool updateItem )
3005 mEvaluatedLabelMargin.setUnits( mLabelMargin.units() );
3013void QgsLayoutItemMap::updateAtlasFeature()
3015 if ( !
mLayout->reportContext().layer() || !
mLayout->reportContext().feature().isValid() )
3018 QgsFeatureExpressionFilterProvider *filter =
new QgsFeatureExpressionFilterProvider();
3019 filter->
setFilter(
mLayout->reportContext().layer()->id(), QgsExpression( u
"@id = %1"_s.arg(
mLayout->reportContext().feature().id() ) ) );
3020 mAtlasFeatureFilterProvider = std::make_unique<QgsGroupedFeatureFilterProvider>();
3021 mAtlasFeatureFilterProvider->addProvider( filter );
3026 QgsRectangle bounds = computeAtlasRectangle();
3034 QgsRectangle newExtent = bounds;
3035 QgsRectangle originalExtent = mExtent;
3040 if ( mAtlasScalingMode ==
Fixed || mAtlasScalingMode ==
Predefined || isPointLayer )
3042 QgsScaleCalculator calc;
3045 if ( QgsProject *project =
mLayout->project() )
3050 double originalScale = calc.
calculate( originalExtent, rect().width() );
3051 double geomCenterX = ( xa1 + xa2 ) / 2.0;
3052 double geomCenterY = ( ya1 + ya2 ) / 2.0;
3053 QVector<qreal> scales;
3055 if ( !
mLayout->reportContext().predefinedScales().empty() )
3056 scales =
mLayout->reportContext().predefinedScales();
3058 scales =
mLayout->renderContext().predefinedScales();
3060 if ( mAtlasScalingMode ==
Fixed || scales.isEmpty() || ( isPointLayer && mAtlasScalingMode !=
Predefined ) )
3063 double xMin = geomCenterX - originalExtent.
width() / 2.0;
3064 double yMin = geomCenterY - originalExtent.
height() / 2.0;
3065 newExtent = QgsRectangle( xMin, yMin, xMin + originalExtent.
width(), yMin + originalExtent.
height() );
3069 double newScale = calc.
calculate( newExtent, rect().width() );
3072 newExtent.
scale( originalScale / newScale );
3078 double newWidth = originalExtent.
width();
3079 double newHeight = originalExtent.
height();
3080 for (
int i = 0; i < scales.size(); i++ )
3082 double ratio = scales[i] / originalScale;
3083 newWidth = originalExtent.
width() * ratio;
3084 newHeight = originalExtent.
height() * ratio;
3087 double xMin = geomCenterX - newWidth / 2.0;
3088 double yMin = geomCenterY - newHeight / 2.0;
3089 newExtent = QgsRectangle( xMin, yMin, xMin + newWidth, yMin + newHeight );
3093 const double newScale = calc.
calculate( newExtent, rect().width() );
3097 newExtent.
scale( scales[i] / newScale );
3107 else if ( mAtlasScalingMode ==
Auto )
3111 double geomRatio = bounds.
width() / bounds.
height();
3112 double mapRatio = originalExtent.
width() / originalExtent.
height();
3115 if ( geomRatio < mapRatio )
3118 double adjWidth = ( mapRatio * bounds.
height() - bounds.
width() ) / 2.0;
3123 else if ( geomRatio > mapRatio )
3126 double adjHeight = ( bounds.
width() / mapRatio - bounds.
height() ) / 2.0;
3130 newExtent = QgsRectangle( xa1, ya1, xa2, ya2 );
3132 const double evaluatedAtlasMargin =
atlasMargin();
3133 if ( evaluatedAtlasMargin > 0.0 )
3135 newExtent.
scale( 1 + evaluatedAtlasMargin );
3149 QgsGeometry g =
mLayout->reportContext().currentGeometry(
crs() );
3161 double dx = std::max( std::abs( prevCenter.
x() - bounds.
xMinimum() ), std::abs( prevCenter.
x() - bounds.
xMaximum() ) );
3162 double dy = std::max( std::abs( prevCenter.
y() - bounds.
yMinimum() ), std::abs( prevCenter.
y() - bounds.
yMaximum() ) );
3164 return QgsRectangle( center.
x() - dx, center.
y() - dy, center.
x() + dx, center.
y() + dy );
3172void QgsLayoutItemMap::createStagedRenderJob(
const QgsRectangle &extent,
const QSizeF size,
double dpi )
3175 settings.
setLayers( mOverviewStack->modifyMapLayerList( settings.
layers() ) );
3177 mStagedRendererJob = std::make_unique<
3179 mStagedRendererJob->start();
3191 if ( mMap->layout() && mMap->layout()->project() )
3193 connect( mMap->layout()->project(), static_cast< void ( QgsProject::* )( const QList<QgsMapLayer *> &layers ) >( &QgsProject::layersWillBeRemoved ), this, &QgsLayoutItemMapAtlasClippingSettings::layersAboutToBeRemoved );
3199 return mClipToAtlasFeature;
3204 if (
enabled == mClipToAtlasFeature )
3207 mClipToAtlasFeature =
enabled;
3213 return mFeatureClippingType;
3218 if ( mFeatureClippingType == type )
3221 mFeatureClippingType = type;
3227 return mForceLabelsInsideFeature;
3232 if ( forceInside == mForceLabelsInsideFeature )
3235 mForceLabelsInsideFeature = forceInside;
3241 return mClipItemShape;
3255 return mRestrictToLayers;
3260 if ( mRestrictToLayers ==
enabled )
3269 return _qgis_listRefToRaw( mLayersToClip );
3280 QDomElement settingsElem = document.createElement( u
"atlasClippingSettings"_s );
3281 settingsElem.setAttribute( u
"enabled"_s, mClipToAtlasFeature ? u
"1"_s : u
"0"_s );
3282 settingsElem.setAttribute( u
"forceLabelsInside"_s, mForceLabelsInsideFeature ? u
"1"_s : u
"0"_s );
3283 if ( mClipItemShape )
3285 settingsElem.setAttribute( u
"clipItemShape"_s, u
"1"_s );
3287 settingsElem.setAttribute( u
"clippingType"_s, QString::number(
static_cast<int>( mFeatureClippingType ) ) );
3288 settingsElem.setAttribute( u
"restrictLayers"_s, mRestrictToLayers ? u
"1"_s : u
"0"_s );
3291 QDomElement layerSetElem = document.createElement( u
"layersToClip"_s );
3296 QDomElement layerElem = document.createElement( u
"Layer"_s );
3297 QDomText layerIdText = document.createTextNode( layerRef.layerId );
3298 layerElem.appendChild( layerIdText );
3300 layerElem.setAttribute( u
"name"_s, layerRef.name );
3301 layerElem.setAttribute( u
"source"_s, layerRef.source );
3302 layerElem.setAttribute( u
"provider"_s, layerRef.provider );
3304 layerSetElem.appendChild( layerElem );
3306 settingsElem.appendChild( layerSetElem );
3308 element.appendChild( settingsElem );
3314 const QDomElement settingsElem = element.firstChildElement( u
"atlasClippingSettings"_s );
3316 mClipToAtlasFeature = settingsElem.attribute( u
"enabled"_s, u
"0"_s ).toInt();
3317 mForceLabelsInsideFeature = settingsElem.attribute( u
"forceLabelsInside"_s, u
"0"_s ).toInt();
3318 mClipItemShape = settingsElem.attribute( u
"clipItemShape"_s, u
"0"_s ).toInt();
3320 mRestrictToLayers = settingsElem.attribute( u
"restrictLayers"_s, u
"0"_s ).toInt();
3322 mLayersToClip.clear();
3323 QDomNodeList layerSetNodeList = settingsElem.elementsByTagName( u
"layersToClip"_s );
3324 if ( !layerSetNodeList.isEmpty() )
3326 QDomElement layerSetElem = layerSetNodeList.at( 0 ).toElement();
3327 QDomNodeList layerIdNodeList = layerSetElem.elementsByTagName( u
"Layer"_s );
3328 mLayersToClip.reserve( layerIdNodeList.size() );
3329 for (
int i = 0; i < layerIdNodeList.size(); ++i )
3331 QDomElement layerElem = layerIdNodeList.at( i ).toElement();
3332 QString layerId = layerElem.text();
3333 QString layerName = layerElem.attribute( u
"name"_s );
3334 QString layerSource = layerElem.attribute( u
"source"_s );
3335 QString layerProvider = layerElem.attribute( u
"provider"_s );
3337 QgsMapLayerRef ref( layerId, layerName, layerSource, layerProvider );
3338 if ( mMap->layout() && mMap->layout()->project() )
3340 mLayersToClip << ref;
3347void QgsLayoutItemMapAtlasClippingSettings::layersAboutToBeRemoved(
const QList<QgsMapLayer *> &layers )
3349 if ( !mLayersToClip.isEmpty() )
3351 _qgis_removeLayers( mLayersToClip, layers );
3365 return mEnabled && mClipPathSource;
3380 if ( mClipPathSource )
3383 mClipPathSource->refresh();
3392 QgsGeometry clipGeom( mClipPathSource->clipPath() );
3393 clipGeom.
transform( mMap->layoutToMapCoordsTransform() );
3403 QgsGeometry clipGeom( mClipPathSource->clipPath() );
3404 clipGeom.
transform( mMap->sceneTransform().inverted() );
3419 if ( mClipPathSource == item )
3422 if ( mClipPathSource )
3431 mClipPathSource = item;
3433 if ( mClipPathSource )
3442 mClipPathSource->refresh();
3456 return mClipPathSource;
3461 return mFeatureClippingType;
3466 if ( mFeatureClippingType == type )
3469 mFeatureClippingType = type;
3475 return mForceLabelsInsideClipPath;
3480 if ( forceInside == mForceLabelsInsideClipPath )
3483 mForceLabelsInsideClipPath = forceInside;
3489 QDomElement settingsElem = document.createElement( u
"itemClippingSettings"_s );
3490 settingsElem.setAttribute( u
"enabled"_s, mEnabled ? u
"1"_s : u
"0"_s );
3491 settingsElem.setAttribute( u
"forceLabelsInside"_s, mForceLabelsInsideClipPath ? u
"1"_s : u
"0"_s );
3492 settingsElem.setAttribute( u
"clippingType"_s, QString::number(
static_cast<int>( mFeatureClippingType ) ) );
3493 if ( mClipPathSource )
3494 settingsElem.setAttribute( u
"clipSource"_s, mClipPathSource->uuid() );
3496 settingsElem.setAttribute( u
"clipSource"_s, QString() );
3498 element.appendChild( settingsElem );
3504 const QDomElement settingsElem = element.firstChildElement( u
"itemClippingSettings"_s );
3506 mEnabled = settingsElem.attribute( u
"enabled"_s, u
"0"_s ).toInt();
3507 mForceLabelsInsideClipPath = settingsElem.attribute( u
"forceLabelsInside"_s, u
"0"_s ).toInt();
3509 mClipPathUuid = settingsElem.attribute( u
"clipSource"_s );
3516 if ( !mClipPathUuid.isEmpty() )
@ Default
Allow raster-based rendering in situations where it is required for correct rendering or where it wil...
@ PreferVector
Prefer vector-based rendering, when the result will still be visually near-identical to a raster-base...
@ ForceVector
Always force vector-based rendering, even when the result will be visually different to a raster-base...
QFlags< VectorRenderingSimplificationFlag > VectorRenderingSimplificationFlags
Simplification flags for vector feature rendering.
@ Millimeters
Millimeters.
@ NoSimplification
No simplification can be applied.
@ CollectUnplacedLabels
Whether unplaced labels should be collected in the labeling results (regardless of whether they are b...
@ DrawUnplacedLabels
Whether to render unplaced labels as an indicator/warning for users.
@ UsePartialCandidates
Whether to use also label candidates that are partially outside of the map view.
@ Export
Renderer used for printing or exporting to a file.
@ View
Renderer used for displaying on screen.
@ Preferred
Preferred format, matching the most recent WKT ISO standard. Currently an alias to WKT2_2019,...
@ DrawEditingInfo
Enable drawing of vertex markers for layers in editing mode.
@ UseRenderingOptimization
Enable vector simplification and other rendering optimizations.
@ RenderPartialOutput
Whether to make extra effort to update map image with partially rendered layers (better for interacti...
@ ForceRasterMasks
Force symbol masking to be applied using a raster method. This is considerably faster when compared t...
@ LosslessImageRendering
Render images losslessly whenever possible, instead of the default lossy jpeg rendering used for some...
@ AlwaysUseGlobalMasks
When applying clipping paths for selective masking, always use global ("entire map") paths,...
@ DrawSelection
Whether vector selections should be shown in the rendered map.
@ Antialiasing
Enable anti-aliasing for map rendering.
@ HighQualityImageTransforms
Enable high quality image transformations, which results in better appearance of scaled or rotated ra...
@ DisableTiledRasterLayerRenders
If set, then raster layers will not be drawn as separate tiles. This may improve the appearance in ex...
@ LimitCoverageLayerRenderToCurrentFeature
Limit coverage layer rendering to the current atlas feature.
@ LosslessImageRendering
Render images losslessly whenever possible, instead of the default lossy jpeg rendering used for some...
@ AlwaysUseGlobalMasks
When applying clipping paths for selective masking, always use global ("entire map") paths,...
@ DrawSelection
Draw selection.
@ Antialiasing
Use antialiasing when drawing items.
@ RenderLabelsByMapLayer
When rendering map items to multi-layered exports, render labels belonging to different layers into s...
@ HideCoverageLayer
Hide coverage layer in outputs.
virtual QPainterPath asQPainterPath() const =0
Returns the geometry represented as a QPainterPath.
Abstract base class for annotation items which are drawn over a map.
QgsCoordinateReferenceSystem mapPositionCrs() const
Returns the CRS of the map position, or an invalid CRS if the annotation does not have a fixed map po...
void render(QgsRenderContext &context) const
Renders the annotation to a target render context.
bool isVisible() const
Returns true if the annotation is visible and should be rendered.
QPointF relativePosition() const
Returns the relative position of the annotation, if it is not attached to a fixed map position.
static QIcon getThemeIcon(const QString &name, const QColor &fillColor=QColor(), const QColor &strokeColor=QColor())
Helper to get a theme icon.
static QgsCoordinateReferenceSystemRegistry * coordinateReferenceSystemRegistry()
Returns the application's coordinate reference system (CRS) registry, which handles known CRS definit...
void userCrsChanged(const QString &id)
Emitted whenever an existing user CRS definition is changed.
Represents a coordinate reference system (CRS).
bool isValid() const
Returns whether this CRS is correctly initialized and usable.
QString toProj() const
Returns a Proj string representation of this CRS.
QString ellipsoidAcronym() const
Returns the ellipsoid acronym for the ellipsoid used by the CRS.
QString projectionAcronym() const
Returns the projection acronym for the projection used by the CRS.
QString toWkt(Qgis::CrsWktVariant variant=Qgis::CrsWktVariant::Wkt1Gdal, bool multiline=false, int indentationWidth=4) const
Returns a WKT representation of this CRS.
QgsProjOperation operation() const
Returns information about the PROJ operation associated with the coordinate reference system,...
Qgis::DistanceUnit mapUnits
QgsRange which stores a range of double values.
Single scope for storing variables and functions for use within a QgsExpressionContext.
void addFunction(const QString &name, QgsScopedExpressionFunction *function)
Adds a function to the scope.
void addVariable(const QgsExpressionContextScope::StaticVariable &variable)
Adds a variable into the context scope.
void setVariable(const QString &name, const QVariant &value, bool isStatic=false)
Convenience method for setting a variable in the context scope by name name and value.
Expression contexts are used to encapsulate the parameters around which a QgsExpression should be eva...
void appendScope(QgsExpressionContextScope *scope)
Appends a scope to the end of the context.
void setFilter(const QString &layerId, const QgsExpression &expression)
Set a filter for the given layer.
A geometry is the spatial representation of a feature.
QPolygonF asQPolygonF() const
Returns contents of the geometry as a QPolygonF.
static QgsGeometry fromRect(const QgsRectangle &rect)
Creates a new geometry from a QgsRectangle.
QgsGeometry intersection(const QgsGeometry &geometry, const QgsGeometryParameters ¶meters=QgsGeometryParameters(), QgsFeedback *feedback=nullptr) const
Returns a geometry representing the points shared by this geometry and other.
static QgsGeometry fromQPolygonF(const QPolygonF &polygon)
Construct geometry from a QPolygonF.
Qgis::GeometryOperationResult transform(const QgsCoordinateTransform &ct, Qgis::TransformDirection direction=Qgis::TransformDirection::Forward, bool transformZ=false)
Transforms this geometry as described by the coordinate transform ct.
const QgsAbstractGeometry * constGet() const
Returns a non-modifiable (const) reference to the underlying abstract geometry primitive.
static QgsGeometry fromPointXY(const QgsPointXY &point)
Creates a new geometry from a QgsPointXY object.
QgsGeometry buffer(double distance, int segments, QgsFeedback *feedback=nullptr) const
Returns a buffer region around this geometry having the given width and with a specified number of se...
bool isEmpty() const
Returns true if the geometry is empty (eg a linestring with no vertices, or a collection with no geom...
QgsRectangle boundingBox() const
Returns the bounding box of the geometry.
Qgis::GeometryOperationResult rotate(double rotation, const QgsPointXY ¢er)
Rotate this geometry around the Z axis.
A map layer which consists of a set of child layers, where all component layers are rendered as a sin...
QList< QgsMapLayer * > childLayers() const
Returns the child layers contained by the group.
void setChildLayers(const QList< QgsMapLayer * > &layers)
Sets the child layers contained by the group.
QgsGroupedFeatureFilterProvider & addProvider(const QgsFeatureFilterProvider *provider)
Add another filter provider to the group.
A representation of the interval between two datetime values.
Stores global configuration for labeling engine.
void setFlag(Qgis::LabelingFlag f, bool enabled=true)
Sets whether a particual flag is enabled.
Stores computed placement from labeling engine.
void layerOrderChanged()
Emitted when the layer order has changed.
Contains settings relating to clipping a layout map by the current atlas feature.
void setFeatureClippingType(QgsMapClippingRegion::FeatureClippingType type)
Sets the feature clipping type to apply when clipping to the current atlas feature.
bool restrictToLayers() const
Returns true if clipping should be restricted to a subset of layers.
QgsLayoutItemMapAtlasClippingSettings(QgsLayoutItemMap *map=nullptr)
Constructor for QgsLayoutItemMapAtlasClippingSettings, with the specified map parent.
bool readXml(const QDomElement &element, const QDomDocument &doc, const QgsReadWriteContext &context)
Sets the setting's state from a DOM document, where element is the DOM node corresponding to a 'Layou...
bool clipItemShape() const
Returns true if the map item shape will be clipped to the atlas feature geometry.
bool writeXml(QDomElement &element, QDomDocument &document, const QgsReadWriteContext &context) const
Stores settings in a DOM element, where element is the DOM element corresponding to a 'LayoutMap' tag...
void setRestrictToLayers(bool enabled)
Sets whether clipping should be restricted to a subset of layers.
void setLayersToClip(const QList< QgsMapLayer * > &layers)
Sets the list of map layers to clip to the atlas feature.
QList< QgsMapLayer * > layersToClip() const
Returns the list of map layers to clip to the atlas feature.
void setEnabled(bool enabled)
Sets whether the map content should be clipped to the current atlas feature.
void changed()
Emitted when the atlas clipping settings are changed.
void setClipItemShape(bool clipItemShape)
Sets whether the map item shape will be clipped to the atlas feature geometry.
bool forceLabelsInsideFeature() const
Returns true if labels should only be placed inside the atlas feature geometry.
bool enabled() const
Returns true if the map content should be clipped to the current atlas feature.
void setForceLabelsInsideFeature(bool forceInside)
Sets whether labels should only be placed inside the atlas feature geometry.
QgsMapClippingRegion::FeatureClippingType featureClippingType() const
Returns the feature clipping type to apply when clipping to the current atlas feature.
Contains settings relating to clipping a layout map by another layout item.
bool writeXml(QDomElement &element, QDomDocument &document, const QgsReadWriteContext &context) const
Stores settings in a DOM element, where element is the DOM element corresponding to a 'LayoutMap' tag...
void setForceLabelsInsideClipPath(bool forceInside)
Sets whether labels should only be placed inside the clip path geometry.
void setSourceItem(QgsLayoutItem *item)
Sets the source item which will provide the clipping path for the map.
QgsLayoutItemMapItemClipPathSettings(QgsLayoutItemMap *map=nullptr)
Constructor for QgsLayoutItemMapItemClipPathSettings, with the specified map parent.
bool readXml(const QDomElement &element, const QDomDocument &doc, const QgsReadWriteContext &context)
Sets the setting's state from a DOM document, where element is the DOM node corresponding to a 'Layou...
QgsGeometry clipPathInMapItemCoordinates() const
Returns the clipping path geometry, in the map item's coordinate space.
QgsGeometry clippedMapExtent() const
Returns the geometry to use for clipping the parent map, in the map item's CRS.
QgsLayoutItem * sourceItem()
Returns the source item which will provide the clipping path for the map, or nullptr if no item is se...
void setEnabled(bool enabled)
Sets whether the map content should be clipped to the associated item.
bool forceLabelsInsideClipPath() const
Returns true if labels should only be placed inside the clip path geometry.
void finalizeRestoreFromXml()
To be called after all pending items have been restored from XML.
QgsMapClippingRegion::FeatureClippingType featureClippingType() const
Returns the feature clipping type to apply when clipping to the associated item.
bool enabled() const
Returns true if the map content should be clipped to the associated item.
QgsMapClippingRegion toMapClippingRegion() const
Returns the clip path as a map clipping region.
void changed()
Emitted when the item clipping settings are changed.
void setFeatureClippingType(QgsMapClippingRegion::FeatureClippingType type)
Sets the feature clipping type to apply when clipping to the associated item.
bool isActive() const
Returns true if the item clipping is enabled and set to a valid source item.
An item which is drawn inside a QgsLayoutItemMap, e.g., a grid or map overview.
@ StackAboveMapLabels
Render above all map layers and labels.
StackingPosition stackingPosition() const
Returns the item's stacking position, which specifies where the in the map's stack the item should be...
bool enabled() const
Returns whether the item will be drawn.
Layout graphical items for displaying a map.
void setFollowVisibilityPreset(bool follow)
Sets whether the map should follow a map theme.
bool nextExportPart() override
Moves to the next export part for a multi-layered export item, during a multi-layered export.
void removeRenderedFeatureHandler(QgsRenderedFeatureHandlerInterface *handler)
Removes a previously added rendered feature handler.
void extentChanged()
Emitted when the map's extent changes.
QPointF mapToItemCoords(QPointF mapCoords) const
Transforms map coordinates to item coordinates (considering rotation and move offset).
bool accept(QgsStyleEntityVisitorInterface *visitor) const override
Accepts the specified style entity visitor, causing it to visit all style entities associated with th...
~QgsLayoutItemMap() override
QIcon icon() const override
Returns the item's icon.
void refreshDataDefinedProperty(QgsLayoutObject::DataDefinedProperty property=QgsLayoutObject::DataDefinedProperty::AllProperties) override
void preparedForAtlas()
Emitted when the map has been prepared for atlas rendering, just before actual rendering.
void setFollowVisibilityPresetName(const QString &name)
Sets preset name for map rendering.
QTransform layoutToMapCoordsTransform() const
Creates a transform from layout coordinates to map coordinates.
bool writePropertiesToElement(QDomElement &element, QDomDocument &document, const QgsReadWriteContext &context) const override
Stores item state within an XML DOM element.
QgsMapSettings mapSettings(const QgsRectangle &extent, QSizeF size, double dpi, bool includeLayerSettings) const
Returns map settings that will be used for drawing of the map.
bool isLabelBlockingItem(QgsLayoutItem *item) const
Returns true if the specified item is a "label blocking item".
void storeCurrentLayerStyles()
Stores the current project layer styles into style overrides.
void setAtlasDriven(bool enabled)
Sets whether the map extent will follow the current atlas feature.
QgsLayoutMeasurement labelMargin() const
Returns the margin from the map edges in which no labels may be placed.
AtlasScalingMode
Scaling modes used for the serial rendering (atlas).
@ Predefined
A scale is chosen from the predefined scales.
@ Auto
The extent is adjusted so that each feature is fully visible.
@ Fixed
The current scale of the map is used for each feature of the atlas.
bool requiresRasterization() const override
Returns true if the item is drawn in such a way that forces the whole layout to be rasterized when ex...
Q_DECL_DEPRECATED int numberExportLayers() const override
void layerStyleOverridesChanged()
Emitted when layer style overrides are changed... a means to let associated legend items know they sh...
void updateBoundingRect()
Updates the bounding rect of this item. Call this function before doing any changes related to annota...
void moveContent(double dx, double dy) override
Moves the content of the item, by a specified dx and dy in layout units.
void setZRangeEnabled(bool enabled)
Sets whether the z range is enabled (i.e.
QgsLayoutItemMapGrid * grid()
Returns the map item's first grid.
void mapRotationChanged(double newRotation)
Emitted when the map's rotation changes.
int type() const override
QList< QgsMapLayer * > layersToRender(const QgsExpressionContext *context=nullptr, bool includeInvalidLayers=false) const
Returns a list of the layers which will be rendered within this map item, considering any locked laye...
void previewRefreshed()
Emitted whenever the item's map preview has been refreshed.
friend class QgsLayoutItemMapOverview
void setExtent(const QgsRectangle &extent)
Sets a new extent for the map.
void paint(QPainter *painter, const QStyleOptionGraphicsItem *itemStyle, QWidget *pWidget) override
QFlags< MapItemFlag > MapItemFlags
void draw(QgsLayoutItemRenderContext &context) override
Draws the item's contents using the specified item render context.
QPolygonF visibleExtentPolygon() const
Returns a polygon representing the current visible map extent, considering map extents and rotation.
QgsRectangle requestedExtent() const
Calculates the extent to request and the yShift of the top-left point in case of rotation.
QgsLayoutItemMap(QgsLayout *layout)
Constructor for QgsLayoutItemMap, with the specified parent layout.
void setMapFlags(QgsLayoutItemMap::MapItemFlags flags)
Sets the map item's flags, which control how the map content is drawn.
void zoomContent(double factor, QPointF point) override
Zooms content of item.
void crsChanged()
Emitted when the map's coordinate reference system is changed.
void setLayers(const QList< QgsMapLayer * > &layers)
Sets the stored layers set.
QPolygonF transformedMapPolygon() const
Returns extent that considers rotation and shift with mOffsetX / mOffsetY.
static QgsLayoutItemMap * create(QgsLayout *layout)
Returns a new map item for the specified layout.
QRectF boundingRect() const override
QString displayName() const override
Gets item display name.
bool atlasDriven() const
Returns whether the map extent is set to follow the current atlas feature.
void setZRange(const QgsDoubleRange &range)
Sets the map's z range, which is used to filter the map's content to only display features within the...
void setLayerStyleOverrides(const QMap< QString, QString > &overrides)
Sets the stored overrides of styles for layers.
void stopLayeredExport() override
Stops a multi-layer export operation.
void addRenderedFeatureHandler(QgsRenderedFeatureHandlerInterface *handler)
Adds a rendered feature handler to use while rendering the map.
double estimatedFrameBleed() const override
Returns the estimated amount the item's frame bleeds outside the item's actual rectangle.
QPainterPath framePath() const override
Returns the path to use when drawing the item's frame or background.
QgsExpressionContext createExpressionContext() const override
This method needs to be reimplemented in all classes which implement this interface and return an exp...
void startLayeredExport() override
Starts a multi-layer export operation.
bool containsWmsLayer() const
Returns true if the map contains a WMS layer.
void setScale(double scale, bool forceUpdate=true)
Sets new map scale and changes only the map extent.
double mapRotation(QgsLayoutObject::PropertyValueType valueType=QgsLayoutObject::EvaluatedValue) const
Returns the rotation used for drawing the map within the layout item, in degrees clockwise.
double mapUnitsToLayoutUnits() const
Returns the conversion factor from map units to layout units.
QgsLayoutItemMap::MapItemFlags mapFlags() const
Returns the map item's flags, which control how the map content is drawn.
bool zRangeEnabled() const
Returns whether the z range is enabled (i.e.
void setLabelMargin(const QgsLayoutMeasurement &margin)
Sets the margin from the map edges in which no labels may be placed.
void themeChanged(const QString &theme)
Emitted when the map's associated theme is changed.
QgsLayoutItem::ExportLayerDetail exportLayerDetails() const override
Returns the details for the specified current export layer.
void zoomToExtent(const QgsRectangle &extent)
Zooms the map so that the specified extent is fully visible within the map item.
double scale() const
Returns the map scale.
@ ShowPartialLabels
Whether to draw labels which are partially outside of the map view.
@ ShowUnplacedLabels
Whether to render unplaced labels in the map view.
bool drawAnnotations() const
Returns whether annotations are drawn within the map.
QgsDoubleRange zRange() const
Returns the map's z range, which is used to filter the map's content to only display features within ...
void removeLabelBlockingItem(QgsLayoutItem *item)
Removes the specified layout item from the map's "label blocking items".
void setCrs(const QgsCoordinateReferenceSystem &crs)
Sets the map's preset crs (coordinate reference system).
void invalidateCache() override
QgsRectangle extent() const
Returns the current map extent.
QgsLayoutItemMapOverview * overview()
Returns the map item's first overview.
void finalizeRestoreFromXml() override
Called after all pending items have been restored from XML.
bool readPropertiesFromElement(const QDomElement &element, const QDomDocument &document, const QgsReadWriteContext &context) override
Sets item state from a DOM element.
void setFrameStrokeWidth(QgsLayoutMeasurement width) override
Sets the frame stroke width.
bool containsAdvancedEffects() const override
Returns true if the item contains contents with blend modes or transparency effects which can only be...
friend class QgsLayoutItemMapGrid
QgsLayoutItem::Flags itemFlags() const override
Returns the item's flags, which indicate how the item behaves.
QList< QgsMapLayer * > layers() const
Returns the stored layer set.
void setMoveContentPreviewOffset(double dx, double dy) override
Sets temporary offset for the item, by a specified dx and dy in layout units.
void setMapRotation(double rotation)
Sets the rotation for the map - this does not affect the layout item shape, only the way the map is d...
static const QgsSettingsEntryBool * settingForceRasterMasks
Settings entry - Whether to force rasterized clipping masks, regardless of output format.
QgsCoordinateReferenceSystem crs() const
Returns coordinate reference system used for rendering the map.
double atlasMargin(QgsLayoutObject::PropertyValueType valueType=QgsLayoutObject::EvaluatedValue)
Returns the margin size (percentage) used when the map is in atlas mode.
void addLabelBlockingItem(QgsLayoutItem *item)
Sets the specified layout item as a "label blocking item" for this map.
void assignFreeId()
Sets the map id() to a number not yet used in the layout.
ExportLayerBehavior exportLayerBehavior() const override
Returns the behavior of this item during exporting to layered exports (e.g.
QgsLabelingResults * previewLabelingResults() const
Returns the labeling results of the most recent preview map render.
Contains settings and helpers relating to a render of a QgsLayoutItem.
Base class for graphical items within a QgsLayout.
virtual void drawFrame(QgsRenderContext &context)
Draws the frame around the item.
virtual QPainterPath framePath() const
Returns the path to use when drawing the item's frame or background.
QColor backgroundColor(bool useDataDefined=true) const
Returns the background color for this item.
void drawRefreshingOverlay(QPainter *painter, const QStyleOptionGraphicsItem *itemStyle)
Draws a "refreshing" overlay icon on the item.
virtual void refreshDataDefinedProperty(QgsLayoutObject::DataDefinedProperty property=QgsLayoutObject::DataDefinedProperty::AllProperties)
Refreshes a data defined property for the item by reevaluating the property's value and redrawing the...
virtual void setFrameStrokeWidth(QgsLayoutMeasurement width)
Sets the frame stroke width.
QgsLayoutItem(QgsLayout *layout, bool manageZValue=true)
Constructor for QgsLayoutItem, with the specified parent layout.
void rotationChanged(double newRotation)
Emitted on item rotation change.
friend class QgsLayoutItemMap
QgsExpressionContext createExpressionContext() const override
This method needs to be reimplemented in all classes which implement this interface and return an exp...
virtual void drawBackground(QgsRenderContext &context)
Draws the background for the item.
bool shouldDrawItem() const
Returns whether the item should be drawn in the current context.
@ FlagOverridesPaint
Item overrides the default layout item painting method.
@ FlagDisableSceneCaching
Item should not have QGraphicsItem caching enabled.
virtual bool containsAdvancedEffects() const
Returns true if the item contains contents with blend modes or transparency effects which can only be...
void sizePositionChanged()
Emitted when the item's size or position changes.
virtual QString uuid() const
Returns the item identification string.
QString id() const
Returns the item's ID name.
bool frameEnabled() const
Returns true if the item includes a frame.
ExportLayerBehavior
Behavior of item when exporting to layered outputs.
@ ItemContainsSubLayers
Item contains multiple sublayers which must be individually exported.
void clipPathChanged()
Emitted when the item's clipping path has changed.
bool hasBackground() const
Returns true if the item has a background.
void refresh() override
Refreshes the item, causing a recalculation of any property overrides and recalculation of its positi...
void attemptSetSceneRect(const QRectF &rect, bool includesFrame=false)
Attempts to update the item's position and size to match the passed rect in layout coordinates.
virtual double estimatedFrameBleed() const
Returns the estimated amount the item's frame bleeds outside the item's actual rectangle.
QPainter::CompositionMode blendMode() const
Returns the item's composition blending mode.
void backgroundTaskCountChanged(int count)
Emitted whenever the number of background tasks an item is executing changes.
Provides a method of storing measurements for use in QGIS layouts using a variety of different measur...
static QgsLayoutMeasurement decodeMeasurement(const QString &string)
Decodes a measurement from a string.
QgsPropertyCollection mDataDefinedProperties
const QgsLayout * layout() const
Returns the layout the object is attached to.
void changed()
Emitted when the object's properties change.
QPointer< QgsLayout > mLayout
DataDefinedProperty
Data defined properties for different item types.
@ MapYMin
Map extent y minimum.
@ MapZRangeUpper
Map frame Z-range lower value.
@ StartDateTime
Temporal range's start DateTime.
@ MapLayers
Map layer set.
@ MapZRangeLower
Map frame Z-range lower value.
@ MapRotation
Map rotation.
@ MapXMax
Map extent x maximum.
@ MapStylePreset
Layer and style map theme.
@ MapYMax
Map extent y maximum.
@ MapAtlasMargin
Map atlas margin.
@ EndDateTime
Temporal range's end DateTime.
@ MapXMin
Map extent x minimum.
@ MapLabelMargin
Map label margin.
@ AllProperties
All properties for item.
PropertyValueType
Specifies whether the value returned by a function should be the original, user set value,...
@ EvaluatedValue
Return the current evaluated value for the property.
void predefinedScalesChanged()
Emitted when the list of predefined scales changes.
static QgsRenderContext createRenderContextForMap(QgsLayoutItemMap *map, QPainter *painter, double dpi=-1)
Creates a render context suitable for the specified layout map and painter destination.
static void rotate(double angle, double &x, double &y)
Rotates a point / vector around the origin.
static Q_DECL_DEPRECATED double scaleFactorFromItemStyle(const QStyleOptionGraphicsItem *style)
Extracts the scale factor from an item style.
QgsLayoutItem * itemByUuid(const QString &uuid, bool includeTemplateUuids=false) const
Returns the layout item with matching uuid unique identifier, or nullptr if a matching item could not...
void refreshed()
Emitted when the layout has been refreshed and items should also be refreshed and updated.
A map clipping region (in map coordinates and CRS).
void setRestrictToLayers(bool enabled)
Sets whether clipping should be restricted to a subset of layers.
FeatureClippingType
Feature clipping behavior, which controls how features from vector layers will be clipped.
void setFeatureClip(FeatureClippingType type)
Sets the feature clipping type.
void setRestrictedLayers(const QList< QgsMapLayer * > &layers)
Sets a list of layers to restrict the clipping region effects to.
Stores style information (renderer, opacity, labeling, diagrams etc.) applicable to a map layer.
void readXml(const QDomElement &styleElement)
Read style configuration (for project file reading).
void readFromLayer(QgsMapLayer *layer)
Store layer's active style information in the instance.
void writeXml(QDomElement &styleElement) const
Write style configuration (for project file writing).
QString xmlData() const
Returns XML content of the style.
Base class for all map layer types.
void cancelWithoutBlocking() override
Triggers cancellation of the rendering job without blocking.
void finished()
emitted when asynchronous rendering is finished (or canceled).
@ RenderLabelsByMapLayer
Labels should be rendered in individual stages by map layer. This allows separation of labels belongi...
@ Finished
Rendering is finished.
@ Symbology
Rendering layer symbology.
@ Labels
Rendering labels.
static QStringList containsAdvancedEffects(const QgsMapSettings &mapSettings, EffectsCheckFlags flags=QgsMapSettingsUtils::EffectsCheckFlags())
Checks whether any of the layers attached to a map settings object contain advanced effects.
Contains configuration for rendering maps.
void setElevationShadingRenderer(const QgsElevationShadingRenderer &renderer)
Sets the shading renderer used to render shading on the entire map.
void addClippingRegion(const QgsMapClippingRegion ®ion)
Adds a new clipping region to the map settings.
QList< QgsMapLayer * > layers(bool expandGroupLayers=false) const
Returns the list of layers which will be rendered in the map.
void setSelectionColor(const QColor &color)
Sets the color that is used for drawing of selected vector features.
void setSimplifyMethod(const QgsVectorSimplifyMethod &method)
Sets the simplification setting to use when rendering vector layers.
QPolygonF visiblePolygon() const
Returns the visible area as a polygon (may be rotated).
void addRenderedFeatureHandler(QgsRenderedFeatureHandlerInterface *handler)
Adds a rendered feature handler to use while rendering the map settings.
void setTextRenderFormat(Qgis::TextRenderFormat format)
Sets the text render format, which dictates how text is rendered (e.g.
void setLayers(const QList< QgsMapLayer * > &layers)
Sets the list of layers to render in the map.
bool setEllipsoid(const QString &ellipsoid)
Sets the ellipsoid by its acronym.
void setScaleMethod(Qgis::ScaleCalculationMethod method)
Sets the method to use for scale calculations for the map.
void setDpiTarget(double dpi)
Sets the target dpi (dots per inch) to be taken into consideration when rendering.
void setDevicePixelRatio(float dpr)
Sets the device pixel ratio.
void setZRange(const QgsDoubleRange &range)
Sets the range of z-values which will be visible in the map.
void setOutputDpi(double dpi)
Sets the dpi (dots per inch) used for conversion between real world units (e.g.
void setRendererUsage(Qgis::RendererUsage rendererUsage)
Sets the rendering usage.
void setRasterizedRenderingPolicy(Qgis::RasterizedRenderingPolicy policy)
Sets the policy controlling when rasterisation of content during renders is permitted.
QgsRectangle extent() const
Returns geographical coordinates of the rectangle that should be rendered.
void setMaskSettings(const QgsMaskRenderSettings &settings)
Sets the mask render settings, which control how masks are drawn and behave during the map render.
void setLayerStyleOverrides(const QMap< QString, QString > &overrides)
Sets the map of map layer style overrides (key: layer ID, value: style name) where a different style ...
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.
void setLabelingEngineSettings(const QgsLabelingEngineSettings &settings)
Sets the global configuration of the labeling engine.
void setTransformContext(const QgsCoordinateTransformContext &context)
Sets the coordinate transform context, which stores various information regarding which datum transfo...
void setRotation(double rotation)
Sets the rotation of the resulting map image, in degrees clockwise.
void setPathResolver(const QgsPathResolver &resolver)
Sets the path resolver for conversion between relative and absolute paths during rendering operations...
void setLabelBoundaryGeometry(const QgsGeometry &boundary)
Sets the label boundary geometry, which restricts where in the rendered map labels are permitted to b...
void setLabelBlockingRegions(const QList< QgsLabelBlockingRegion > ®ions)
Sets a list of regions to avoid placing labels within.
void setOutputSize(QSize size)
Sets the size of the resulting map image, in pixels.
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.
void mapThemeRenamed(const QString &name, const QString &newName)
Emitted when a map theme within the collection is renamed.
void mapThemeChanged(const QString &theme)
Emitted when a map theme changes definition.
QString description() const
Description.
Encapsulates a QGIS project, including sets of map layers and their styles, layouts,...
void layersWillBeRemoved(const QStringList &layerIds)
Emitted when one or more layers are about to be removed from the registry.
void crsChanged()
Emitted when the crs() of the project has changed.
QgsMapThemeCollection * mapThemeCollection
void projectColorsChanged()
Emitted whenever the project's color scheme has been changed.
QgsLayerTree * layerTreeRoot() const
Returns pointer to the root (invisible) node of the project's layer tree.
Qgis::ScaleCalculationMethod scaleMethod
A container for the context for various read/write operations on objects.
A rectangle specified with double values.
void scale(double scaleFactor, const QgsPointXY *c=nullptr)
Scale the rectangle around its center point.
void setYMinimum(double y)
Set the minimum y value.
void setXMinimum(double x)
Set the minimum x value.
void setYMaximum(double y)
Set the maximum y value.
void setXMaximum(double x)
Set the maximum x value.
static QgsRectangle fromCenterAndSize(const QgsPointXY ¢er, double width, double height)
Creates a new rectangle, given the specified center point and width and height.
Contains information about the context of a rendering operation.
QPainter * painter()
Returns the destination QPainter for the render operation.
void setPainterFlagsUsingContext(QPainter *painter=nullptr) const
Sets relevant flags on a destination painter, using the flags and settings currently defined for the ...
QgsExpressionContext & expressionContext()
Gets the expression context.
void setRasterizedRenderingPolicy(Qgis::RasterizedRenderingPolicy policy)
Sets the policy controlling when rasterisation of content during renders is permitted.
Qgis::RasterizedRenderingPolicy rasterizedRenderingPolicy() const
Returns the policy controlling when rasterisation of content during renders is permitted.
void setExpressionContext(const QgsExpressionContext &context)
Sets the expression context.
An interface for classes which provide custom handlers for features rendered as part of a map render ...
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.
void setDpi(double dpi)
Sets the dpi (dots per inch) for the output resolution, to be used in scale calculations.
void setMapUnits(Qgis::DistanceUnit mapUnits)
Set the map units.
void setEllipsoid(const QString &ellipsoid)
Sets the ellipsoid by its acronym.
void setMethod(Qgis::ScaleCalculationMethod method)
Sets the method to use for map scale calculations.
Scoped object for saving and restoring a QPainter object's state.
A boolean settings entry.
static QgsSettingsTreeNode * sTreeLayout
An interface for classes which can visit style entity (e.g.
@ LayoutItem
Individual item in a print layout.
virtual bool visitExit(const QgsStyleEntityVisitorInterface::Node &node)
Called when the visitor stops visiting a node.
virtual bool visitEnter(const QgsStyleEntityVisitorInterface::Node &node)
Called when the visitor starts visiting a node.
const QgsDateTimeRange & temporalRange() const
Returns the datetime range for the object.
bool isTemporal() const
Returns true if the object's temporal range is enabled, and the object will be filtered when renderin...
void setIsTemporal(bool enabled)
Sets whether the temporal range is enabled (i.e.
void setTemporalRange(const QgsDateTimeRange &range)
Sets the temporal range for the object.
T begin() const
Returns the beginning of the range.
T end() const
Returns the upper bound of the range.
static Q_INVOKABLE QString toString(Qgis::DistanceUnit unit)
Returns a translated string representing a distance unit.
static double scaleToZoom(double mapScale, double z0Scale=559082264.0287178)
Finds zoom level given map scale denominator.
static int scaleToZoomLevel(double mapScale, int sourceMinZoom, int sourceMaxZoom, double z0Scale=559082264.0287178)
Finds the best fitting zoom level given a map scale denominator and allowed zoom level range.
static Qgis::GeometryType geometryType(Qgis::WkbType type)
Returns the geometry type for a WKB type, e.g., both MultiPolygon and CurvePolygon would have a Polyg...
#define Q_NOWARN_DEPRECATED_POP
QString qgsDoubleToString(double a, int precision=17)
Returns a string representation of a double.
#define Q_NOWARN_DEPRECATED_PUSH
bool qgsDoubleNear(double a, double b, double epsilon=4 *std::numeric_limits< double >::epsilon())
Compare two doubles (but allow some difference).
QPointer< QgsMapLayer > QgsWeakMapLayerPointer
Weak pointer for QgsMapLayer.
_LayerRef< QgsMapLayer > QgsMapLayerRef
QgsTemporalRange< QDateTime > QgsDateTimeRange
QgsRange which stores a range of date times.
Single variable definition for use within a QgsExpressionContextScope.
Contains details of a particular export layer relating to a layout item.
QPainter::CompositionMode compositionMode
Associated composition mode if this layer is associated with a map layer.
QString mapLayerId
Associated map layer ID, or an empty string if this export layer is not associated with a map layer.
double opacity
Associated opacity, if this layer is associated with a map layer.
QString name
User-friendly name for the export layer.
QString mapTheme
Associated map theme, or an empty string if this export layer does not need to be associated with a m...
Contains information relating to a node (i.e.
TYPE * resolveWeakly(const QgsProject *project, MatchType matchType=MatchType::All)
Resolves the map layer by attempting to find a matching layer in a project using a weak match.
QString source
Weak reference to layer public source.
QString name
Weak reference to layer name.
QString provider
Weak reference to layer provider.
TYPE * resolve(const QgsProject *project)
Resolves the map layer by attempting to find a layer with matching ID within a project.
QString layerId
Original layer ID.