bool QgsPointDisplacementRenderer::renderFeature( QgsFeature& feature, QgsRenderContext& context, int layer, bool selected, bool drawVertexMarker ) { Q_UNUSED( drawVertexMarker ); Q_UNUSED( context ); Q_UNUSED( layer ); //check, if there is already a point at that position if ( !feature.constGeometry() ) return false; QgsSymbolV2* symbol = firstSymbolForFeature( mRenderer, feature, context ); //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 const QgsGeometry* geom = feature.constGeometry(); QGis::WkbType geomType = geom->wkbType(); if ( geomType != QGis::WKBPoint && geomType != QGis::WKBPoint25D ) { //can only render point type return false; } if ( selected ) mSelectedFeatures.insert( feature.id() ); double searchDistance = mTolerance * QgsSymbolLayerV2Utils::mapUnitScaleFactor( context, mToleranceUnit, mToleranceMapUnitScale ); QList<QgsFeatureId> intersectList = mSpatialIndex->intersects( searchRect( feature.constGeometry()->asPoint(), searchDistance ) ); if ( intersectList.empty() ) { mSpatialIndex->insertFeature( feature ); // create new group DisplacementGroup newGroup; newGroup.insert( feature.id(), qMakePair( feature, symbol ) ); mDisplacementGroups.push_back( newGroup ); // add to group index mGroupIndex.insert( feature.id(), mDisplacementGroups.count() - 1 ); return true; } //go through all the displacement group maps and search an entry where the id equals the result of the spatial search QgsFeatureId existingEntry = intersectList.at( 0 ); int groupIdx = mGroupIndex[ existingEntry ]; DisplacementGroup& group = mDisplacementGroups[groupIdx]; // add to a group group.insert( feature.id(), qMakePair( feature, symbol ) ); // add to group index mGroupIndex.insert( feature.id(), groupIdx ); return true; }
bool QgsPointDisplacementRenderer::renderFeature( QgsFeature& feature, QgsRenderContext& context, int layer, bool selected, bool drawVertexMarker ) { Q_UNUSED( drawVertexMarker ); Q_UNUSED( context ); Q_UNUSED( layer ); //check, if there is already a point at that position if ( !feature.geometry() ) return false; //point position in screen coords QgsGeometry* geom = feature.geometry(); QGis::WkbType geomType = geom->wkbType(); if ( geomType != QGis::WKBPoint && geomType != QGis::WKBPoint25D ) { //can only render point type return false; } if ( selected ) mSelectedFeatures.insert( feature.id() ); QList<QgsFeatureId> intersectList = mSpatialIndex->intersects( searchRect( feature.geometry()->asPoint() ) ); if ( intersectList.empty() ) { mSpatialIndex->insertFeature( feature ); // create new group DisplacementGroup newGroup; newGroup.insert( feature.id(), feature ); mDisplacementGroups.push_back( newGroup ); // add to group index mGroupIndex.insert( feature.id(), mDisplacementGroups.count() - 1 ); return true; } //go through all the displacement group maps and search an entry where the id equals the result of the spatial search QgsFeatureId existingEntry = intersectList.at( 0 ); int groupIdx = mGroupIndex[ existingEntry ]; DisplacementGroup& group = mDisplacementGroups[groupIdx]; // add to a group group.insert( feature.id(), feature ); // add to group index mGroupIndex.insert( feature.id(), groupIdx ); return true; }