50#include <QApplication>
54#include <QStyleOptionGraphicsItem>
57#include "moc_qgslayoutitemmap.cpp"
59using namespace Qt::StringLiterals;
69 mBackgroundUpdateTimer =
new QTimer(
this );
70 mBackgroundUpdateTimer->setSingleShot(
true );
71 connect( mBackgroundUpdateTimer, &QTimer::timeout,
this, &QgsLayoutItemMap::recreateCachedImageInBackground );
75 setCacheMode( QGraphicsItem::NoCache );
79 mGridStack = std::make_unique< QgsLayoutItemMapGridStack >(
this );
80 mOverviewStack = std::make_unique< QgsLayoutItemMapOverviewStack >(
this );
88 crs.updateDefinition();
106 mPainterJob->cancel();
131 QList<QgsLayoutItemMap *> mapsList;
132 mLayout->layoutItems( mapsList );
141 if ( map->mMapId == mMapId )
144 maxId = std::max( maxId, map->mMapId );
149 mLayout->itemsModel()->updateItemDisplayName(
this );
161 return tr(
"Map %1" ).arg( mMapId );
173 mCachedLayerStyleOverridesPresetName.clear();
177 updateAtlasFeature();
182 if ( rect().isEmpty() || !
mLayout )
187 calculator.
setDpi( 25.4 );
191 calculator.
setMethod( project->scaleMethod() );
199 double currentScaleDenominator =
scale();
206 double scaleRatio = scaleDenominator / currentScaleDenominator;
207 mExtent.scale( scaleRatio );
209 if ( mAtlasDriven && mAtlasScalingMode ==
Fixed )
216 calculator.
setDpi( 25.4 );
222 calculator.
setMethod( project->scaleMethod() );
226 const double newScale = calculator.
calculate( mExtent, rect().width() );
229 scaleRatio = scaleDenominator / newScale;
230 mExtent.scale( scaleRatio );
255 if ( mExtent.isFinite() && !mExtent.isEmpty() )
257 const QRectF currentRect = rect();
258 const double newHeight = mExtent.width() == 0 ? 0 : currentRect.width() * mExtent.height() / mExtent.width();
270 double currentWidthHeightRatio = 1.0;
271 if ( !currentExtent.
isEmpty() )
272 currentWidthHeightRatio = currentExtent.
width() / currentExtent.
height();
274 currentWidthHeightRatio = rect().width() / rect().height();
276 if ( currentWidthHeightRatio != 0 && !std::isnan( currentWidthHeightRatio ) && !newExtent.
isEmpty() )
278 double newWidthHeightRatio = newExtent.
width() / newExtent.
height();
280 if ( currentWidthHeightRatio < newWidthHeightRatio )
283 double newHeight = newExtent.
width() / currentWidthHeightRatio;
284 double deltaHeight = newHeight - newExtent.
height();
291 double newWidth = currentWidthHeightRatio * newExtent.
height();
292 double deltaWidth = newWidth - newExtent.
width();
298 if ( mExtent == newExtent )
317QPolygonF QgsLayoutItemMap::calculateVisibleExtentPolygon(
bool includeClipping )
const
320 mapPolygon( mExtent, poly );
322 if ( includeClipping )
329 poly = poly.intersected( geom.asQPolygonF() );
333 if ( mItemClippingSettings->isActive() )
335 const QgsGeometry geom = mItemClippingSettings->clippedMapExtent();
348 return calculateVisibleExtentPolygon(
true );
353 if ( mCrs.isValid() )
356 return mLayout->project()->crs();
371 return _qgis_listRefToRaw( mLayers );
376 mGroupLayers.clear();
378 QList<QgsMapLayer *> layersCopy {
layers };
383 for (
auto it = layersCopy.begin(); it != layersCopy.end(); ++it )
385 if (
const QgsGroupLayer *groupLayer = qobject_cast<QgsGroupLayer *>( *it ) )
387 auto existingIt = mGroupLayers.find( groupLayer->id() );
388 if ( existingIt != mGroupLayers.end() )
390 *it = ( *existingIt ).second.get();
394 std::unique_ptr<QgsGroupLayer> groupLayerClone { groupLayer->clone() };
397 groupLayerClone->setId( groupLayer->id() );
398 mGroupLayers[groupLayer->id()] = std::move( groupLayerClone );
399 *it = mGroupLayers[groupLayer->id()].get();
403 mLayers = _qgis_listRawToRef( layersCopy );
408 if ( overrides == mLayerStyleOverrides )
411 mLayerStyleOverrides = overrides;
417 mLayerStyleOverrides.clear();
424 mLayerStyleOverrides.insert( layer->id(), style.
xmlData() );
431 if ( mFollowVisibilityPreset == follow )
434 mFollowVisibilityPreset = follow;
436 if ( !mFollowVisibilityPresetName.isEmpty() )
437 emit
themeChanged( mFollowVisibilityPreset ? mFollowVisibilityPresetName : QString() );
442 if ( name == mFollowVisibilityPresetName )
445 mFollowVisibilityPresetName = name;
446 if ( mFollowVisibilityPreset )
452 mLastRenderedImageOffsetX -= dx;
453 mLastRenderedImageOffsetY -= dy;
456 transformShift( dx, dy );
457 if ( !mExtent.isNull() )
459 mExtent.setXMinimum( mExtent.xMinimum() + dx );
460 mExtent.setXMaximum( mExtent.xMaximum() + dx );
461 mExtent.setYMinimum( mExtent.yMinimum() + dy );
462 mExtent.setYMaximum( mExtent.yMaximum() + dy );
476 if ( mDrawing || mExtent.isNull() )
482 double mapX = mExtent.xMinimum() + ( point.x() / rect().width() ) * ( mExtent.xMaximum() - mExtent.xMinimum() );
483 double mapY = mExtent.yMinimum() + ( 1 - ( point.y() / rect().height() ) ) * ( mExtent.yMaximum() - mExtent.yMinimum() );
486 double centerX = ( mExtent.xMaximum() + mExtent.xMinimum() ) / 2;
487 double centerY = ( mExtent.yMaximum() + mExtent.yMinimum() ) / 2;
489 centerX = mapX + ( centerX - mapX ) * ( 1.0 / factor );
490 centerY = mapY + ( centerY - mapY ) * ( 1.0 / factor );
492 double newIntervalX, newIntervalY;
496 newIntervalX = ( mExtent.xMaximum() - mExtent.xMinimum() ) / factor;
497 newIntervalY = ( mExtent.yMaximum() - mExtent.yMinimum() ) / factor;
504 mExtent.setXMaximum( centerX + newIntervalX / 2 );
505 mExtent.setXMinimum( centerX - newIntervalX / 2 );
506 mExtent.setYMaximum( centerY + newIntervalY / 2 );
507 mExtent.setYMinimum( centerY - newIntervalY / 2 );
509 if ( mAtlasDriven && mAtlasScalingMode ==
Fixed )
516 calculator.
setDpi( 25.4 );
521 calculator.
setMethod( project->scaleMethod() );
525 const double newScale = calculator.
calculate( mExtent, rect().width() );
528 const double scaleRatio =
scale() / newScale;
529 mExtent.scale( scaleRatio );
546 if ( layer->dataProvider() && layer->providerType() ==
"wms"_L1 )
556 if (
blendMode() != QPainter::CompositionMode_SourceOver )
575 auto containsAdvancedEffectsIgnoreItemOpacity = [
this]() ->
bool {
584 if ( mOverviewStack->containsAdvancedEffects() )
592 if ( mGridStack->containsAdvancedEffects() )
605 if ( !containsAdvancedEffectsIgnoreItemOpacity() )
626 if ( mOverviewStack->containsAdvancedEffects() )
634 if ( mGridStack->containsAdvancedEffects() )
649 mMapRotation = rotation;
650 mEvaluatedMapRotation = mMapRotation;
663 mAtlasDriven = enabled;
680 double margin = mAtlasMargin;
688 margin = ddMargin / 100;
700 if ( mGridStack->size() < 1 )
703 mGridStack->addGrid(
grid );
705 return mGridStack->grid( 0 );
710 if ( mOverviewStack->size() < 1 )
713 mOverviewStack->addOverview(
overview );
715 return mOverviewStack->overview( 0 );
725 for (
int i = 0; i < mGridStack->size(); ++i )
728 if (
grid->mEvaluatedEnabled )
731 frameBleed = std::max( frameBleed,
grid->mEvaluatedGridFrameWidth +
grid->mEvaluatedGridFrameMargin +
grid->mEvaluatedGridFrameLineThickness / 2.0 );
746 mapElem.setAttribute( u
"keepLayerSet"_s, u
"true"_s );
750 mapElem.setAttribute( u
"keepLayerSet"_s, u
"false"_s );
753 if ( mDrawAnnotations )
755 mapElem.setAttribute( u
"drawCanvasItems"_s, u
"true"_s );
759 mapElem.setAttribute( u
"drawCanvasItems"_s, u
"false"_s );
763 QDomElement extentElem = doc.createElement( u
"Extent"_s );
768 mapElem.appendChild( extentElem );
770 if ( mCrs.isValid() )
772 QDomElement crsElem = doc.createElement( u
"crs"_s );
773 mCrs.writeXml( crsElem, doc );
774 mapElem.appendChild( crsElem );
778 mapElem.setAttribute( u
"followPreset"_s, mFollowVisibilityPreset ? u
"true"_s : u
"false"_s );
779 mapElem.setAttribute( u
"followPresetName"_s, mFollowVisibilityPresetName );
782 mapElem.setAttribute( u
"mapRotation"_s, QString::number( mMapRotation ) );
785 QDomElement layerSetElem = doc.createElement( u
"LayerSet"_s );
790 QDomElement layerElem = doc.createElement( u
"Layer"_s );
792 const auto it = std::find_if( mGroupLayers.cbegin(), mGroupLayers.cend(), [&layerRef](
const std::pair<
const QString, std::unique_ptr<QgsGroupLayer>> &groupLayer ) ->
bool {
793 return groupLayer.second.get() == layerRef.get();
796 if ( it != mGroupLayers.end() )
802 layerId = layerRef.layerId;
805 QDomText layerIdText = doc.createTextNode( layerId );
806 layerElem.appendChild( layerIdText );
808 layerElem.setAttribute( u
"name"_s, layerRef.name );
809 layerElem.setAttribute( u
"source"_s, layerRef.source );
810 layerElem.setAttribute( u
"provider"_s, layerRef.provider );
812 if ( it != mGroupLayers.end() )
814 const auto childLayers { it->second->childLayers() };
815 QDomElement childLayersElement = doc.createElement( u
"childLayers"_s );
816 for (
const QgsMapLayer *childLayer : std::as_const( childLayers ) )
818 QDomElement childElement = doc.createElement( u
"child"_s );
819 childElement.setAttribute( u
"layerid"_s, childLayer->id() );
820 childLayersElement.appendChild( childElement );
822 layerElem.appendChild( childLayersElement );
824 layerSetElem.appendChild( layerElem );
826 mapElem.appendChild( layerSetElem );
829 if ( mKeepLayerStyles )
831 QDomElement stylesElem = doc.createElement( u
"LayerStyles"_s );
832 for (
auto styleIt = mLayerStyleOverrides.constBegin(); styleIt != mLayerStyleOverrides.constEnd(); ++styleIt )
834 QDomElement styleElem = doc.createElement( u
"LayerStyle"_s );
839 styleElem.setAttribute( u
"layerid"_s, ref.
layerId );
840 styleElem.setAttribute( u
"name"_s, ref.
name );
841 styleElem.setAttribute( u
"source"_s, ref.
source );
842 styleElem.setAttribute( u
"provider"_s, ref.
provider );
846 stylesElem.appendChild( styleElem );
848 mapElem.appendChild( stylesElem );
852 mGridStack->writeXml( mapElem, doc, context );
855 mOverviewStack->writeXml( mapElem, doc, context );
858 QDomElement atlasElem = doc.createElement( u
"AtlasMap"_s );
859 atlasElem.setAttribute( u
"atlasDriven"_s, mAtlasDriven );
860 atlasElem.setAttribute( u
"scalingMode"_s, mAtlasScalingMode );
862 mapElem.appendChild( atlasElem );
864 mapElem.setAttribute( u
"labelMargin"_s, mLabelMargin.encodeMeasurement() );
865 mapElem.setAttribute( u
"mapFlags"_s,
static_cast< int>( mMapFlags ) );
867 QDomElement labelBlockingItemsElem = doc.createElement( u
"labelBlockingItems"_s );
868 for (
const auto &item : std::as_const( mBlockingLabelItems ) )
873 QDomElement blockingItemElem = doc.createElement( u
"item"_s );
874 blockingItemElem.setAttribute( u
"uuid"_s, item->uuid() );
875 labelBlockingItemsElem.appendChild( blockingItemElem );
877 mapElem.appendChild( labelBlockingItemsElem );
880 mapElem.setAttribute( u
"isTemporal"_s,
isTemporal() ? 1 : 0 );
883 mapElem.setAttribute( u
"temporalRangeBegin"_s,
temporalRange().begin().toString( Qt::ISODate ) );
884 mapElem.setAttribute( u
"temporalRangeEnd"_s,
temporalRange().end().toString( Qt::ISODate ) );
887 mapElem.setAttribute( u
"enableZRange"_s, mZRangeEnabled ? 1 : 0 );
888 if ( mZRange.lower() != std::numeric_limits< double >::lowest() )
890 if ( mZRange.upper() != std::numeric_limits< double >::max() )
893 mAtlasClippingSettings->writeXml( mapElem, doc, context );
894 mItemClippingSettings->writeXml( mapElem, doc, context );
901 mUpdatesEnabled =
false;
904 QDomNodeList extentNodeList = itemElem.elementsByTagName( u
"Extent"_s );
905 if ( !extentNodeList.isEmpty() )
907 QDomElement extentElem = extentNodeList.at( 0 ).toElement();
908 double xmin, xmax, ymin, ymax;
909 xmin = extentElem.attribute( u
"xmin"_s ).toDouble();
910 xmax = extentElem.attribute( u
"xmax"_s ).toDouble();
911 ymin = extentElem.attribute( u
"ymin"_s ).toDouble();
912 ymax = extentElem.attribute( u
"ymax"_s ).toDouble();
916 QDomNodeList crsNodeList = itemElem.elementsByTagName( u
"crs"_s );
918 if ( !crsNodeList.isEmpty() )
920 QDomElement crsElem = crsNodeList.at( 0 ).toElement();
921 crs.readXml( crsElem );
926 mMapRotation = itemElem.attribute( u
"mapRotation"_s, u
"0"_s ).toDouble();
927 mEvaluatedMapRotation = mMapRotation;
930 mFollowVisibilityPreset = itemElem.attribute( u
"followPreset"_s ).compare(
"true"_L1 ) == 0;
931 mFollowVisibilityPresetName = itemElem.attribute( u
"followPresetName"_s );
934 QString keepLayerSetFlag = itemElem.attribute( u
"keepLayerSet"_s );
935 if ( keepLayerSetFlag.compare(
"true"_L1, Qt::CaseInsensitive ) == 0 )
937 mKeepLayerSet =
true;
941 mKeepLayerSet =
false;
944 QString drawCanvasItemsFlag = itemElem.attribute( u
"drawCanvasItems"_s, u
"true"_s );
945 if ( drawCanvasItemsFlag.compare(
"true"_L1, Qt::CaseInsensitive ) == 0 )
947 mDrawAnnotations =
true;
951 mDrawAnnotations =
false;
954 mLayerStyleOverrides.clear();
956 QList<QgsMapLayerRef> layerSet;
957 QDomNodeList layerSetNodeList = itemElem.elementsByTagName( u
"LayerSet"_s );
958 if ( !layerSetNodeList.isEmpty() )
960 QDomElement layerSetElem = layerSetNodeList.at( 0 ).toElement();
961 QDomNodeList layerIdNodeList = layerSetElem.elementsByTagName( u
"Layer"_s );
962 layerSet.reserve( layerIdNodeList.size() );
963 for (
int i = 0; i < layerIdNodeList.size(); ++i )
965 QDomElement layerElem = layerIdNodeList.at( i ).toElement();
966 QString layerId = layerElem.text();
967 QString layerName = layerElem.attribute( u
"name"_s );
968 QString layerSource = layerElem.attribute( u
"source"_s );
969 QString layerProvider = layerElem.attribute( u
"provider"_s );
971 QgsMapLayerRef ref( layerId, layerName, layerSource, layerProvider );
979 setLayers( _qgis_listRefToRaw( layerSet ) );
982 if ( !layerSetNodeList.isEmpty() )
984 QDomElement layerSetElem = layerSetNodeList.at( 0 ).toElement();
985 QDomNodeList layerIdNodeList = layerSetElem.elementsByTagName( u
"Layer"_s );
986 for (
int i = 0; i < layerIdNodeList.size(); ++i )
988 QDomElement layerElem = layerIdNodeList.at( i ).toElement();
989 const QString layerId = layerElem.text();
990 const auto it = mGroupLayers.find( layerId );
991 if ( it != mGroupLayers.cend() )
993 QList<QgsMapLayerRef> childSet;
994 const QDomNodeList childLayersElements = layerElem.elementsByTagName( u
"childLayers"_s );
995 const QDomNodeList children = childLayersElements.at( 0 ).childNodes();
996 for (
int i = 0; i < children.size(); ++i )
998 const QDomElement childElement = children.at( i ).toElement();
999 const QString
id = childElement.attribute( u
"layerid"_s );
1003 childSet.push_back( layerRef );
1006 it->second->setChildLayers( _qgis_listRefToRaw( childSet ) );
1013 QDomNodeList layerStylesNodeList = itemElem.elementsByTagName( u
"LayerStyles"_s );
1014 mKeepLayerStyles = !layerStylesNodeList.isEmpty();
1015 if ( mKeepLayerStyles )
1017 QDomElement layerStylesElem = layerStylesNodeList.at( 0 ).toElement();
1018 QDomNodeList layerStyleNodeList = layerStylesElem.elementsByTagName( u
"LayerStyle"_s );
1019 for (
int i = 0; i < layerStyleNodeList.size(); ++i )
1021 const QDomElement &layerStyleElement = layerStyleNodeList.at( i ).toElement();
1022 QString layerId = layerStyleElement.attribute( u
"layerid"_s );
1023 QString layerName = layerStyleElement.attribute( u
"name"_s );
1024 QString layerSource = layerStyleElement.attribute( u
"source"_s );
1025 QString layerProvider = layerStyleElement.attribute( u
"provider"_s );
1026 QgsMapLayerRef ref( layerId, layerName, layerSource, layerProvider );
1030 style.
readXml( layerStyleElement );
1036 mNumCachedLayers = 0;
1037 mCacheInvalidated =
true;
1040 mOverviewStack->readXml( itemElem, doc, context );
1043 mGridStack->readXml( itemElem, doc, context );
1046 QDomNodeList atlasNodeList = itemElem.elementsByTagName( u
"AtlasMap"_s );
1047 if ( !atlasNodeList.isEmpty() )
1049 QDomElement atlasElem = atlasNodeList.at( 0 ).toElement();
1050 mAtlasDriven = ( atlasElem.attribute( u
"atlasDriven"_s, u
"0"_s ) !=
"0"_L1 );
1051 if ( atlasElem.hasAttribute( u
"fixedScale"_s ) )
1053 mAtlasScalingMode = ( atlasElem.attribute( u
"fixedScale"_s, u
"0"_s ) !=
"0"_L1 ) ?
Fixed :
Auto;
1055 else if ( atlasElem.hasAttribute( u
"scalingMode"_s ) )
1057 mAtlasScalingMode =
static_cast<AtlasScalingMode>( atlasElem.attribute( u
"scalingMode"_s ).toInt() );
1059 mAtlasMargin = atlasElem.attribute( u
"margin"_s, u
"0.1"_s ).toDouble();
1064 mMapFlags =
static_cast< MapItemFlags>( itemElem.attribute( u
"mapFlags"_s,
nullptr ).toInt() );
1067 mBlockingLabelItems.clear();
1068 mBlockingLabelItemUuids.clear();
1069 QDomNodeList labelBlockingNodeList = itemElem.elementsByTagName( u
"labelBlockingItems"_s );
1070 if ( !labelBlockingNodeList.isEmpty() )
1072 QDomElement blockingItems = labelBlockingNodeList.at( 0 ).toElement();
1073 QDomNodeList labelBlockingNodeList = blockingItems.childNodes();
1074 for (
int i = 0; i < labelBlockingNodeList.size(); ++i )
1076 const QDomElement &itemBlockingElement = labelBlockingNodeList.at( i ).toElement();
1077 const QString itemUuid = itemBlockingElement.attribute( u
"uuid"_s );
1078 mBlockingLabelItemUuids << itemUuid;
1082 mAtlasClippingSettings->readXml( itemElem, doc, context );
1083 mItemClippingSettings->readXml( itemElem, doc, context );
1088 setIsTemporal( itemElem.attribute( u
"isTemporal"_s ).toInt() );
1091 const QDateTime begin = QDateTime::fromString( itemElem.attribute( u
"temporalRangeBegin"_s ), Qt::ISODate );
1092 const QDateTime end = QDateTime::fromString( itemElem.attribute( u
"temporalRangeEnd"_s ), Qt::ISODate );
1096 mZRangeEnabled = itemElem.attribute( u
"enableZRange"_s ).toInt();
1098 double zLower = itemElem.attribute( u
"zRangeLower"_s ).toDouble( &ok );
1101 zLower = std::numeric_limits< double >::lowest();
1103 double zUpper = itemElem.attribute( u
"zRangeUpper"_s ).toDouble( &ok );
1106 zUpper = std::numeric_limits< double >::max();
1110 mUpdatesEnabled =
true;
1114bool QgsLayoutItemMap::hasCustomFramePath()
const
1125 return mItemClippingSettings->isActive();
1130 QPainterPath customFramePath;
1131 if ( mAtlasClippingSettings->enabled() && mAtlasClippingSettings->clipItemShape() )
1136 QPolygonF visibleExtent = calculateVisibleExtentPolygon(
false );
1137 QPolygonF rectPoly = QPolygonF( QRectF( 0, 0, rect().width(), rect().height() ) );
1140 visibleExtent.pop_back();
1141 rectPoly.pop_back();
1144 QTransform transform;
1145 QTransform::quadToQuad( visibleExtent, rectPoly, transform );
1155 if ( mItemClippingSettings->isActive() )
1157 const QgsGeometry g = mItemClippingSettings->clipPathInMapItemCoordinates();
1160 if ( !customFramePath.isEmpty() )
1163 customFramePath.closeSubpath();
1177 if ( !
mLayout || !painter || !painter->device() || !mUpdatesEnabled )
1186 QRectF thisPaintRect = rect();
1192 if (
mLayout->renderContext().isPreviewRender() )
1194 bool renderInProgress =
false;
1195 mPreviewDevicePixelRatio = painter->device()->devicePixelRatioF();
1198 painter->setClipRect( thisPaintRect );
1199 if ( !mCacheFinalImage || mCacheFinalImage->isNull() )
1202 painter->setBrush( QBrush( QColor( 125, 125, 125, 125 ) ) );
1203 painter->drawRect( thisPaintRect );
1204 painter->setBrush( Qt::NoBrush );
1206 messageFont.setPointSize( 12 );
1207 painter->setFont( messageFont );
1208 painter->setPen( QColor( 255, 255, 255, 255 ) );
1209 painter->drawText( thisPaintRect, Qt::AlignCenter | Qt::AlignHCenter, tr(
"Rendering map" ) );
1210 if ( mPainterJob && mCacheInvalidated && !mDrawingPreview )
1214 mBackgroundUpdateTimer->start( 100 );
1216 else if ( !mPainterJob && !mDrawingPreview )
1220 mBackgroundUpdateTimer->start( 100 );
1222 renderInProgress =
true;
1226 if ( mCacheInvalidated && !mDrawingPreview )
1230 mBackgroundUpdateTimer->start( 100 );
1231 renderInProgress =
true;
1236 double imagePixelWidth = mCacheFinalImage->width();
1237 double scale = rect().width() / imagePixelWidth * mCacheFinalImage->devicePixelRatio();
1241 painter->translate( mLastRenderedImageOffsetX + mXOffset, mLastRenderedImageOffsetY + mYOffset );
1242 painter->setCompositionMode( blendModeForRender() );
1244 painter->drawImage( 0, 0, *mCacheFinalImage );
1249 painter->setClipRect( thisPaintRect, Qt::NoClip );
1251 mOverviewStack->drawItems( painter,
false );
1252 mGridStack->drawItems( painter );
1254 drawMapFrame( painter );
1256 if ( renderInProgress )
1267 QPaintDevice *paintDevice = painter->device();
1275 painter->setRenderHint( QPainter::LosslessImageRendering,
true );
1284 int widthInPixels =
static_cast< int >( std::round(
boundingRect().width() * layoutUnitsInInches * destinationDpi ) );
1285 int heightInPixels =
static_cast< int >( std::round(
boundingRect().height() * layoutUnitsInInches * destinationDpi ) );
1286 QImage image = QImage( widthInPixels, heightInPixels, QImage::Format_ARGB32 );
1288 image.fill( Qt::transparent );
1289 image.setDotsPerMeterX(
static_cast< int >( std::round( 1000 * destinationDpi / 25.4 ) ) );
1290 image.setDotsPerMeterY(
static_cast< int >( std::round( 1000 * destinationDpi / 25.4 ) ) );
1291 double dotsPerMM = destinationDpi / 25.4;
1292 QPainter p( &image );
1295 QRect imagePaintRect(
1296 static_cast< int >( std::round( tl.x() * dotsPerMM ) ),
1297 static_cast< int >( std::round( tl.y() * dotsPerMM ) ),
1298 static_cast< int >( std::round( thisPaintRect.width() * dotsPerMM ) ),
1299 static_cast< int >( std::round( thisPaintRect.height() * dotsPerMM ) )
1301 p.setClipRect( imagePaintRect );
1303 p.translate( imagePaintRect.topLeft() );
1307 if ( shouldDrawPart( Background ) )
1309 p.scale( dotsPerMM, dotsPerMM );
1310 drawMapBackground( &p );
1311 p.scale( 1.0 / dotsPerMM, 1.0 / dotsPerMM );
1314 drawMap( &p, cExtent, imagePaintRect.size(), image.logicalDpiX() );
1319 p.scale( dotsPerMM, dotsPerMM );
1321 if ( shouldDrawPart( OverviewMapExtent ) )
1323 mOverviewStack->drawItems( &p,
false );
1325 if ( shouldDrawPart( Grid ) )
1327 mGridStack->drawItems( &p );
1332 painter->setCompositionMode( blendModeForRender() );
1333 painter->scale( 1 / dotsPerMM, 1 / dotsPerMM );
1334 painter->drawImage( QPointF( -tl.x() * dotsPerMM, -tl.y() * dotsPerMM ), image );
1335 painter->scale( dotsPerMM, dotsPerMM );
1340 if ( shouldDrawPart( Background ) )
1342 drawMapBackground( painter );
1346 painter->setClipRect( thisPaintRect );
1351 painter->translate( mXOffset, mYOffset );
1353 double dotsPerMM = paintDevice->logicalDpiX() / 25.4;
1355 painter->scale( 1 / dotsPerMM, 1 / dotsPerMM );
1357 if ( mCurrentExportPart != NotLayered )
1359 if ( !mStagedRendererJob )
1361 createStagedRenderJob( cExtent, size, paintDevice->logicalDpiX() );
1364 mStagedRendererJob->renderCurrentPart( painter );
1368 drawMap( painter, cExtent, size, paintDevice->logicalDpiX() );
1372 painter->setClipRect( thisPaintRect, Qt::NoClip );
1374 if ( shouldDrawPart( OverviewMapExtent ) )
1376 mOverviewStack->drawItems( painter,
false );
1378 if ( shouldDrawPart( Grid ) )
1380 mGridStack->drawItems( painter );
1385 if ( shouldDrawPart( Frame ) )
1387 drawMapFrame( painter );
1398 + ( layerCount + ( layerCount ? 1 : 0 ) )
1399 + ( mGridStack->hasEnabledItems() ? 1 : 0 )
1400 + ( mOverviewStack->hasEnabledItems() ? 1 : 0 )
1406 mCurrentExportPart = Start;
1408 mExportThemes = !mFollowVisibilityPreset ?
mLayout->renderContext().exportThemes() : QStringList();
1409 mExportThemeIt = mExportThemes.begin();
1414 mCurrentExportPart = NotLayered;
1415 mExportThemes.clear();
1416 mExportThemeIt = mExportThemes.begin();
1421 switch ( mCurrentExportPart )
1426 mCurrentExportPart = Background;
1432 mCurrentExportPart = Layer;
1436 if ( mStagedRendererJob )
1438 if ( mStagedRendererJob->nextPart() )
1442 mExportLabelingResults.reset( mStagedRendererJob->takeLabelingResults() );
1443 mStagedRendererJob.reset();
1447 if ( mExportThemeIt != mExportThemes.end() && ++mExportThemeIt != mExportThemes.end() )
1453 if ( mGridStack->hasEnabledItems() )
1455 mCurrentExportPart = Grid;
1461 for (
int i = 0; i < mOverviewStack->size(); ++i )
1466 mCurrentExportPart = OverviewMapExtent;
1472 case OverviewMapExtent:
1475 mCurrentExportPart = Frame;
1482 if ( isSelected() && !
mLayout->renderContext().isPreviewRender() )
1484 mCurrentExportPart = SelectionBoxes;
1489 case SelectionBoxes:
1490 mCurrentExportPart = End;
1511 switch ( mCurrentExportPart )
1521 if ( !mExportThemes.empty() && mExportThemeIt != mExportThemes.end() )
1524 if ( mStagedRendererJob )
1526 switch ( mStagedRendererJob->currentStage() )
1530 detail.
mapLayerId = mStagedRendererJob->currentLayerId();
1531 detail.
compositionMode = mStagedRendererJob->currentLayerCompositionMode();
1532 detail.
opacity = mStagedRendererJob->currentLayerOpacity();
1540 else if (
mLayout->project()->mainAnnotationLayer()->id() == detail.
mapLayerId )
1551 const QList<QgsLayoutItemMapOverview *> res = mOverviewStack->asList();
1557 if ( item->mapLayer() && detail.
mapLayerId == item->mapLayer()->id() )
1562 detail.
name = u
"%1: %2"_s.arg(
displayName(), item->mapLayer()->name() );
1571 detail.
mapLayerId = mStagedRendererJob->currentLayerId();
1577 detail.
name = tr(
"%1: %2 (Labels)" ).arg(
displayName(), layer->name() );
1612 case OverviewMapExtent:
1620 case SelectionBoxes:
1635void QgsLayoutItemMap::drawMap( QPainter *painter,
const QgsRectangle &extent, QSizeF size,
double dpi )
1641 if ( std::isnan( size.width() ) || std::isnan( size.height() ) ||
qgsDoubleNear( size.width(), 0.0 ) ||
qgsDoubleNear( size.height(), 0.0 ) )
1643 QgsDebugError( u
"Trying to draw a map with invalid size (%1, %2)"_s.arg( size.width() ).arg( size.height() ) );
1650 if ( shouldDrawPart( OverviewMapExtent ) )
1652 ms.setLayers( mOverviewStack->modifyMapLayerList( ms.layers() ) );
1655 QgsMapRendererCustomPainterJob job( ms, painter );
1656#ifdef HAVE_SERVER_PYTHON_PLUGINS
1657 job.setFeatureFilterProvider(
mLayout->renderContext().featureFilterProvider() );
1660 QgsGroupedFeatureFilterProvider jobFeatureFilter;
1663 jobFeatureFilter.
addProvider( mAtlasFeatureFilterProvider.get() );
1664 if ( job.featureFilterProvider() )
1666 jobFeatureFilter.
addProvider( job.featureFilterProvider() );
1668 job.setFeatureFilterProvider( &jobFeatureFilter );
1674 job.renderSynchronously();
1676 mExportLabelingResults.reset( job.takeLabelingResults() );
1678 mRenderingErrors = job.errors();
1682 mRenderingErrors.append( QgsMapRendererJob::Error( QString(), u
"Invalid layer(s)"_s ) );
1686void QgsLayoutItemMap::recreateCachedImageInBackground()
1691 QgsMapRendererCustomPainterJob *oldJob = mPainterJob.release();
1692 QPainter *oldPainter = mPainter.release();
1693 QImage *oldImage = mCacheRenderingImage.release();
1695 oldJob->deleteLater();
1703 mCacheRenderingImage.reset(
nullptr );
1707 Q_ASSERT( !mPainterJob );
1708 Q_ASSERT( !mPainter );
1709 Q_ASSERT( !mCacheRenderingImage );
1711 QgsRectangle ext =
extent();
1715 int w =
static_cast< int >( std::round( widthLayoutUnits * mPreviewScaleFactor ) );
1716 int h =
static_cast< int >( std::round( heightLayoutUnits * mPreviewScaleFactor ) );
1719 if ( w > 5000 || h > 5000 )
1724 h =
static_cast< int>( std::round( w * heightLayoutUnits / widthLayoutUnits ) );
1729 w =
static_cast< int >( std::round( h * widthLayoutUnits / heightLayoutUnits ) );
1733 if ( w <= 0 || h <= 0 )
1736 mCacheRenderingImage = std::make_unique<QImage>( w * mPreviewDevicePixelRatio, h * mPreviewDevicePixelRatio, QImage::Format_ARGB32 );
1739 mCacheRenderingImage->setDotsPerMeterX(
static_cast< int >( std::round( 1000 * w / widthLayoutUnits ) ) );
1740 mCacheRenderingImage->setDotsPerMeterY(
static_cast< int >( std::round( 1000 * h / heightLayoutUnits ) ) );
1741 mCacheRenderingImage->setDevicePixelRatio( mPreviewDevicePixelRatio );
1744 mCacheRenderingImage->fill( QColor( 255, 255, 255, 0 ).rgba() );
1749 if ( hasCustomFramePath() )
1751 QPainter p( mCacheRenderingImage.get() );
1753 p.setPen( Qt::NoPen );
1755 p.scale( mCacheRenderingImage->width() / widthLayoutUnits, mCacheRenderingImage->height() / heightLayoutUnits );
1765 mCacheInvalidated =
false;
1766 mPainter = std::make_unique<QPainter>( mCacheRenderingImage.get() );
1767 QgsMapSettings settings(
mapSettings( ext, QSizeF( w, h ), mCacheRenderingImage->logicalDpiX(),
true ) );
1769 if ( shouldDrawPart( OverviewMapExtent ) )
1771 settings.setLayers( mOverviewStack->modifyMapLayerList( settings.layers() ) );
1774 mPainterJob = std::make_unique<QgsMapRendererCustomPainterJob>( settings, mPainter.get() );
1777 mPainterJob->setFeatureFilterProvider( mAtlasFeatureFilterProvider.get() );
1780 mPainterJob->start();
1792 mDrawingPreview =
false;
1815 if (
layout()->renderContext().isPreviewRender() )
1818 jobMapSettings.
setDevicePixelRatio( mPainter ? mPainter->device()->devicePixelRatioF() : 1.0 );
1821 jobMapSettings.
setRotation( mEvaluatedMapRotation );
1829 if ( includeLayerSettings )
1834 if ( !
mLayout->project()->mainAnnotationLayer()->isEmpty() )
1837 layers.insert( 0,
mLayout->project()->mainAnnotationLayer() );
1844 if ( !
mLayout->renderContext().isPreviewRender() )
1893 if ( mEvaluatedLabelMargin.length() > 0 )
1896 visiblePoly.append( visiblePoly.at( 0 ) );
1897 const double layoutLabelMargin =
mLayout->convertToLayoutUnits( mEvaluatedLabelMargin );
1898 const double layoutLabelMarginInMapUnits = layoutLabelMargin / rect().width() * jobMapSettings.
extent().
width();
1900 mapBoundaryGeom = mapBoundaryGeom.
buffer( -layoutLabelMarginInMapUnits, 0 );
1901 labelBoundary = mapBoundaryGeom;
1904 if ( !mBlockingLabelItems.isEmpty() )
1917 if ( mZRangeEnabled )
1922 if ( mAtlasClippingSettings->enabled() &&
mLayout->reportContext().feature().isValid() )
1926 region.
setFeatureClip( mAtlasClippingSettings->featureClippingType() );
1931 if ( mAtlasClippingSettings->forceLabelsInsideFeature() )
1933 if ( !labelBoundary.
isEmpty() )
1935 labelBoundary = clipGeom.
intersection( labelBoundary );
1939 labelBoundary = clipGeom;
1944 if ( mItemClippingSettings->isActive() )
1946 const QgsGeometry clipGeom = mItemClippingSettings->clippedMapExtent();
1949 jobMapSettings.
addClippingRegion( mItemClippingSettings->toMapClippingRegion() );
1951 if ( mItemClippingSettings->forceLabelsInsideClipPath() )
1953 const double layoutLabelMargin =
mLayout->convertToLayoutUnits( mEvaluatedLabelMargin );
1954 const double layoutLabelMarginInMapUnits = layoutLabelMargin / rect().width() * jobMapSettings.
extent().
width();
1956 mapBoundaryGeom = mapBoundaryGeom.
buffer( -layoutLabelMarginInMapUnits, 0 );
1957 if ( !labelBoundary.
isEmpty() )
1959 labelBoundary = mapBoundaryGeom.
intersection( labelBoundary );
1963 labelBoundary = mapBoundaryGeom;
1969 if ( !labelBoundary.
isNull() )
1972 return jobMapSettings;
1979 mBlockingLabelItems.clear();
1980 for (
const QString &
uuid : std::as_const( mBlockingLabelItemUuids ) )
1989 mOverviewStack->finalizeRestoreFromXml();
1990 mGridStack->finalizeRestoreFromXml();
1991 mItemClippingSettings->finalizeRestoreFromXml();
2002 return mCurrentRectangle;
2016 const double mapScale =
scale();
2040 QVariantList layersIds;
2050 const QList<QgsMapLayer *> layersInMap =
layersToRender( &context );
2052 layersIds.reserve( layersInMap.count() );
2053 layers.reserve( layersInMap.count() );
2056 layersIds << layer->id();
2062 scope->
addFunction( u
"is_layer_visible"_s,
new QgsExpressionContextUtils::GetLayerVisibility( layersInMap,
scale() ) );
2084 if ( extentWidth <= 0 )
2088 return rect().width() / extentWidth;
2093 double dx = mXOffset;
2094 double dy = mYOffset;
2095 transformShift( dx, dy );
2096 QPolygonF poly = calculateVisibleExtentPolygon(
false );
2097 poly.translate( -dx, -dy );
2103 if ( !mBlockingLabelItems.contains( item ) )
2104 mBlockingLabelItems.append( item );
2111 mBlockingLabelItems.removeAll( item );
2118 return mBlockingLabelItems.contains( item );
2123 return mPreviewLabelingResults.get();
2132 if ( mOverviewStack )
2134 for (
int i = 0; i < mOverviewStack->size(); ++i )
2136 if ( mOverviewStack->item( i )->accept( visitor ) )
2143 for (
int i = 0; i < mGridStack->size(); ++i )
2145 if ( mGridStack->item( i )->accept( visitor ) )
2158 mRenderedFeatureHandlers.append( handler );
2163 mRenderedFeatureHandlers.removeAll( handler );
2169 if ( mapPoly.empty() )
2171 return QPointF( 0, 0 );
2176 double dx = mapCoords.x() - rotationPoint.
x();
2177 double dy = mapCoords.y() - rotationPoint.
y();
2179 QgsPointXY backRotatedCoords( rotationPoint.
x() + dx, rotationPoint.
y() + dy );
2182 double xItem = rect().width() * ( backRotatedCoords.
x() - unrotatedExtent.
xMinimum() ) / unrotatedExtent.
width();
2183 double yItem = rect().height() * ( 1 - ( backRotatedCoords.
y() - unrotatedExtent.
yMinimum() ) / unrotatedExtent.
height() );
2184 return QPointF( xItem, yItem );
2198 mapPolygon( newExtent, poly );
2199 QRectF bRect = poly.boundingRect();
2200 extent.setXMinimum( bRect.left() );
2201 extent.setXMaximum( bRect.right() );
2202 extent.setYMinimum( bRect.top() );
2203 extent.setYMaximum( bRect.bottom() );
2213 mCacheInvalidated =
true;
2219 QRectF rectangle = rect();
2220 double frameExtension =
frameEnabled() ? pen().widthF() / 2.0 : 0.0;
2222 double topExtension = 0.0;
2223 double rightExtension = 0.0;
2224 double bottomExtension = 0.0;
2225 double leftExtension = 0.0;
2228 mGridStack->calculateMaxGridExtension( topExtension, rightExtension, bottomExtension, leftExtension );
2230 topExtension = std::max( topExtension, frameExtension );
2231 rightExtension = std::max( rightExtension, frameExtension );
2232 bottomExtension = std::max( bottomExtension, frameExtension );
2233 leftExtension = std::max( leftExtension, frameExtension );
2235 rectangle.setLeft( rectangle.left() - leftExtension );
2236 rectangle.setRight( rectangle.right() + rightExtension );
2237 rectangle.setTop( rectangle.top() - topExtension );
2238 rectangle.setBottom( rectangle.bottom() + bottomExtension );
2239 if ( rectangle != mCurrentRectangle )
2241 prepareGeometryChange();
2242 mCurrentRectangle = rectangle;
2273 refreshMapExtents( &context );
2275 if ( mExtent != beforeExtent )
2282 refreshLabelMargin(
false );
2286 const QString previousTheme = mLastEvaluatedThemeName.isEmpty() ? mFollowVisibilityPresetName : mLastEvaluatedThemeName;
2288 if ( mLastEvaluatedThemeName != previousTheme )
2309 double zLower = mZRange.lower();
2310 double zUpper = mZRange.upper();
2321 mCacheInvalidated =
true;
2326void QgsLayoutItemMap::layersAboutToBeRemoved(
const QList<QgsMapLayer *> &layers )
2328 if ( !mLayers.isEmpty() || mLayerStyleOverrides.isEmpty() )
2332 mLayerStyleOverrides.remove( layer->id() );
2334 _qgis_removeLayers( mLayers,
layers );
2337 for ( QgsMapLayer *layer : std::as_const(
layers ) )
2340 if ( mGroupLayers.erase( layer->id() ) == 0 )
2343 for (
auto it = mGroupLayers.begin(); it != mGroupLayers.end(); ++it )
2345 QgsGroupLayer *groupLayer = it->second.get();
2346 if ( groupLayer->
childLayers().contains( layer ) )
2348 QList<QgsMapLayer *> childLayers { groupLayer->
childLayers() };
2349 childLayers.removeAll( layer );
2357void QgsLayoutItemMap::painterJobFinished()
2360 mPreviewLabelingResults.reset( mPainterJob->takeLabelingResults() );
2361 mPainterJob.reset(
nullptr );
2362 mPainter.reset(
nullptr );
2363 mCacheFinalImage = std::move( mCacheRenderingImage );
2364 mLastRenderedImageOffsetX = 0;
2365 mLastRenderedImageOffsetY = 0;
2371void QgsLayoutItemMap::shapeChanged()
2374 if ( !mExtent.isNull() )
2376 QgsPointXY oldCenter = mExtent.center();
2378 double w = rect().width();
2379 double h = rect().height();
2382 double newWidth = mExtent.width();
2384 double newHeight = newWidth * h / w;
2390 refreshMapExtents();
2397void QgsLayoutItemMap::mapThemeChanged(
const QString &theme )
2399 if ( theme == mCachedLayerStyleOverridesPresetName )
2400 mCachedLayerStyleOverridesPresetName.clear();
2403void QgsLayoutItemMap::currentMapThemeRenamed(
const QString &theme,
const QString &newTheme )
2405 if ( theme == mFollowVisibilityPresetName )
2407 mFollowVisibilityPresetName = newTheme;
2411void QgsLayoutItemMap::connectUpdateSlot()
2414 QgsProject *project =
mLayout->project();
2418 connect( project,
static_cast< void ( QgsProject::* )(
const QList<QgsMapLayer *> &
layers )
>( &
QgsProject::layersWillBeRemoved ),
this, &QgsLayoutItemMap::layersAboutToBeRemoved );
2421 if ( layers().isEmpty() )
2429 if ( !mCrs.isValid() )
2445 if ( mAtlasScalingMode == Predefined )
2446 updateAtlasFeature();
2452 QPolygonF thisExtent = calculateVisibleExtentPolygon(
false );
2453 QTransform mapTransform;
2454 QPolygonF thisRectPoly = QPolygonF( QRectF( 0, 0, rect().width(), rect().height() ) );
2456 thisRectPoly.pop_back();
2457 thisExtent.pop_back();
2459 QPolygonF thisItemPolyInLayout = mapToScene( thisRectPoly );
2462 QTransform::quadToQuad( thisItemPolyInLayout, thisExtent, mapTransform );
2463 return mapTransform;
2468 mZRangeEnabled = enabled;
2473 return mZRangeEnabled;
2486QList<QgsLabelBlockingRegion> QgsLayoutItemMap::createLabelBlockingRegions(
const QgsMapSettings & )
const
2489 QList< QgsLabelBlockingRegion > blockers;
2490 blockers.reserve( mBlockingLabelItems.count() );
2491 for (
const auto &item : std::as_const( mBlockingLabelItems ) )
2498 if ( item->property(
"wasVisible" ).isValid() )
2500 if ( !item->property(
"wasVisible" ).toBool() )
2503 else if ( !item->isVisible() )
2506 QPolygonF itemRectInMapCoordinates = mapTransform.map( item->mapToScene( item->rect() ) );
2507 itemRectInMapCoordinates.append( itemRectInMapCoordinates.at( 0 ) );
2509 blockers << QgsLabelBlockingRegion( blockingRegion );
2516 return mLabelMargin;
2521 mLabelMargin = margin;
2522 refreshLabelMargin(
false );
2525void QgsLayoutItemMap::updateToolTip()
2534 if ( mFollowVisibilityPreset )
2536 presetName = mFollowVisibilityPresetName;
2540 else if ( !mExportThemes.empty() && mExportThemeIt != mExportThemes.end() )
2541 presetName = *mExportThemeIt;
2552 QList<QgsMapLayer *> renderLayers;
2554 QString presetName = themeToRender( *evalContext );
2555 if ( !presetName.isEmpty() )
2557 if (
mLayout->project()->mapThemeCollection()->hasMapTheme( presetName ) )
2558 renderLayers =
mLayout->project()->mapThemeCollection()->mapThemeVisibleLayers( presetName );
2560 renderLayers =
mLayout->project()->mapThemeCollection()->masterVisibleLayers();
2562 else if ( !
layers().isEmpty() )
2568 renderLayers =
mLayout->project()->mapThemeCollection()->masterVisibleLayers();
2575 renderLayers.clear();
2577 const QStringList layerNames = ddLayers.split(
'|' );
2579 for (
const QString &name : layerNames )
2581 const QList< QgsMapLayer * > matchingLayers =
mLayout->project()->mapLayersByName( name );
2584 renderLayers << layer;
2593 int removeAt = renderLayers.indexOf(
mLayout->reportContext().layer() );
2594 if ( removeAt != -1 )
2596 renderLayers.removeAt( removeAt );
2601 if ( !includeInvalidLayers )
2603 renderLayers.erase( std::remove_if( renderLayers.begin(), renderLayers.end(), [](
QgsMapLayer *layer ) { return !layer || !layer->isValid(); } ), renderLayers.end() );
2606 return renderLayers;
2609QMap<QString, QString> QgsLayoutItemMap::layerStyleOverridesToRender(
const QgsExpressionContext &context )
const
2611 QString presetName = themeToRender( context );
2612 if ( !presetName.isEmpty() )
2614 if (
mLayout->project()->mapThemeCollection()->hasMapTheme( presetName ) )
2616 if ( presetName != mCachedLayerStyleOverridesPresetName )
2619 mCachedPresetLayerStyleOverrides =
mLayout->project()->mapThemeCollection()->mapThemeStyleOverrides( presetName );
2620 mCachedLayerStyleOverridesPresetName = presetName;
2623 return mCachedPresetLayerStyleOverrides;
2626 return QMap<QString, QString>();
2628 else if ( mFollowVisibilityPreset )
2630 QString presetName = mFollowVisibilityPresetName;
2633 if (
mLayout->project()->mapThemeCollection()->hasMapTheme( presetName ) )
2635 if ( presetName.isEmpty() || presetName != mCachedLayerStyleOverridesPresetName )
2638 mCachedPresetLayerStyleOverrides =
mLayout->project()->mapThemeCollection()->mapThemeStyleOverrides( presetName );
2639 mCachedLayerStyleOverridesPresetName = presetName;
2642 return mCachedPresetLayerStyleOverrides;
2645 return QMap<QString, QString>();
2647 else if ( mKeepLayerStyles )
2649 return mLayerStyleOverrides;
2653 return QMap<QString, QString>();
2657QgsRectangle QgsLayoutItemMap::transformedExtent()
const
2659 double dx = mXOffset;
2660 double dy = mYOffset;
2661 transformShift( dx, dy );
2662 return QgsRectangle( mExtent.xMinimum() - dx, mExtent.yMinimum() - dy, mExtent.xMaximum() - dx, mExtent.yMaximum() - dy );
2665void QgsLayoutItemMap::mapPolygon(
const QgsRectangle &extent, QPolygonF &poly )
const
2670 poly << QPointF(
extent.xMinimum(),
extent.yMaximum() );
2671 poly << QPointF(
extent.xMaximum(),
extent.yMaximum() );
2672 poly << QPointF(
extent.xMaximum(),
extent.yMinimum() );
2673 poly << QPointF(
extent.xMinimum(),
extent.yMinimum() );
2675 poly << QPointF( poly.at( 0 ) );
2680 QgsPointXY rotationPoint( (
extent.xMaximum() +
extent.xMinimum() ) / 2.0, (
extent.yMaximum() +
extent.yMinimum() ) / 2.0 );
2684 dx = rotationPoint.x() -
extent.xMinimum();
2685 dy = rotationPoint.y() -
extent.yMaximum();
2687 poly << QPointF( rotationPoint.x() - dx, rotationPoint.y() - dy );
2690 dx = rotationPoint.x() -
extent.xMaximum();
2691 dy = rotationPoint.y() -
extent.yMaximum();
2693 poly << QPointF( rotationPoint.x() - dx, rotationPoint.y() - dy );
2696 dx = rotationPoint.x() -
extent.xMaximum();
2697 dy = rotationPoint.y() -
extent.yMinimum();
2699 poly << QPointF( rotationPoint.x() - dx, rotationPoint.y() - dy );
2702 dx = rotationPoint.x() -
extent.xMinimum();
2703 dy = rotationPoint.y() -
extent.yMinimum();
2705 poly << QPointF( rotationPoint.x() - dx, rotationPoint.y() - dy );
2708 poly << QPointF( poly.at( 0 ) );
2711void QgsLayoutItemMap::transformShift(
double &xShift,
double &yShift )
const
2714 double dxScaled = xShift * mmToMapUnits;
2715 double dyScaled = -yShift * mmToMapUnits;
2730 const QList< QgsAnnotation * > annotations =
mLayout->project()->annotationManager()->annotations();
2731 if ( annotations.isEmpty() )
2740 for ( QgsAnnotation *annotation : annotations )
2742 if ( !annotation || !annotation->isVisible() )
2746 if ( annotation->mapLayer() && !
layers.contains( annotation->mapLayer() ) )
2749 drawAnnotation( annotation, rc );
2760 QgsScopedQPainterState painterState( context.
painter() );
2763 double itemX, itemY;
2766 QPointF mapPos = layoutMapPosForItem( annotation );
2775 context.
painter()->translate( itemX, itemY );
2778 double dotsPerMM = context.
painter()->device()->logicalDpiX() / 25.4;
2779 context.
painter()->scale( 1 / dotsPerMM, 1 / dotsPerMM );
2781 annotation->
render( context );
2784QPointF QgsLayoutItemMap::layoutMapPosForItem(
const QgsAnnotation *annotation )
const
2787 return QPointF( 0, 0 );
2794 QgsCoordinateReferenceSystem annotationCrs = annotation->
mapPositionCrs();
2796 if ( annotationCrs !=
crs() )
2799 QgsCoordinateTransform t( annotationCrs,
crs(),
mLayout->project() );
2803 t.transformInPlace( mapX, mapY, z );
2805 catch (
const QgsCsException & )
2812void QgsLayoutItemMap::drawMapFrame( QPainter *p )
2823void QgsLayoutItemMap::drawMapBackground( QPainter *p )
2834bool QgsLayoutItemMap::shouldDrawPart( QgsLayoutItemMap::PartType part )
const
2836 if ( mCurrentExportPart == NotLayered )
2854 return mCurrentExportPart == Layer;
2857 return mCurrentExportPart == Grid && mGridStack->hasEnabledItems();
2859 case OverviewMapExtent:
2860 return mCurrentExportPart == OverviewMapExtent && mOverviewStack->hasEnabledItems();
2865 case SelectionBoxes:
2866 return mCurrentExportPart == SelectionBoxes && isSelected();
2877 QgsExpressionContext scopedContext;
2882 const QgsExpressionContext *evalContext = context ? context : &scopedContext;
2886 QgsRectangle newExtent =
extent();
2887 bool useDdXMin =
false;
2888 bool useDdXMax =
false;
2889 bool useDdYMin =
false;
2890 bool useDdYMax =
false;
2921 if ( newExtent != mExtent )
2927 double currentWidthHeightRatio = mExtent.width() / mExtent.height();
2928 double newWidthHeightRatio = newExtent.
width() / newExtent.
height();
2930 if ( currentWidthHeightRatio < newWidthHeightRatio )
2933 double newHeight = newExtent.
width() / currentWidthHeightRatio;
2934 double deltaHeight = newHeight - newExtent.
height();
2941 double newWidth = currentWidthHeightRatio * newExtent.
height();
2942 double deltaWidth = newWidth - newExtent.
width();
2947 mExtent = newExtent;
2957 newExtent = mExtent;
2960 if ( useDdXMax || useDdXMin || useDdYMax || useDdYMin )
2964 if ( useDdXMin && !useDdXMax )
2966 double xMax = mExtent.xMaximum() - ( mExtent.xMinimum() - minXD );
2970 else if ( !useDdXMin && useDdXMax )
2972 double xMin = mExtent.xMinimum() - ( mExtent.xMaximum() - maxXD );
2976 if ( useDdYMin && !useDdYMax )
2978 double yMax = mExtent.yMaximum() - ( mExtent.yMinimum() - minYD );
2982 else if ( !useDdYMin && useDdYMax )
2984 double yMin = mExtent.yMinimum() - ( mExtent.yMaximum() - maxYD );
2989 if ( newExtent != mExtent )
2991 mExtent = newExtent;
3008void QgsLayoutItemMap::refreshLabelMargin(
bool updateItem )
3013 mEvaluatedLabelMargin.setUnits( mLabelMargin.units() );
3021void QgsLayoutItemMap::updateAtlasFeature()
3023 if ( !
mLayout->reportContext().layer() || !
mLayout->reportContext().feature().isValid() )
3026 QgsFeatureExpressionFilterProvider *filter =
new QgsFeatureExpressionFilterProvider();
3027 filter->
setFilter(
mLayout->reportContext().layer()->id(), QgsExpression( u
"@id = %1"_s.arg(
mLayout->reportContext().feature().id() ) ) );
3028 mAtlasFeatureFilterProvider = std::make_unique<QgsGroupedFeatureFilterProvider>();
3029 mAtlasFeatureFilterProvider->addProvider( filter );
3034 QgsRectangle bounds = computeAtlasRectangle();
3042 QgsRectangle newExtent = bounds;
3043 QgsRectangle originalExtent = mExtent;
3048 if ( mAtlasScalingMode ==
Fixed || mAtlasScalingMode ==
Predefined || isPointLayer )
3050 QgsScaleCalculator calc;
3053 if ( QgsProject *project =
mLayout->project() )
3058 double originalScale = calc.
calculate( originalExtent, rect().width() );
3059 double geomCenterX = ( xa1 + xa2 ) / 2.0;
3060 double geomCenterY = ( ya1 + ya2 ) / 2.0;
3061 QVector<qreal> scales;
3063 if ( !
mLayout->reportContext().predefinedScales().empty() )
3064 scales =
mLayout->reportContext().predefinedScales();
3066 scales =
mLayout->renderContext().predefinedScales();
3068 if ( mAtlasScalingMode ==
Fixed || scales.isEmpty() || ( isPointLayer && mAtlasScalingMode !=
Predefined ) )
3071 double xMin = geomCenterX - originalExtent.
width() / 2.0;
3072 double yMin = geomCenterY - originalExtent.
height() / 2.0;
3073 newExtent = QgsRectangle( xMin, yMin, xMin + originalExtent.
width(), yMin + originalExtent.
height() );
3077 double newScale = calc.
calculate( newExtent, rect().width() );
3080 newExtent.
scale( originalScale / newScale );
3086 double newWidth = originalExtent.
width();
3087 double newHeight = originalExtent.
height();
3088 for (
int i = 0; i < scales.size(); i++ )
3090 double ratio = scales[i] / originalScale;
3091 newWidth = originalExtent.
width() * ratio;
3092 newHeight = originalExtent.
height() * ratio;
3095 double xMin = geomCenterX - newWidth / 2.0;
3096 double yMin = geomCenterY - newHeight / 2.0;
3097 newExtent = QgsRectangle( xMin, yMin, xMin + newWidth, yMin + newHeight );
3101 const double newScale = calc.
calculate( newExtent, rect().width() );
3105 newExtent.
scale( scales[i] / newScale );
3115 else if ( mAtlasScalingMode ==
Auto )
3119 double geomRatio = bounds.
width() / bounds.
height();
3120 double mapRatio = originalExtent.
width() / originalExtent.
height();
3123 if ( geomRatio < mapRatio )
3126 double adjWidth = ( mapRatio * bounds.
height() - bounds.
width() ) / 2.0;
3131 else if ( geomRatio > mapRatio )
3134 double adjHeight = ( bounds.
width() / mapRatio - bounds.
height() ) / 2.0;
3138 newExtent = QgsRectangle( xa1, ya1, xa2, ya2 );
3140 const double evaluatedAtlasMargin =
atlasMargin();
3141 if ( evaluatedAtlasMargin > 0.0 )
3143 newExtent.
scale( 1 + evaluatedAtlasMargin );
3157 QgsGeometry g =
mLayout->reportContext().currentGeometry(
crs() );
3169 double dx = std::max( std::abs( prevCenter.
x() - bounds.
xMinimum() ), std::abs( prevCenter.
x() - bounds.
xMaximum() ) );
3170 double dy = std::max( std::abs( prevCenter.
y() - bounds.
yMinimum() ), std::abs( prevCenter.
y() - bounds.
yMaximum() ) );
3172 return QgsRectangle( center.
x() - dx, center.
y() - dy, center.
x() + dx, center.
y() + dy );
3180void QgsLayoutItemMap::createStagedRenderJob(
const QgsRectangle &extent,
const QSizeF size,
double dpi )
3183 settings.
setLayers( mOverviewStack->modifyMapLayerList( settings.
layers() ) );
3185 mStagedRendererJob = std::make_unique<
3187 mStagedRendererJob->start();
3199 if ( mMap->layout() && mMap->layout()->project() )
3201 connect( mMap->layout()->project(), static_cast< void ( QgsProject::* )( const QList<QgsMapLayer *> &layers ) >( &QgsProject::layersWillBeRemoved ), this, &QgsLayoutItemMapAtlasClippingSettings::layersAboutToBeRemoved );
3207 return mClipToAtlasFeature;
3212 if (
enabled == mClipToAtlasFeature )
3215 mClipToAtlasFeature =
enabled;
3221 return mFeatureClippingType;
3226 if ( mFeatureClippingType == type )
3229 mFeatureClippingType = type;
3235 return mForceLabelsInsideFeature;
3240 if ( forceInside == mForceLabelsInsideFeature )
3243 mForceLabelsInsideFeature = forceInside;
3249 return mClipItemShape;
3263 return mRestrictToLayers;
3268 if ( mRestrictToLayers ==
enabled )
3277 return _qgis_listRefToRaw( mLayersToClip );
3288 QDomElement settingsElem = document.createElement( u
"atlasClippingSettings"_s );
3289 settingsElem.setAttribute( u
"enabled"_s, mClipToAtlasFeature ? u
"1"_s : u
"0"_s );
3290 settingsElem.setAttribute( u
"forceLabelsInside"_s, mForceLabelsInsideFeature ? u
"1"_s : u
"0"_s );
3291 if ( mClipItemShape )
3293 settingsElem.setAttribute( u
"clipItemShape"_s, u
"1"_s );
3295 settingsElem.setAttribute( u
"clippingType"_s, QString::number(
static_cast<int>( mFeatureClippingType ) ) );
3296 settingsElem.setAttribute( u
"restrictLayers"_s, mRestrictToLayers ? u
"1"_s : u
"0"_s );
3299 QDomElement layerSetElem = document.createElement( u
"layersToClip"_s );
3304 QDomElement layerElem = document.createElement( u
"Layer"_s );
3305 QDomText layerIdText = document.createTextNode( layerRef.layerId );
3306 layerElem.appendChild( layerIdText );
3308 layerElem.setAttribute( u
"name"_s, layerRef.name );
3309 layerElem.setAttribute( u
"source"_s, layerRef.source );
3310 layerElem.setAttribute( u
"provider"_s, layerRef.provider );
3312 layerSetElem.appendChild( layerElem );
3314 settingsElem.appendChild( layerSetElem );
3316 element.appendChild( settingsElem );
3322 const QDomElement settingsElem = element.firstChildElement( u
"atlasClippingSettings"_s );
3324 mClipToAtlasFeature = settingsElem.attribute( u
"enabled"_s, u
"0"_s ).toInt();
3325 mForceLabelsInsideFeature = settingsElem.attribute( u
"forceLabelsInside"_s, u
"0"_s ).toInt();
3326 mClipItemShape = settingsElem.attribute( u
"clipItemShape"_s, u
"0"_s ).toInt();
3328 mRestrictToLayers = settingsElem.attribute( u
"restrictLayers"_s, u
"0"_s ).toInt();
3330 mLayersToClip.clear();
3331 QDomNodeList layerSetNodeList = settingsElem.elementsByTagName( u
"layersToClip"_s );
3332 if ( !layerSetNodeList.isEmpty() )
3334 QDomElement layerSetElem = layerSetNodeList.at( 0 ).toElement();
3335 QDomNodeList layerIdNodeList = layerSetElem.elementsByTagName( u
"Layer"_s );
3336 mLayersToClip.reserve( layerIdNodeList.size() );
3337 for (
int i = 0; i < layerIdNodeList.size(); ++i )
3339 QDomElement layerElem = layerIdNodeList.at( i ).toElement();
3340 QString layerId = layerElem.text();
3341 QString layerName = layerElem.attribute( u
"name"_s );
3342 QString layerSource = layerElem.attribute( u
"source"_s );
3343 QString layerProvider = layerElem.attribute( u
"provider"_s );
3345 QgsMapLayerRef ref( layerId, layerName, layerSource, layerProvider );
3346 if ( mMap->layout() && mMap->layout()->project() )
3348 mLayersToClip << ref;
3355void QgsLayoutItemMapAtlasClippingSettings::layersAboutToBeRemoved(
const QList<QgsMapLayer *> &layers )
3357 if ( !mLayersToClip.isEmpty() )
3359 _qgis_removeLayers( mLayersToClip, layers );
3373 return mEnabled && mClipPathSource;
3388 if ( mClipPathSource )
3391 mClipPathSource->refresh();
3400 QgsGeometry clipGeom( mClipPathSource->clipPath() );
3401 clipGeom.
transform( mMap->layoutToMapCoordsTransform() );
3411 QgsGeometry clipGeom( mClipPathSource->clipPath() );
3412 clipGeom.
transform( mMap->sceneTransform().inverted() );
3427 if ( mClipPathSource == item )
3430 if ( mClipPathSource )
3439 mClipPathSource = item;
3441 if ( mClipPathSource )
3450 mClipPathSource->refresh();
3464 return mClipPathSource;
3469 return mFeatureClippingType;
3474 if ( mFeatureClippingType == type )
3477 mFeatureClippingType = type;
3483 return mForceLabelsInsideClipPath;
3488 if ( forceInside == mForceLabelsInsideClipPath )
3491 mForceLabelsInsideClipPath = forceInside;
3497 QDomElement settingsElem = document.createElement( u
"itemClippingSettings"_s );
3498 settingsElem.setAttribute( u
"enabled"_s, mEnabled ? u
"1"_s : u
"0"_s );
3499 settingsElem.setAttribute( u
"forceLabelsInside"_s, mForceLabelsInsideClipPath ? u
"1"_s : u
"0"_s );
3500 settingsElem.setAttribute( u
"clippingType"_s, QString::number(
static_cast<int>( mFeatureClippingType ) ) );
3501 if ( mClipPathSource )
3502 settingsElem.setAttribute( u
"clipSource"_s, mClipPathSource->uuid() );
3504 settingsElem.setAttribute( u
"clipSource"_s, QString() );
3506 element.appendChild( settingsElem );
3512 const QDomElement settingsElem = element.firstChildElement( u
"itemClippingSettings"_s );
3514 mEnabled = settingsElem.attribute( u
"enabled"_s, u
"0"_s ).toInt();
3515 mForceLabelsInsideClipPath = settingsElem.attribute( u
"forceLabelsInside"_s, u
"0"_s ).toInt();
3517 mClipPathUuid = settingsElem.attribute( u
"clipSource"_s );
3524 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).
#define QgsDebugError(str)
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.