30#include <QDomDocument>
33#include <QMutexLocker>
36using namespace Qt::StringLiterals;
42 QgsGeospatialPdfRenderedFeatureHandler( QgsLayoutItemMap *map, QgsLayoutGeospatialPdfExporter *exporter,
const QStringList &layerIds )
43 : mExporter( exporter )
45 , mLayerIds( layerIds )
48 const QgsLayoutSize pageSize = map->
layout()->pageCollection()->page( map->
page() )->pageSize();
53 const double pageHeightPdfUnits = pageSizeInches.height() * 72;
54 const double pageWidthPdfUnits = pageSizeInches.width() * 72;
56 QTransform mapTransform;
57 QPolygonF mapRectPoly = QPolygonF( QRectF( 0, 0, map->rect().width(), map->rect().height() ) );
59 mapRectPoly.pop_back();
61 QPolygonF mapRectInLayout = map->mapToScene( mapRectPoly );
64 QTransform::quadToQuad( mapRectPoly, mapRectInLayout, mMapToLayoutTransform );
67 mLayoutToPdfTransform = QTransform::fromTranslate( 0, pageHeightPdfUnits ).
scale( pageWidthPdfUnits / pageSizeLayoutUnits.width(), -pageHeightPdfUnits / pageSizeLayoutUnits.height() );
70 void handleRenderedFeature(
const QgsFeature &feature,
const QgsGeometry &renderedBounds,
const QgsRenderedFeatureHandlerInterface::RenderedFeatureContext &context )
override
76 if ( !mLayerIds.contains( layerId ) )
79 const QString theme = ( mMap->mExportThemes.isEmpty() || mMap->mExportThemeIt == mMap->mExportThemes.end() ) ? QString() : *mMap->mExportThemeIt;
83 QgsGeometry transformed = renderedBounds;
84 transformed.
transform( pixelToMapItemTransform );
86 transformed.
transform( mMapToLayoutTransform );
88 transformed.
transform( mLayoutToPdfTransform );
93 mExporter->pushRenderedFeature( layerId, QgsLayoutGeospatialPdfExporter::RenderedFeature( feature, transformed ), theme );
99 QTransform mMapToLayoutTransform;
100 QTransform mLayoutToPdfTransform;
101 QgsLayoutGeospatialPdfExporter *mExporter =
nullptr;
102 QgsLayoutItemMap *mMap =
nullptr;
103 QStringList mLayerIds;
111 QStringList exportableLayerIds;
112 const QMap< QString, QgsMapLayer * > layers = mLayout->project()->mapLayers(
true );
113 for (
auto it = layers.constBegin(); it != layers.constEnd(); ++it )
115 if ( QgsMapLayer *ml = it.value() )
117 const QVariant visibility = ml->customProperty( u
"geopdf/initiallyVisible"_s, true );
118 mInitialLayerVisibility.insert( ml->id(), !visibility.isValid() ? true : visibility.toBool() );
119 if ( ml->type() == Qgis::LayerType::Vector )
121 const QVariant v = ml->customProperty( u
"geopdf/includeFeatures"_s );
122 if ( !v.isValid() || v.toBool() )
124 exportableLayerIds << ml->id();
128 const QString groupName = ml->customProperty( u
"geopdf/groupName"_s ).toString();
129 if ( !groupName.isEmpty() )
130 mCustomLayerTreeGroups.insert( ml->id(), groupName );
135 QList< QgsLayoutItemMap * > maps;
136 mLayout->layoutItems( maps );
139 QgsGeospatialPdfRenderedFeatureHandler *handler =
new QgsGeospatialPdfRenderedFeatureHandler( map,
this, exportableLayerIds );
140 mMapHandlers.insert( map, handler );
144 mLayerTreeGroupOrder = mLayout->customProperty( u
"pdfGroupOrder"_s ).toStringList();
147 QStringList geospatialPdfLayerOrder;
148 const QString presetLayerOrder = mLayout->customProperty( u
"pdfLayerOrder"_s ).toString();
149 if ( !presetLayerOrder.isEmpty() )
150 geospatialPdfLayerOrder = presetLayerOrder.split( u
"~~~"_s );
152 QList< QgsMapLayer * > layerOrder = mLayout->project()->layerTreeRoot()->layerOrder();
153 for (
auto it = geospatialPdfLayerOrder.rbegin(); it != geospatialPdfLayerOrder.rend(); ++it )
155 for ( int i = 0; i < layerOrder.size(); ++i )
157 if ( layerOrder.at( i )->id() == *it )
159 layerOrder.move( i, 0 );
166 mLayerOrder << layer->id();
172 for (
auto it = mMapHandlers.constBegin(); it != mMapHandlers.constEnd(); ++it )
174 it.key()->removeRenderedFeatureHandler( it.value() );
182 VectorComponentDetail detail;
184 detail.
name = layer ? layer->
name() : layerId;
185 detail.mapLayerId = layerId;
186 if (
const QgsVectorLayer *vl = qobject_cast< const QgsVectorLayer * >( layer ) )
188 detail.displayAttribute = vl->displayField();
193QgsLayerTree *QgsLayoutGeospatialPdfExporter::layerTree()
const
195 return mLayout->project()->layerTreeRoot();
205 QList< QgsLayoutItemMap * > maps;
206 mLayout->layoutItems( maps );
212 mTemporaryLayersToRender.insert( map->
uuid(), map->
layers() );
213 map->
setLayers( mLayout->project()->layerTreeRoot()->layerOrder() );
222 for (
auto it = mTemporaryLayersToRender.constBegin(); it != mTemporaryLayersToRender.constEnd(); it++ )
230 mTemporaryLayersToRender.clear();
QVariant variable(const QString &name) const
Fetches a matching variable from the context.
static const QString ALL_ATTRIBUTES
A special attribute that if set matches all attributes.
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.
bool convertToMultiType()
Converts single type geometry into multitype geometry e.g.
Namespace with helper functions for layer tree operations.
void restoreMapItemLayersAfterRendering()
Restores map item layers after a rendering operation for Geospatial PDFs that follow QGIS layer tree ...
~QgsLayoutGeospatialPdfExporter() override
bool setMapItemLayersBeforeRendering()
Sets QGIS project layers (including invisible ones) to layout item maps before rendering.
QgsLayoutGeospatialPdfExporter(QgsLayout *layout)
Constructor for QgsLayoutGeospatialPdfExporter, associated with the specified layout.
Layout graphical items for displaying a map.
bool keepLayerSet() const
Returns whether a stored layer set should be used or the current layer set from the project associate...
bool followVisibilityPreset() const
Returns whether the map should follow a map theme.
void setLayers(const QList< QgsMapLayer * > &layers)
Sets the stored layers set.
void addRenderedFeatureHandler(QgsRenderedFeatureHandlerInterface *handler)
Adds a rendered feature handler to use while rendering the map.
double scale() const
Returns the map scale.
QList< QgsMapLayer * > layers() const
Returns the stored layer set.
Base class for graphical items within a QgsLayout.
int page() const
Returns the page the item is currently on, with the first page returning 0.
int type() const override
Returns a unique graphics item type identifier.
virtual QString uuid() const
Returns the item identification string.
QgsLayoutMeasurement convert(QgsLayoutMeasurement measurement, Qgis::LayoutUnit targetUnits) const
Converts a measurement from one unit to another.
const QgsLayout * layout() const
Returns the layout the object is attached to.
const QgsLayoutMeasurementConverter & measurementConverter() const
Returns the layout measurement converter to be used in the layout.
Base class for layouts, which can contain items such as maps, labels, scalebars, etc.
QgsLayoutRenderContext & renderContext()
Returns a reference to the layout's render context, which stores information relating to the current ...
double convertToLayoutUnits(QgsLayoutMeasurement measurement) const
Converts a measurement into the layout's native units.
QgsProject * project() const
The project associated with the layout.
Base class for all map layer types.
Encapsulates a QGIS project, including sets of map layers and their styles, layouts,...
Q_INVOKABLE QgsMapLayer * mapLayer(const QString &layerId) const
Retrieve a pointer to a registered layer by layer ID.
double scaleFactor() const
Returns the scaling factor for the render to convert painter units to physical sizes.
QgsExpressionContext & expressionContext()
Gets the expression context.
An interface for classes which provide custom handlers for features rendered as part of a map render ...
virtual QSet< QString > usedAttributes(QgsVectorLayer *layer, const QgsRenderContext &context) const
Returns a list of attributes required by this handler, for the specified layer.
virtual void handleRenderedFeature(const QgsFeature &feature, const QgsGeometry &renderedBounds, const QgsRenderedFeatureHandlerInterface::RenderedFeatureContext &context)=0
Called whenever a feature is rendered during a map render job.
Represents a vector layer which manages a vector based dataset.
Contains information relating to a single PDF layer in the Geospatial PDF export.
const QgsRenderContext & renderContext
The render context which was used while rendering feature.