@@ -641,6 +641,9 @@ static QList<double> _calcJenksBreaks( QList<double> values, int classes,
641
641
// Returns class breaks such that classes are internally homogeneous while
642
642
// assuring heterogeneity among classes.
643
643
644
+ if ( !values.count () )
645
+ return QList<double >();
646
+
644
647
if ( classes <= 1 )
645
648
{
646
649
return QList<double >() << maximum;
@@ -772,15 +775,22 @@ QgsGraduatedSymbolRendererV2* QgsGraduatedSymbolRendererV2::createRenderer(
772
775
int attrNum = vlayer->fieldNameIndex ( attrName );
773
776
double minimum;
774
777
double maximum;
778
+
779
+ QScopedPointer<QgsExpression> expression;
780
+
775
781
if ( attrNum == -1 )
776
782
{
783
+ // try to use expression
784
+ expression.reset ( new QgsExpression ( attrName ) );
785
+ if ( expression->hasParserError () || !expression->prepare ( vlayer->pendingFields () ) )
786
+ return 0 ; // should have a means to report errors
787
+
777
788
QList<double > values;
778
789
QgsFeatureIterator fit = vlayer->getFeatures ();
779
790
QgsFeature feature;
780
- QgsExpression expression ( attrName );
781
791
while ( fit.nextFeature ( feature ) )
782
792
{
783
- values << expression. evaluate ( feature ).toDouble ();
793
+ values << expression-> evaluate ( feature ).toDouble ();
784
794
}
785
795
qSort ( values );
786
796
minimum = values.first ();
@@ -808,15 +818,21 @@ QgsGraduatedSymbolRendererV2* QgsGraduatedSymbolRendererV2::createRenderer(
808
818
// get values from layer
809
819
QList<double > values;
810
820
QgsFeature f;
811
- QgsAttributeList lst;
812
- lst.append ( attrNum );
821
+ QStringList lst;
822
+ if ( expression.isNull () )
823
+ lst.append ( attrName );
824
+ else
825
+ lst = expression->referencedColumns ();
813
826
814
- QgsFeatureIterator fit = vlayer->getFeatures ( QgsFeatureRequest ().setFlags ( QgsFeatureRequest::NoGeometry ).setSubsetOfAttributes ( lst ) );
827
+ QgsFeatureIterator fit = vlayer->getFeatures ( QgsFeatureRequest ().setFlags ( QgsFeatureRequest::NoGeometry ).setSubsetOfAttributes ( lst, vlayer-> pendingFields () ) );
815
828
816
829
// create list of non-null attribute values
817
830
while ( fit.nextFeature ( f ) )
818
- if ( !f.attribute ( attrNum ).isNull () )
819
- values.append ( f.attribute ( attrNum ).toDouble () );
831
+ {
832
+ QVariant v = expression.isNull () ? f.attribute ( attrNum ) : expression->evaluate ( f );
833
+ if ( !v.isNull () )
834
+ values.append ( v.toDouble () );
835
+ }
820
836
821
837
// calculate the breaks
822
838
if ( mode == Quantile )
0 commit comments