Skip to content

Commit 3b280fa

Browse files
author
wonder
committedMay 29, 2010
Applied patch #2747 from Marco.
git-svn-id: http://svn.osgeo.org/qgis/trunk@13587 c8812cc2-4d05-0410-92ff-de0c093fc19c
1 parent 546b279 commit 3b280fa

File tree

7 files changed

+102
-22
lines changed

7 files changed

+102
-22
lines changed
 

‎python/core/qgsmaprenderer.sip

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,7 @@ public:
1919
//! called when starting rendering of a layer
2020
virtual int prepareLayer(QgsVectorLayer* layer, int& attrIndex, QgsRenderContext& ctx ) = 0;
2121
//! called for every feature
22-
virtual void registerFeature( QgsVectorLayer* layer, QgsFeature& feat ) = 0;
22+
virtual void registerFeature( QgsVectorLayer* layer, QgsFeature& feat, const QgsRenderContext& context = QgsRenderContext() ) = 0;
2323
//! called when the map is drawn and labels should be placed
2424
virtual void drawLabeling( QgsRenderContext& context ) = 0;
2525
//! called when we're done with rendering

‎src/core/qgsmaprenderer.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -53,7 +53,7 @@ class QgsLabelingEngineInterface
5353
//! called when starting rendering of a layer
5454
virtual int prepareLayer( QgsVectorLayer* layer, int& attrIndex, QgsRenderContext& ctx ) = 0;
5555
//! called for every feature
56-
virtual void registerFeature( QgsVectorLayer* layer, QgsFeature& feat ) = 0;
56+
virtual void registerFeature( QgsVectorLayer* layer, QgsFeature& feat, const QgsRenderContext& context = QgsRenderContext() ) = 0;
5757
//! called when the map is drawn and labels should be placed
5858
virtual void drawLabeling( QgsRenderContext& context ) = 0;
5959
//! called when we're done with rendering

‎src/core/qgsvectorlayer.cpp

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -741,7 +741,7 @@ void QgsVectorLayer::drawRendererV2( QgsRenderContext& rendererContext, bool lab
741741

742742
// labeling - register feature
743743
if ( labeling && mRendererV2->symbolForFeature( fet ) != NULL )
744-
rendererContext.labelingEngine()->registerFeature( this, fet );
744+
rendererContext.labelingEngine()->registerFeature( this, fet, rendererContext );
745745

746746
if ( mEditable )
747747
{
@@ -805,7 +805,7 @@ void QgsVectorLayer::drawRendererV2Levels( QgsRenderContext& rendererContext, bo
805805
features[sym].append( fet );
806806

807807
if ( labeling && mRendererV2->symbolForFeature( fet ) != NULL )
808-
rendererContext.labelingEngine()->registerFeature( this, fet );
808+
rendererContext.labelingEngine()->registerFeature( this, fet, rendererContext );
809809

810810
if ( mEditable )
811811
{
@@ -1052,7 +1052,7 @@ bool QgsVectorLayer::draw( QgsRenderContext& rendererContext )
10521052

10531053
if ( labeling && mRenderer->willRenderFeature( &fet ) )
10541054
{
1055-
rendererContext.labelingEngine()->registerFeature( this, fet );
1055+
rendererContext.labelingEngine()->registerFeature( this, fet, rendererContext );
10561056
}
10571057

10581058
++featureCount;

‎src/plugins/labeling/labelinggui.cpp

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -117,6 +117,7 @@ LabelingGui::LabelingGui( PalLabeling* lbl, QgsVectorLayer* layer, QWidget* pare
117117
chkNoObstacle->setChecked( !lyr.obstacle );
118118
chkLabelPerFeaturePart->setChecked( lyr.labelPerPart );
119119
chkMergeLines->setChecked( lyr.mergeLines );
120+
mMinSizeSpinBox->setValue( lyr.minFeatureSize );
120121

121122
bool scaleBased = ( lyr.scaleMin != 0 && lyr.scaleMax != 0 );
122123
chkScaleBasedVisibility->setChecked( scaleBased );
@@ -231,7 +232,7 @@ LayerSettings LabelingGui::layerSettings()
231232
{
232233
lyr.bufferSize = 0;
233234
}
234-
235+
lyr.minFeatureSize = mMinSizeSpinBox->value();
235236
return lyr;
236237
}
237238

‎src/plugins/labeling/labelingguibase.ui

Lines changed: 29 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@
66
<rect>
77
<x>0</x>
88
<y>0</y>
9-
<width>480</width>
9+
<width>448</width>
1010
<height>610</height>
1111
</rect>
1212
</property>
@@ -18,15 +18,15 @@
1818
<normaloff/>
1919
</iconset>
2020
</property>
21-
<layout class="QVBoxLayout" name="verticalLayout">
22-
<item>
21+
<layout class="QGridLayout" name="gridLayout_5">
22+
<item row="0" column="0">
2323
<widget class="QCheckBox" name="chkEnableLabeling">
2424
<property name="text">
2525
<string>Label this layer</string>
2626
</property>
2727
</widget>
2828
</item>
29-
<item>
29+
<item row="1" column="0">
3030
<layout class="QHBoxLayout" name="horizontalLayout_9">
3131
<item>
3232
<widget class="QLabel" name="label_6">
@@ -56,7 +56,7 @@
5656
</item>
5757
</layout>
5858
</item>
59-
<item>
59+
<item row="2" column="0">
6060
<widget class="QGroupBox" name="groupBox_4">
6161
<property name="title">
6262
<string>Placement</string>
@@ -326,7 +326,7 @@
326326
</layout>
327327
</widget>
328328
</item>
329-
<item>
329+
<item row="3" column="0">
330330
<layout class="QGridLayout" name="gridLayout_4">
331331
<item row="0" column="0" rowspan="2">
332332
<widget class="QGroupBox" name="groupBox">
@@ -648,21 +648,39 @@
648648
</item>
649649
</layout>
650650
</item>
651-
<item>
651+
<item row="4" column="0">
652652
<widget class="QCheckBox" name="chkLabelPerFeaturePart">
653653
<property name="text">
654654
<string>label every part of multi-part features</string>
655655
</property>
656656
</widget>
657657
</item>
658-
<item>
658+
<item row="5" column="0">
659659
<widget class="QCheckBox" name="chkMergeLines">
660660
<property name="text">
661661
<string>merge connected lines to avoid duplicate labels</string>
662662
</property>
663663
</widget>
664664
</item>
665-
<item>
665+
<item row="6" column="0">
666+
<layout class="QHBoxLayout" name="horizontalLayout_10">
667+
<item>
668+
<widget class="QLabel" name="label_19">
669+
<property name="text">
670+
<string>Suppress labeling of features smaller than</string>
671+
</property>
672+
</widget>
673+
</item>
674+
<item>
675+
<widget class="QDoubleSpinBox" name="mMinSizeSpinBox">
676+
<property name="suffix">
677+
<string> mm</string>
678+
</property>
679+
</widget>
680+
</item>
681+
</layout>
682+
</item>
683+
<item row="7" column="0">
666684
<layout class="QHBoxLayout" name="horizontalLayout_2">
667685
<item>
668686
<widget class="QCheckBox" name="chkNoObstacle">
@@ -699,7 +717,7 @@
699717
</item>
700718
</layout>
701719
</item>
702-
<item>
720+
<item row="8" column="0">
703721
<spacer name="verticalSpacer_2">
704722
<property name="orientation">
705723
<enum>Qt::Vertical</enum>
@@ -712,7 +730,7 @@
712730
</property>
713731
</spacer>
714732
</item>
715-
<item>
733+
<item row="9" column="0">
716734
<widget class="QDialogButtonBox" name="buttonBox">
717735
<property name="orientation">
718736
<enum>Qt::Horizontal</enum>

‎src/plugins/labeling/pallabeling.cpp

Lines changed: 57 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -105,6 +105,7 @@ LayerSettings::LayerSettings()
105105
bufferColor = Qt::white;
106106
labelPerPart = false;
107107
mergeLines = false;
108+
minFeatureSize = 0.0;
108109
}
109110

110111
LayerSettings::LayerSettings( const LayerSettings& s )
@@ -125,6 +126,7 @@ LayerSettings::LayerSettings( const LayerSettings& s )
125126
bufferColor = s.bufferColor;
126127
labelPerPart = s.labelPerPart;
127128
mergeLines = s.mergeLines;
129+
minFeatureSize = s.minFeatureSize;
128130

129131
fontMetrics = NULL;
130132
ct = NULL;
@@ -178,6 +180,7 @@ void LayerSettings::readFromLayer( QgsVectorLayer* layer )
178180
bufferColor = _readColor( layer, "labeling/bufferColor" );
179181
labelPerPart = layer->customProperty( "labeling/labelPerPart" ).toBool();
180182
mergeLines = layer->customProperty( "labeling/mergeLines" ).toBool();
183+
minFeatureSize = layer->customProperty( "labeling/minFeatureSize" ).toDouble();
181184
}
182185

183186
void LayerSettings::writeToLayer( QgsVectorLayer* layer )
@@ -205,6 +208,51 @@ void LayerSettings::writeToLayer( QgsVectorLayer* layer )
205208
_writeColor( layer, "labeling/bufferColor", bufferColor );
206209
layer->setCustomProperty( "labeling/labelPerPart", labelPerPart );
207210
layer->setCustomProperty( "labeling/mergeLines", mergeLines );
211+
layer->setCustomProperty( "labeling/minFeatureSize", minFeatureSize );
212+
}
213+
214+
bool LayerSettings::checkMinimumSizeMM( const QgsRenderContext& ct, QgsGeometry* geom, double minSize ) const
215+
{
216+
if ( minSize <= 0 )
217+
{
218+
return true;
219+
}
220+
221+
if ( !geom )
222+
{
223+
return false;
224+
}
225+
226+
QGis::GeometryType featureType = geom->type();
227+
if ( featureType == QGis::Point ) //minimum size does not apply to point features
228+
{
229+
return true;
230+
}
231+
232+
GEOSGeometry* geosGeom = geom->asGeos();
233+
if ( !geosGeom )
234+
{
235+
return true;
236+
}
237+
238+
double mapUnitsPerMM = ct.mapToPixel().mapUnitsPerPixel() * ct.scaleFactor();
239+
if ( featureType == QGis::Line )
240+
{
241+
double length;
242+
if ( GEOSLength( geosGeom, &length ) )
243+
{
244+
return ( length >= ( minSize * mapUnitsPerMM ) );
245+
}
246+
}
247+
else if ( featureType == QGis::Polygon )
248+
{
249+
double area;
250+
if ( GEOSArea( geosGeom, &area ) )
251+
{
252+
return ( sqrt( area ) >= ( minSize * mapUnitsPerMM ) );
253+
}
254+
}
255+
return true; //should never be reached. Return true in this case to label such geometries anyway.
208256
}
209257

210258
void LayerSettings::calculateLabelSize( QString text, double& labelX, double& labelY )
@@ -219,7 +267,7 @@ void LayerSettings::calculateLabelSize( QString text, double& labelX, double& la
219267
}
220268

221269

222-
void LayerSettings::registerFeature( QgsFeature& f )
270+
void LayerSettings::registerFeature( QgsFeature& f, const QgsRenderContext& context )
223271
{
224272
QString labelText = f.attributeMap()[fieldIndex].toString();
225273
double labelX, labelY; // will receive label size
@@ -229,6 +277,11 @@ void LayerSettings::registerFeature( QgsFeature& f )
229277
if ( ct != NULL ) // reproject the geometry if necessary
230278
geom->transform( *ct );
231279

280+
if ( !checkMinimumSizeMM( context, geom, minFeatureSize ) )
281+
{
282+
return;
283+
}
284+
232285
MyLabel* lbl = new MyLabel( f.id(), labelText, GEOSGeom_clone( geom->asGeos() ) );
233286

234287
// record the created geometry - it will be deleted at the end.
@@ -375,9 +428,10 @@ int PalLabeling::prepareLayer( QgsVectorLayer* layer, int& attrIndex, QgsRenderC
375428
}
376429

377430

378-
void PalLabeling::registerFeature( QgsVectorLayer* layer, QgsFeature& f )
431+
void PalLabeling::registerFeature( QgsVectorLayer* layer, QgsFeature& f, const QgsRenderContext& context )
379432
{
380-
mActiveLayers[layer].registerFeature( f );
433+
LayerSettings& lyr = mActiveLayers[layer];
434+
lyr.registerFeature( f, context );
381435
}
382436

383437

‎src/plugins/labeling/pallabeling.h

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -66,12 +66,13 @@ class LayerSettings
6666
QColor bufferColor;
6767
bool labelPerPart; // whether to label every feature's part or only the biggest one
6868
bool mergeLines;
69+
double minFeatureSize; // minimum feature size to be labelled (in mm)
6970

7071
// called from register feature hook
7172
void calculateLabelSize( QString text, double& labelX, double& labelY );
7273

7374
// implementation of register feature hook
74-
void registerFeature( QgsFeature& f );
75+
void registerFeature( QgsFeature& f, const QgsRenderContext& context );
7576

7677
void readFromLayer( QgsVectorLayer* layer );
7778
void writeToLayer( QgsVectorLayer* layer );
@@ -85,6 +86,11 @@ class LayerSettings
8586
const QgsCoordinateTransform* ct;
8687
QgsPoint ptZero, ptOne;
8788
QList<MyLabel*> geometries;
89+
90+
private:
91+
/**Checks if a feature is larger than a minimum size (in mm)
92+
@return true if above size, false if below*/
93+
bool checkMinimumSizeMM( const QgsRenderContext& ct, QgsGeometry* geom, double minSize ) const;
8894
};
8995

9096
class LabelCandidate
@@ -128,7 +134,7 @@ class PalLabeling : public QgsLabelingEngineInterface
128134
//! hook called when drawing layer before issuing select()
129135
virtual int prepareLayer( QgsVectorLayer* layer, int& attrIndex, QgsRenderContext& ctx );
130136
//! hook called when drawing for every feature in a layer
131-
virtual void registerFeature( QgsVectorLayer* layer, QgsFeature& feat );
137+
virtual void registerFeature( QgsVectorLayer* layer, QgsFeature& feat, const QgsRenderContext& context = QgsRenderContext() );
132138
//! called when the map is drawn and labels should be placed
133139
virtual void drawLabeling( QgsRenderContext& context );
134140
//! called when we're done with rendering
@@ -145,6 +151,7 @@ class PalLabeling : public QgsLabelingEngineInterface
145151

146152
void initPal();
147153

154+
148155
protected:
149156
// temporary hashtable of layer settings, being filled during labeling, cleared once labeling's done
150157
QHash<QgsVectorLayer*, LayerSettings> mActiveLayers;

0 commit comments

Comments
 (0)
Please sign in to comment.