37 , mExtentLayer( qgis::make_unique<
QgsVectorLayer >( QStringLiteral(
"Polygon?crs=EPSG:4326" ), QStringLiteral(
"overview" ), QStringLiteral(
"memory" ),
QgsVectorLayer::LayerOptions( map && map->layout() && map->layout()->project() ? map->layout()->project()->transformContext() :
QgsCoordinateTransformContext() ) ) )
39 createDefaultFrameSymbol();
44 void QgsLayoutItemMapOverview::createDefaultFrameSymbol()
47 properties.insert( QStringLiteral(
"color" ), QStringLiteral(
"255,0,0,75" ) );
48 properties.insert( QStringLiteral(
"style" ), QStringLiteral(
"solid" ) );
49 properties.insert( QStringLiteral(
"style_border" ), QStringLiteral(
"no" ) );
67 if ( !overviewFrameMap )
74 if ( overviewFrameMap->
crs() !=
91 otherExtent = g.asQPolygonF();
97 QPolygonF intersectExtent = thisExtent.intersected( otherExtent );
100 double dotsPerMM = painter->device()->logicalDpiX() / 25.4;
109 painter->setCompositionMode( mBlendMode );
110 painter->translate(
mMap->mXOffset,
mMap->mYOffset );
111 painter->scale( 1 / dotsPerMM, 1 / dotsPerMM );
112 painter->setRenderHint( QPainter::Antialiasing );
114 mFrameSymbol->startRender( context );
118 QTransform mapTransform;
119 QPolygonF thisRectPoly = QPolygonF( QRectF( 0, 0, dotsPerMM *
mMap->rect().width(), dotsPerMM *
mMap->rect().height() ) );
122 thisRectPoly.pop_back();
123 thisExtent.pop_back();
126 QTransform::quadToQuad( thisExtent, thisRectPoly, mapTransform );
127 QPolygonF intersectPolygon;
128 intersectPolygon = mapTransform.map( intersectExtent );
130 QList<QPolygonF> rings;
134 mFrameSymbol->renderPolygon( intersectPolygon, &rings,
nullptr, context );
140 QPolygonF outerPolygon;
141 outerPolygon << QPointF( 0, 0 )
142 << QPointF(
mMap->rect().width() * dotsPerMM, 0 )
143 << QPointF(
mMap->rect().width() * dotsPerMM,
mMap->rect().height() * dotsPerMM )
144 << QPointF( 0,
mMap->rect().height() * dotsPerMM )
148 rings.append( intersectPolygon );
149 mFrameSymbol->renderPolygon( outerPolygon, &rings,
nullptr, context );
152 mFrameSymbol->stopRender( context );
164 QDomElement overviewFrameElem = doc.createElement( QStringLiteral(
"ComposerMapOverview" ) );
166 overviewFrameElem.setAttribute( QStringLiteral(
"frameMap" ), mFrameMap ? mFrameMap ->uuid() : QString() );
168 overviewFrameElem.setAttribute( QStringLiteral(
"inverted" ), mInverted );
169 overviewFrameElem.setAttribute( QStringLiteral(
"centered" ), mCentered );
172 overviewFrameElem.appendChild( frameStyleElem );
175 elem.appendChild( overviewFrameElem );
182 if ( itemElem.isNull() )
189 mFrameMapUuid = itemElem.attribute( QStringLiteral(
"frameMap" ) );
192 mBlendMode =
QgsPainting::getCompositionMode( static_cast< QgsPainting::BlendMode >( itemElem.attribute( QStringLiteral(
"blendMode" ), QStringLiteral(
"0" ) ).toUInt() ) );
193 mInverted = ( itemElem.attribute( QStringLiteral(
"inverted" ), QStringLiteral(
"0" ) ) != QLatin1String(
"0" ) );
194 mCentered = ( itemElem.attribute( QStringLiteral(
"centered" ), QStringLiteral(
"0" ) ) != QLatin1String(
"0" ) );
196 QDomElement frameStyleElem = itemElem.firstChildElement( QStringLiteral(
"symbol" ) );
197 if ( !frameStyleElem.isNull() )
199 mFrameSymbol.reset( QgsSymbolLayerUtils::loadSymbol<QgsFillSymbol>( frameStyleElem, context ) );
206 if ( !mFrameMapUuid.isEmpty() )
208 setLinkedMap( qobject_cast< QgsLayoutItemMap * >(
mLayout->itemByUuid( mFrameMapUuid,
true ) ) );
214 return mBlendMode != QPainter::CompositionMode_SourceOver;
219 if ( mFrameMap == map )
264 if ( !overviewFrameMap )
294 mExtentLayer->setBlendMode( mBlendMode );
297 mExtentLayer->dataProvider()->truncate();
298 mExtentLayer->setCrs(
mMap->
crs() );
302 intersectExtent = thisGeom.
difference( intersectExtent );
307 mExtentLayer->dataProvider()->addFeature( f );
309 return mExtentLayer.get();
326 mFrameSymbol.reset( symbol );
331 return mFrameSymbol.get();
336 return mFrameSymbol.get();
363 if (
mMap->
layout() && mCentered && mFrameMap )
370 center.
y() - extent.
height() / 2,
432 QList< QgsLayoutItemMapOverview * > list;
433 QList< QgsLayoutItemMapItem * >::const_iterator it =
mItems.begin();
434 for ( ; it !=
mItems.end(); ++it )
439 list.append( overview );
450 QDomNodeList mapOverviewNodeList = elem.elementsByTagName( QStringLiteral(
"ComposerMapOverview" ) );
451 for (
int i = 0; i < mapOverviewNodeList.size(); ++i )
453 QDomElement mapOverviewElem = mapOverviewNodeList.at( i ).toElement();
455 mapOverview->
readXml( mapOverviewElem, doc, context );
456 mItems.append( mapOverview );
464 QList<QgsMapLayer *> res = layers;
465 res.reserve( layers.count() +
mItems.count() );
487 auto pos = std::find( res.begin(), res.end(), stackLayer );
488 if ( pos == res.end() )
494 if ( pos == res.end() )
500 res.insert( pos, l );
void setForceVectorOutput(bool force)
Sets whether rendering operations should use vector operations instead of any faster raster shortcuts...
The class is used as a container of context for various read/write operations on other objects...
void setLinkedMap(QgsLayoutItemMap *map)
Sets the map to show the overview extent of.
A rectangle specified with double values.
Base class for all map layer types.
A symbol entity for QgsStyle databases.
QList< QgsMapLayer *> modifyMapLayerList(const QList< QgsMapLayer * > &layers)
Alters the list of map layers which will be rendered for the link map item, inserting temporary layer...
void moveOverviewUp(const QString &overviewId)
Moves an overview with matching overviewId up the stack, causing it to be rendered above other overvi...
void setFrameSymbol(QgsFillSymbol *symbol)
Sets the fill symbol used for drawing the overview extent.
An individual overview which is drawn above the map content in a QgsLayoutItemMap, and shows the extent of another QgsLayoutItemMap.
OperationResult transform(const QgsCoordinateTransform &ct, QgsCoordinateTransform::TransformDirection direction=QgsCoordinateTransform::ForwardTransform, bool transformZ=false) SIP_THROW(QgsCsException)
Transforms this geometry as described by the coordinate transform ct.
void setInverted(bool inverted)
Sets whether the overview frame is inverted, ie, whether the shaded area is drawn outside the extent ...
void setExtent(const QgsRectangle &extent)
Sets a new extent for the map.
QgsLayoutItemMapOverview(const QString &name, QgsLayoutItemMap *map)
Constructor for QgsLayoutItemMapOverview.
An item which is drawn inside a QgsLayoutItemMap, e.g., a grid or map overview.
static QgsFillSymbol * createSimple(const QgsStringMap &properties)
Create a fill symbol with one symbol layer: SimpleFill with specified properties. ...
A class to represent a 2D point.
void extentChanged()
Emitted when the map's extent changes.
void draw(QPainter *painter) override
Draws the item on to a destination painter.
static QgsPainting::BlendMode getBlendModeEnum(QPainter::CompositionMode blendMode)
Returns a BlendMode corresponding to a QPainter::CompositionMode.
Render above a specific map layer (see stackingLayer())
A collection of map items which are drawn above the map content in a QgsLayoutItemMap.
A geometry is the spatial representation of a feature.
bool readXml(const QDomElement &itemElem, const QDomDocument &doc, const QgsReadWriteContext &context) override
Sets the map item state from a DOM document, where element is the DOM node corresponding to a 'Layout...
static QPainter::CompositionMode getCompositionMode(QgsPainting::BlendMode blendMode)
Returns a QPainter::CompositionMode corresponding to a BlendMode.
QList< QgsLayoutItemMapOverview *> asList() const
Returns a list of QgsLayoutItemMapOverviews contained by the stack.
static QDomElement saveSymbol(const QString &symbolName, const QgsSymbol *symbol, QDomDocument &doc, const QgsReadWriteContext &context)
Writes a symbol definition to XML.
void invalidateCache() override
void finalizeRestoreFromXml() override
Called after all pending items have been restored from XML.
QgsFillSymbol * frameSymbol()
Returns the fill symbol used for drawing the overview extent.
QgsGeometry intersection(const QgsGeometry &geometry) const
Returns a geometry representing the points shared by this geometry and other.
The feature class encapsulates a single feature including its id, geometry and a list of field/values...
An interface for classes which can visit style entity (e.g.
bool accept(QgsStyleEntityVisitorInterface *visitor) const override
Accepts the specified style entity visitor, causing it to visit all style entities associated with th...
void setBlendMode(QPainter::CompositionMode mode)
Sets the blending mode used for drawing the overview.
QMap< QString, QString > QgsStringMap
void connectSignals()
Reconnects signals for overview map, so that overview correctly follows changes to source map's exten...
Render below a specific map layer (see stackingLayer())
void removeItems()
Clears the item stack and deletes all QgsLayoutItemMapItems contained by the stack.
QgsLayoutItemMapOverview * overview(const QString &overviewId) const
Returns a reference to an overview with matching overviewId within the stack.
Render above all map layers, but below map labels.
QgsLayoutItemMapOverview & operator[](int index)
Returns a reference to an overview at the specified index within the stack.
virtual bool visit(const QgsStyleEntityVisitorInterface::StyleLeaf &entity)
Called when the visitor will visit a style entity.
void addOverview(QgsLayoutItemMapOverview *overview)
Adds a new map overview to the stack and takes ownership of the overview.
QgsLayoutItemMap * mMap
Associated map.
bool inverted() const
Returns whether the overview frame is inverted, ie, whether the shaded area is drawn outside the exte...
QgsExpressionContext createExpressionContext() const override
This method needs to be reimplemented in all classes which implement this interface and return an exp...
bool mEnabled
True if item is to be displayed on map.
QgsRectangle extent() const
Returns the current map extent.
Layout graphical items for displaying a map.
const QgsLayout * layout() const
Returns the layout the object is attached to.
double width() const
Returns the width of the rectangle.
QgsGeometry densifyByCount(int extraNodesPerSegment) const
Returns a copy of the geometry which has been densified by adding the specified number of extra nodes...
Expression contexts are used to encapsulate the parameters around which a QgsExpression should be eva...
void addItem(QgsLayoutItemMapItem *item)
Adds a new map item to the stack and takes ownership of the item.
~QgsLayoutItemMapOverview() override
QPainter::CompositionMode blendMode() const
Retrieves the blending mode used for drawing the overview.
StackingPosition stackingPosition() const
Returns the item's stacking position, which specifies where the in the map's stack the item should be...
static QgsRenderContext createRenderContextForLayout(QgsLayout *layout, QPainter *painter, double dpi=-1)
Creates a render context suitable for the specified layout and painter destination.
QPointer< QgsLayout > mLayout
void moveOverviewDown(const QString &overviewId)
Moves an overview with matching overviewId down the stack, causing it to be rendered below other over...
QgsMapLayer * stackingLayer() const
Returns the item's stacking layer, which specifies where the in the map's stack the item should be re...
bool readXml(const QDomElement &elem, const QDomDocument &doc, const QgsReadWriteContext &context) override
Sets the item stack's state from a DOM document, where element is a DOM node corresponding to a 'Layo...
Contains information about the context in which a coordinate transform is executed.
void moveItemUp(const QString &itemId)
Moves an item which matching itemId up the stack, causing it to be rendered above other items...
QgsLayoutItemMapItem * item(int index) const
Returns a reference to the item at the specified index within the stack.
void setCentered(bool centered)
Sets whether the extent of the map is forced to center on the overview.
QPolygonF visibleExtentPolygon() const
Returns a polygon representing the current visible map extent, considering map extents and rotation...
void mapRotationChanged(double newRotation)
Emitted when the map's rotation changes.
const QgsLayoutItemMap * map() const
Returns the layout item map for the item.
QgsLayoutItemMapOverviewStack(QgsLayoutItemMap *map)
Constructor for QgsLayoutItemMapOverviewStack, attached to the specified map.
virtual bool readXml(const QDomElement &element, const QDomDocument &doc, const QgsReadWriteContext &context)
Sets the map item state from a DOM document, where element is the DOM node corresponding to a 'Layout...
void removeOverview(const QString &overviewId)
Removes an overview with matching overviewId from the stack and deletes the corresponding QgsLayoutIt...
Contains information about the context of a rendering operation.
void overviewExtentChanged()
Handles recentering of the map and redrawing of the map's overview.
bool usesAdvancedEffects() const override
Returns true if the item is drawn using advanced effects, such as blend modes.
QgsCoordinateReferenceSystem crs() const
Returns coordinate reference system used for rendering the map.
void setGeometry(const QgsGeometry &geometry)
Set the feature's geometry.
static QgsGeometry fromQPolygonF(const QPolygonF &polygon)
Construct geometry from a QPolygonF.
bool centered() const
Returns whether the extent of the map is forced to center on the overview.
A fill symbol type, for rendering Polygon and MultiPolygon geometries.
void removeItem(const QString &itemId)
Removes an item which matching itemId from the stack and deletes the corresponding QgsLayoutItemMapIt...
Custom exception class for Coordinate Reference System related exceptions.
QgsVectorLayer * asMapLayer()
Returns a vector layer to render as part of the QgsLayoutItemMap render, containing a feature represe...
QgsPointXY center() const
Returns the center point of the rectangle.
void moveItemDown(const QString &itemId)
Moves an item which matching itemId up the stack, causing it to be rendered above other items...
QList< QgsLayoutItemMapItem *> mItems
Represents a vector layer which manages a vector based data sets.
Contains information relating to the style entity currently being visited.
bool writeXml(QDomElement &elem, QDomDocument &doc, const QgsReadWriteContext &context) const override
Stores map item state in a DOM element, where element is the DOM element corresponding to a 'LayoutMa...
void setExpressionContext(const QgsExpressionContext &context)
Sets the expression context.
Render above all map layers and labels.
virtual bool writeXml(QDomElement &element, QDomDocument &document, const QgsReadWriteContext &context) const
Stores map item state in a DOM element, where element is the DOM element corresponding to a 'LayoutMa...
double height() const
Returns the height of the rectangle.
QgsLayoutItemMap * linkedMap()
Returns the source map to show the overview extent of.
Render below all map layers.
QgsGeometry difference(const QgsGeometry &geometry) const
Returns a geometry representing the points making up this geometry that do not make up other...