Skip to content

Commit 1a418f5

Browse files
committed
Handle request crs transform in cached feature iterators
1 parent 8ef6722 commit 1a418f5

File tree

2 files changed

+29
-1
lines changed

2 files changed

+29
-1
lines changed

src/core/qgscachedfeatureiterator.cpp

Lines changed: 25 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,17 @@ QgsCachedFeatureIterator::QgsCachedFeatureIterator( QgsVectorLayerCache *vlCache
2020
: QgsAbstractFeatureIterator( featureRequest )
2121
, mVectorLayerCache( vlCache )
2222
{
23+
if ( mRequest.destinationCrs().isValid() && mRequest.destinationCrs() != mVectorLayerCache->sourceCrs() )
24+
{
25+
mTransform = QgsCoordinateTransform( mVectorLayerCache->sourceCrs(), mRequest.destinationCrs() );
26+
}
27+
mFilterRect = transformedFilterRect( mTransform );
28+
if ( !mFilterRect.isNull() )
29+
{
30+
// update request to be the unprojected filter rect
31+
mRequest.setFilterRect( mFilterRect );
32+
}
33+
2334
switch ( featureRequest.filterType() )
2435
{
2536
case QgsFeatureRequest::FilterFids:
@@ -61,6 +72,7 @@ bool QgsCachedFeatureIterator::fetchFeature( QgsFeature &f )
6172
if ( mRequest.acceptFeature( f ) )
6273
{
6374
f.setValid( true );
75+
transformFeatureGeometry( f, mTransform );
6476
return true;
6577
}
6678
}
@@ -85,7 +97,18 @@ QgsCachedFeatureWriterIterator::QgsCachedFeatureWriterIterator( QgsVectorLayerCa
8597
: QgsAbstractFeatureIterator( featureRequest )
8698
, mVectorLayerCache( vlCache )
8799
{
88-
mFeatIt = vlCache->layer()->getFeatures( featureRequest );
100+
if ( mRequest.destinationCrs().isValid() && mRequest.destinationCrs() != mVectorLayerCache->sourceCrs() )
101+
{
102+
mTransform = QgsCoordinateTransform( mVectorLayerCache->sourceCrs(), mRequest.destinationCrs() );
103+
}
104+
mFilterRect = transformedFilterRect( mTransform );
105+
if ( !mFilterRect.isNull() )
106+
{
107+
// update request to be the unprojected filter rect
108+
mRequest.setFilterRect( mFilterRect );
109+
}
110+
111+
mFeatIt = vlCache->layer()->getFeatures( mRequest );
89112
}
90113

91114
bool QgsCachedFeatureWriterIterator::fetchFeature( QgsFeature &f )
@@ -100,6 +123,7 @@ bool QgsCachedFeatureWriterIterator::fetchFeature( QgsFeature &f )
100123
// As long as features can be fetched from the provider: Write them to cache
101124
mVectorLayerCache->cacheFeature( f );
102125
mFids.insert( f.id() );
126+
transformFeatureGeometry( f, mTransform );
103127
return true;
104128
}
105129
else

src/core/qgscachedfeatureiterator.h

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -78,6 +78,8 @@ class CORE_EXPORT QgsCachedFeatureIterator : public QgsAbstractFeatureIterator
7878
QgsFeatureIds mFeatureIds;
7979
QgsVectorLayerCache *mVectorLayerCache = nullptr;
8080
QgsFeatureIds::ConstIterator mFeatureIdIterator;
81+
QgsCoordinateTransform mTransform;
82+
QgsRectangle mFilterRect;
8183
};
8284

8385
/** \ingroup core
@@ -127,5 +129,7 @@ class CORE_EXPORT QgsCachedFeatureWriterIterator : public QgsAbstractFeatureIter
127129
QgsFeatureIterator mFeatIt;
128130
QgsVectorLayerCache *mVectorLayerCache = nullptr;
129131
QgsFeatureIds mFids;
132+
QgsCoordinateTransform mTransform;
133+
QgsRectangle mFilterRect;
130134
};
131135
#endif // QGSCACHEDFEATUREITERATOR_H

0 commit comments

Comments
 (0)