47#include <QElapsedTimer>
51#include "moc_qgsrasterlayerrenderer.cpp"
57 , mMinimalPreviewInterval( 250 )
62void QgsRasterLayerRendererFeedback::onNewData()
64 if ( !renderPartialOutput() )
69 if ( mLastPreview.isValid() && mLastPreview.msecsTo( QTime::currentTime() ) < mMinimalPreviewInterval )
74 QgsDebugMsgLevel( QStringLiteral(
"new raster preview! %1" ).arg( mLastPreview.msecsTo( QTime::currentTime() ) ), 3 );
82 drawer.draw( *( mR->renderContext() ), mR->mRasterViewPort, &feedback );
83 mR->mReadyToCompose =
true;
84 QgsDebugMsgLevel( QStringLiteral(
"total raster preview time: %1 ms" ).arg( t.elapsed() ), 3 );
85 mLastPreview = QTime::currentTime();
92 , mLayerName( layer->name() )
93 , mLayerOpacity( layer->opacity() )
94 , mProviderCapabilities( layer->dataProvider()->providerCapabilities() )
95 , mInterfaceCapabilities( layer->dataProvider()->capabilities() )
97 , mEnableProfile( rendererContext.
flags() &
Qgis::RenderContextFlag::RecordProfile )
111 const QgsPointXY center = mapToPixel.toMapCoordinates(
112 static_cast<int>( mapToPixel.mapWidth() / 2.0 ),
113 static_cast<int>( mapToPixel.mapHeight() / 2.0 )
115 mapToPixel.setMapRotation( 0, center.x(), center.y() );
123 QgsDebugMsgLevel( QStringLiteral(
"coordinateTransform set -> project extents." ), 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( QStringLiteral(
"draw request outside view extent." ), 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( QStringLiteral(
"draw request outside view extent." ), 2 );
202 visibleExtentOfRasterInMapCrs = layerToMapTransform.transformBoundingBox( visibleExtentInLayerCrs );
211 if ( visibleExtentOfRasterInMapCrs.
isEmpty() )
213 QgsDebugMsgLevel( QStringLiteral(
"draw request outside view extent." ), 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 );
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(),
262 mRasterViewPort->mBottomRightPoint.y() ),
263 mapToPixel.toMapCoordinates( mRasterViewPort->mBottomRightPoint.x(),
264 mRasterViewPort->mTopLeftPoint.y() )
268 mRasterViewPort->mWidth =
static_cast<qgssize>( std::abs( mRasterViewPort->mBottomRightPoint.x() - mRasterViewPort->mTopLeftPoint.x() ) );
269 mRasterViewPort->mHeight =
static_cast<qgssize>( std::abs( mRasterViewPort->mBottomRightPoint.y() - mRasterViewPort->mTopLeftPoint.y() ) );
271 double dpi = 25.4 * rendererContext.scaleFactor();
273 && rendererContext.dpiTarget() >= 0.0 )
275 const double dpiScaleFactor = rendererContext.dpiTarget() / dpi;
276 mRasterViewPort->mWidth *= dpiScaleFactor;
277 mRasterViewPort->mHeight *= dpiScaleFactor;
278 dpi = rendererContext.dpiTarget();
282 rendererContext.setDpiTarget( -1.0 );
289 QgsDebugMsgLevel( QStringLiteral(
"mapUnitsPerPixel = %1" ).arg( mapToPixel.mapUnitsPerPixel() ), 3 );
290 QgsDebugMsgLevel( QStringLiteral(
"mWidth = %1" ).arg( layer->width() ), 3 );
291 QgsDebugMsgLevel( QStringLiteral(
"mHeight = %1" ).arg( layer->height() ), 3 );
292 QgsDebugMsgLevel( QStringLiteral(
"visibleExtentOfRasterInMapCrs.xMinimum() = %1" ).arg( visibleExtentOfRasterInMapCrs.
xMinimum() ), 3 );
293 QgsDebugMsgLevel( QStringLiteral(
"visibleExtentOfRasterInMapCrs.xMaximum() = %1" ).arg( visibleExtentOfRasterInMapCrs.
xMaximum() ), 3 );
294 QgsDebugMsgLevel( QStringLiteral(
"visibleExtentOfRasterInMapCrs.yMinimum() = %1" ).arg( visibleExtentOfRasterInMapCrs.
yMinimum() ), 3 );
295 QgsDebugMsgLevel( QStringLiteral(
"visibleExtentOfRasterInMapCrs.yMaximum() = %1" ).arg( visibleExtentOfRasterInMapCrs.
yMaximum() ), 3 );
297 QgsDebugMsgLevel( QStringLiteral(
"mTopLeftPoint.x() = %1" ).arg( mRasterViewPort->mTopLeftPoint.x() ), 3 );
298 QgsDebugMsgLevel( QStringLiteral(
"mBottomRightPoint.x() = %1" ).arg( mRasterViewPort->mBottomRightPoint.x() ), 3 );
299 QgsDebugMsgLevel( QStringLiteral(
"mTopLeftPoint.y() = %1" ).arg( mRasterViewPort->mTopLeftPoint.y() ), 3 );
300 QgsDebugMsgLevel( QStringLiteral(
"mBottomRightPoint.y() = %1" ).arg( mRasterViewPort->mBottomRightPoint.y() ), 3 );
302 QgsDebugMsgLevel( QStringLiteral(
"mWidth = %1" ).arg( mRasterViewPort->mWidth ), 3 );
303 QgsDebugMsgLevel( QStringLiteral(
"mHeight = %1" ).arg( mRasterViewPort->mHeight ), 3 );
310 layer->dataProvider()->setDpi( std::floor( dpi * rendererContext.devicePixelRatio() ) );
313 mPipe = std::make_unique<QgsRasterPipe>( *layer->pipe() );
321 if ( rasterRenderer->needsRefresh( rendererContext.extent() ) )
323 QList<double> minValues;
324 QList<double> maxValues;
325 const QgsRasterMinMaxOrigin &minMaxOrigin = rasterRenderer->minMaxOrigin();
326 for ( const int bandIdx : rasterRenderer->usesBands() )
330 layer->computeMinMax( bandIdx, minMaxOrigin, minMaxOrigin.limits(),
331 rendererContext.extent(), static_cast<int>( QgsRasterLayer::SAMPLE_SIZE ),
333 minValues.append( min );
334 maxValues.append( max );
337 rasterRenderer->refresh( rendererContext.extent(), minValues, maxValues );
338 QgsRenderedLayerStatistics *layerStatistics = new QgsRenderedLayerStatistics( layer->id(), minValues, maxValues );
339 layerStatistics->setBoundingBox( rendererContext.extent() );
340 appendRenderedItemDetails( layerStatistics );
344 mPipe->evaluateDataDefinedProperties( rendererContext.expressionContext() );
349 if ( ( temporalProperties->isActive() && renderContext()->isTemporal() )
350 || ( elevationProperties->hasElevation() && !renderContext()->zRange().isInfinite() ) )
353 bool matched =
false;
356 rendererContext.temporalRange(),
357 rendererContext.zRange(),
360 if ( matched && matchedBand > 0 )
362 mPipe->renderer()->setInputBand( matchedBand );
366 if ( temporalProperties->isActive() && renderContext()->isTemporal() )
368 switch ( temporalProperties->mode() )
377 if ( mPipe->renderer()->usesBands().contains( temporalProperties->bandNumber() ) )
380 std::unique_ptr< QgsRasterTransparency > transparency;
382 transparency = std::make_unique< QgsRasterTransparency >( *rendererTransparency );
384 transparency = std::make_unique< QgsRasterTransparency >();
386 QVector<QgsRasterTransparency::TransparentSingleValuePixel> transparentPixels = transparency->transparentSingleValuePixelList();
388 const QDateTime &offset = temporalProperties->temporalRepresentationOffset();
389 const QgsInterval &scale = temporalProperties->temporalRepresentationScale();
392 if ( !temporalProperties->accumulatePixels() )
398 transparency->setTransparentSingleValuePixelList( transparentPixels );
399 mPipe->renderer()->setRasterTransparency( transparency.release() );
407 temporalCapabilities->setRequestedTemporalRange( rendererContext.temporalRange() );
408 temporalCapabilities->setIntervalHandlingMethod( temporalProperties->intervalHandlingMethod() );
415 temporalCapabilities->setRequestedTemporalRange( QgsDateTimeRange() );
416 temporalCapabilities->setIntervalHandlingMethod( temporalProperties->intervalHandlingMethod() );
421 if ( elevationProperties && elevationProperties->hasElevation() )
423 mDrawElevationMap = true;
424 mElevationScale = elevationProperties->zScale();
425 mElevationOffset = elevationProperties->zOffset();
426 mElevationBand = elevationProperties->bandNumber();
428 if ( !rendererContext.zRange().isInfinite() )
431 switch ( elevationProperties->mode() )
433 case Qgis::RasterElevationMode::FixedElevationRange:
438 case Qgis::RasterElevationMode::FixedRangePerBand:
439 case Qgis::RasterElevationMode::DynamicRangePerBand:
443 case Qgis::RasterElevationMode::RepresentsElevationSurface:
445 if ( mPipe->renderer()->usesBands().contains( mElevationBand ) )
448 if ( mPipe->renderer()->flags() & Qgis::RasterRendererFlag::UseNoDataForOutOfRangePixels )
450 std::unique_ptr< QgsRasterNuller> nuller;
451 if ( const QgsRasterNuller *existingNuller = mPipe->nuller() )
452 nuller.reset( existingNuller->clone() );
454 nuller = std::make_unique< QgsRasterNuller >();
458 QgsRasterRangeList nullRanges;
459 const double adjustedLower = ( rendererContext.zRange().lower() - mElevationOffset ) / mElevationScale;
460 const double adjustedUpper = ( rendererContext.zRange().upper() - mElevationOffset ) / mElevationScale;
461 nullRanges.append( QgsRasterRange( std::numeric_limits<double>::lowest(), adjustedLower, rendererContext.zRange().includeLower() ? QgsRasterRange::BoundsType::IncludeMin : QgsRasterRange::BoundsType::IncludeMinAndMax ) );
462 nullRanges.append( QgsRasterRange( adjustedUpper, std::numeric_limits<double>::max(), rendererContext.zRange().includeUpper() ? QgsRasterRange::BoundsType::IncludeMax : QgsRasterRange::BoundsType::IncludeMinAndMax ) );
463 nuller->setOutputNoDataValue( mElevationBand, static_cast< int >( adjustedLower - 1 ) );
464 nuller->setNoData( mElevationBand, nullRanges );
466 if ( !mPipe->insert( 1, nuller.release() ) )
468 QgsDebugError( QStringLiteral(
"Cannot set pipe nuller" ) );
473 std::unique_ptr< QgsRasterTransparency > transparency;
474 if ( const QgsRasterTransparency *rendererTransparency = mPipe->renderer()->rasterTransparency() )
475 transparency = std::make_unique< QgsRasterTransparency >( *rendererTransparency );
477 transparency = std::make_unique< QgsRasterTransparency >();
479 QVector<QgsRasterTransparency::TransparentSingleValuePixel> transparentPixels = transparency->transparentSingleValuePixelList();
483 const double adjustedLower = ( rendererContext.zRange().lower() - mElevationOffset ) / mElevationScale;
484 const double adjustedUpper = ( rendererContext.zRange().upper() - mElevationOffset ) / mElevationScale;
485 transparentPixels.append( QgsRasterTransparency::TransparentSingleValuePixel( std::numeric_limits<double>::lowest(), adjustedLower, 0, true, !rendererContext.zRange().includeLower() ) );
486 transparentPixels.append( QgsRasterTransparency::TransparentSingleValuePixel( adjustedUpper, std::numeric_limits<double>::max(), 0, !rendererContext.zRange().includeUpper(), true ) );
488 transparency->setTransparentSingleValuePixelList( transparentPixels );
489 mPipe->renderer()->setRasterTransparency( transparency.release() );
499 prepareLabeling( layer );
501 mFeedback->setRenderContext( rendererContext );
503 mPipe->moveToThread(
nullptr );
505 mPreparationTime = timer.elapsed();
512 delete mRasterViewPort;
519 std::unique_ptr< QgsScopedRuntimeProfile > profile;
520 if ( mEnableProfile )
522 profile = std::make_unique< QgsScopedRuntimeProfile >( mLayerName, QStringLiteral(
"rendering" ),
layerId() );
523 if ( mPreparationTime > 0 )
529 !( mInterfaceCapabilities &
533 mPipe->moveToThread( QThread::currentThread() );
538 std::unique_ptr< QgsScopedRuntimeProfile > preparingProfile;
539 if ( mEnableProfile )
541 preparingProfile = std::make_unique< QgsScopedRuntimeProfile >( QObject::tr(
"Preparing render" ), QStringLiteral(
"rendering" ) );
555 bool antialiasEnabled =
false;
556 if ( !mClippingRegions.empty() )
558 bool needsPainterClipPath =
false;
560 if ( needsPainterClipPath )
568 antialiasEnabled =
true;
574 bool restoreOldResamplingStage =
false;
583 mRasterViewPort->mSrcCRS != mRasterViewPort->mDestCRS &&
586 restoreOldResamplingStage =
true;
589 projector->
setCrs( mRasterViewPort->mSrcCRS, mRasterViewPort->mDestCRS, mRasterViewPort->mTransformContext );
592 preparingProfile.reset();
593 std::unique_ptr< QgsScopedRuntimeProfile > renderingProfile;
594 if ( mEnableProfile )
596 renderingProfile = std::make_unique< QgsScopedRuntimeProfile >( QObject::tr(
"Rendering" ), QStringLiteral(
"rendering" ) );
605 const QSize maxTileSize {provider->maximumTileSize()};
613 if ( mDrawElevationMap )
616 renderingProfile.reset();
618 if ( mLabelProvider && !
renderContext()->renderingStopped() )
620 std::unique_ptr< QgsScopedRuntimeProfile > labelingProfile;
621 if ( mEnableProfile )
623 labelingProfile = std::make_unique< QgsScopedRuntimeProfile >( QObject::tr(
"Labeling" ), QStringLiteral(
"rendering" ) );
628 if ( restoreOldResamplingStage )
630 mPipe->setResamplingStage( oldResamplingState );
633 const QStringList
errors = mFeedback->errors();
634 for (
const QString &error :
errors )
639 QgsDebugMsgLevel( QStringLiteral(
"total raster draw time (ms): %1" ).arg( time.elapsed(), 5 ), 4 );
642 mPipe->moveToThread(
nullptr );
644 return !mFeedback->isCanceled();
654 if ( !mRasterViewPort || !mPipe )
683void QgsRasterLayerRenderer::prepareLabeling(
QgsRasterLayer *layer )
693 std::unique_ptr< QgsRasterLayerLabelProvider > provider = labeling->provider( layer );
697 mLabelProvider = provider.release();
699 engine2->addProvider( mLabelProvider );
706void QgsRasterLayerRenderer::drawLabeling()
708 if ( mLabelProvider )
709 mLabelProvider->generateLabels( *
renderContext(), mPipe.get(), mRasterViewPort, mFeedback );
712void QgsRasterLayerRenderer::drawElevationMap()
714 QgsRasterDataProvider *dataProvider = mPipe->provider();
717 double dpiScalefactor;
722 dpiScalefactor = 1.0;
725 int outputHeight =
static_cast<int>(
static_cast<double>( mRasterViewPort->mHeight ) / dpiScalefactor *
renderContext()->
devicePixelRatio() );
728 int viewWidth =
static_cast<int>( viewSize.width() / dpiScalefactor );
729 int viewHeight =
static_cast<int>( viewSize.height() / dpiScalefactor );
731 bool canRenderElevation =
false;
732 std::unique_ptr<QgsRasterBlock> elevationBlock;
733 if ( mRasterViewPort->mSrcCRS == mRasterViewPort->mDestCRS )
735 elevationBlock.reset(
738 mRasterViewPort->mDrawnExtent,
742 canRenderElevation =
true;
752 if ( viewExtentInLayerCoordinate.
xMinimum() == std::numeric_limits<double>::lowest() &&
753 viewExtentInLayerCoordinate.
yMinimum() == std::numeric_limits<double>::lowest() &&
754 viewExtentInLayerCoordinate.
xMaximum() == std::numeric_limits<double>::max() &&
755 viewExtentInLayerCoordinate.
yMaximum() == std::numeric_limits<double>::max() )
757 viewExtentInLayerCoordinate = dataProvider->
extent();
760 double xLayerResol = viewExtentInLayerCoordinate.
width() /
static_cast<double>( viewWidth );
761 double yLayerResol = viewExtentInLayerCoordinate.
height() /
static_cast<double>( viewHeight );
763 double overSampling = 1;
764 if ( mPipe->resampleFilter() )
765 overSampling = mPipe->resampleFilter()->maxOversampling();
770 double providerXResol = dataProvider->
extent().
width() / dataProvider->
xSize();
772 overSampling = ( xLayerResol / providerXResol + yLayerResol / providerYResol ) / 2;
776 if ( overSampling > 1 )
786 int sourceWidth = viewWidth + 4;
787 int sourceHeight = viewHeight + 4;
788 viewExtentInLayerCoordinate = QgsRectangle(
789 viewExtentInLayerCoordinate.
xMinimum() - xLayerResol * 2,
790 viewExtentInLayerCoordinate.
yMinimum() - yLayerResol * 2,
791 viewExtentInLayerCoordinate.
xMaximum() + xLayerResol * 2,
792 viewExtentInLayerCoordinate.
yMaximum() + yLayerResol * 2 );
795 std::unique_ptr<QgsRasterBlock> sourcedata( dataProvider->
block( mElevationBand, viewExtentInLayerCoordinate, sourceWidth, sourceHeight, mFeedback ) );
800 elevationBlock = std::make_unique<QgsRasterBlock>( dataType,
804 elevationBlock->setNoDataValue( dataProvider->
sourceNoDataValue( mElevationBand ) );
811 QString coordinateOperation;
818 if ( coordinateOperation.isEmpty() )
820 mRasterViewPort->mSrcCRS, mRasterViewPort->mDestCRS );
823 coordinateOperation.toUtf8().constData() );
827 if ( canRenderElevation )
841 int top = elevMapHeight;
842 int left = elevMapWidth;
845 QList<QgsPointXY> corners;
846 corners << QgsPointXY( mRasterViewPort->mDrawnExtent.xMinimum(), mRasterViewPort->mDrawnExtent.yMinimum() )
847 << QgsPointXY( mRasterViewPort->mDrawnExtent.xMaximum(), mRasterViewPort->mDrawnExtent.yMaximum() )
848 << QgsPointXY( mRasterViewPort->mDrawnExtent.xMinimum(), mRasterViewPort->mDrawnExtent.yMaximum() )
849 << QgsPointXY( mRasterViewPort->mDrawnExtent.xMaximum(), mRasterViewPort->mDrawnExtent.yMinimum() );
851 for (
const QgsPointXY &corner : std::as_const( corners ) )
853 const QgsPointXY dpt = mtp.
transform( corner );
854 int x =
static_cast<int>( std::round( dpt.
x() ) );
855 int y =
static_cast<int>( std::round( dpt.
y() ) );
875 std::unique_ptr<QgsRasterBlock> rotatedElevationBlock =
876 std::make_unique<QgsRasterBlock>( elevationBlock->dataType(),
878 ( bottom - top ) *
renderContext()->devicePixelRatio() + 1 );
880 rotatedElevationBlock->setNoDataValue( elevationBlock->noDataValue() );
890 elevationBlock = std::move( rotatedElevationBlock );
893 topLeft = QPoint( left, top );
897 topLeft = mRasterViewPort->mTopLeftPoint.toQPointF().toPoint();
901 elevationBlock.get(),
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())
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 truncated to the sp...
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.
This class provides details of the viewable area that a raster will be rendered into.
QgsRectangle mDrawnExtent
Intersection of current map extent and layer extent, in map (destination) CRS.