diff --git a/src/core/symbology-ng/qgspointdisplacementrenderer.cpp b/src/core/symbology-ng/qgspointdisplacementrenderer.cpp index ac89ef147ff3..afc47850d607 100644 --- a/src/core/symbology-ng/qgspointdisplacementrenderer.cpp +++ b/src/core/symbology-ng/qgspointdisplacementrenderer.cpp @@ -85,6 +85,12 @@ bool QgsPointDisplacementRenderer::renderFeature( QgsFeature& feature, QgsRender if ( !feature.geometry() ) return false; + QgsSymbolV2* symbol = firstSymbolForFeature( mRenderer, feature ); + + //if the feature has no symbol (eg, no matching rule in a rule-based renderer), skip it + if ( !symbol ) + return false; + //point position in screen coords QgsGeometry* geom = feature.geometry(); QGis::WkbType geomType = geom->wkbType(); @@ -103,7 +109,7 @@ bool QgsPointDisplacementRenderer::renderFeature( QgsFeature& feature, QgsRender mSpatialIndex->insertFeature( feature ); // create new group DisplacementGroup newGroup; - newGroup.insert( feature.id(), feature ); + newGroup.insert( feature.id(), qMakePair( feature, symbol ) ); mDisplacementGroups.push_back( newGroup ); // add to group index mGroupIndex.insert( feature.id(), mDisplacementGroups.count() - 1 ); @@ -117,7 +123,7 @@ bool QgsPointDisplacementRenderer::renderFeature( QgsFeature& feature, QgsRender DisplacementGroup& group = mDisplacementGroups[groupIdx]; // add to a group - group.insert( feature.id(), feature ); + group.insert( feature.id(), qMakePair( feature, symbol ) ); // add to group index mGroupIndex.insert( feature.id(), groupIdx ); return true; @@ -125,7 +131,7 @@ bool QgsPointDisplacementRenderer::renderFeature( QgsFeature& feature, QgsRender void QgsPointDisplacementRenderer::drawGroup( const DisplacementGroup& group, QgsRenderContext& context ) { - const QgsFeature& feature = group.begin().value(); + const QgsFeature& feature = group.begin().value().first; bool selected = mSelectedFeatures.contains( feature.id() ); // maybe we should highlight individual features instead of the whole group? QPointF pt; @@ -137,9 +143,8 @@ void QgsPointDisplacementRenderer::drawGroup( const DisplacementGroup& group, Qg for ( DisplacementGroup::const_iterator attIt = group.constBegin(); attIt != group.constEnd(); ++attIt ) { - labelAttributeList << ( mDrawLabels ? getLabel( attIt.value() ) : QString() ); - QgsFeature& f = const_cast( attIt.value() ); // other parts of API use non-const ref to QgsFeature :-/ - symbolList << dynamic_cast( firstSymbolForFeature( mRenderer, f ) ); + labelAttributeList << ( mDrawLabels ? getLabel( attIt.value().first ) : QString() ); + symbolList << dynamic_cast( attIt.value().second ); } //draw symbol @@ -413,7 +418,7 @@ void QgsPointDisplacementRenderer::printInfoDisplacementGroups() for ( int i = 0; i < nGroups; ++i ) { QgsDebugMsg( "***************displacement group " + QString::number( i ) ); - QMap::const_iterator it = mDisplacementGroups.at( i ).constBegin(); + DisplacementGroup::const_iterator it = mDisplacementGroups.at( i ).constBegin(); for ( ; it != mDisplacementGroups.at( i ).constEnd(); ++it ) { QgsDebugMsg( FID_TO_STRING( it.key() ) ); diff --git a/src/core/symbology-ng/qgspointdisplacementrenderer.h b/src/core/symbology-ng/qgspointdisplacementrenderer.h index 5e19c589e15e..e4299250ce61 100644 --- a/src/core/symbology-ng/qgspointdisplacementrenderer.h +++ b/src/core/symbology-ng/qgspointdisplacementrenderer.h @@ -143,7 +143,7 @@ class CORE_EXPORT QgsPointDisplacementRenderer: public QgsFeatureRendererV2 /**Maximum scale denominator for label display. Negative number means no scale limitation*/ double mMaxLabelScaleDenominator; - typedef QMap DisplacementGroup; + typedef QMap > DisplacementGroup; /**Groups of features that have the same position*/ QList mDisplacementGroups; /**Mapping from feature ID to its group index*/