47#include <QElapsedTimer>
52#include "moc_qgsrasterlayerrenderer.cpp"
54using namespace Qt::StringLiterals;
64void QgsRasterLayerRendererFeedback::onNewData()
66 if ( !renderPartialOutput() )
71 if ( mLastPreview.isValid() && mLastPreview.msecsTo( QTime::currentTime() ) < mMinimalPreviewInterval )
76 QgsDebugMsgLevel( u
"new raster preview! %1"_s.arg( mLastPreview.msecsTo( QTime::currentTime() ) ), 3 );
84 drawer.draw( *( mR->renderContext() ), mR->mRasterViewPort, &feedback );
85 mR->mReadyToCompose =
true;
86 QgsDebugMsgLevel( u
"total raster preview time: %1 ms"_s.arg( t.elapsed() ), 3 );
87 mLastPreview = QTime::currentTime();
94 , mLayerName( layer->name() )
95 , mLayerOpacity( layer->opacity() )
96 , mProviderCapabilities( layer->dataProvider()->providerCapabilities() )
97 , mInterfaceCapabilities( layer->dataProvider()->capabilities() )
99 , mEnableProfile( rendererContext.
flags() &
Qgis::RenderContextFlag::RecordProfile )
113 const QgsPointXY center = mapToPixel.toMapCoordinates(
114 static_cast<int>( mapToPixel.mapWidth() / 2.0 ),
115 static_cast<int>( mapToPixel.mapHeight() / 2.0 )
117 mapToPixel.setMapRotation( 0, center.x(), center.y() );
125 QgsDebugMsgLevel( u
"coordinateTransform set -> project extents."_s, 4 );
126 if ( rendererContext.extent().xMinimum() == std::numeric_limits<double>::lowest() &&
127 rendererContext.extent().yMinimum() == std::numeric_limits<double>::lowest() &&
128 rendererContext.extent().xMaximum() == std::numeric_limits<double>::max() &&
129 rendererContext.extent().yMaximum() == std::numeric_limits<double>::max() )
136 viewExtentInMapCrs = rendererContext.extent();
142 QgsCoordinateTransform ct = rendererContext.coordinateTransform();
143 ct.setBallparkTransformsAreAppropriate( true );
144 viewExtentInMapCrs = rendererContext.mapExtent();
149 viewExtentInMapCrs.setNull();
162 layerExtentInMapCrs.setNull();
168 viewExtentInMapCrs = rendererContext.extent();
169 layerExtentInMapCrs = layer->extent();
173 QgsRectangle visibleExtentOfRasterInMapCrs = layer->ignoreExtents() ? viewExtentInMapCrs : viewExtentInMapCrs.
intersect( layerExtentInMapCrs );
174 if ( visibleExtentOfRasterInMapCrs.
isEmpty() )
176 if ( rendererContext.coordinateTransform().isShortCircuited() )
180 QgsDebugMsgLevel( u
"draw request outside view extent."_s, 2 );
192 QgsCoordinateTransform layerToMapTransform = rendererContext.coordinateTransform();
193 layerToMapTransform.setBallparkTransformsAreAppropriate( true );
194 const QgsRectangle viewExtentInLayerCrs = layerToMapTransform.transformBoundingBox( rendererContext.mapExtent(), Qgis::TransformDirection::Reverse );
196 const QgsRectangle visibleExtentInLayerCrs = layer->ignoreExtents() ? viewExtentInLayerCrs : viewExtentInLayerCrs.intersect( layer->extent() );
197 if ( visibleExtentInLayerCrs.isEmpty() )
199 QgsDebugMsgLevel( u
"draw request outside view extent."_s, 2 );
204 visibleExtentOfRasterInMapCrs = layerToMapTransform.transformBoundingBox( visibleExtentInLayerCrs );
213 if ( visibleExtentOfRasterInMapCrs.
isEmpty() )
215 QgsDebugMsgLevel( u
"draw request outside view extent."_s, 2 );
220 QgsDebugMsgLevel(
"map extent in layer crs is " + rendererContext.extent().toString(), 4 );
221 QgsDebugMsgLevel(
"map extent in map crs is " + viewExtentInMapCrs.toString(), 4 );
222 QgsDebugMsgLevel(
"layer extent in map crs is " + layerExtentInMapCrs.toString(), 4 );
234 mRasterViewPort->
mDrawnExtent = visibleExtentOfRasterInMapCrs;
235 if ( rendererContext.coordinateTransform().isValid() )
237 mRasterViewPort->mSrcCRS = layer->crs();
238 mRasterViewPort->mDestCRS = rendererContext.coordinateTransform().destinationCrs();
239 mRasterViewPort->mTransformContext = rendererContext.transformContext();
243 mRasterViewPort->mSrcCRS = QgsCoordinateReferenceSystem();
244 mRasterViewPort->mDestCRS = QgsCoordinateReferenceSystem();
248 mRasterViewPort->mTopLeftPoint = mapToPixel.transform( visibleExtentOfRasterInMapCrs.
xMinimum(), visibleExtentOfRasterInMapCrs.
yMaximum() );
249 mRasterViewPort->mBottomRightPoint = mapToPixel.transform( visibleExtentOfRasterInMapCrs.
xMaximum(), visibleExtentOfRasterInMapCrs.
yMinimum() );
257 mRasterViewPort->mTopLeftPoint.setX( std::floor( mRasterViewPort->mTopLeftPoint.x() ) );
258 mRasterViewPort->mTopLeftPoint.setY( std::floor( mRasterViewPort->mTopLeftPoint.y() ) );
259 mRasterViewPort->mBottomRightPoint.setX( std::ceil( mRasterViewPort->mBottomRightPoint.x() ) );
260 mRasterViewPort->mBottomRightPoint.setY( std::ceil( mRasterViewPort->mBottomRightPoint.y() ) );
262 visibleExtentOfRasterInMapCrs.
set(
263 mapToPixel.toMapCoordinates( mRasterViewPort->mTopLeftPoint.x(),
264 mRasterViewPort->mBottomRightPoint.y() ),
265 mapToPixel.toMapCoordinates( mRasterViewPort->mBottomRightPoint.x(),
266 mRasterViewPort->mTopLeftPoint.y() )
270 mRasterViewPort->mWidth =
static_cast<qgssize>( std::abs( mRasterViewPort->mBottomRightPoint.x() - mRasterViewPort->mTopLeftPoint.x() ) );
271 mRasterViewPort->mHeight =
static_cast<qgssize>( std::abs( mRasterViewPort->mBottomRightPoint.y() - mRasterViewPort->mTopLeftPoint.y() ) );
273 double dpi = 25.4 * rendererContext.scaleFactor();
275 && rendererContext.dpiTarget() >= 0.0 )
277 const double dpiScaleFactor = rendererContext.dpiTarget() / dpi;
278 mRasterViewPort->mWidth *= dpiScaleFactor;
279 mRasterViewPort->mHeight *= dpiScaleFactor;
280 dpi = rendererContext.dpiTarget();
284 rendererContext.setDpiTarget( -1.0 );
291 QgsDebugMsgLevel( u
"mapUnitsPerPixel = %1"_s.arg( mapToPixel.mapUnitsPerPixel() ), 3 );
294 QgsDebugMsgLevel( u
"visibleExtentOfRasterInMapCrs.xMinimum() = %1"_s.arg( visibleExtentOfRasterInMapCrs.
xMinimum() ), 3 );
295 QgsDebugMsgLevel( u
"visibleExtentOfRasterInMapCrs.xMaximum() = %1"_s.arg( visibleExtentOfRasterInMapCrs.
xMaximum() ), 3 );
296 QgsDebugMsgLevel( u
"visibleExtentOfRasterInMapCrs.yMinimum() = %1"_s.arg( visibleExtentOfRasterInMapCrs.
yMinimum() ), 3 );
297 QgsDebugMsgLevel( u
"visibleExtentOfRasterInMapCrs.yMaximum() = %1"_s.arg( visibleExtentOfRasterInMapCrs.
yMaximum() ), 3 );
299 QgsDebugMsgLevel( u
"mTopLeftPoint.x() = %1"_s.arg( mRasterViewPort->mTopLeftPoint.x() ), 3 );
300 QgsDebugMsgLevel( u
"mBottomRightPoint.x() = %1"_s.arg( mRasterViewPort->mBottomRightPoint.x() ), 3 );
301 QgsDebugMsgLevel( u
"mTopLeftPoint.y() = %1"_s.arg( mRasterViewPort->mTopLeftPoint.y() ), 3 );
302 QgsDebugMsgLevel( u
"mBottomRightPoint.y() = %1"_s.arg( mRasterViewPort->mBottomRightPoint.y() ), 3 );
312 layer->dataProvider()->setDpi( std::floor( dpi * rendererContext.devicePixelRatio() ) );
315 mPipe = std::make_unique<QgsRasterPipe>( *layer->pipe() );
323 if ( rasterRenderer->needsRefresh( rendererContext.extent() ) )
325 QList<double> minValues;
326 QList<double> maxValues;
327 const QgsRasterMinMaxOrigin &minMaxOrigin = rasterRenderer->minMaxOrigin();
328 for ( const int bandIdx : rasterRenderer->usesBands() )
332 layer->computeMinMax( bandIdx, minMaxOrigin, minMaxOrigin.limits(),
333 rendererContext.extent(), static_cast<int>( QgsRasterLayer::SAMPLE_SIZE ),
335 minValues.append( min );
336 maxValues.append( max );
339 rasterRenderer->refresh( rendererContext.extent(), minValues, maxValues );
340 QgsRenderedLayerStatistics *layerStatistics = new QgsRenderedLayerStatistics( layer->id(), minValues, maxValues );
341 layerStatistics->setBoundingBox( rendererContext.extent() );
342 appendRenderedItemDetails( layerStatistics );
346 mPipe->evaluateDataDefinedProperties( rendererContext.expressionContext() );
351 if ( ( temporalProperties->isActive() && renderContext()->isTemporal() )
352 || ( elevationProperties->hasElevation() && !renderContext()->zRange().isInfinite() ) )
355 bool matched =
false;
358 rendererContext.temporalRange(),
359 rendererContext.zRange(),
362 if ( matched && matchedBand > 0 )
364 mPipe->renderer()->setInputBand( matchedBand );
368 if ( temporalProperties->isActive() && renderContext()->isTemporal() )
370 switch ( temporalProperties->mode() )
379 if ( mPipe->renderer()->usesBands().contains( temporalProperties->bandNumber() ) )
382 std::unique_ptr< QgsRasterTransparency > transparency;
384 transparency = std::make_unique< QgsRasterTransparency >( *rendererTransparency );
386 transparency = std::make_unique< QgsRasterTransparency >();
388 QVector<QgsRasterTransparency::TransparentSingleValuePixel> transparentPixels = transparency->transparentSingleValuePixelList();
390 const QDateTime &offset = temporalProperties->temporalRepresentationOffset();
391 const QgsInterval &scale = temporalProperties->temporalRepresentationScale();
394 if ( !temporalProperties->accumulatePixels() )
400 transparency->setTransparentSingleValuePixelList( transparentPixels );
401 mPipe->renderer()->setRasterTransparency( transparency.release() );
409 temporalCapabilities->setRequestedTemporalRange( rendererContext.temporalRange() );
410 temporalCapabilities->setIntervalHandlingMethod( temporalProperties->intervalHandlingMethod() );
417 temporalCapabilities->setRequestedTemporalRange( QgsDateTimeRange() );
418 temporalCapabilities->setIntervalHandlingMethod( temporalProperties->intervalHandlingMethod() );
423 if ( elevationProperties && elevationProperties->hasElevation() )
425 mDrawElevationMap = true;
426 mElevationScale = elevationProperties->zScale();
427 mElevationOffset = elevationProperties->zOffset();
428 mElevationBand = elevationProperties->bandNumber();
430 if ( !rendererContext.zRange().isInfinite() )
433 switch ( elevationProperties->mode() )
435 case Qgis::RasterElevationMode::FixedElevationRange:
440 case Qgis::RasterElevationMode::FixedRangePerBand:
441 case Qgis::RasterElevationMode::DynamicRangePerBand:
445 case Qgis::RasterElevationMode::RepresentsElevationSurface:
447 if ( mPipe->renderer()->usesBands().contains( mElevationBand ) )
450 if ( mPipe->renderer()->flags() & Qgis::RasterRendererFlag::UseNoDataForOutOfRangePixels )
452 std::unique_ptr< QgsRasterNuller> nuller;
453 if ( const QgsRasterNuller *existingNuller = mPipe->nuller() )
454 nuller.reset( existingNuller->clone() );
456 nuller = std::make_unique< QgsRasterNuller >();
460 QgsRasterRangeList nullRanges;
461 const double adjustedLower = ( rendererContext.zRange().lower() - mElevationOffset ) / mElevationScale;
462 const double adjustedUpper = ( rendererContext.zRange().upper() - mElevationOffset ) / mElevationScale;
463 nullRanges.append( QgsRasterRange( std::numeric_limits<double>::lowest(), adjustedLower, rendererContext.zRange().includeLower() ? QgsRasterRange::BoundsType::IncludeMin : QgsRasterRange::BoundsType::IncludeMinAndMax ) );
464 nullRanges.append( QgsRasterRange( adjustedUpper, std::numeric_limits<double>::max(), rendererContext.zRange().includeUpper() ? QgsRasterRange::BoundsType::IncludeMax : QgsRasterRange::BoundsType::IncludeMinAndMax ) );
465 nuller->setOutputNoDataValue( mElevationBand, static_cast< int >( adjustedLower - 1 ) );
466 nuller->setNoData( mElevationBand, nullRanges );
468 if ( !mPipe->insert( 1, nuller.release() ) )
470 QgsDebugError( u
"Cannot set pipe nuller"_s );
475 std::unique_ptr< QgsRasterTransparency > transparency;
476 if ( const QgsRasterTransparency *rendererTransparency = mPipe->renderer()->rasterTransparency() )
477 transparency = std::make_unique< QgsRasterTransparency >( *rendererTransparency );
479 transparency = std::make_unique< QgsRasterTransparency >();
481 QVector<QgsRasterTransparency::TransparentSingleValuePixel> transparentPixels = transparency->transparentSingleValuePixelList();
485 const double adjustedLower = ( rendererContext.zRange().lower() - mElevationOffset ) / mElevationScale;
486 const double adjustedUpper = ( rendererContext.zRange().upper() - mElevationOffset ) / mElevationScale;
487 transparentPixels.append( QgsRasterTransparency::TransparentSingleValuePixel( std::numeric_limits<double>::lowest(), adjustedLower, 0, true, !rendererContext.zRange().includeLower() ) );
488 transparentPixels.append( QgsRasterTransparency::TransparentSingleValuePixel( adjustedUpper, std::numeric_limits<double>::max(), 0, !rendererContext.zRange().includeUpper(), true ) );
490 transparency->setTransparentSingleValuePixelList( transparentPixels );
491 mPipe->renderer()->setRasterTransparency( transparency.release() );
501 prepareLabeling( layer );
503 mFeedback->setRenderContext( rendererContext );
505 mPipe->moveToThread(
nullptr );
507 mPreparationTime = timer.elapsed();
514 delete mRasterViewPort;
521 std::unique_ptr< QgsScopedRuntimeProfile > profile;
522 if ( mEnableProfile )
524 profile = std::make_unique< QgsScopedRuntimeProfile >( mLayerName, u
"rendering"_s,
layerId() );
525 if ( mPreparationTime > 0 )
531 !( mInterfaceCapabilities &
535 mPipe->moveToThread( QThread::currentThread() );
540 std::unique_ptr< QgsScopedRuntimeProfile > preparingProfile;
541 if ( mEnableProfile )
543 preparingProfile = std::make_unique< QgsScopedRuntimeProfile >( QObject::tr(
"Preparing render" ), u
"rendering"_s );
557 bool antialiasEnabled =
false;
558 if ( !mClippingRegions.empty() )
560 bool needsPainterClipPath =
false;
562 if ( needsPainterClipPath )
570 antialiasEnabled =
true;
576 bool restoreOldResamplingStage =
false;
585 mRasterViewPort->mSrcCRS != mRasterViewPort->mDestCRS &&
588 restoreOldResamplingStage =
true;
591 projector->
setCrs( mRasterViewPort->mSrcCRS, mRasterViewPort->mDestCRS, mRasterViewPort->mTransformContext );
594 preparingProfile.reset();
595 std::unique_ptr< QgsScopedRuntimeProfile > renderingProfile;
596 if ( mEnableProfile )
598 renderingProfile = std::make_unique< QgsScopedRuntimeProfile >( QObject::tr(
"Rendering" ), u
"rendering"_s );
607 const QSize maxTileSize {provider->maximumTileSize()};
615 if ( mDrawElevationMap )
618 renderingProfile.reset();
620 if ( mLabelProvider && !
renderContext()->renderingStopped() )
622 std::unique_ptr< QgsScopedRuntimeProfile > labelingProfile;
623 if ( mEnableProfile )
625 labelingProfile = std::make_unique< QgsScopedRuntimeProfile >( QObject::tr(
"Labeling" ), u
"rendering"_s );
630 if ( restoreOldResamplingStage )
632 mPipe->setResamplingStage( oldResamplingState );
635 const QStringList
errors = mFeedback->errors();
636 for (
const QString &error :
errors )
641 QgsDebugMsgLevel( u
"total raster draw time (ms): %1"_s.arg( time.elapsed(), 5 ), 4 );
644 mPipe->moveToThread(
nullptr );
646 return !mFeedback->isCanceled();
656 if ( !mRasterViewPort || !mPipe )
685void QgsRasterLayerRenderer::prepareLabeling(
QgsRasterLayer *layer )
695 std::unique_ptr< QgsRasterLayerLabelProvider > provider = labeling->provider( layer );
699 mLabelProvider = provider.release();
701 engine2->addProvider( mLabelProvider );
708void QgsRasterLayerRenderer::drawLabeling()
710 if ( mLabelProvider )
711 mLabelProvider->generateLabels( *
renderContext(), mPipe.get(), mRasterViewPort, mFeedback );
714void QgsRasterLayerRenderer::drawElevationMap()
716 QgsRasterDataProvider *dataProvider = mPipe->provider();
719 double dpiScalefactor;
724 dpiScalefactor = 1.0;
727 int outputHeight =
static_cast<int>(
static_cast<double>( mRasterViewPort->mHeight ) / dpiScalefactor *
renderContext()->
devicePixelRatio() );
730 int viewWidth =
static_cast<int>( viewSize.width() / dpiScalefactor );
731 int viewHeight =
static_cast<int>( viewSize.height() / dpiScalefactor );
733 bool canRenderElevation =
false;
734 std::unique_ptr<QgsRasterBlock> elevationBlock;
735 if ( mRasterViewPort->mSrcCRS == mRasterViewPort->mDestCRS )
737 elevationBlock.reset(
740 mRasterViewPort->mDrawnExtent,
744 canRenderElevation =
true;
754 if ( viewExtentInLayerCoordinate.
xMinimum() == std::numeric_limits<double>::lowest() &&
755 viewExtentInLayerCoordinate.
yMinimum() == std::numeric_limits<double>::lowest() &&
756 viewExtentInLayerCoordinate.
xMaximum() == std::numeric_limits<double>::max() &&
757 viewExtentInLayerCoordinate.
yMaximum() == std::numeric_limits<double>::max() )
759 viewExtentInLayerCoordinate = dataProvider->
extent();
762 double xLayerResol = viewExtentInLayerCoordinate.
width() /
static_cast<double>( viewWidth );
763 double yLayerResol = viewExtentInLayerCoordinate.
height() /
static_cast<double>( viewHeight );
765 double overSampling = 1;
766 if ( mPipe->resampleFilter() )
767 overSampling = mPipe->resampleFilter()->maxOversampling();
772 double providerXResol = dataProvider->
extent().
width() / dataProvider->
xSize();
774 overSampling = ( xLayerResol / providerXResol + yLayerResol / providerYResol ) / 2;
778 if ( overSampling > 1 )
788 int sourceWidth = viewWidth + 4;
789 int sourceHeight = viewHeight + 4;
790 viewExtentInLayerCoordinate = QgsRectangle(
791 viewExtentInLayerCoordinate.
xMinimum() - xLayerResol * 2,
792 viewExtentInLayerCoordinate.
yMinimum() - yLayerResol * 2,
793 viewExtentInLayerCoordinate.
xMaximum() + xLayerResol * 2,
794 viewExtentInLayerCoordinate.
yMaximum() + yLayerResol * 2 );
797 std::unique_ptr<QgsRasterBlock> sourcedata( dataProvider->
block( mElevationBand, viewExtentInLayerCoordinate, sourceWidth, sourceHeight, mFeedback ) );
802 elevationBlock = std::make_unique<QgsRasterBlock>( dataType,
806 elevationBlock->setNoDataValue( dataProvider->
sourceNoDataValue( mElevationBand ) );
813 QString coordinateOperation;
820 if ( coordinateOperation.isEmpty() )
822 mRasterViewPort->mSrcCRS, mRasterViewPort->mDestCRS );
825 coordinateOperation.toUtf8().constData() );
829 if ( canRenderElevation )
843 int top = elevMapHeight;
844 int left = elevMapWidth;
847 QList<QgsPointXY> corners;
848 corners << QgsPointXY( mRasterViewPort->mDrawnExtent.xMinimum(), mRasterViewPort->mDrawnExtent.yMinimum() )
849 << QgsPointXY( mRasterViewPort->mDrawnExtent.xMaximum(), mRasterViewPort->mDrawnExtent.yMaximum() )
850 << QgsPointXY( mRasterViewPort->mDrawnExtent.xMinimum(), mRasterViewPort->mDrawnExtent.yMaximum() )
851 << QgsPointXY( mRasterViewPort->mDrawnExtent.xMaximum(), mRasterViewPort->mDrawnExtent.yMinimum() );
853 for (
const QgsPointXY &corner : std::as_const( corners ) )
855 const QgsPointXY dpt = mtp.
transform( corner );
856 int x =
static_cast<int>( std::round( dpt.
x() ) );
857 int y =
static_cast<int>( std::round( dpt.
y() ) );
877 std::unique_ptr<QgsRasterBlock> rotatedElevationBlock =
878 std::make_unique<QgsRasterBlock>( elevationBlock->dataType(),
880 ( bottom - top ) *
renderContext()->devicePixelRatio() + 1 );
882 rotatedElevationBlock->setNoDataValue( elevationBlock->noDataValue() );
892 elevationBlock = std::move( rotatedElevationBlock );
895 topLeft = QPoint( left, top );
899 topLeft = mRasterViewPort->mTopLeftPoint.toQPointF().toPoint();
903 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.