From b3d11c75c0a4af007b9b3feb342bc792f9fc6e03 Mon Sep 17 00:00:00 2001 From: Nyall Dawson Date: Wed, 20 May 2015 00:33:40 +1000 Subject: [PATCH] Fix point displacement renderer not ignoring features with no symbol Previously, the renderer would incorrectly draw circles and displace features which were proximal to features with no symbols. This caused issues with the rule based renderer, were some features should not be drawn. cherry-picked from 81f4e4471f696215113bb67f91d114cecde029bd --- .../qgspointdisplacementrenderer.cpp | 19 ++++++++++++------- .../qgspointdisplacementrenderer.h | 2 +- 2 files changed, 13 insertions(+), 8 deletions(-) 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*/