Skip to content

Commit

Permalink
Browse files Browse the repository at this point in the history
When rendering lower zoom level tiles vs actual render zoom level
due to presence of tilemap, ensure that we always use the actual
render zoom level to match styles for the tile instead of the
zoom level corresponding to the tile

Otherwise we'll be rendering different rules depending on the
actual tile source, when we should always use the actual
rules for the current map scale
  • Loading branch information
nyalldawson committed May 16, 2023
1 parent d70b8ec commit 27a4336
Show file tree
Hide file tree
Showing 5 changed files with 58 additions and 2 deletions.
24 changes: 24 additions & 0 deletions python/core/auto_generated/vectortile/qgsvectortilerenderer.sip.in
Expand Up @@ -42,6 +42,30 @@ Sets polygon of the tile
QPolygon tilePolygon() const;
%Docstring
Returns polygon (made out of four corners of the tile) in screen coordinates calculated from render context
%End

void setRenderZoomLevel( int level );
%Docstring
Sets the zoom level corresponding to the target render.

This may differ from the tile's actual zoom leve when indexed tiles cause replacement of
higher zoom level tiles with data from lower zoom level tiles.

.. seealso:: :py:func:`renderZoomLevel`

.. versionadded:: 3.32
%End

int renderZoomLevel() const;
%Docstring
Returns the zoom level corresponding to the target render.

This may differ from the tile's actual zoom leve when indexed tiles cause replacement of
higher zoom level tiles with data from lower zoom level tiles.

.. seealso:: :py:func:`setRenderZoomLevel`

.. versionadded:: 3.32
%End

void setFields( const QMap<QString, QgsFields> &fields );
Expand Down
2 changes: 1 addition & 1 deletion src/core/vectortile/qgsvectortilebasiclabeling.cpp
Expand Up @@ -200,7 +200,7 @@ bool QgsVectorTileBasicLabelProvider::prepare( QgsRenderContext &context, QSet<Q
void QgsVectorTileBasicLabelProvider::registerTileFeatures( const QgsVectorTileRendererData &tile, QgsRenderContext &context )
{
const QgsVectorTileFeatures tileData = tile.features();
int zoomLevel = tile.id().zoomLevel();
const int zoomLevel = tile.renderZoomLevel();

for ( int i = 0; i < mStyles.count(); ++i )
{
Expand Down
2 changes: 1 addition & 1 deletion src/core/vectortile/qgsvectortilebasicrenderer.cpp
Expand Up @@ -193,7 +193,7 @@ void QgsVectorTileBasicRenderer::renderBackground( QgsRenderContext &context )
void QgsVectorTileBasicRenderer::renderTile( const QgsVectorTileRendererData &tile, QgsRenderContext &context )
{
const QgsVectorTileFeatures tileData = tile.features();
int zoomLevel = tile.id().zoomLevel();
const int zoomLevel = tile.renderZoomLevel();

for ( const QgsVectorTileBasicRendererStyle &layerStyle : std::as_const( mStyles ) )
{
Expand Down
2 changes: 2 additions & 0 deletions src/core/vectortile/qgsvectortilelayerrenderer.cpp
Expand Up @@ -229,6 +229,8 @@ void QgsVectorTileLayerRenderer::decodeAndDrawTile( const QgsVectorTileRawData &
const QgsCoordinateTransform ct = ctx.coordinateTransform();

QgsVectorTileRendererData tile( rawTile.id );
tile.setRenderZoomLevel( mTileZoom );

tile.setFields( mPerLayerFields );
tile.setFeatures( decoder.layerFeatures( mPerLayerFields, ct, &mRequiredLayers ) );

Expand Down
30 changes: 30 additions & 0 deletions src/core/vectortile/qgsvectortilerenderer.h
Expand Up @@ -42,6 +42,7 @@ class CORE_EXPORT QgsVectorTileRendererData
//! Constructs the object
explicit QgsVectorTileRendererData( QgsTileXYZ id )
: mId( id )
, mRenderZoomLevel( id.zoomLevel() )
{}

//! Returns coordinates of the tile
Expand All @@ -52,6 +53,28 @@ class CORE_EXPORT QgsVectorTileRendererData
//! Returns polygon (made out of four corners of the tile) in screen coordinates calculated from render context
QPolygon tilePolygon() const { return mTilePolygon; }

/**
* Sets the zoom level corresponding to the target render.
*
* This may differ from the tile's actual zoom leve when indexed tiles cause replacement of
* higher zoom level tiles with data from lower zoom level tiles.
*
* \see renderZoomLevel()
* \since QGIS 3.32
*/
void setRenderZoomLevel( int level ) { mRenderZoomLevel = level; }

/**
* Returns the zoom level corresponding to the target render.
*
* This may differ from the tile's actual zoom leve when indexed tiles cause replacement of
* higher zoom level tiles with data from lower zoom level tiles.
*
* \see setRenderZoomLevel()
* \since QGIS 3.32
*/
int renderZoomLevel() const { return mRenderZoomLevel; }

//! Sets per-layer fields
void setFields( const QMap<QString, QgsFields> &fields ) { mFields = fields; }
//! Returns per-layer fields
Expand All @@ -69,6 +92,13 @@ class CORE_EXPORT QgsVectorTileRendererData
private:
//! Position of the tile in the tile matrix set
QgsTileXYZ mId;

/**
* Zoom level corresponding to the target render. This may differ from the tile's actual zoom leve when indexed tiles cause replacement of
* higher zoom level tiles with data from lower zoom level tiles.
*/
int mRenderZoomLevel = -1;

//! Per-layer fields
QMap<QString, QgsFields> mFields;
//! Features of the tile grouped into sub-layers
Expand Down

0 comments on commit 27a4336

Please sign in to comment.