mirror of
https://github.com/qgis/QGIS.git
synced 2025-04-15 00:04:00 -04:00
Rule based renderer exposes filter where clause
This filter can then be sent to the server to reduce the amount of fetched features
This commit is contained in:
parent
cfe91f8261
commit
1d7a6a4909
@ -105,7 +105,9 @@ class QgsRuleBasedRendererV2 : QgsFeatureRendererV2
|
||||
QDomElement save( QDomDocument& doc, QgsSymbolV2Map& symbolMap );
|
||||
|
||||
//! prepare the rule for rendering and its children (build active children array)
|
||||
bool startRender( QgsRenderContext& context, const QgsFields& fields );
|
||||
bool startRender( QgsRenderContext& context, const QgsFields& fields ) /Deprecated/;
|
||||
//! prepare the rule for rendering and its children (build active children array)
|
||||
bool startRender( QgsRenderContext& context, const QgsFields& fields, QString& filter );
|
||||
//! get all used z-levels from this rule and children
|
||||
QSet<int> collectZLevels();
|
||||
//! assign normalized z-levels [0..N-1] for this rule's symbol for quick access during rendering
|
||||
|
@ -134,7 +134,7 @@ bool QgsVectorLayerRenderer::render()
|
||||
mContext.painter()->setCompositionMode( mFeatureBlendMode );
|
||||
}
|
||||
|
||||
mRendererV2->startRender( mContext, mFields );
|
||||
QgsRenderOptions opts = mRendererV2->startRender( mContext, mFields );
|
||||
|
||||
QgsRectangle requestExtent = mContext.extent();
|
||||
mRendererV2->modifyRequestExtent( requestExtent, mContext );
|
||||
@ -143,6 +143,11 @@ bool QgsVectorLayerRenderer::render()
|
||||
.setFilterRect( requestExtent )
|
||||
.setSubsetOfAttributes( mAttrNames, mFields );
|
||||
|
||||
if ( !opts.whereClause().isNull() )
|
||||
{
|
||||
featureRequest.setFilterExpression( opts.whereClause() );
|
||||
}
|
||||
|
||||
// enable the simplification of the geometries (Using the current map2pixel context) before send it to renderer engine.
|
||||
if ( mSimplifyGeometry )
|
||||
{
|
||||
|
@ -64,6 +64,9 @@ class CORE_EXPORT QgsSymbolV2LevelItem
|
||||
class CORE_EXPORT QgsRenderOptions
|
||||
{
|
||||
public:
|
||||
QgsRenderOptions() {}
|
||||
QgsRenderOptions( const QString& whereClause ) { mWhereClause = whereClause; }
|
||||
|
||||
void setWhereClause( const QString& whereClause ) { mWhereClause = whereClause; }
|
||||
QString whereClause() { return mWhereClause; }
|
||||
private:
|
||||
|
@ -390,6 +390,12 @@ void QgsRuleBasedRendererV2::Rule::toSld( QDomDocument& doc, QDomElement &elemen
|
||||
}
|
||||
|
||||
bool QgsRuleBasedRendererV2::Rule::startRender( QgsRenderContext& context, const QgsFields& fields )
|
||||
{
|
||||
QString filter;
|
||||
return startRender( context, fields, filter );
|
||||
}
|
||||
|
||||
bool QgsRuleBasedRendererV2::Rule::startRender( QgsRenderContext& context, const QgsFields& fields, QString& filter )
|
||||
{
|
||||
mActiveChildren.clear();
|
||||
|
||||
@ -408,15 +414,37 @@ bool QgsRuleBasedRendererV2::Rule::startRender( QgsRenderContext& context, const
|
||||
|
||||
// init children
|
||||
// build temporary list of active rules (usable with this scale)
|
||||
QStringList subfilters;
|
||||
for ( RuleList::iterator it = mChildren.begin(); it != mChildren.end(); ++it )
|
||||
{
|
||||
QString subfilter;
|
||||
Rule* rule = *it;
|
||||
if ( rule->startRender( context, fields ) )
|
||||
if ( rule->startRender( context, fields , subfilter ) )
|
||||
{
|
||||
// only add those which are active with current scale
|
||||
mActiveChildren.append( rule );
|
||||
subfilters.append( subfilter );
|
||||
}
|
||||
}
|
||||
|
||||
// subfilters (on the same level) are joined with OR and finally joined with AND with their parent (this) filter
|
||||
QString sf;
|
||||
if ( subfilters.length() )
|
||||
sf = subfilters.join( ") OR (" ).prepend( "(" ).append( ")" );
|
||||
|
||||
if ( isElse() )
|
||||
{
|
||||
if ( !sf.length() )
|
||||
filter = "1";
|
||||
else
|
||||
filter = sf;
|
||||
}
|
||||
else if ( mFilterExp.length() && sf.length() )
|
||||
filter = QString( "(%1) AND (%2)" ).arg( mFilterExp ).arg( sf );
|
||||
else if ( mFilterExp.length() )
|
||||
filter = mFilterExp;
|
||||
else
|
||||
filter = sf;
|
||||
return true;
|
||||
}
|
||||
|
||||
@ -781,8 +809,9 @@ bool QgsRuleBasedRendererV2::renderFeature( QgsFeature& feature,
|
||||
|
||||
QgsRenderOptions QgsRuleBasedRendererV2::startRender( QgsRenderContext& context, const QgsFields& fields )
|
||||
{
|
||||
QString filter;
|
||||
// prepare active children
|
||||
mRootRule->startRender( context, fields );
|
||||
mRootRule->startRender( context, fields, filter );
|
||||
|
||||
QSet<int> symbolZLevelsSet = mRootRule->collectZLevels();
|
||||
QList<int> symbolZLevels = symbolZLevelsSet.toList();
|
||||
@ -800,7 +829,7 @@ QgsRenderOptions QgsRuleBasedRendererV2::startRender( QgsRenderContext& context,
|
||||
}
|
||||
|
||||
mRootRule->setNormZLevels( zLevelsToNormLevels );
|
||||
return QgsRenderOptions();
|
||||
return QgsRenderOptions( filter );
|
||||
}
|
||||
|
||||
void QgsRuleBasedRendererV2::stopRender( QgsRenderContext& context )
|
||||
|
@ -135,7 +135,9 @@ class CORE_EXPORT QgsRuleBasedRendererV2 : public QgsFeatureRendererV2
|
||||
QDomElement save( QDomDocument& doc, QgsSymbolV2Map& symbolMap );
|
||||
|
||||
//! prepare the rule for rendering and its children (build active children array)
|
||||
bool startRender( QgsRenderContext& context, const QgsFields& fields );
|
||||
Q_DECL_DEPRECATED bool startRender( QgsRenderContext& context, const QgsFields& fields );
|
||||
//! prepare the rule for rendering and its children (build active children array)
|
||||
bool startRender( QgsRenderContext& context, const QgsFields& fields, QString& filter );
|
||||
//! get all used z-levels from this rule and children
|
||||
QSet<int> collectZLevels();
|
||||
//! assign normalized z-levels [0..N-1] for this rule's symbol for quick access during rendering
|
||||
|
Loading…
x
Reference in New Issue
Block a user