QGIS API Documentation  3.16.0-Hannover (43b64b13f3)
qgsrasterlayerrenderer.cpp
Go to the documentation of this file.
1 /***************************************************************************
2  qgsrasterlayerrenderer.cpp
3  --------------------------------------
4  Date : December 2013
5  Copyright : (C) 2013 by Martin Dobias
6  Email : wonder dot sk at gmail dot com
7  ***************************************************************************
8  * *
9  * This program is free software; you can redistribute it and/or modify *
10  * it under the terms of the GNU General Public License as published by *
11  * the Free Software Foundation; either version 2 of the License, or *
12  * (at your option) any later version. *
13  * *
14  ***************************************************************************/
15 
16 #include "qgsrasterlayerrenderer.h"
17 
18 #include "qgsmessagelog.h"
19 #include "qgsrasterdataprovider.h"
20 #include "qgsrasterdrawer.h"
21 #include "qgsrasteriterator.h"
22 #include "qgsrasterlayer.h"
23 #include "qgsrasterprojector.h"
24 #include "qgsrendercontext.h"
25 #include "qgsproject.h"
26 #include "qgsexception.h"
28 #include "qgsmapclippingutils.h"
29 
31 
32 QgsRasterLayerRendererFeedback::QgsRasterLayerRendererFeedback( QgsRasterLayerRenderer *r )
33  : mR( r )
34  , mMinimalPreviewInterval( 250 )
35 {
36  setRenderPartialOutput( r->renderContext()->testFlag( QgsRenderContext::RenderPartialOutput ) );
37 }
38 
39 void QgsRasterLayerRendererFeedback::onNewData()
40 {
41  if ( !renderPartialOutput() )
42  return; // we were not asked for partial renders and we may not have a temporary image for overwriting...
43 
44  // update only once upon a time
45  // (preview itself takes some time)
46  if ( mLastPreview.isValid() && mLastPreview.msecsTo( QTime::currentTime() ) < mMinimalPreviewInterval )
47  return;
48 
49  // TODO: update only the area that got new data
50 
51  QgsDebugMsgLevel( QStringLiteral( "new raster preview! %1" ).arg( mLastPreview.msecsTo( QTime::currentTime() ) ), 3 );
52  QElapsedTimer t;
53  t.start();
54  QgsRasterBlockFeedback feedback;
55  feedback.setPreviewOnly( true );
56  feedback.setRenderPartialOutput( true );
57  QgsRasterIterator iterator( mR->mPipe->last() );
58  QgsRasterDrawer drawer( &iterator );
59  drawer.draw( mR->renderContext()->painter(), mR->mRasterViewPort, &mR->renderContext()->mapToPixel(), &feedback );
60  QgsDebugMsgLevel( QStringLiteral( "total raster preview time: %1 ms" ).arg( t.elapsed() ), 3 );
61  mLastPreview = QTime::currentTime();
62 }
63 
67  : QgsMapLayerRenderer( layer->id(), &rendererContext )
68  , mProviderCapabilities( static_cast<QgsRasterDataProvider::Capability>( layer->dataProvider()->capabilities() ) )
69  , mFeedback( new QgsRasterLayerRendererFeedback( this ) )
70 {
71  QgsMapToPixel mapToPixel = rendererContext.mapToPixel();
72  if ( rendererContext.mapToPixel().mapRotation() )
73  {
74  // unset rotation for the sake of local computations.
75  // Rotation will be handled by QPainter later
76  // TODO: provide a method of QgsMapToPixel to fetch map center
77  // in geographical units
78  QgsPointXY center = mapToPixel.toMapCoordinates(
79  static_cast<int>( mapToPixel.mapWidth() / 2.0 ),
80  static_cast<int>( mapToPixel.mapHeight() / 2.0 )
81  );
82  mapToPixel.setMapRotation( 0, center.x(), center.y() );
83  }
84 
85  QgsRectangle myProjectedViewExtent;
86  QgsRectangle myProjectedLayerExtent;
87 
88  if ( rendererContext.coordinateTransform().isValid() )
89  {
90  QgsDebugMsgLevel( QStringLiteral( "coordinateTransform set -> project extents." ), 4 );
91  if ( rendererContext.extent().xMinimum() == std::numeric_limits<double>::lowest() &&
92  rendererContext.extent().yMinimum() == std::numeric_limits<double>::lowest() &&
93  rendererContext.extent().xMaximum() == std::numeric_limits<double>::max() &&
94  rendererContext.extent().yMaximum() == std::numeric_limits<double>::max() )
95  {
96  // We get in this situation if the view CRS is geographical and the
97  // extent goes beyond -180,-90,180,90. To avoid reprojection issues to the
98  // layer CRS, then this dummy extent is returned by QgsMapRendererJob::reprojectToLayerExtent()
99  // Don't try to reproject it now to view extent as this would return
100  // a null rectangle.
101  myProjectedViewExtent = rendererContext.extent();
102  }
103  else
104  {
105  try
106  {
107  QgsCoordinateTransform ct = rendererContext.coordinateTransform();
109  myProjectedViewExtent = ct.transformBoundingBox( rendererContext.extent() );
110  }
111  catch ( QgsCsException &cs )
112  {
113  QgsMessageLog::logMessage( QObject::tr( "Could not reproject view extent: %1" ).arg( cs.what() ), QObject::tr( "Raster" ) );
114  myProjectedViewExtent.setMinimal();
115  }
116  }
117 
118  try
119  {
120  QgsCoordinateTransform ct = rendererContext.coordinateTransform();
122  myProjectedLayerExtent = ct.transformBoundingBox( layer->extent() );
123  }
124  catch ( QgsCsException &cs )
125  {
126  QgsMessageLog::logMessage( QObject::tr( "Could not reproject layer extent: %1" ).arg( cs.what() ), QObject::tr( "Raster" ) );
127  myProjectedLayerExtent.setMinimal();
128  }
129  }
130  else
131  {
132  QgsDebugMsgLevel( QStringLiteral( "coordinateTransform not set" ), 4 );
133  myProjectedViewExtent = rendererContext.extent();
134  myProjectedLayerExtent = layer->extent();
135  }
136 
137  // clip raster extent to view extent
138  QgsRectangle myRasterExtent = layer->ignoreExtents() ? myProjectedViewExtent : myProjectedViewExtent.intersect( myProjectedLayerExtent );
139  if ( myRasterExtent.isEmpty() )
140  {
141  QgsDebugMsgLevel( QStringLiteral( "draw request outside view extent." ), 2 );
142  // nothing to do
143  return;
144  }
145 
146  QgsDebugMsgLevel( "theViewExtent is " + rendererContext.extent().toString(), 4 );
147  QgsDebugMsgLevel( "myProjectedViewExtent is " + myProjectedViewExtent.toString(), 4 );
148  QgsDebugMsgLevel( "myProjectedLayerExtent is " + myProjectedLayerExtent.toString(), 4 );
149  QgsDebugMsgLevel( "myRasterExtent is " + myRasterExtent.toString(), 4 );
150 
151  //
152  // The first thing we do is set up the QgsRasterViewPort. This struct stores all the settings
153  // relating to the size (in pixels and coordinate system units) of the raster part that is
154  // in view in the map window. It also stores the origin.
155  //
156  //this is not a class level member because every time the user pans or zooms
157  //the contents of the rasterViewPort will change
158  mRasterViewPort = new QgsRasterViewPort();
159 
160  mRasterViewPort->mDrawnExtent = myRasterExtent;
161  if ( rendererContext.coordinateTransform().isValid() )
162  {
163  mRasterViewPort->mSrcCRS = layer->crs();
164  mRasterViewPort->mDestCRS = rendererContext.coordinateTransform().destinationCrs();
165  mRasterViewPort->mTransformContext = rendererContext.transformContext();
166  }
167  else
168  {
169  mRasterViewPort->mSrcCRS = QgsCoordinateReferenceSystem(); // will be invalid
170  mRasterViewPort->mDestCRS = QgsCoordinateReferenceSystem(); // will be invalid
171  }
172 
173  // get dimensions of clipped raster image in device coordinate space (this is the size of the viewport)
174  mRasterViewPort->mTopLeftPoint = mapToPixel.transform( myRasterExtent.xMinimum(), myRasterExtent.yMaximum() );
175  mRasterViewPort->mBottomRightPoint = mapToPixel.transform( myRasterExtent.xMaximum(), myRasterExtent.yMinimum() );
176 
177  // align to output device grid, i.e. std::floor/ceil to integers
178  // TODO: this should only be done if paint device is raster - screen, image
179  // for other devices (pdf) it can have floating point origin
180  // we could use floating point for raster devices as well, but respecting the
181  // output device grid should make it more effective as the resampling is done in
182  // the provider anyway
183  mRasterViewPort->mTopLeftPoint.setX( std::floor( mRasterViewPort->mTopLeftPoint.x() ) );
184  mRasterViewPort->mTopLeftPoint.setY( std::floor( mRasterViewPort->mTopLeftPoint.y() ) );
185  mRasterViewPort->mBottomRightPoint.setX( std::ceil( mRasterViewPort->mBottomRightPoint.x() ) );
186  mRasterViewPort->mBottomRightPoint.setY( std::ceil( mRasterViewPort->mBottomRightPoint.y() ) );
187  // recalc myRasterExtent to aligned values
188  myRasterExtent.set(
189  mapToPixel.toMapCoordinates( mRasterViewPort->mTopLeftPoint.x(),
190  mRasterViewPort->mBottomRightPoint.y() ),
191  mapToPixel.toMapCoordinates( mRasterViewPort->mBottomRightPoint.x(),
192  mRasterViewPort->mTopLeftPoint.y() )
193  );
194 
195  //raster viewport top left / bottom right are already rounded to int
196  mRasterViewPort->mWidth = static_cast<qgssize>( std::abs( mRasterViewPort->mBottomRightPoint.x() - mRasterViewPort->mTopLeftPoint.x() ) );
197  mRasterViewPort->mHeight = static_cast<qgssize>( std::abs( mRasterViewPort->mBottomRightPoint.y() - mRasterViewPort->mTopLeftPoint.y() ) );
198 
199  //the drawable area can start to get very very large when you get down displaying 2x2 or smaller, this is because
200  //mapToPixel.mapUnitsPerPixel() is less then 1,
201  //so we will just get the pixel data and then render these special cases differently in paintImageToCanvas()
202 
203  QgsDebugMsgLevel( QStringLiteral( "mapUnitsPerPixel = %1" ).arg( mapToPixel.mapUnitsPerPixel() ), 3 );
204  QgsDebugMsgLevel( QStringLiteral( "mWidth = %1" ).arg( layer->width() ), 3 );
205  QgsDebugMsgLevel( QStringLiteral( "mHeight = %1" ).arg( layer->height() ), 3 );
206  QgsDebugMsgLevel( QStringLiteral( "myRasterExtent.xMinimum() = %1" ).arg( myRasterExtent.xMinimum() ), 3 );
207  QgsDebugMsgLevel( QStringLiteral( "myRasterExtent.xMaximum() = %1" ).arg( myRasterExtent.xMaximum() ), 3 );
208  QgsDebugMsgLevel( QStringLiteral( "myRasterExtent.yMinimum() = %1" ).arg( myRasterExtent.yMinimum() ), 3 );
209  QgsDebugMsgLevel( QStringLiteral( "myRasterExtent.yMaximum() = %1" ).arg( myRasterExtent.yMaximum() ), 3 );
210 
211  QgsDebugMsgLevel( QStringLiteral( "mTopLeftPoint.x() = %1" ).arg( mRasterViewPort->mTopLeftPoint.x() ), 3 );
212  QgsDebugMsgLevel( QStringLiteral( "mBottomRightPoint.x() = %1" ).arg( mRasterViewPort->mBottomRightPoint.x() ), 3 );
213  QgsDebugMsgLevel( QStringLiteral( "mTopLeftPoint.y() = %1" ).arg( mRasterViewPort->mTopLeftPoint.y() ), 3 );
214  QgsDebugMsgLevel( QStringLiteral( "mBottomRightPoint.y() = %1" ).arg( mRasterViewPort->mBottomRightPoint.y() ), 3 );
215 
216  QgsDebugMsgLevel( QStringLiteral( "mWidth = %1" ).arg( mRasterViewPort->mWidth ), 3 );
217  QgsDebugMsgLevel( QStringLiteral( "mHeight = %1" ).arg( mRasterViewPort->mHeight ), 3 );
218 
219  // /\/\/\ - added to handle zoomed-in rasters
220 
221  // TODO R->mLastViewPort = *mRasterViewPort;
222 
223  // TODO: is it necessary? Probably WMS only?
224  layer->dataProvider()->setDpi( 25.4 * rendererContext.scaleFactor() );
225 
226 
227  // copy the whole raster pipe!
228  mPipe = new QgsRasterPipe( *layer->pipe() );
229  QObject::connect( mPipe->provider(), &QgsRasterDataProvider::statusChanged, layer, &QgsRasterLayer::statusChanged );
230  QgsRasterRenderer *rasterRenderer = mPipe->renderer();
231  if ( rasterRenderer
232  && !( rendererContext.flags() & QgsRenderContext::RenderPreviewJob )
233  && !( rendererContext.flags() & QgsRenderContext::Render3DMap ) )
234  layer->refreshRendererIfNeeded( rasterRenderer, rendererContext.extent() );
235 
236  const QgsRasterLayerTemporalProperties *temporalProperties = qobject_cast< const QgsRasterLayerTemporalProperties * >( layer->temporalProperties() );
237  if ( temporalProperties->isActive() && renderContext()->isTemporal() )
238  {
239  switch ( temporalProperties->mode() )
240  {
242  break;
243 
245  // in this mode we need to pass on the desired render temporal range to the data provider
246  if ( mPipe->provider()->temporalCapabilities() )
247  {
248  mPipe->provider()->temporalCapabilities()->setRequestedTemporalRange( rendererContext.temporalRange() );
250  }
251  break;
252  }
253  }
254  else if ( mPipe->provider()->temporalCapabilities() )
255  {
256  mPipe->provider()->temporalCapabilities()->setRequestedTemporalRange( QgsDateTimeRange() );
258  }
259 
261 }
262 
264 {
265  delete mFeedback;
266 
267  delete mRasterViewPort;
268  delete mPipe;
269 }
270 
272 {
273  // Skip rendering of out of view tiles (xyz)
274  if ( !mRasterViewPort || ( renderContext()->testFlag( QgsRenderContext::Flag::RenderPreviewJob ) &&
275  !( mProviderCapabilities &
276  QgsRasterInterface::Capability::Prefetch ) ) )
277  return true;
278 
279  QElapsedTimer time;
280  time.start();
281  //
282  //
283  // The goal here is to make as many decisions as possible early on (outside of the rendering loop)
284  // so that we can maximise performance of the rendering process. So now we check which drawing
285  // procedure to use :
286  //
287 
288  QgsScopedQPainterState painterSate( renderContext()->painter() );
289  if ( !mClippingRegions.empty() )
290  {
291  bool needsPainterClipPath = false;
292  const QPainterPath path = QgsMapClippingUtils::calculatePainterClipRegion( mClippingRegions, *renderContext(), QgsMapLayerType::RasterLayer, needsPainterClipPath );
293  if ( needsPainterClipPath )
294  renderContext()->painter()->setClipPath( path, Qt::IntersectClip );
295  }
296 
297  QgsRasterProjector *projector = mPipe->projector();
298  bool restoreOldResamplingStage = false;
299  QgsRasterPipe::ResamplingStage oldResamplingState = mPipe->resamplingStage();
300 
301  // TODO add a method to interface to get provider and get provider
302  // params in QgsRasterProjector
303  if ( projector )
304  {
305  // Force provider resampling if reprojection is needed
307  mRasterViewPort->mSrcCRS != mRasterViewPort->mDestCRS &&
308  oldResamplingState != QgsRasterPipe::ResamplingStage::Provider )
309  {
310  restoreOldResamplingStage = true;
312  }
313  projector->setCrs( mRasterViewPort->mSrcCRS, mRasterViewPort->mDestCRS, mRasterViewPort->mTransformContext );
314  }
315 
316  // Drawer to pipe?
317  QgsRasterIterator iterator( mPipe->last() );
318  QgsRasterDrawer drawer( &iterator );
319  drawer.draw( renderContext()->painter(), mRasterViewPort, &renderContext()->mapToPixel(), mFeedback );
320 
321  if ( restoreOldResamplingStage )
322  {
323  mPipe->setResamplingStage( oldResamplingState );
324  }
325 
326  const QStringList errors = mFeedback->errors();
327  for ( const QString &error : errors )
328  {
329  mErrors.append( error );
330  }
331 
332  QgsDebugMsgLevel( QStringLiteral( "total raster draw time (ms): %1" ).arg( time.elapsed(), 5 ), 4 );
333 
334  return true;
335 }
336 
338 {
339  return mFeedback;
340 }
341 
QgsMapClippingUtils::collectClippingRegionsForLayer
static QList< QgsMapClippingRegion > collectClippingRegionsForLayer(const QgsRenderContext &context, const QgsMapLayer *layer)
Collects the list of map clipping regions from a context which apply to a map layer.
Definition: qgsmapclippingutils.cpp:23
QgsRasterViewPort::mBottomRightPoint
QgsPointXY mBottomRightPoint
Coordinate (in output device coordinate system) of bottom right corner of the part of the raster that...
Definition: qgsrasterviewport.h:52
QgsMapLayer::crs
QgsCoordinateReferenceSystem crs
Definition: qgsmaplayer.h:89
qgsrasterprojector.h
QgsRenderContext::testFlag
bool testFlag(Flag flag) const
Check whether a particular flag is enabled.
Definition: qgsrendercontext.cpp:192
QgsPointXY::y
double y
Definition: qgspointxy.h:48
QgsRenderContext::mapToPixel
const QgsMapToPixel & mapToPixel() const
Returns the context's map to pixel transform, which transforms between map coordinates and device coo...
Definition: qgsrendercontext.h:325
qgsrasterlayer.h
QgsMapToPixel::mapUnitsPerPixel
double mapUnitsPerPixel() const
Returns current map units per pixel.
Definition: qgsmaptopixel.cpp:128
QgsRasterLayer::ignoreExtents
bool ignoreExtents() const
If the ignoreExtent flag is set, the layer will also render outside the bounding box reported by the ...
Definition: qgsrasterlayer.cpp:1001
QgsRenderContext::Render3DMap
@ Render3DMap
Render is for a 3D map.
Definition: qgsrendercontext.h:86
QgsRasterDataProviderTemporalCapabilities::setIntervalHandlingMethod
void setIntervalHandlingMethod(IntervalHandlingMethod method)
Sets the desired method to use when resolving a temporal interval to matching layers or bands in the ...
Definition: qgsrasterdataprovidertemporalcapabilities.cpp:66
QgsDebugMsgLevel
#define QgsDebugMsgLevel(str, level)
Definition: qgslogger.h:39
QgsPointXY::x
Q_GADGET double x
Definition: qgspointxy.h:47
qgsrasterdrawer.h
QgsMapLayerRenderer::errors
QStringList errors() const
Returns list of errors (problems) that happened during the rendering.
Definition: qgsmaplayerrenderer.h:74
QgsRasterViewPort::mSrcCRS
QgsCoordinateReferenceSystem mSrcCRS
Source coordinate system.
Definition: qgsrasterviewport.h:64
QgsRasterDataProvider::ProviderHintCanPerformProviderResampling
@ ProviderHintCanPerformProviderResampling
Provider can perform resampling (to be opposed to post rendering resampling) (since QGIS 3....
Definition: qgsrasterdataprovider.h:104
QgsRectangle::yMinimum
double yMinimum() const SIP_HOLDGIL
Returns the y minimum value (bottom side of rectangle).
Definition: qgsrectangle.h:177
QgsMapLayer::statusChanged
void statusChanged(const QString &status)
Emit a signal with status (e.g. to be caught by QgisApp and display a msg on status bar)
QgsRasterPipe
Base class for processing modules.
Definition: qgsrasterpipe.h:47
QgsPointXY::setY
void setY(double y) SIP_HOLDGIL
Sets the y value of the point.
Definition: qgspointxy.h:117
QgsTemporalRangeObject::temporalRange
const QgsDateTimeRange & temporalRange() const
Returns the datetime range for the object.
Definition: qgstemporalrangeobject.cpp:43
QgsRenderContext
Contains information about the context of a rendering operation.
Definition: qgsrendercontext.h:58
QgsMapLayerRenderer::renderContext
QgsRenderContext * renderContext()
Returns the render context associated with the renderer.
Definition: qgsmaplayerrenderer.h:84
QgsRectangle::setMinimal
void setMinimal() SIP_HOLDGIL
Set a rectangle so that min corner is at max and max corner is at min.
Definition: qgsrectangle.h:151
QgsRasterViewPort::mTopLeftPoint
QgsPointXY mTopLeftPoint
Coordinate (in output device coordinate system) of top left corner of the part of the raster that is ...
Definition: qgsrasterviewport.h:46
QgsRasterViewPort
This class provides details of the viewable area that a raster will be rendered into.
Definition: qgsrasterviewport.h:35
QgsRenderContext::scaleFactor
double scaleFactor() const
Returns the scaling factor for the render to convert painter units to physical sizes.
Definition: qgsrendercontext.h:333
QgsRasterLayerTemporalProperties::ModeTemporalRangeFromDataProvider
@ ModeTemporalRangeFromDataProvider
Mode when raster layer delegates temporal range handling to the dataprovider.
Definition: qgsrasterlayertemporalproperties.h:57
QgsMapToPixel::toMapCoordinates
QgsPointXY toMapCoordinates(int x, int y) const
Transform device coordinates to map (world) coordinates.
Definition: qgsmaptopixel.cpp:108
QgsRectangle::intersect
QgsRectangle intersect(const QgsRectangle &rect) const
Returns the intersection with the given rectangle.
Definition: qgsrectangle.h:312
QgsCoordinateTransform::isValid
bool isValid() const
Returns true if the coordinate transform is valid, ie both the source and destination CRS have been s...
Definition: qgscoordinatetransform.cpp:892
QgsRenderContext::extent
const QgsRectangle & extent() const
When rendering a map layer, calling this method returns the "clipping" extent for the layer (in the l...
Definition: qgsrendercontext.h:306
QgsPointXY::setX
void setX(double x) SIP_HOLDGIL
Sets the x value of the point.
Definition: qgspointxy.h:107
QgsRectangle
A rectangle specified with double values.
Definition: qgsrectangle.h:42
QgsCoordinateTransform::transformBoundingBox
QgsRectangle transformBoundingBox(const QgsRectangle &rectangle, TransformDirection direction=ForwardTransform, bool handle180Crossover=false) const SIP_THROW(QgsCsException)
Transforms a rectangle from the source CRS to the destination CRS.
Definition: qgscoordinatetransform.cpp:511
QgsRasterLayerTemporalProperties
Implementation of map layer temporal properties for raster layers.
Definition: qgsrasterlayertemporalproperties.h:36
QgsRasterPipe::provider
QgsRasterDataProvider * provider() const
Definition: qgsrasterpipe.cpp:233
QgsMapLayerRenderer
Base class for utility classes that encapsulate information necessary for rendering of map layers.
Definition: qgsmaplayerrenderer.h:51
QgsCoordinateTransform::destinationCrs
QgsCoordinateReferenceSystem destinationCrs() const
Returns the destination coordinate reference system, which the transform will transform coordinates t...
Definition: qgscoordinatetransform.cpp:234
qgsrasteriterator.h
QgsRasterProjector
QgsRasterProjector implements approximate projection support for it calculates grid of points in sour...
Definition: qgsrasterprojector.h:48
QgsRectangle::xMaximum
double xMaximum() const SIP_HOLDGIL
Returns the x maximum value (right side of rectangle).
Definition: qgsrectangle.h:162
QgsRasterLayerRenderer::~QgsRasterLayerRenderer
~QgsRasterLayerRenderer() override
Definition: qgsrasterlayerrenderer.cpp:263
QgsRasterLayerTemporalProperties::ModeFixedTemporalRange
@ ModeFixedTemporalRange
Mode when temporal properties have fixed start and end datetimes.
Definition: qgsrasterlayertemporalproperties.h:56
QgsRenderContext::coordinateTransform
QgsCoordinateTransform coordinateTransform() const
Returns the current coordinate transform for the context.
Definition: qgsrendercontext.h:245
QgsRasterLayerRenderer::feedback
QgsFeedback * feedback() const override
Access to feedback object of the layer renderer (may be nullptr)
Definition: qgsrasterlayerrenderer.cpp:337
QgsCsException
Custom exception class for Coordinate Reference System related exceptions.
Definition: qgsexception.h:66
QgsRasterLayer::width
int width() const
Returns the width of the (unclipped) raster.
Definition: qgsrasterlayer.cpp:2448
QgsRasterDrawer::draw
void draw(QPainter *p, QgsRasterViewPort *viewPort, const QgsMapToPixel *qgsMapToPixel, QgsRasterBlockFeedback *feedback=nullptr)
Draws raster data.
Definition: qgsrasterdrawer.cpp:36
QgsTemporalProperty::isActive
bool isActive() const
Returns true if the temporal property is active.
Definition: qgstemporalproperty.cpp:36
QgsCoordinateTransform::setBallparkTransformsAreAppropriate
void setBallparkTransformsAreAppropriate(bool appropriate)
Sets whether approximate "ballpark" results are appropriate for this coordinate transform.
Definition: qgscoordinatetransform.cpp:935
QgsRasterPipe::renderer
QgsRasterRenderer * renderer() const
Definition: qgsrasterpipe.cpp:238
QgsRasterRenderer
Raster renderer pipe that applies colors to a raster.
Definition: qgsrasterrenderer.h:39
QgsRasterDataProvider::providerCapabilities
virtual QgsRasterDataProvider::ProviderCapabilities providerCapabilities() const
Returns flags containing the supported capabilities of the data provider.
Definition: qgsrasterdataprovider.cpp:245
QgsRasterViewPort::mTransformContext
QgsCoordinateTransformContext mTransformContext
Coordinate transform context.
Definition: qgsrasterviewport.h:72
QgsMapClippingUtils::calculatePainterClipRegion
static QPainterPath calculatePainterClipRegion(const QList< QgsMapClippingRegion > &regions, const QgsRenderContext &context, QgsMapLayerType layerType, bool &shouldClip)
Returns a QPainterPath representing the intersection of clipping regions from context which should be...
Definition: qgsmapclippingutils.cpp:126
QgsRasterDataProvider::temporalCapabilities
QgsRasterDataProviderTemporalCapabilities * temporalCapabilities() override
Returns the provider's temporal capabilities.
Definition: qgsrasterdataprovider.cpp:427
QgsFeedback
Base class for feedback objects to be used for cancellation of something running in a worker thread.
Definition: qgsfeedback.h:44
QgsMapToPixel::mapHeight
int mapHeight() const
Returns current map height in pixels.
Definition: qgsmaptopixel.cpp:69
QgsMapToPixel::mapRotation
double mapRotation() const
Returns current map rotation in degrees (clockwise)
Definition: qgsmaptopixel.cpp:158
QgsRasterLayer::height
int height() const
Returns the height of the (unclipped) raster.
Definition: qgsrasterlayer.cpp:2454
QgsMapLayer::extent
virtual QgsRectangle extent() const
Returns the extent of the layer.
Definition: qgsmaplayer.cpp:197
QgsRasterLayer::temporalProperties
QgsMapLayerTemporalProperties * temporalProperties() override
Returns the layer's temporal properties.
Definition: qgsrasterlayer.cpp:1006
QgsException::what
QString what() const
Definition: qgsexception.h:48
QgsMapLayerType::RasterLayer
@ RasterLayer
QgsRasterDataProvider::setDpi
void setDpi(int dpi)
Sets the output device resolution.
Definition: qgsrasterdataprovider.h:425
qgsrendercontext.h
QgsRasterDrawer
The drawing pipe for raster layers.
Definition: qgsrasterdrawer.h:38
QgsMapLayerRenderer::mErrors
QStringList mErrors
Definition: qgsmaplayerrenderer.h:87
QgsRasterLayer::dataProvider
QgsRasterDataProvider * dataProvider() override
Returns the source data provider.
Definition: qgsrasterlayer.cpp:234
QgsRasterProjector::setCrs
Q_DECL_DEPRECATED void setCrs(const QgsCoordinateReferenceSystem &srcCRS, const QgsCoordinateReferenceSystem &destCRS, int srcDatumTransform=-1, int destDatumTransform=-1)
Sets the source and destination CRS.
QgsRasterLayerTemporalProperties::mode
TemporalMode mode() const
Returns the temporal properties mode.
Definition: qgsrasterlayertemporalproperties.cpp:61
QgsRectangle::xMinimum
double xMinimum() const SIP_HOLDGIL
Returns the x minimum value (left side of rectangle).
Definition: qgsrectangle.h:167
QgsRasterLayer
Represents a raster layer.
Definition: qgsrasterlayer.h:71
QgsScopedQPainterState
Scoped object for saving and restoring a QPainter object's state.
Definition: qgsrendercontext.h:1120
QgsRasterBlockFeedback::setRenderPartialOutput
void setRenderPartialOutput(bool enable)
Set whether our painter is drawing to a temporary image used just by this layer.
Definition: qgsrasterinterface.h:77
QgsRasterIterator
Iterator for sequentially processing raster cells.
Definition: qgsrasteriterator.h:35
QgsRasterLayerTemporalProperties::intervalHandlingMethod
QgsRasterDataProviderTemporalCapabilities::IntervalHandlingMethod intervalHandlingMethod() const
Returns the desired method to use when resolving a temporal interval to matching layers or bands in t...
Definition: qgsrasterlayertemporalproperties.cpp:78
QgsCoordinateReferenceSystem
This class represents a coordinate reference system (CRS).
Definition: qgscoordinatereferencesystem.h:206
QgsMapToPixel::transform
QgsPointXY transform(const QgsPointXY &p) const
Transform the point from map (world) coordinates to device coordinates.
Definition: qgsmaptopixel.cpp:217
qgsrasterlayerrenderer.h
QgsRectangle::toString
QString toString(int precision=16) const
Returns a string representation of form xmin,ymin : xmax,ymax Coordinates will be truncated to the sp...
Definition: qgsrectangle.cpp:127
QgsPointXY
A class to represent a 2D point.
Definition: qgspointxy.h:44
QgsRasterLayerRenderer::render
bool render() override
Do the rendering (based on data stored in the class)
Definition: qgsrasterlayerrenderer.cpp:271
QgsRenderContext::RenderPartialOutput
@ RenderPartialOutput
Whether to make extra effort to update map image with partially rendered layers (better for interacti...
Definition: qgsrendercontext.h:80
QgsRasterPipe::last
QgsRasterInterface * last() const
Definition: qgsrasterpipe.h:114
QgsRasterViewPort::mHeight
qgssize mHeight
Height, number of rows to be rendered.
Definition: qgsrasterviewport.h:58
QgsRectangle::yMaximum
double yMaximum() const SIP_HOLDGIL
Returns the y maximum value (top side of rectangle).
Definition: qgsrectangle.h:172
QgsRasterLayerRenderer
Implementation of threaded rendering for raster layers.
Definition: qgsrasterlayerrenderer.h:71
QgsRasterPipe::resamplingStage
ResamplingStage resamplingStage() const
Returns which stage of the pipe should apply resampling.
Definition: qgsrasterpipe.h:160
QgsRasterPipe::setResamplingStage
void setResamplingStage(ResamplingStage stage)
Select which stage of the pipe should apply resampling.
Definition: qgsrasterpipe.cpp:345
QgsRasterViewPort::mWidth
qgssize mWidth
Width, number of columns to be rendered.
Definition: qgsrasterviewport.h:55
QgsMapToPixel
Perform transforms between map coordinates and device coordinates.
Definition: qgsmaptopixel.h:38
QgsMapToPixel::mapWidth
int mapWidth() const
Returns current map width in pixels The information is only known if setRotation was used.
Definition: qgsmaptopixel.cpp:74
QgsRasterLayer::pipe
QgsRasterPipe * pipe()
Returns the raster pipe.
Definition: qgsrasterlayer.h:293
QgsRenderContext::transformContext
QgsCoordinateTransformContext transformContext() const
Returns the context's coordinate transform context, which stores various information regarding which ...
Definition: qgsrendercontext.cpp:157
QgsRectangle::set
void set(const QgsPointXY &p1, const QgsPointXY &p2)
Sets the rectangle from two QgsPoints.
Definition: qgsrectangle.h:105
QgsRasterBlockFeedback
Feedback object tailored for raster block reading.
Definition: qgsrasterinterface.h:41
QgsRasterDataProvider::statusChanged
void statusChanged(const QString &) const
Emit a message to be displayed on status bar, usually used by network providers (WMS,...
QgsRasterLayer::refreshRendererIfNeeded
void refreshRendererIfNeeded(QgsRasterRenderer *rasterRenderer, const QgsRectangle &extent)
Refresh renderer with new extent, if needed.
Definition: qgsrasterlayer.cpp:1193
QgsMessageLog::logMessage
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).
Definition: qgsmessagelog.cpp:27
qgsmapclippingutils.h
QgsRasterBlockFeedback::setPreviewOnly
void setPreviewOnly(bool preview)
set flag whether the block request is for preview purposes only
Definition: qgsrasterinterface.h:65
qgsrasterlayertemporalproperties.h
qgsexception.h
QgsRasterPipe::projector
QgsRasterProjector * projector() const
Definition: qgsrasterpipe.cpp:258
QgsRenderContext::painter
QPainter * painter()
Returns the destination QPainter for the render operation.
Definition: qgsrendercontext.h:179
QgsCoordinateTransform
Class for doing transforms between two map coordinate systems.
Definition: qgscoordinatetransform.h:53
QgsRasterViewPort::mDestCRS
QgsCoordinateReferenceSystem mDestCRS
Target coordinate system.
Definition: qgsrasterviewport.h:67
QgsRasterPipe::ResamplingStage
ResamplingStage
Stage at which resampling occurs.
Definition: qgsrasterpipe.h:139
QgsRectangle::isEmpty
bool isEmpty() const
Returns true if the rectangle is empty.
Definition: qgsrectangle.h:437
QgsRenderContext::RenderPreviewJob
@ RenderPreviewJob
Render is a 'canvas preview' render, and shortcuts should be taken to ensure fast rendering.
Definition: qgsrendercontext.h:81
QgsMapToPixel::setMapRotation
void setMapRotation(double degrees, double cx, double cy)
Set map rotation in degrees (clockwise)
Definition: qgsmaptopixel.cpp:133
QgsRasterViewPort::mDrawnExtent
QgsRectangle mDrawnExtent
Intersection of current map extent and layer extent.
Definition: qgsrasterviewport.h:61
QgsRasterDataProvider
Base class for raster data providers.
Definition: qgsrasterdataprovider.h:89
qgsproject.h
QgsRasterPipe::ResamplingStage::Provider
@ Provider
Resampling occurs in Provider.
qgsrasterdataprovider.h
QgsRenderContext::flags
Flags flags() const
Returns combination of flags used for rendering.
Definition: qgsrendercontext.cpp:187
QgsRasterLayerRenderer::QgsRasterLayerRenderer
QgsRasterLayerRenderer(QgsRasterLayer *layer, QgsRenderContext &rendererContext)
Definition: qgsrasterlayerrenderer.cpp:66
qgsmessagelog.h
qgssize
unsigned long long qgssize
Qgssize is used instead of size_t, because size_t is stdlib type, unknown by SIP, and it would be har...
Definition: qgis.h:768