21
21
#include " qgswkbptr.h"
22
22
#include " qgis.h"
23
23
#include " qgslogger.h"
24
+ #include " qgsrenderer.h"
24
25
25
26
#include < SpatialIndex.h>
26
27
@@ -636,6 +637,9 @@ QgsPointLocator::QgsPointLocator( QgsVectorLayer *layer, const QgsCoordinateRefe
636
637
connect ( mLayer , &QgsVectorLayer::featureDeleted, this , &QgsPointLocator::onFeatureDeleted );
637
638
connect ( mLayer , &QgsVectorLayer::geometryChanged, this , &QgsPointLocator::onGeometryChanged );
638
639
connect ( mLayer , &QgsVectorLayer::dataChanged, this , &QgsPointLocator::destroyIndex );
640
+ connect ( mLayer , &QgsVectorLayer::rendererChanged, this , &QgsPointLocator::destroyIndex );
641
+ connect ( mLayer , &QgsVectorLayer::styleChanged, this , &QgsPointLocator::destroyIndex );
642
+ connect ( mLayer , &QgsVectorLayer::layerModified, this , &QgsPointLocator::destroyIndex );
639
643
}
640
644
641
645
@@ -661,6 +665,12 @@ void QgsPointLocator::setExtent( const QgsRectangle *extent )
661
665
destroyIndex ();
662
666
}
663
667
668
+ void QgsPointLocator::setRenderContext ( const QgsRenderContext &context )
669
+ {
670
+ mContext = std::unique_ptr<QgsRenderContext>( new QgsRenderContext ( context ) );
671
+
672
+ destroyIndex ();
673
+ }
664
674
665
675
bool QgsPointLocator::init ( int maxFeaturesToIndex )
666
676
{
@@ -686,6 +696,7 @@ bool QgsPointLocator::rebuildIndex( int maxFeaturesToIndex )
686
696
687
697
QgsFeatureRequest request;
688
698
request.setSubsetOfAttributes ( QgsAttributeList () );
699
+
689
700
if ( mExtent )
690
701
{
691
702
QgsRectangle rect = *mExtent ;
@@ -704,13 +715,40 @@ bool QgsPointLocator::rebuildIndex( int maxFeaturesToIndex )
704
715
}
705
716
request.setFilterRect ( rect );
706
717
}
718
+
719
+ bool filter = false ;
720
+ std::unique_ptr< QgsFeatureRenderer > renderer ( mLayer ->renderer () ? mLayer ->renderer ()->clone () : nullptr );
721
+ QgsRenderContext *ctx = nullptr ;
722
+ if ( mContext )
723
+ {
724
+ mContext ->expressionContext () << QgsExpressionContextUtils::layerScope ( mLayer );
725
+ ctx = mContext .get ();
726
+ if ( renderer )
727
+ {
728
+ // setup scale for scale dependent visibility (rule based)
729
+ renderer->startRender ( *ctx, mLayer ->fields () );
730
+ filter = renderer->capabilities () & QgsFeatureRenderer::Filter;
731
+ request.setSubsetOfAttributes ( renderer->usedAttributes ( *ctx ), mLayer ->fields () );
732
+ }
733
+ }
734
+
707
735
QgsFeatureIterator fi = mLayer ->getFeatures ( request );
708
736
int indexedCount = 0 ;
737
+
709
738
while ( fi.nextFeature ( f ) )
710
739
{
711
740
if ( !f.hasGeometry () )
712
741
continue ;
713
742
743
+ if ( ctx && renderer )
744
+ {
745
+ ctx->expressionContext ().setFeature ( f );
746
+ if ( filter && !renderer->willRenderFeature ( f, *ctx ) )
747
+ {
748
+ continue ;
749
+ }
750
+ }
751
+
714
752
if ( mTransform .isValid () )
715
753
{
716
754
try
@@ -761,6 +799,12 @@ bool QgsPointLocator::rebuildIndex( int maxFeaturesToIndex )
761
799
QgsPointLocator_Stream stream ( dataList );
762
800
mRTree = RTree::createAndBulkLoadNewRTree ( RTree::BLM_STR, stream, *mStorage , fillFactor, indexCapacity,
763
801
leafCapacity, dimension, variant, indexId );
802
+
803
+ if ( ctx && renderer )
804
+ {
805
+ renderer->stopRender ( *ctx );
806
+ renderer.release ();
807
+ }
764
808
return true ;
765
809
}
766
810
@@ -832,6 +876,7 @@ void QgsPointLocator::onFeatureDeleted( QgsFeatureId fid )
832
876
mRTree ->deleteData ( rect2region ( mGeoms [fid]->boundingBox () ), fid );
833
877
delete mGeoms .take ( fid );
834
878
}
879
+
835
880
}
836
881
837
882
void QgsPointLocator::onGeometryChanged ( QgsFeatureId fid, const QgsGeometry &geom )
0 commit comments