@@ -105,6 +105,7 @@ LayerSettings::LayerSettings()
105105 bufferColor = Qt::white;
106106 labelPerPart = false ;
107107 mergeLines = false ;
108+ minFeatureSize = 0.0 ;
108109}
109110
110111LayerSettings::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
183186void 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
210258void 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
0 commit comments