@@ -803,7 +803,18 @@ void QgsRuleBasedRendererV2::refineRuleCategories( QgsRuleBasedRendererV2::Rule*
803
803
{
804
804
foreach ( const QgsRendererCategoryV2& cat, r->categories () )
805
805
{
806
- QString filter = QString ( " %1 = '%2'" ).arg ( r->classAttribute () ).arg ( cat.value ().toString () );
806
+ QString attr = QgsExpression::quotedColumnRef ( r->classAttribute () );
807
+ QString value;
808
+ // not quoting numbers saves a type cast
809
+ if ( cat.value ().type () == QVariant::Int )
810
+ value = cat.value ().toString ();
811
+ else if ( cat.value ().type () == QVariant::Double )
812
+ // we loose precision here - so we may miss some categories :-(
813
+ // TODO: have a possibility to construct expressions directly as a parse tree to avoid loss of precision
814
+ value = QString::number ( cat.value ().toDouble (), ' f' , 4 );
815
+ else
816
+ value = QgsExpression::quotedString ( cat.value ().toString () );
817
+ QString filter = QString ( " %1 = %2" ).arg ( attr ).arg ( value );
807
818
QString label = filter;
808
819
initialRule->appendChild ( new Rule ( cat.symbol ()->clone (), 0 , 0 , filter, label ) );
809
820
}
@@ -813,7 +824,12 @@ void QgsRuleBasedRendererV2::refineRuleRanges( QgsRuleBasedRendererV2::Rule* ini
813
824
{
814
825
foreach ( const QgsRendererRangeV2& rng, r->ranges () )
815
826
{
816
- QString filter = QString ( " %1 >= '%2' AND %1 <= '%3'" ).arg ( r->classAttribute () ).arg ( rng.lowerValue () ).arg ( rng.upperValue () );
827
+ // due to the loss of precision in double->string conversion we may miss out values at the limit of the range
828
+ // TODO: have a possibility to construct expressions directly as a parse tree to avoid loss of precision
829
+ QString attr = QgsExpression::quotedColumnRef ( r->classAttribute () );
830
+ QString filter = QString ( " %1 >= %2 AND %1 <= %3" ).arg ( attr )
831
+ .arg ( QString::number ( rng.lowerValue (), ' f' , 4 ) )
832
+ .arg ( QString::number ( rng.upperValue (), ' f' , 4 ) );
817
833
QString label = filter;
818
834
initialRule->appendChild ( new Rule ( rng.symbol ()->clone (), 0 , 0 , filter, label ) );
819
835
}
0 commit comments