Skip to content

Commit e3d30af

Browse files
committed
Update to limit of number of features sent to PAL
- Distributes max number across total number of features registered in PAL - Caveat: PAL may not show label for every registered feature
1 parent 9183adc commit e3d30af

7 files changed

+67
-15
lines changed

python/core/qgsmaprenderer.sip

+3
Original file line numberDiff line numberDiff line change
@@ -40,6 +40,9 @@ class QgsLabelingEngineInterface
4040
//! called when starting rendering of a layer
4141
//! @note: this method was added in version 1.6
4242
virtual int prepareLayer( QgsVectorLayer* layer, QSet<int>& attrIndices, QgsRenderContext& ctx ) = 0;
43+
//! returns PAL layer settings for a registered layer
44+
//! @note: this method was added in version 1.9
45+
virtual QgsPalLayerSettings& layer( const QString& layerName ) = 0;
4346
//! adds a diagram layer to the labeling engine
4447
virtual int addDiagramLayer( QgsVectorLayer* layer, QgsDiagramLayerSettings* s );
4548
//! called for every feature

python/core/qgspallabeling.sip

-2
Original file line numberDiff line numberDiff line change
@@ -126,8 +126,6 @@ class QgsPalLayerSettings
126126
double minFeatureSize; // minimum feature size to be labelled (in mm)
127127
bool limitNumLabels; // whether to limit the number of labels to be drawn
128128
int maxNumLabels; // maximum number of labels to be drawn
129-
//bool rndMaxNumLabels; // whether to take a randomized maxNumLabels subset of features to be labeled
130-
131129
// Adds '<' or '>', or user-defined symbol to the label string pointing to the
132130
// direction of the line / polygon ring
133131
// Works only if Placement == Line

src/core/qgsmaprenderer.h

+4
Original file line numberDiff line numberDiff line change
@@ -39,6 +39,7 @@ class QgsDistanceArea;
3939
class QgsOverlayObjectPositionManager;
4040
class QgsVectorLayer;
4141

42+
class QgsPalLayerSettings;
4243
class QgsDiagramLayerSettings;
4344

4445
class CORE_EXPORT QgsLabelPosition
@@ -75,6 +76,9 @@ class CORE_EXPORT QgsLabelingEngineInterface
7576
//! called when starting rendering of a layer
7677
//! @note: this method was added in version 1.6
7778
virtual int prepareLayer( QgsVectorLayer* layer, QSet<int>& attrIndices, QgsRenderContext& ctx ) = 0;
79+
//! returns PAL layer settings for a registered layer
80+
//! @note: this method was added in version 1.9
81+
virtual QgsPalLayerSettings& layer( const QString& layerName ) = 0;
7882
//! adds a diagram layer to the labeling engine
7983
virtual int addDiagramLayer( QgsVectorLayer* layer, QgsDiagramLayerSettings* s )
8084
{ Q_UNUSED( layer ); Q_UNUSED( s ); return 0; }

src/core/qgspallabeling.cpp

+36-8
Original file line numberDiff line numberDiff line change
@@ -177,7 +177,7 @@ class QgsPalGeometry : public PalGeometry
177177
// -------------
178178

179179
QgsPalLayerSettings::QgsPalLayerSettings()
180-
: palLayer( NULL ), ct( NULL ), extentGeom( NULL ), expression( NULL )
180+
: palLayer( NULL ), ct( NULL ), extentGeom( NULL ), mFeaturesToLabel( 0 ), mFeatsSendingToPal( 0 ), mFeatsRegPal( 0 ), expression( NULL )
181181
{
182182
placement = AroundPoint;
183183
placementFlags = 0;
@@ -658,13 +658,6 @@ void QgsPalLayerSettings::calculateLabelSize( const QFontMetricsF* fm, QString t
658658

659659
void QgsPalLayerSettings::registerFeature( QgsVectorLayer* layer, QgsFeature& f, const QgsRenderContext& context )
660660
{
661-
662-
// check if max number of labels to draw (already registered features) has been reached
663-
if ( limitNumLabels && ( maxNumLabels == 0 || palLayer->getNbFeatures() >= maxNumLabels ) )
664-
{
665-
return;
666-
}
667-
668661
// data defined show label? defaults to show label if not 0
669662
QMap< DataDefinedProperties, int >::const_iterator showIt = dataDefinedProperties.find( QgsPalLayerSettings::Show );
670663
if ( showIt != dataDefinedProperties.constEnd() )
@@ -822,6 +815,32 @@ void QgsPalLayerSettings::registerFeature( QgsVectorLayer* layer, QgsFeature& f
822815
if ( geos_geom == NULL )
823816
return; // invalid geometry
824817

818+
// likelihood exists label will be registered with PAL and may be drawn
819+
// check if max number of features to label (already registered with PAL) has been reached
820+
// Debug output at end of QgsPalLabeling::drawLabeling(), when deleting temp geometries
821+
if ( limitNumLabels )
822+
{
823+
if ( !maxNumLabels )
824+
{
825+
return;
826+
}
827+
mFeatsRegPal = palLayer->getNbFeatures();
828+
if ( mFeatsRegPal >= maxNumLabels )
829+
{
830+
return;
831+
}
832+
833+
int divNum = ( int )(( mFeaturesToLabel / maxNumLabels ) + 0.5 );
834+
if ( divNum && ( mFeatsRegPal == ( int )( mFeatsSendingToPal / divNum ) ) )
835+
{
836+
mFeatsSendingToPal += 1;
837+
if ( divNum && mFeatsSendingToPal % divNum )
838+
{
839+
return;
840+
}
841+
}
842+
}
843+
825844
GEOSGeometry* geos_geom_clone = GEOSGeom_clone( geos_geom );
826845

827846
//data defined position / alignment / rotation?
@@ -1259,6 +1278,8 @@ int QgsPalLabeling::prepareLayer( QgsVectorLayer* layer, QSet<int>& attrIndices,
12591278
// rect for clipping
12601279
lyr.extentGeom = QgsGeometry::fromRect( mMapRenderer->extent() );
12611280

1281+
lyr.mFeatsSendingToPal = 0;
1282+
12621283
return 1; // init successful
12631284
}
12641285

@@ -1656,6 +1677,13 @@ void QgsPalLabeling::drawLabeling( QgsRenderContext& context )
16561677
QgsPalLayerSettings& lyr = lit.value();
16571678
for ( QList<QgsPalGeometry*>::iterator git = lyr.geometries.begin(); git != lyr.geometries.end(); ++git )
16581679
delete *git;
1680+
if ( lyr.limitNumLabels )
1681+
{
1682+
QgsDebugMsg( QString( "mFeaturesToLabel: %1" ).arg( lyr.mFeaturesToLabel ) );
1683+
QgsDebugMsg( QString( "maxNumLabels: %1" ).arg( lyr.maxNumLabels ) );
1684+
QgsDebugMsg( QString( "mFeatsSendingToPal: %1" ).arg( lyr.mFeatsSendingToPal ) );
1685+
QgsDebugMsg( QString( "mFeatsRegPal: %1" ).arg( lyr.geometries.count() ) );
1686+
}
16591687
lyr.geometries.clear();
16601688
}
16611689

src/core/qgspallabeling.h

+4-3
Original file line numberDiff line numberDiff line change
@@ -180,8 +180,6 @@ class CORE_EXPORT QgsPalLayerSettings
180180
double minFeatureSize; // minimum feature size to be labelled (in mm)
181181
bool limitNumLabels; // whether to limit the number of labels to be drawn
182182
int maxNumLabels; // maximum number of labels to be drawn
183-
//bool rndMaxNumLabels; // whether to take a randomized maxNumLabels subset of features to be labeled
184-
185183
// Adds '<' or '>', or user-defined symbol to the label string pointing to the
186184
// direction of the line / polygon ring
187185
// Works only if Placement == Line
@@ -228,14 +226,17 @@ class CORE_EXPORT QgsPalLayerSettings
228226
@return font pixel size*/
229227
int sizeToPixel( double size, const QgsRenderContext& c , bool buffer = false ) const;
230228

231-
// temporary stuff: set when layer gets prepared
229+
// temporary stuff: set when layer gets prepared or labeled
232230
pal::Layer* palLayer;
233231
int fieldIndex;
234232
const QgsMapToPixel* xform;
235233
const QgsCoordinateTransform* ct;
236234
QgsPoint ptZero, ptOne;
237235
QList<QgsPalGeometry*> geometries;
238236
QgsGeometry* extentGeom;
237+
int mFeaturesToLabel; // total features that will probably be labeled, may be less (figured before PAL)
238+
int mFeatsSendingToPal; // total features tested for sending into PAL (relative to maxNumLabels)
239+
int mFeatsRegPal; // number of features registered in PAL, when using limitNumLabels
239240

240241
private:
241242
/**Checks if a feature is larger than a minimum size (in mm)

src/core/qgsvectorlayer.cpp

+15
Original file line numberDiff line numberDiff line change
@@ -5699,6 +5699,21 @@ void QgsVectorLayer::prepareLabelingAndDiagrams( QgsRenderContext& rendererConte
56995699
labeling = true;
57005700
}
57015701

5702+
if ( labeling )
5703+
{
5704+
// see if feature count limit is set for labeling
5705+
QgsPalLayerSettings& palyr = rendererContext.labelingEngine()->layer( this->id() );
5706+
if ( palyr.limitNumLabels && palyr.maxNumLabels > 0 )
5707+
{
5708+
select( QgsAttributeList(), rendererContext.extent() );
5709+
// total number of features that may be labeled
5710+
QgsFeature ftr;
5711+
int nFeatsToLabel = 0;
5712+
while ( nextFeature( ftr ) ) { nFeatsToLabel += 1; }
5713+
palyr.mFeaturesToLabel = nFeatsToLabel;
5714+
}
5715+
}
5716+
57025717
//register diagram layers
57035718
if ( mDiagramRenderer && mDiagramLayerSettings )
57045719
{

src/ui/qgslabelingguibase.ui

+5-2
Original file line numberDiff line numberDiff line change
@@ -2780,7 +2780,7 @@
27802780
</sizepolicy>
27812781
</property>
27822782
<property name="text">
2783-
<string>Limit number of labels drawn to</string>
2783+
<string>Limit number of features to be labeled to</string>
27842784
</property>
27852785
</widget>
27862786
</item>
@@ -2795,6 +2795,9 @@
27952795
<height>0</height>
27962796
</size>
27972797
</property>
2798+
<property name="toolTip">
2799+
<string>Number of features sent to labeling engine, though not all may be labeled</string>
2800+
</property>
27982801
<property name="alignment">
27992802
<set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
28002803
</property>
@@ -2855,7 +2858,7 @@
28552858
<rect>
28562859
<x>0</x>
28572860
<y>0</y>
2858-
<width>686</width>
2861+
<width>488</width>
28592862
<height>981</height>
28602863
</rect>
28612864
</property>

0 commit comments

Comments
 (0)