Skip to content

Commit 2ab0221

Browse files
committed
recalculate vector layer extent only when necessary (fixes #6172)
1 parent d73368f commit 2ab0221

File tree

6 files changed

+55
-29
lines changed

6 files changed

+55
-29
lines changed

src/core/qgsmaplayer.cpp

+7-2
Original file line numberDiff line numberDiff line change
@@ -126,9 +126,9 @@ QString const & QgsMapLayer::source() const
126126
return mDataSource;
127127
}
128128

129-
QgsRectangle QgsMapLayer::extent() const
129+
QgsRectangle QgsMapLayer::extent()
130130
{
131-
return mLayerExtent;
131+
return mExtent;
132132
}
133133

134134
bool QgsMapLayer::draw( QgsRenderContext& rendererContext )
@@ -1247,3 +1247,8 @@ QString QgsMapLayer::metadata()
12471247
{
12481248
return QString();
12491249
}
1250+
1251+
void QgsMapLayer::setExtent( const QgsRectangle &r )
1252+
{
1253+
mExtent = r;
1254+
}

src/core/qgsmaplayer.h

+6-4
Original file line numberDiff line numberDiff line change
@@ -110,8 +110,8 @@ class CORE_EXPORT QgsMapLayer : public QObject
110110
*/
111111
virtual void drawLabels( QgsRenderContext& rendererContext );
112112

113-
/** Return the extent of the layer as a QRect */
114-
QgsRectangle extent() const;
113+
/** Return the extent of the layer */
114+
virtual QgsRectangle extent();
115115

116116
/*! Return the status of the layer. An invalid layer is one which has a bad datasource
117117
* or other problem. Child classes set this flag when intialized
@@ -126,7 +126,7 @@ class CORE_EXPORT QgsMapLayer : public QObject
126126
QString publicSource() const;
127127

128128
/** Returns the source for the layer */
129-
QString const & source() const;
129+
QString const &source() const;
130130

131131
/**
132132
* Returns the sublayers of this layer
@@ -390,6 +390,8 @@ class CORE_EXPORT QgsMapLayer : public QObject
390390
void dataChanged();
391391

392392
protected:
393+
/** Set the extent */
394+
virtual void setExtent( const QgsRectangle &rect );
393395

394396
/** set whether layer is valid or not - should be used in constructor.
395397
\note added in v1.5 */
@@ -421,7 +423,7 @@ class CORE_EXPORT QgsMapLayer : public QObject
421423
unsigned int mTransparencyLevel;
422424

423425
/** Extent of the layer */
424-
QgsRectangle mLayerExtent;
426+
QgsRectangle mExtent;
425427

426428
/** Indicates if the layer is valid and can be drawn */
427429
bool mValid;

src/core/qgspluginlayer.cpp

+2-2
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,7 @@ QString QgsPluginLayer::pluginLayerType()
2424
return mPluginLayerType;
2525
}
2626

27-
void QgsPluginLayer::setExtent( const QgsRectangle & extent )
27+
void QgsPluginLayer::setExtent( const QgsRectangle &extent )
2828
{
29-
mLayerExtent = extent;
29+
mExtent = extent;
3030
}

src/core/qgsvectorlayer.cpp

+28-12
Original file line numberDiff line numberDiff line change
@@ -105,6 +105,7 @@ QgsVectorLayer::QgsVectorLayer( QString vectorLayerPath,
105105
, mJoinBuffer( 0 )
106106
, mDiagramRenderer( 0 )
107107
, mDiagramLayerSettings( 0 )
108+
, mValidExtent( false )
108109
{
109110
mActions = new QgsAttributeAction( this );
110111

@@ -1461,10 +1462,24 @@ long QgsVectorLayer::updateFeatureCount() const
14611462

14621463
void QgsVectorLayer::updateExtents()
14631464
{
1464-
if ( !hasGeometryType() )
1465-
return;
1465+
mValidExtent = false;
1466+
}
1467+
1468+
void QgsVectorLayer::setExtent( const QgsRectangle &r )
1469+
{
1470+
QgsMapLayer::setExtent( r );
1471+
mValidExtent = true;
1472+
}
14661473

1467-
mLayerExtent.setMinimal();
1474+
QgsRectangle QgsVectorLayer::extent()
1475+
{
1476+
if ( mValidExtent )
1477+
return QgsMapLayer::extent();
1478+
1479+
QgsRectangle rect;
1480+
1481+
if ( !hasGeometryType() )
1482+
return rect;
14681483

14691484
if ( !mDataProvider )
14701485
{
@@ -1480,13 +1495,13 @@ void QgsVectorLayer::updateExtents()
14801495
if ( mDataProvider->featureCount() != 0 )
14811496
{
14821497
QgsRectangle r = mDataProvider->extent();
1483-
mLayerExtent.combineExtentWith( &r );
1498+
rect.combineExtentWith( &r );
14841499
}
14851500

14861501
for ( QgsFeatureList::iterator it = mAddedFeatures.begin(); it != mAddedFeatures.end(); it++ )
14871502
{
14881503
QgsRectangle r = it->geometry()->boundingBox();
1489-
mLayerExtent.combineExtentWith( &r );
1504+
rect.combineExtentWith( &r );
14901505
}
14911506
}
14921507
else
@@ -1499,19 +1514,23 @@ void QgsVectorLayer::updateExtents()
14991514
if ( fet.geometry() )
15001515
{
15011516
QgsRectangle bb = fet.geometry()->boundingBox();
1502-
mLayerExtent.combineExtentWith( &bb );
1517+
rect.combineExtentWith( &bb );
15031518
}
15041519
}
15051520
}
15061521

1507-
if ( mLayerExtent.xMinimum() > mLayerExtent.xMaximum() && mLayerExtent.yMinimum() > mLayerExtent.yMaximum() )
1522+
if ( rect.xMinimum() > rect.xMaximum() && rect.yMinimum() > rect.yMaximum() )
15081523
{
15091524
// special case when there are no features in provider nor any added
1510-
mLayerExtent = QgsRectangle(); // use rectangle with zero coordinates
1525+
rect = QgsRectangle(); // use rectangle with zero coordinates
15111526
}
15121527

1528+
setExtent( rect );
1529+
15131530
// Send this (hopefully) up the chain to the map canvas
15141531
emit recalculateExtents();
1532+
1533+
return rect;
15151534
}
15161535

15171536
QString QgsVectorLayer::subsetString()
@@ -2819,10 +2838,7 @@ bool QgsVectorLayer::setDataProvider( QString const & provider )
28192838
QString s = mbr.toString();
28202839
QgsDebugMsg( "Extent of layer: " + s );
28212840
// store the extent
2822-
mLayerExtent.setXMaximum( mbr.xMaximum() );
2823-
mLayerExtent.setXMinimum( mbr.xMinimum() );
2824-
mLayerExtent.setYMaximum( mbr.yMaximum() );
2825-
mLayerExtent.setYMinimum( mbr.yMinimum() );
2841+
setExtent( mbr );
28262842

28272843
// get and store the feature type
28282844
mWkbType = mDataProvider->geometryType();

src/core/qgsvectorlayer.h

+9
Original file line numberDiff line numberDiff line change
@@ -493,6 +493,9 @@ class CORE_EXPORT QgsVectorLayer : public QgsMapLayer
493493
/** Draws the layer labels using coordinate transformation */
494494
void drawLabels( QgsRenderContext& rendererContext );
495495

496+
/** Return the extent of the layer as a QRect */
497+
QgsRectangle extent();
498+
496499
/** returns field list in the to-be-committed state */
497500
const QgsFieldMap &pendingFields() const;
498501

@@ -745,6 +748,10 @@ class CORE_EXPORT QgsVectorLayer : public QgsMapLayer
745748
void committedAttributeValuesChanges( const QString& layerId, const QgsChangedAttributesMap& changedAttributesValues );
746749
void committedGeometriesChanges( const QString& layerId, const QgsGeometryMap& changedGeometries );
747750

751+
protected:
752+
/** Set the extent */
753+
void setExtent( const QgsRectangle &rect );
754+
748755
private: // Private methods
749756

750757
/** vector layers are not copyable */
@@ -986,6 +993,8 @@ class CORE_EXPORT QgsVectorLayer : public QgsMapLayer
986993

987994
//stores infos about diagram placement (placement type, priority, position distance)
988995
QgsDiagramLayerSettings *mDiagramLayerSettings;
996+
997+
bool mValidExtent;
989998
};
990999

9911000
#endif

src/core/raster/qgsrasterlayer.cpp

+3-9
Original file line numberDiff line numberDiff line change
@@ -693,7 +693,7 @@ bool QgsRasterLayer::draw( QgsRenderContext& rendererContext )
693693

694694
try
695695
{
696-
myProjectedLayerExtent = rendererContext.coordinateTransform()->transformBoundingBox( mLayerExtent );
696+
myProjectedLayerExtent = rendererContext.coordinateTransform()->transformBoundingBox( extent() );
697697
}
698698
catch ( QgsCsException &cs )
699699
{
@@ -705,7 +705,7 @@ bool QgsRasterLayer::draw( QgsRenderContext& rendererContext )
705705
{
706706
QgsDebugMsg( "coordinateTransform not set" );
707707
myProjectedViewExtent = rendererContext.extent();
708-
myProjectedLayerExtent = mLayerExtent;
708+
myProjectedLayerExtent = extent();
709709
}
710710

711711
QPainter* theQPainter = rendererContext.painter();
@@ -1691,10 +1691,7 @@ void QgsRasterLayer::setDataProvider( QString const & provider )
16911691
QString s = mbr.toString();
16921692
QgsDebugMsg( "Extent of layer: " + s );
16931693
// store the extent
1694-
mLayerExtent.setXMaximum( mbr.xMaximum() );
1695-
mLayerExtent.setXMinimum( mbr.xMinimum() );
1696-
mLayerExtent.setYMaximum( mbr.yMaximum() );
1697-
mLayerExtent.setYMinimum( mbr.yMinimum() );
1694+
setExtent( mbr );
16981695

16991696
mWidth = mDataProvider->xSize();
17001697
mHeight = mDataProvider->ySize();
@@ -1704,9 +1701,6 @@ void QgsRasterLayer::setDataProvider( QString const & provider )
17041701
QgsDebugMsg( "mLayerName: " + name() );
17051702

17061703
mValidNoDataValue = mDataProvider->isNoDataValueValid();
1707-
if ( mValidNoDataValue )
1708-
{
1709-
}
17101704

17111705
// set up the raster drawing style
17121706
setDrawingStyle( MultiBandColor ); //sensible default

0 commit comments

Comments
 (0)