48#include <QElapsedTimer>
53#include "moc_qgsrasterlayerrenderer.cpp"
55using namespace Qt::StringLiterals;
65void QgsRasterLayerRendererFeedback::onNewData()
67 if ( !renderPartialOutput() )
72 if ( mLastPreview.isValid() && mLastPreview.msecsTo( QTime::currentTime() ) < mMinimalPreviewInterval )
77 QgsDebugMsgLevel( u
"new raster preview! %1"_s.arg( mLastPreview.msecsTo( QTime::currentTime() ) ), 3 );
85 drawer.draw( *( mR->renderContext() ), mR->mRasterViewPort.get(), &feedback );
86 mR->mReadyToCompose =
true;
87 QgsDebugMsgLevel( u
"total raster preview time: %1 ms"_s.arg( t.elapsed() ), 3 );
88 mLastPreview = QTime::currentTime();
95 , mLayerName( layer->name() )
96 , mLayerOpacity( layer->opacity() )
97 , mProviderCapabilities( layer->dataProvider()->providerCapabilities() )
98 , mInterfaceCapabilities( layer->dataProvider()->capabilities() )
100 , mEnableProfile( rendererContext.
flags() &
Qgis::RenderContextFlag::RecordProfile )
114 const QgsPointXY center = mapToPixel.toMapCoordinates( static_cast<int>( mapToPixel.mapWidth() / 2.0 ), static_cast<int>( mapToPixel.mapHeight() / 2.0 ) );
115 mapToPixel.setMapRotation( 0, center.x(), center.y() );
123 QgsDebugMsgLevel( u
"coordinateTransform set -> project extents."_s, 4 );
124 if ( rendererContext.extent().xMinimum() == std::numeric_limits<double>::lowest()
125 && rendererContext.extent().yMinimum() == std::numeric_limits<double>::lowest()
126 && rendererContext.extent().xMaximum() == std::numeric_limits<double>::max()
127 && rendererContext.extent().yMaximum() == std::numeric_limits<double>::max() )
134 viewExtentInMapCrs = rendererContext.extent();
140 QgsCoordinateTransform ct = rendererContext.coordinateTransform();
141 ct.setBallparkTransformsAreAppropriate( true );
142 viewExtentInMapCrs = rendererContext.mapExtent();
147 viewExtentInMapCrs.setNull();
160 layerExtentInMapCrs.setNull();
166 viewExtentInMapCrs = rendererContext.extent();
167 layerExtentInMapCrs = layer->extent();
171 QgsRectangle visibleExtentOfRasterInMapCrs = layer->ignoreExtents() ? viewExtentInMapCrs : viewExtentInMapCrs.
intersect( layerExtentInMapCrs );
172 if ( visibleExtentOfRasterInMapCrs.
isEmpty() )
174 if ( rendererContext.coordinateTransform().isShortCircuited() )
178 QgsDebugMsgLevel( u
"draw request outside view extent."_s, 2 );
190 QgsCoordinateTransform layerToMapTransform = rendererContext.coordinateTransform();
191 layerToMapTransform.setBallparkTransformsAreAppropriate( true );
192 const QgsRectangle viewExtentInLayerCrs = layerToMapTransform.transformBoundingBox( rendererContext.mapExtent(), Qgis::TransformDirection::Reverse );
194 const QgsRectangle visibleExtentInLayerCrs = layer->ignoreExtents() ? viewExtentInLayerCrs : viewExtentInLayerCrs.intersect( layer->extent() );
195 if ( visibleExtentInLayerCrs.isEmpty() )
197 QgsDebugMsgLevel( u
"draw request outside view extent."_s, 2 );
202 visibleExtentOfRasterInMapCrs = layerToMapTransform.transformBoundingBox( visibleExtentInLayerCrs );
211 if ( visibleExtentOfRasterInMapCrs.
isEmpty() )
213 QgsDebugMsgLevel( u
"draw request outside view extent."_s, 2 );
218 QgsDebugMsgLevel(
"map extent in layer crs is " + rendererContext.extent().toString(), 4 );
219 QgsDebugMsgLevel(
"map extent in map crs is " + viewExtentInMapCrs.toString(), 4 );
220 QgsDebugMsgLevel(
"layer extent in map crs is " + layerExtentInMapCrs.toString(), 4 );
230 mRasterViewPort = std::make_unique<QgsRasterViewPort>();
232 mRasterViewPort->mDrawnExtent = visibleExtentOfRasterInMapCrs;
233 if ( rendererContext.coordinateTransform().isValid() )
235 mRasterViewPort->mSrcCRS = layer->crs();
236 mRasterViewPort->mDestCRS = rendererContext.coordinateTransform().destinationCrs();
237 mRasterViewPort->mTransformContext = rendererContext.transformContext();
241 mRasterViewPort->mSrcCRS = QgsCoordinateReferenceSystem();
242 mRasterViewPort->mDestCRS = QgsCoordinateReferenceSystem();
246 mRasterViewPort->mTopLeftPoint = mapToPixel.transform( visibleExtentOfRasterInMapCrs.
xMinimum(), visibleExtentOfRasterInMapCrs.
yMaximum() );
247 mRasterViewPort->mBottomRightPoint = mapToPixel.transform( visibleExtentOfRasterInMapCrs.
xMaximum(), visibleExtentOfRasterInMapCrs.
yMinimum() );
255 mRasterViewPort->mTopLeftPoint.setX( std::floor( mRasterViewPort->mTopLeftPoint.x() ) );
256 mRasterViewPort->mTopLeftPoint.setY( std::floor( mRasterViewPort->mTopLeftPoint.y() ) );
257 mRasterViewPort->mBottomRightPoint.setX( std::ceil( mRasterViewPort->mBottomRightPoint.x() ) );
258 mRasterViewPort->mBottomRightPoint.setY( std::ceil( mRasterViewPort->mBottomRightPoint.y() ) );
260 visibleExtentOfRasterInMapCrs.
set(
261 mapToPixel.toMapCoordinates( mRasterViewPort->mTopLeftPoint.x(), mRasterViewPort->mBottomRightPoint.y() ),
262 mapToPixel.toMapCoordinates( mRasterViewPort->mBottomRightPoint.x(), mRasterViewPort->mTopLeftPoint.y() )
266 mRasterViewPort->mWidth =
static_cast<qgssize>( std::abs( mRasterViewPort->mBottomRightPoint.x() - mRasterViewPort->mTopLeftPoint.x() ) );
267 mRasterViewPort->mHeight =
static_cast<qgssize>( std::abs( mRasterViewPort->mBottomRightPoint.y() - mRasterViewPort->mTopLeftPoint.y() ) );
269 double dpi = 25.4 * rendererContext.scaleFactor();
272 const double dpiScaleFactor = rendererContext.dpiTarget() / dpi;
273 mRasterViewPort->mWidth *= dpiScaleFactor;
274 mRasterViewPort->mHeight *= dpiScaleFactor;
275 dpi = rendererContext.dpiTarget();
279 rendererContext.setDpiTarget( -1.0 );
286 QgsDebugMsgLevel( u
"mapUnitsPerPixel = %1"_s.arg( mapToPixel.mapUnitsPerPixel() ), 3 );
289 QgsDebugMsgLevel( u
"visibleExtentOfRasterInMapCrs.xMinimum() = %1"_s.arg( visibleExtentOfRasterInMapCrs.
xMinimum() ), 3 );
290 QgsDebugMsgLevel( u
"visibleExtentOfRasterInMapCrs.xMaximum() = %1"_s.arg( visibleExtentOfRasterInMapCrs.
xMaximum() ), 3 );
291 QgsDebugMsgLevel( u
"visibleExtentOfRasterInMapCrs.yMinimum() = %1"_s.arg( visibleExtentOfRasterInMapCrs.
yMinimum() ), 3 );
292 QgsDebugMsgLevel( u
"visibleExtentOfRasterInMapCrs.yMaximum() = %1"_s.arg( visibleExtentOfRasterInMapCrs.
yMaximum() ), 3 );
294 QgsDebugMsgLevel( u
"mTopLeftPoint.x() = %1"_s.arg( mRasterViewPort->mTopLeftPoint.x() ), 3 );
295 QgsDebugMsgLevel( u
"mBottomRightPoint.x() = %1"_s.arg( mRasterViewPort->mBottomRightPoint.x() ), 3 );
296 QgsDebugMsgLevel( u
"mTopLeftPoint.y() = %1"_s.arg( mRasterViewPort->mTopLeftPoint.y() ), 3 );
297 QgsDebugMsgLevel( u
"mBottomRightPoint.y() = %1"_s.arg( mRasterViewPort->mBottomRightPoint.y() ), 3 );
307 layer->dataProvider()->setDpi( std::floor( dpi * rendererContext.devicePixelRatio() ) );
310 mPipe = std::make_unique<QgsRasterPipe>( *layer->pipe() );
316 if ( rasterRenderer->needsRefresh( rendererContext.extent() ) )
318 QList<double> minValues;
319 QList<double> maxValues;
320 const QgsRasterMinMaxOrigin &minMaxOrigin = rasterRenderer->minMaxOrigin();
321 for ( const int bandIdx : rasterRenderer->usesBands() )
325 layer->computeMinMax( bandIdx, minMaxOrigin, minMaxOrigin.limits(), rendererContext.extent(), static_cast<int>( QgsRasterLayer::SAMPLE_SIZE ), min, max );
326 minValues.append( min );
327 maxValues.append( max );
330 rasterRenderer->refresh( rendererContext.extent(), minValues, maxValues );
331 QgsRenderedLayerStatistics *layerStatistics = new QgsRenderedLayerStatistics( layer->id(), minValues, maxValues );
332 layerStatistics->setBoundingBox( rendererContext.extent() );
333 appendRenderedItemDetails( layerStatistics );
337 mPipe->evaluateDataDefinedProperties( rendererContext.expressionContext() );
342 if ( ( temporalProperties->isActive() && renderContext()->isTemporal() ) || ( elevationProperties->hasElevation() && !renderContext()->zRange().isInfinite() ) )
345 bool matched =
false;
347 if ( matched && matchedBand > 0 )
349 mPipe->renderer()->setInputBand( matchedBand );
353 if ( temporalProperties->isActive() && renderContext()->isTemporal() )
355 switch ( temporalProperties->mode() )
364 if ( mPipe->renderer()->usesBands().contains( temporalProperties->bandNumber() ) )
367 std::unique_ptr< QgsRasterTransparency > transparency;
369 transparency = std::make_unique< QgsRasterTransparency >( *rendererTransparency );
371 transparency = std::make_unique< QgsRasterTransparency >();
373 QVector<QgsRasterTransparency::TransparentSingleValuePixel> transparentPixels = transparency->transparentSingleValuePixelList();
375 const QDateTime &offset = temporalProperties->temporalRepresentationOffset();
376 const QgsInterval &scale = temporalProperties->temporalRepresentationScale();
377 const double adjustedLower =
static_cast< double >( offset.msecsTo( rendererContext.temporalRange().begin() ) )
380 const double adjustedUpper =
static_cast< double >( offset.msecsTo( rendererContext.temporalRange().end() ) )
383 if ( !temporalProperties->accumulatePixels() )
389 transparency->setTransparentSingleValuePixelList( transparentPixels );
390 mPipe->renderer()->setRasterTransparency( transparency.release() );
398 temporalCapabilities->setRequestedTemporalRange( rendererContext.temporalRange() );
399 temporalCapabilities->setIntervalHandlingMethod( temporalProperties->intervalHandlingMethod() );
406 temporalCapabilities->setRequestedTemporalRange( QgsDateTimeRange() );
407 temporalCapabilities->setIntervalHandlingMethod( temporalProperties->intervalHandlingMethod() );
412 if ( elevationProperties && elevationProperties->hasElevation() )
414 mDrawElevationMap = true;
415 mElevationScale = elevationProperties->zScale();
416 mElevationOffset = elevationProperties->zOffset();
417 mElevationBand = elevationProperties->bandNumber();
419 if ( !rendererContext.zRange().isInfinite() )
422 switch ( elevationProperties->mode() )
424 case Qgis::RasterElevationMode::FixedElevationRange:
429 case Qgis::RasterElevationMode::FixedRangePerBand:
430 case Qgis::RasterElevationMode::DynamicRangePerBand:
434 case Qgis::RasterElevationMode::RepresentsElevationSurface:
436 if ( mPipe->renderer()->usesBands().contains( mElevationBand ) )
439 if ( mPipe->renderer()->flags() & Qgis::RasterRendererFlag::UseNoDataForOutOfRangePixels )
441 std::unique_ptr< QgsRasterNuller> nuller;
442 if ( const QgsRasterNuller *existingNuller = mPipe->nuller() )
443 nuller.reset( existingNuller->clone() );
445 nuller = std::make_unique< QgsRasterNuller >();
449 QgsRasterRangeList nullRanges;
450 const double adjustedLower = ( rendererContext.zRange().lower() - mElevationOffset ) / mElevationScale;
451 const double adjustedUpper = ( rendererContext.zRange().upper() - mElevationOffset ) / mElevationScale;
453 QgsRasterRange( std::numeric_limits<double>::lowest(), adjustedLower, rendererContext.zRange().includeLower() ? QgsRasterRange::BoundsType::IncludeMin : QgsRasterRange::BoundsType::IncludeMinAndMax )
456 QgsRasterRange( adjustedUpper, std::numeric_limits<double>::max(), rendererContext.zRange().includeUpper() ? QgsRasterRange::BoundsType::IncludeMax : QgsRasterRange::BoundsType::IncludeMinAndMax )
458 nuller->setOutputNoDataValue( mElevationBand, static_cast< int >( adjustedLower - 1 ) );
459 nuller->setNoData( mElevationBand, nullRanges );
461 if ( !mPipe->insert( 1, nuller.release() ) )
463 QgsDebugError( u
"Cannot set pipe nuller"_s );
468 std::unique_ptr< QgsRasterTransparency > transparency;
469 if ( const QgsRasterTransparency *rendererTransparency = mPipe->renderer()->rasterTransparency() )
470 transparency = std::make_unique< QgsRasterTransparency >( *rendererTransparency );
472 transparency = std::make_unique< QgsRasterTransparency >();
474 QVector<QgsRasterTransparency::TransparentSingleValuePixel> transparentPixels = transparency->transparentSingleValuePixelList();
478 const double adjustedLower = ( rendererContext.zRange().lower() - mElevationOffset ) / mElevationScale;
479 const double adjustedUpper = ( rendererContext.zRange().upper() - mElevationOffset ) / mElevationScale;
480 transparentPixels.append( QgsRasterTransparency::TransparentSingleValuePixel( std::numeric_limits<double>::lowest(), adjustedLower, 0, true, !rendererContext.zRange().includeLower() ) );
481 transparentPixels.append( QgsRasterTransparency::TransparentSingleValuePixel( adjustedUpper, std::numeric_limits<double>::max(), 0, !rendererContext.zRange().includeUpper(), true ) );
483 transparency->setTransparentSingleValuePixelList( transparentPixels );
484 mPipe->renderer()->setRasterTransparency( transparency.release() );
494 prepareLabeling( layer );
496 mFeedback->setRenderContext( rendererContext );
498 mPipe->moveToThread(
nullptr );
500 mPreparationTime = timer.elapsed();
510 std::unique_ptr< QgsScopedRuntimeProfile > profile;
511 if ( mEnableProfile )
513 profile = std::make_unique< QgsScopedRuntimeProfile >( mLayerName, u
"rendering"_s,
layerId() );
514 if ( mPreparationTime > 0 )
522 mPipe->moveToThread( QThread::currentThread() );
527 std::unique_ptr< QgsScopedRuntimeProfile > preparingProfile;
528 if ( mEnableProfile )
530 preparingProfile = std::make_unique< QgsScopedRuntimeProfile >( QObject::tr(
"Preparing render" ), u
"rendering"_s );
544 bool antialiasEnabled =
false;
545 if ( !mClippingRegions.empty() )
547 bool needsPainterClipPath =
false;
549 if ( needsPainterClipPath )
557 antialiasEnabled =
true;
563 bool restoreOldResamplingStage =
false;
572 && mRasterViewPort->mSrcCRS != mRasterViewPort->mDestCRS
575 restoreOldResamplingStage =
true;
578 projector->
setCrs( mRasterViewPort->mSrcCRS, mRasterViewPort->mDestCRS, mRasterViewPort->mTransformContext );
581 preparingProfile.reset();
582 std::unique_ptr< QgsScopedRuntimeProfile > renderingProfile;
583 if ( mEnableProfile )
585 renderingProfile = std::make_unique< QgsScopedRuntimeProfile >( QObject::tr(
"Rendering" ), u
"rendering"_s );
594 const QSize maxTileSize { provider->maximumTileSize() };
602 if ( mDrawElevationMap )
605 renderingProfile.reset();
607 if ( mLabelProvider && !
renderContext()->renderingStopped() )
609 std::unique_ptr< QgsScopedRuntimeProfile > labelingProfile;
610 if ( mEnableProfile )
612 labelingProfile = std::make_unique< QgsScopedRuntimeProfile >( QObject::tr(
"Labeling" ), u
"rendering"_s );
617 if ( restoreOldResamplingStage )
619 mPipe->setResamplingStage( oldResamplingState );
622 const QStringList
errors = mFeedback->errors();
623 for (
const QString &error :
errors )
628 QgsDebugMsgLevel( u
"total raster draw time (ms): %1"_s.arg( time.elapsed(), 5 ), 4 );
631 mPipe->moveToThread(
nullptr );
633 return !mFeedback->isCanceled();
638 return mFeedback.get();
643 if ( !mRasterViewPort || !mPipe )
672void QgsRasterLayerRenderer::prepareLabeling(
QgsRasterLayer *layer )
682 std::unique_ptr< QgsRasterLayerLabelProvider > provider = labeling->provider( layer );
686 mLabelProvider = provider.release();
688 engine2->addProvider( mLabelProvider );
695void QgsRasterLayerRenderer::drawLabeling()
697 if ( mLabelProvider )
698 mLabelProvider->generateLabels( *
renderContext(), mPipe.get(), mRasterViewPort.get(), mFeedback.get() );
701void QgsRasterLayerRenderer::drawElevationMap()
703 QgsRasterDataProvider *dataProvider = mPipe->provider();
706 double dpiScalefactor;
711 dpiScalefactor = 1.0;
714 int outputHeight =
static_cast<int>(
static_cast<double>( mRasterViewPort->mHeight ) / dpiScalefactor *
renderContext()->
devicePixelRatio() );
717 int viewWidth =
static_cast<int>( viewSize.width() / dpiScalefactor );
718 int viewHeight =
static_cast<int>( viewSize.height() / dpiScalefactor );
720 bool canRenderElevation =
false;
721 std::unique_ptr<QgsRasterBlock> elevationBlock;
722 if ( mRasterViewPort->mSrcCRS == mRasterViewPort->mDestCRS )
724 elevationBlock.reset( dataProvider->
block( mElevationBand, mRasterViewPort->mDrawnExtent, outputWidth, outputHeight, mFeedback.get() ) );
725 canRenderElevation =
true;
735 if ( viewExtentInLayerCoordinate.
xMinimum() == std::numeric_limits<double>::lowest()
736 && viewExtentInLayerCoordinate.
yMinimum() == std::numeric_limits<double>::lowest()
737 && viewExtentInLayerCoordinate.
xMaximum() == std::numeric_limits<double>::max()
738 && viewExtentInLayerCoordinate.
yMaximum() == std::numeric_limits<double>::max() )
740 viewExtentInLayerCoordinate = dataProvider->
extent();
743 double xLayerResol = viewExtentInLayerCoordinate.
width() /
static_cast<double>( viewWidth );
744 double yLayerResol = viewExtentInLayerCoordinate.
height() /
static_cast<double>( viewHeight );
746 double overSampling = 1;
747 if ( mPipe->resampleFilter() )
748 overSampling = mPipe->resampleFilter()->maxOversampling();
753 double providerXResol = dataProvider->
extent().
width() / dataProvider->
xSize();
755 overSampling = ( xLayerResol / providerXResol + yLayerResol / providerYResol ) / 2;
759 if ( overSampling > 1 )
769 int sourceWidth = viewWidth + 4;
770 int sourceHeight = viewHeight + 4;
771 viewExtentInLayerCoordinate = QgsRectangle(
772 viewExtentInLayerCoordinate.
xMinimum() - xLayerResol * 2,
773 viewExtentInLayerCoordinate.
yMinimum() - yLayerResol * 2,
774 viewExtentInLayerCoordinate.
xMaximum() + xLayerResol * 2,
775 viewExtentInLayerCoordinate.
yMaximum() + yLayerResol * 2
779 std::unique_ptr<QgsRasterBlock> sourcedata( dataProvider->
block( mElevationBand, viewExtentInLayerCoordinate, sourceWidth, sourceHeight, mFeedback.get() ) );
783 elevationBlock = std::make_unique<QgsRasterBlock>( dataType, outputWidth, outputHeight );
785 elevationBlock->setNoDataValue( dataProvider->
sourceNoDataValue( mElevationBand ) );
791 QString coordinateOperation;
798 if ( coordinateOperation.isEmpty() )
805 if ( canRenderElevation )
819 int top = elevMapHeight;
820 int left = elevMapWidth;
823 QList<QgsPointXY> corners;
825 << QgsPointXY( mRasterViewPort->mDrawnExtent.xMinimum(), mRasterViewPort->mDrawnExtent.yMinimum() )
826 << QgsPointXY( mRasterViewPort->mDrawnExtent.xMaximum(), mRasterViewPort->mDrawnExtent.yMaximum() )
827 << QgsPointXY( mRasterViewPort->mDrawnExtent.xMinimum(), mRasterViewPort->mDrawnExtent.yMaximum() )
828 << QgsPointXY( mRasterViewPort->mDrawnExtent.xMaximum(), mRasterViewPort->mDrawnExtent.yMinimum() );
830 for (
const QgsPointXY &corner : std::as_const( corners ) )
832 const QgsPointXY dpt = mtp.
transform( corner );
833 int x =
static_cast<int>( std::round( dpt.
x() ) );
834 int y =
static_cast<int>( std::round( dpt.
y() ) );
853 std::unique_ptr<QgsRasterBlock> rotatedElevationBlock
854 = std::make_unique<QgsRasterBlock>( elevationBlock->dataType(), ( right - left ) *
renderContext()->devicePixelRatio() + 1, ( bottom - top ) *
renderContext()->devicePixelRatio() + 1 );
856 rotatedElevationBlock->setNoDataValue( elevationBlock->noDataValue() );
862 elevationBlock = std::move( rotatedElevationBlock );
865 topLeft = QPoint( left, top );
869 topLeft = mRasterViewPort->mTopLeftPoint.toQPointF().toPoint();
Provides global constants and enumerations for use throughout the application.
@ Default
Allow raster-based rendering in situations where it is required for correct rendering or where it wil...
@ PreferVector
Prefer vector-based rendering, when the result will still be visually near-identical to a raster-base...
@ ForceVector
Always force vector-based rendering, even when the result will be visually different to a raster-base...
RasterResamplingStage
Stage at which raster resampling occurs.
@ Provider
Resampling occurs in Provider.
@ ProviderHintCanPerformProviderResampling
Provider can perform resampling (to be opposed to post rendering resampling).
@ DpiDependentData
Provider's rendering is dependent on requested pixel size of the viewport.
@ InternalLayerOpacityHandling
The renderer internally handles the raster layer's opacity, so the default layer level opacity handli...
@ Milliseconds
Milliseconds.
@ RepresentsTemporalValues
Pixel values represent an datetime.
@ RedrawLayerOnly
Redraw the layer when temporal range changes, but don't apply any filtering. Useful when raster symbo...
@ FixedRangePerBand
Layer has a fixed temporal range per band.
@ TemporalRangeFromDataProvider
Mode when raster layer delegates temporal range handling to the dataprovider.
@ FixedTemporalRange
Mode when temporal properties have fixed start and end datetimes.
@ FixedDateTime
Layer has a fixed date time instant.
@ Prefetch
Allow prefetching of out-of-view images.
@ Size
Original data source size (and thus resolution) is known, it is not always available,...
DataType
Raster data types.
@ UnknownDataType
Unknown or unspecified type.
@ RenderPreviewJob
Render is a 'canvas preview' render, and shortcuts should be taken to ensure fast rendering.
@ RenderPartialOutput
Whether to make extra effort to update map image with partially rendered layers (better for interacti...
@ Render3DMap
Render is for a 3D map.
Abstract base class for labeling settings for raster layers.
static QgsRuntimeProfiler * profiler()
Returns the application runtime profiler.
QString calculateCoordinateOperation(const QgsCoordinateReferenceSystem &source, const QgsCoordinateReferenceSystem &destination) const
Returns the Proj coordinate operation string to use when transforming from the specified source CRS t...
bool mustReverseCoordinateOperation(const QgsCoordinateReferenceSystem &source, const QgsCoordinateReferenceSystem &destination) const
Returns true if the coordinate operation returned by calculateCoordinateOperation() for the source to...
Custom exception class for Coordinate Reference System related exceptions.
QImage rawElevationImage() const
Returns raw elevation image with elevations encoded as color values.
void fillWithRasterBlock(QgsRasterBlock *block, int top, int left, double zScale=1.0, double offset=0.0)
Fills the elevation map with values contains in a raster block starting from position defined by top ...
Base class for feedback objects to be used for cancellation of something running in a worker thread.
static bool resampleSingleBandRaster(GDALDatasetH hSrcDS, GDALDatasetH hDstDS, GDALResampleAlg resampleAlg, const char *pszCoordinateOperation)
Resamples a single band raster to the destination dataset with different resolution (and possibly wit...
static GDALResampleAlg gdalResamplingAlgorithm(Qgis::RasterResamplingMethod method)
Returns the GDAL resampling method corresponding to the QGIS resampling method.
static gdal::dataset_unique_ptr blockToSingleBandMemoryDataset(int pixelWidth, int pixelHeight, const QgsRectangle &extent, void *block, GDALDataType dataType)
Converts a data block to a single band GDAL memory dataset.
A representation of the interval between two datetime values.
double originalDuration() const
Returns the original interval duration.
Qgis::TemporalUnit originalUnit() const
Returns the original interval temporal unit.
Provides map labeling functionality.
static QPainterPath calculatePainterClipRegion(const QList< QgsMapClippingRegion > ®ions, const QgsRenderContext &context, Qgis::LayerType layerType, bool &shouldClip)
Returns a QPainterPath representing the intersection of clipping regions from context which should be...
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.
bool mReadyToCompose
The flag must be set to false in renderer's constructor if wants to use the smarter map redraws funct...
QString layerId() const
Gets access to the ID of the layer rendered by this class.
virtual Qgis::MapLayerRendererFlags flags() const
Returns flags which control how the map layer rendering behaves.
QgsRenderContext * renderContext()
Returns the render context associated with the renderer.
QStringList errors() const
Returns list of errors (problems) that happened during the rendering.
QgsMapLayerRenderer(const QString &layerID, QgsRenderContext *context=nullptr)
Constructor for QgsMapLayerRenderer, with the associated layerID and render context.
void statusChanged(const QString &status)
Emit a signal with status (e.g. to be caught by QgisApp and display a msg on status bar).
Perform transforms between map coordinates and device coordinates.
QgsPointXY toMapCoordinates(int x, int y) const
Transforms device coordinates to map (world) coordinates.
QgsPointXY transform(const QgsPointXY &p) const
Transforms a point p from map (world) coordinates to device coordinates.
double mapRotation() const
Returns the current map rotation in degrees (clockwise).
static void logMessage(const QString &message, const QString &tag=QString(), Qgis::MessageLevel level=Qgis::MessageLevel::Warning, bool notifyUser=true, const char *file=__builtin_FILE(), const char *function=__builtin_FUNCTION(), int line=__builtin_LINE(), Qgis::StringFormat format=Qgis::StringFormat::PlainText)
Adds a message to the log instance (and creates it if necessary).
double distance(double x, double y) const
Returns the distance between this point and a specified x, y coordinate.
Feedback object tailored for raster block reading.
void setPreviewOnly(bool preview)
set flag whether the block request is for preview purposes only
void setRenderPartialOutput(bool enable)
Set whether our painter is drawing to a temporary image used just by this layer.
Implementation of data provider temporal properties for QgsRasterDataProviders.
Base class for raster data providers.
Qgis::RasterResamplingMethod zoomedInResamplingMethod() const
Returns resampling method for zoomed-in operations.
virtual double sourceNoDataValue(int bandNo) const
Value representing no data value.
QgsRectangle extent() const override=0
Returns the extent of the layer.
Qgis::DataType dataType(int bandNo) const override=0
Returns data type for the band specified by number.
Qgis::RasterResamplingMethod zoomedOutResamplingMethod() const
Returns resampling method for zoomed-out operations.
QgsRasterBlock * block(int bandNo, const QgsRectangle &boundingBox, int width, int height, QgsRasterBlockFeedback *feedback=nullptr) override
Read block of data using given extent and size.
void statusChanged(const QString &) const
Emit a message to be displayed on status bar, usually used by network providers (WMS,...
The drawing pipe for raster layers.
void draw(QPainter *p, QgsRasterViewPort *viewPort, const QgsMapToPixel *qgsMapToPixel, QgsRasterBlockFeedback *feedback=nullptr)
Draws raster data.
virtual Qgis::RasterInterfaceCapabilities capabilities() const
Returns the capabilities supported by the interface.
virtual int xSize() const
Gets raster size.
virtual int ySize() const
Iterator for sequentially processing raster cells.
void setMaximumTileWidth(int w)
Sets the maximum tile width returned during iteration.
void setMaximumTileHeight(int h)
Sets the minimum tile height returned during iteration.
Raster layer specific subclass of QgsMapLayerElevationProperties.
void startRender(QgsRenderContext &context) final
To be called before rendering of labels begins.
Implementation of threaded rendering for raster layers.
bool render() override
Do the rendering (based on data stored in the class).
QgsRasterLayerRenderer(QgsRasterLayer *layer, QgsRenderContext &rendererContext)
bool forceRasterRender() const override
Returns true if the renderer must be rendered to a raster paint device (e.g.
~QgsRasterLayerRenderer() override
friend class QgsRasterLayerRendererFeedback
QgsFeedback * feedback() const override
Access to feedback object of the layer renderer (may be nullptr).
Implementation of map layer temporal properties for raster layers.
static int renderedBandForElevationAndTemporalRange(QgsRasterLayer *layer, const QgsDateTimeRange &temporalRange, const QgsDoubleRange &elevationRange, bool &matched)
Given a raster layer, returns the band which should be used for rendering the layer for a specified t...
Represents a raster layer.
const QgsAbstractRasterLayerLabeling * labeling() const
Access to const labeling configuration.
bool labelsEnabled() const
Returns whether the layer contains labels which are enabled and should be drawn.
Implements approximate projection support for optimised raster transformation.
Q_DECL_DEPRECATED void setCrs(const QgsCoordinateReferenceSystem &srcCRS, const QgsCoordinateReferenceSystem &destCRS, int srcDatumTransform=-1, int destDatumTransform=-1)
Sets the source and destination CRS.
Raster renderer pipe that applies colors to a raster.
Defines the list of pixel values to be considered as transparent or semi transparent when rendering r...
A rectangle specified with double values.
Q_INVOKABLE QString toString(int precision=16) const
Returns a string representation of form xmin,ymin : xmax,ymax Coordinates will be rounded to the spec...
void set(const QgsPointXY &p1, const QgsPointXY &p2, bool normalize=true)
Sets the rectangle from two QgsPoints.
QgsRectangle intersect(const QgsRectangle &rect) const
Returns the intersection with the given rectangle.
Contains information about the context of a rendering operation.
double scaleFactor() const
Returns the scaling factor for the render to convert painter units to physical sizes.
QPainter * painter()
Returns the destination QPainter for the render operation.
double rendererScale() const
Returns the renderer map scale.
QgsCoordinateTransformContext transformContext() const
Returns the context's coordinate transform context, which stores various information regarding which ...
QgsElevationMap * elevationMap() const
Returns the destination elevation map for the render operation.
const QgsRectangle & extent() const
When rendering a map layer, calling this method returns the "clipping" extent for the layer (in the l...
bool testFlag(Qgis::RenderContextFlag flag) const
Check whether a particular flag is enabled.
float devicePixelRatio() const
Returns the device pixel ratio.
double dpiTarget() const
Returns the targeted DPI for rendering.
const QgsMapToPixel & mapToPixel() const
Returns the context's map to pixel transform, which transforms between map coordinates and device coo...
QSize deviceOutputSize() const
Returns the device output size of the render.
QgsLabelingEngine * labelingEngine() const
Gets access to new labeling engine (may be nullptr).
QgsCoordinateTransform coordinateTransform() const
Returns the current coordinate transform for the context.
void record(const QString &name, double time, const QString &group="startup", const QString &id=QString())
Manually adds a profile event with the given name and total time (in seconds).
Scoped object for saving and restoring a QPainter object's state.
Scoped object for setting the current thread name.
static Q_INVOKABLE double fromUnitToUnitFactor(Qgis::DistanceUnit fromUnit, Qgis::DistanceUnit toUnit)
Returns the conversion factor between the specified distance units.
std::unique_ptr< std::remove_pointer< GDALDatasetH >::type, GDALDatasetCloser > dataset_unique_ptr
Scoped GDAL dataset.
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...
bool qgsDoubleNear(double a, double b, double epsilon=4 *std::numeric_limits< double >::epsilon())
Compare two doubles (but allow some difference).
#define QgsDebugMsgLevel(str, level)
Defines the transparency for a range of single-band pixel values.