30#include <QDomDocument>
33#include <QMutexLocker>
40 QgsGeospatialPdfRenderedFeatureHandler( QgsLayoutItemMap *map, QgsLayoutGeospatialPdfExporter *exporter,
const QStringList &layerIds )
41 : mExporter( exporter )
43 , mLayerIds( layerIds )
46 const QgsLayoutSize pageSize = map->
layout()->pageCollection()->page( map->
page() )->pageSize();
51 const double pageHeightPdfUnits = pageSizeInches.height() * 72;
52 const double pageWidthPdfUnits = pageSizeInches.width() * 72;
54 QTransform mapTransform;
55 QPolygonF mapRectPoly = QPolygonF( QRectF( 0, 0, map->rect().width(), map->rect().height() ) );
57 mapRectPoly.pop_back();
59 QPolygonF mapRectInLayout = map->mapToScene( mapRectPoly );
62 QTransform::quadToQuad( mapRectPoly, mapRectInLayout, mMapToLayoutTransform );
65 mLayoutToPdfTransform = QTransform::fromTranslate( 0, pageHeightPdfUnits ).
scale( pageWidthPdfUnits / pageSizeLayoutUnits.width(),
66 -pageHeightPdfUnits / pageSizeLayoutUnits.height() );
69 void handleRenderedFeature(
const QgsFeature &feature,
const QgsGeometry &renderedBounds,
const QgsRenderedFeatureHandlerInterface::RenderedFeatureContext &context )
override
75 if ( !mLayerIds.contains( layerId ) )
78 const QString theme = ( mMap->mExportThemes.isEmpty() || mMap->mExportThemeIt == mMap->mExportThemes.end() ) ? QString() : *mMap->mExportThemeIt;
82 QgsGeometry transformed = renderedBounds;
83 transformed.
transform( pixelToMapItemTransform );
85 transformed.
transform( mMapToLayoutTransform );
87 transformed.
transform( mLayoutToPdfTransform );
92 mExporter->pushRenderedFeature( layerId, QgsLayoutGeospatialPdfExporter::RenderedFeature( feature, transformed ), theme );
95 QSet<QString>
usedAttributes( QgsVectorLayer *,
const QgsRenderContext & )
const override
101 QTransform mMapToLayoutTransform;
102 QTransform mLayoutToPdfTransform;
103 QgsLayoutGeospatialPdfExporter *mExporter =
nullptr;
104 QgsLayoutItemMap *mMap =
nullptr;
105 QStringList mLayerIds;
113 QStringList exportableLayerIds;
114 const QMap< QString, QgsMapLayer * > layers = mLayout->project()->mapLayers(
true );
115 for (
auto it = layers.constBegin(); it != layers.constEnd(); ++it )
117 if ( QgsMapLayer *ml = it.value() )
119 const QVariant visibility = ml->customProperty( QStringLiteral(
"geopdf/initiallyVisible" ), true );
120 mInitialLayerVisibility.insert( ml->id(), !visibility.isValid() ? true : visibility.toBool() );
121 if ( ml->type() == Qgis::LayerType::Vector )
123 const QVariant v = ml->customProperty( QStringLiteral(
"geopdf/includeFeatures" ) );
124 if ( !v.isValid() || v.toBool() )
126 exportableLayerIds << ml->id();
130 const QString groupName = ml->customProperty( QStringLiteral(
"geopdf/groupName" ) ).toString();
131 if ( !groupName.isEmpty() )
132 mCustomLayerTreeGroups.insert( ml->id(), groupName );
137 QList< QgsLayoutItemMap * > maps;
138 mLayout->layoutItems( maps );
141 QgsGeospatialPdfRenderedFeatureHandler *handler =
new QgsGeospatialPdfRenderedFeatureHandler( map,
this, exportableLayerIds );
142 mMapHandlers.insert( map, handler );
146 mLayerTreeGroupOrder = mLayout->customProperty( QStringLiteral(
"pdfGroupOrder" ) ).toStringList();
149 QStringList geospatialPdfLayerOrder;
150 const QString presetLayerOrder = mLayout->customProperty( QStringLiteral(
"pdfLayerOrder" ) ).toString();
151 if ( !presetLayerOrder.isEmpty() )
152 geospatialPdfLayerOrder = presetLayerOrder.split( QStringLiteral(
"~~~" ) );
154 QList< QgsMapLayer * > layerOrder = mLayout->project()->layerTreeRoot()->layerOrder();
155 for (
auto it = geospatialPdfLayerOrder.rbegin(); it != geospatialPdfLayerOrder.rend(); ++it )
157 for ( int i = 0; i < layerOrder.size(); ++i )
159 if ( layerOrder.at( i )->id() == *it )
161 layerOrder.move( i, 0 );
168 mLayerOrder << layer->id();
174 for (
auto it = mMapHandlers.constBegin(); it != mMapHandlers.constEnd(); ++it )
176 it.key()->removeRenderedFeatureHandler( it.value() );
184 VectorComponentDetail detail;
186 detail.
name = layer ? layer->
name() : layerId;
187 detail.mapLayerId = layerId;
188 if (
const QgsVectorLayer *vl = qobject_cast< const QgsVectorLayer * >( layer ) )
190 detail.displayAttribute = vl->displayField();
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.
~QgsLayoutGeospatialPdfExporter() override
QgsLayoutGeospatialPdfExporter(QgsLayout *layout)
Constructor for QgsLayoutGeospatialPdfExporter, associated with the specified layout.
Layout graphical items for displaying a map.
void addRenderedFeatureHandler(QgsRenderedFeatureHandlerInterface *handler)
Adds a rendered feature handler to use while rendering the map.
double scale() const
Returns the map scale.
int page() const
Returns the page the item is currently on, with the first page returning 0.
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.