@@ -286,6 +286,7 @@ QgsGraduatedSymbolRendererV2::QgsGraduatedSymbolRendererV2( QString attrName, Qg
286
286
, mMode( Custom )
287
287
, mInvertedColorRamp( false )
288
288
, mScaleMethod( DEFAULT_SCALE_METHOD )
289
+ , mGraduatedMethod( GraduatedColor )
289
290
, mAttrNum( -1 )
290
291
, mCounting( false )
291
292
@@ -519,6 +520,7 @@ QgsFeatureRendererV2* QgsGraduatedSymbolRendererV2::clone() const
519
520
r->setSizeScaleField ( sizeScaleField () );
520
521
r->setScaleMethod ( scaleMethod () );
521
522
r->setLabelFormat ( labelFormat () );
523
+ r->setGraduatedMethod ( graduatedMethod () );
522
524
copyPaintEffect ( r );
523
525
return r;
524
526
}
@@ -527,6 +529,7 @@ void QgsGraduatedSymbolRendererV2::toSld( QDomDocument& doc, QDomElement &elemen
527
529
{
528
530
QgsStringMap props;
529
531
props[ " attribute" ] = mAttrName ;
532
+ props[ " method" ] = graduatedMethodStr ( mGraduatedMethod );
530
533
if ( mRotation .data () )
531
534
props[ " angle" ] = mRotation ->expression ();
532
535
if ( mSizeScale .data () )
@@ -962,6 +965,7 @@ QgsGraduatedSymbolRendererV2* QgsGraduatedSymbolRendererV2::createRenderer(
962
965
QList<double > QgsGraduatedSymbolRendererV2::getDataValues ( QgsVectorLayer *vlayer )
963
966
{
964
967
QList<double > values;
968
+
965
969
QScopedPointer<QgsExpression> expression;
966
970
int attrNum = vlayer->fieldNameIndex ( mAttrName );
967
971
@@ -1022,7 +1026,7 @@ void QgsGraduatedSymbolRendererV2::updateClasses( QgsVectorLayer *vlayer, Mode m
1022
1026
if ( values.isEmpty () )
1023
1027
return ;
1024
1028
1025
- qSort ( values );
1029
+ qSort ( values ); // vmora: is wondering if O( n log(n) ) is really necessary here, min and max are O( n )
1026
1030
minimum = values.first ();
1027
1031
maximum = values.last ();
1028
1032
valuesLoaded = true ;
@@ -1146,6 +1150,16 @@ QgsFeatureRendererV2* QgsGraduatedSymbolRendererV2::create( QDomElement& element
1146
1150
1147
1151
QgsGraduatedSymbolRendererV2* r = new QgsGraduatedSymbolRendererV2 ( attrName, ranges );
1148
1152
1153
+ QString attrMethod = element.attribute ( " graduatedMethod" );
1154
+ if ( attrMethod.length () )
1155
+ {
1156
+ if ( attrMethod == graduatedMethodStr ( GraduatedColor ) )
1157
+ r->setGraduatedMethod ( GraduatedColor );
1158
+ else if ( attrMethod == graduatedMethodStr ( GraduatedSize ) )
1159
+ r->setGraduatedMethod ( GraduatedSize );
1160
+ }
1161
+
1162
+
1149
1163
// delete symbols if there are any more
1150
1164
QgsSymbolLayerV2Utils::clearSymbolMap ( symbolMap );
1151
1165
@@ -1214,6 +1228,7 @@ QDomElement QgsGraduatedSymbolRendererV2::save( QDomDocument& doc )
1214
1228
rendererElem.setAttribute ( " type" , " graduatedSymbol" );
1215
1229
rendererElem.setAttribute ( " symbollevels" , ( mUsingSymbolLevels ? " 1" : " 0" ) );
1216
1230
rendererElem.setAttribute ( " attr" , mAttrName );
1231
+ rendererElem.setAttribute ( " graduatedMethod" , graduatedMethodStr ( mGraduatedMethod ) );
1217
1232
1218
1233
// ranges
1219
1234
int i = 0 ;
@@ -1348,6 +1363,52 @@ void QgsGraduatedSymbolRendererV2::setSourceColorRamp( QgsVectorColorRampV2* ram
1348
1363
mSourceColorRamp .reset ( ramp );
1349
1364
}
1350
1365
1366
+ double QgsGraduatedSymbolRendererV2::minSymbolSize () const
1367
+ {
1368
+ double min = DBL_MAX;
1369
+ for ( int i = 0 ; i < mRanges .count (); i++ )
1370
+ {
1371
+ double sz = 0 ;
1372
+ if ( mRanges [i].symbol ()->type () == QgsSymbolV2::Marker )
1373
+ sz = static_cast < QgsMarkerSymbolV2 * >( mRanges [i].symbol () )->size ();
1374
+ else if ( mRanges [i].symbol ()->type () == QgsSymbolV2::Line )
1375
+ sz = static_cast < QgsLineSymbolV2 * >( mRanges [i].symbol () )->width ();
1376
+ min = qMin ( sz, min );
1377
+ }
1378
+ return min;
1379
+ }
1380
+
1381
+ double QgsGraduatedSymbolRendererV2::maxSymbolSize () const
1382
+ {
1383
+ double max = DBL_MIN;
1384
+ for ( int i = 0 ; i < mRanges .count (); i++ )
1385
+ {
1386
+ double sz = 0 ;
1387
+ if ( mRanges [i].symbol ()->type () == QgsSymbolV2::Marker )
1388
+ sz = static_cast < QgsMarkerSymbolV2 * >( mRanges [i].symbol () )->size ();
1389
+ else if ( mRanges [i].symbol ()->type () == QgsSymbolV2::Line )
1390
+ sz = static_cast < QgsLineSymbolV2 * >( mRanges [i].symbol () )->width ();
1391
+ max = qMax ( sz, max );
1392
+ }
1393
+ return max;
1394
+ }
1395
+
1396
+ void QgsGraduatedSymbolRendererV2::setSymbolSizes ( double minSize, double maxSize )
1397
+ {
1398
+ for ( int i = 0 ; i < mRanges .count (); i++ )
1399
+ {
1400
+ QScopedPointer<QgsSymbolV2> symbol ( mRanges [i].symbol () ? mRanges [i].symbol ()->clone () : 0 );
1401
+ const double size = mRanges .count () > 1
1402
+ ? minSize + i * ( maxSize - minSize ) / ( mRanges .count () - 1 )
1403
+ : .5 * ( maxSize + minSize );
1404
+ if ( symbol->type () == QgsSymbolV2::Marker )
1405
+ static_cast < QgsMarkerSymbolV2 * >( symbol.data () )->setSize ( size );
1406
+ if ( symbol->type () == QgsSymbolV2::Line )
1407
+ static_cast < QgsLineSymbolV2 * >( symbol.data () )->setWidth ( size );
1408
+ updateRangeSymbol ( i, symbol.take () );
1409
+ }
1410
+ }
1411
+
1351
1412
void QgsGraduatedSymbolRendererV2::updateColorRamp ( QgsVectorColorRampV2 *ramp, bool inverted )
1352
1413
{
1353
1414
int i = 0 ;
@@ -1386,9 +1447,21 @@ void QgsGraduatedSymbolRendererV2::updateSymbols( QgsSymbolV2 *sym )
1386
1447
int i = 0 ;
1387
1448
foreach ( QgsRendererRangeV2 range, mRanges )
1388
1449
{
1389
- QgsSymbolV2 *symbol = sym->clone ();
1390
- symbol->setColor ( range.symbol ()->color () );
1391
- updateRangeSymbol ( i, symbol );
1450
+ QScopedPointer<QgsSymbolV2> symbol ( sym->clone () );
1451
+ if ( mGraduatedMethod == GraduatedColor )
1452
+ {
1453
+ symbol->setColor ( range.symbol ()->color () );
1454
+ }
1455
+ else if ( mGraduatedMethod == GraduatedSize )
1456
+ {
1457
+ if ( symbol->type () == QgsSymbolV2::Marker )
1458
+ static_cast <QgsMarkerSymbolV2 *>( symbol.data () )->setSize (
1459
+ static_cast <QgsMarkerSymbolV2 *>( range.symbol () )->size () );
1460
+ else if ( symbol->type () == QgsSymbolV2::Line )
1461
+ static_cast <QgsLineSymbolV2 *>( symbol.data () )->setWidth (
1462
+ static_cast <QgsLineSymbolV2 *>( range.symbol () )->width () );
1463
+ }
1464
+ updateRangeSymbol ( i, symbol.take () );
1392
1465
++i;
1393
1466
}
1394
1467
setSourceSymbol ( sym->clone () );
@@ -1602,3 +1675,15 @@ QgsGraduatedSymbolRendererV2* QgsGraduatedSymbolRendererV2::convertFromRenderer(
1602
1675
1603
1676
return r;
1604
1677
}
1678
+
1679
+ const char * QgsGraduatedSymbolRendererV2::graduatedMethodStr ( GraduatedMethod method )
1680
+ {
1681
+ switch ( method )
1682
+ {
1683
+ case GraduatedColor: return " GraduatedColor" ;
1684
+ case GraduatedSize: return " GraduatedSize" ;
1685
+ }
1686
+ return " " ;
1687
+ }
1688
+
1689
+
0 commit comments