16 #include <QQuickWindow> 18 #include <QSGSimpleTextureNode> 19 #include <QtConcurrent> 34 : QQuickItem( parent )
37 connect(
this, &QQuickItem::windowChanged,
this, &QgsQuickMapCanvasMap::onWindowChanged );
38 connect( &mRefreshTimer, &QTimer::timeout,
this, &QgsQuickMapCanvasMap::refreshMap );
39 connect( &mMapUpdateTimer, &QTimer::timeout,
this, &QgsQuickMapCanvasMap::renderJobUpdated );
47 mMapUpdateTimer.setSingleShot(
false );
48 mMapUpdateTimer.setInterval( 250 );
49 mRefreshTimer.setSingleShot(
true );
50 setTransformOrigin( QQuickItem::TopLeft );
51 setFlags( QQuickItem::ItemHasContents );
56 return mMapSettings.get();
63 QgsPoint mousePos( mMapSettings->screenToCoordinate( center ) );
64 QgsPointXY newCenter( mousePos.x() + ( ( oldCenter.x() - mousePos.x() ) * scale ),
65 mousePos.y() + ( ( oldCenter.y() - mousePos.y() ) * scale ) );
68 extent.
scale( scale, &newCenter );
69 mMapSettings->setExtent( extent );
75 QgsPoint start = mMapSettings->screenToCoordinate( oldPos.toPoint() );
76 QgsPoint end = mMapSettings->screenToCoordinate( newPos.toPoint() );
78 double dx = end.
x() - start.
x();
79 double dy = end.
y() - start.
y();
89 mMapSettings->setExtent( extent );
93 void QgsQuickMapCanvasMap::refreshMap()
104 QgsProject *project = mMapSettings->project();
123 if ( mIncrementalRendering )
124 mMapUpdateTimer.start();
135 void QgsQuickMapCanvasMap::renderJobUpdated()
150 void QgsQuickMapCanvasMap::renderJobFinished()
160 delete mLabelingResults;
171 mMapUpdateTimer.stop();
183 void QgsQuickMapCanvasMap::onWindowChanged( QQuickWindow *window )
185 disconnect( window, &QQuickWindow::screenChanged,
this, &QgsQuickMapCanvasMap::onScreenChanged );
188 connect( window, &QQuickWindow::screenChanged,
this, &QgsQuickMapCanvasMap::onScreenChanged );
189 onScreenChanged( window->screen() );
193 void QgsQuickMapCanvasMap::onScreenChanged( QScreen *screen )
196 mMapSettings->setOutputDpi( screen->physicalDotsPerInch() );
199 void QgsQuickMapCanvasMap::onExtentChanged()
207 void QgsQuickMapCanvasMap::updateTransform()
215 setScale( imageExtent.
width() / newExtent.
width() );
223 return mMapUpdateTimer.interval();
231 mMapUpdateTimer.setInterval( mapUpdateInterval );
238 return mIncrementalRendering;
243 if ( incrementalRendering == mIncrementalRendering )
257 if ( freeze == mFreeze )
262 if ( !mFreeze && mNeedsRefresh )
268 mNeedsRefresh =
false;
287 QSGSimpleTextureNode *node =
static_cast<QSGSimpleTextureNode *
>( oldNode );
290 node =
new QSGSimpleTextureNode();
291 QSGTexture *texture = window()->createTextureFromImage( mImage );
292 node->setTexture( texture );
293 node->setOwnsTexture(
true );
296 QRectF rect( boundingRect() );
299 if ( !rect.isEmpty() &&
300 !mImage.size().isEmpty() &&
301 !
qgsDoubleNear( rect.width() / rect.height(), mImage.width() / mImage.height() ) )
305 rect.setHeight( rect.width() / mImage.width() * mImage.height() );
309 rect.setWidth( rect.height() / mImage.height() * mImage.width() );
313 node->setRect( rect );
320 Q_UNUSED( oldGeometry )
327 mMapSettings->setOutputSize( newGeometry.size().toSize() );
331 void QgsQuickMapCanvasMap::onLayersChanged()
333 if ( mMapSettings->extent().isEmpty() )
336 for (
const QMetaObject::Connection &conn : qgis::as_const( mLayerConnections ) )
340 mLayerConnections.clear();
342 const QList<QgsMapLayer *> layers = mMapSettings->layers();
369 void QgsQuickMapCanvasMap::zoomToFullExtent()
372 const QList<QgsMapLayer *> layers = mMapSettings->layers();
375 if ( mMapSettings->destinationCrs() != layer->crs() )
377 QgsCoordinateTransform transform( layer->crs(), mMapSettings->destinationCrs(), mMapSettings->transformContext() );
385 mMapSettings->setExtent( extent );
392 if ( mMapSettings->outputSize().isNull() )
396 mRefreshTimer.start( 1 );
void finished()
emitted when asynchronous rendering is finished (or canceled).
A rectangle specified with double values.
Base class for all map layer types.
void zoom(QPointF center, qreal scale)
Set map setting's extent (zoom the map) on the center by given scale.
Abstract base class for map rendering implementations.
void setExpressionContext(const QgsExpressionContext &context)
Sets the expression context.
void setXMaximum(double x)
Set the maximum x value.
bool incrementalRendering() const
When the incrementalRendering property is set to true, the automatic refresh of map canvas during ren...
void extentChanged()
Geographical coordinates of the rectangle that should be rendered.
A class to represent a 2D point.
void scale(double scaleFactor, const QgsPointXY *c=nullptr)
Scale the rectangle around its center point.
bool isRendering() const
The isRendering property is set to true while a rendering job is pending for this map canvas map...
bool qgsDoubleNear(double a, double b, double epsilon=4 *std::numeric_limits< double >::epsilon())
Compare two doubles (but allow some difference)
Whether to make extra effort to update map image with partially rendered layers (better for interacti...
void setFreeze(bool freeze)
When freeze property is set to true, the map canvas does not refresh.
Errors errors() const
List of errors that happened during the rendering job - available when the rendering has been finishe...
static QgsExpressionContextScope * projectScope(const QgsProject *project)
Creates a new scope which contains variables and functions relating to a QGIS project.
void renderingLayersFinished()
Emitted when the layers are rendered.
The QgsQuickMapSettings class encapsulates QgsMapSettings class to offer settings of configuration of...
QgsRectangle visibleExtent() const
Returns the actual extent derived from requested extent that takes takes output image size into accou...
void setCache(QgsMapRendererCache *cache)
Assign a cache to be used for reading and storing rendered images of individual layers.
void setFlag(Flag flag, bool on=true)
Enable or disable a particular flag (other flags are not affected)
The QgsMapSettings class contains configuration for rendering of the map.
Perform transforms between map coordinates and device coordinates.
QgsPointXY transform(const QgsPointXY &p) const
Transform the point from map (world) coordinates to device coordinates.
QSGNode * updatePaintNode(QSGNode *oldNode, QQuickItem::UpdatePaintNodeData *) override
void incrementalRenderingChanged()
When the incrementalRendering property is set to true, the automatic refresh of map canvas during ren...
static QgsExpressionContextScope * globalScope()
Creates a new scope which contains variables and functions relating to the global QGIS context...
Job implementation that renders all layers in parallel.
double width() const
Returns the width of the rectangle.
void setYMinimum(double y)
Set the minimum y value.
Expression contexts are used to encapsulate the parameters around which a QgsExpression should be eva...
static void logMessage(const QString &message, const QString &tag=QString(), Qgis::MessageLevel level=Qgis::Warning, bool notifyUser=true)
Adds a message to the log instance (and creates it if necessary).
bool freeze() const
When freeze property is set to true, the map canvas does not refresh.
Reads and writes project states.
void renderStarting()
Signal is emitted when a rendering is starting.
void setIncrementalRendering(bool incrementalRendering)
When the incrementalRendering property is set to true, the automatic refresh of map canvas during ren...
Point geometry type, with support for z-dimension and m-values.
const QgsMapToPixel & mapToPixel() const
int mapUpdateInterval() const
Interval in milliseconds after which the map canvas will be updated while a rendering job is ongoing...
void mapCanvasRefreshed()
Signal is emitted when a canvas is refreshed.
void repaintRequested(bool deferredUpdate=false)
By emitting this signal the layer tells that either appearance or content have been changed and any v...
double yMinimum() const
Returns the y minimum value (bottom side of rectangle).
double xMaximum() const
Returns the x maximum value (right side of rectangle).
QgsQuickMapSettings * mapSettings() const
The mapSettings property contains configuration for rendering of the map.
void combineExtentWith(const QgsRectangle &rect)
Expands the rectangle so that it covers both the original rectangle and the given rectangle...
void stopRendering()
Stop map rendering.
void geometryChanged(const QRectF &newGeometry, const QRectF &oldGeometry) override
void freezeChanged()
When freeze property is set to true, the map canvas does not refresh.
void setLabelingEngineSettings(const QgsLabelingEngineSettings &settings)
Sets the global configuration of the labeling engine.
static QgsExpressionContextScope * mapSettingsScope(const QgsMapSettings &mapSettings)
Creates a new scope which contains variables and functions relating to a QgsMapSettings object...
void refresh()
Refresh the map canvas.
QList< QgsMapRendererJob::Error > Errors
void isRenderingChanged()
The isRendering property is set to true while a rendering job is pending for this map canvas map...
void setYMaximum(double y)
Set the maximum y value.
void cancelWithoutBlocking() override
Triggers cancelation of the rendering job without blocking.
void start() override
Start the rendering job and immediately return.
QgsQuickMapCanvasMap(QQuickItem *parent=nullptr)
Create map canvas map.
double xMinimum() const
Returns the x minimum value (left side of rectangle).
virtual void cancel()=0
Stop the rendering job - does not return until the job has terminated.
double yMaximum() const
Returns the y maximum value (top side of rectangle).
Enable vector simplification and other rendering optimizations.
void setMapUpdateInterval(int mapUpdateInterval)
Interval in milliseconds after which the map canvas will be updated while a rendering job is ongoing...
void mapUpdateIntervalChanged()
Interval in milliseconds after which the map canvas will be updated while a rendering job is ongoing...
QgsPointXY center() const
Returns the center point of the rectangle.
void pan(QPointF oldPos, QPointF newPos)
Set map setting's extent (pan the map) based on the difference of positions.
const QgsMapSettings & mapSettings() const
Returns map settings with which this job was started.
void setXMinimum(double x)
Set the minimum x value.
void layersChanged()
Set list of layers for map rendering.
QImage renderedImage() override
Gets a preview/resulting image.
const QgsLabelingEngineSettings & labelingEngineSettings() const
Returns project's global labeling engine settings.
QgsLabelingResults * takeLabelingResults() override
Gets pointer to internal labeling engine (in order to get access to the results). ...