32 #include <QDomDocument>
33 #include <QDomElement>
48 : mLowerValue( lowerValue )
49 , mUpperValue( upperValue )
57 : mLowerValue( range.mLowerValue )
58 , mUpperValue( range.mUpperValue )
59 , mSymbol( range.mSymbol.data() ? range.mSymbol->clone() : NULL )
60 , mLabel( range.mLabel )
61 , mRender( range.mRender )
148 QString attrName = props[
"attribute" ];
170 mSymbol->toSld( doc, ruleElem, props );
179 mFormat(
" %1 - %2 " ),
181 mTrimTrailingZeroes( false ),
184 mReTrailingZeroes(
"[.,]?0*$" ),
185 mReNegativeZero(
"^\\-0(?:[.,]0*)?$" )
190 mReTrailingZeroes(
"[.,]?0*$" ),
191 mReNegativeZero(
"^\\-0(?:[.,]0*)?$" )
209 return !( *
this == other );
219 while ( precision < 0 )
240 valueStr = valueStr.
mid( 1 );
246 if ( valueStr ==
"-0" )
248 if ( valueStr !=
"0" )
260 return legend.
replace(
"%1", lowerStr ).
replace(
"%2", upperStr );
266 element.
attribute(
"prefix",
" " ) +
"%1" +
267 element.
attribute(
"separator",
" - " ) +
"%2" +
285 , mAttrName( attrName )
288 , mInvertedColorRamp( false )
290 , mGraduatedMethod( GraduatedColor )
307 if ( it->lowerValue() <= value && it->upperValue() >= value )
322 if ( symbol == NULL )
340 markerSymbol->
setSize( sizeScale * static_cast<QgsMarkerSymbolV2*>( symbol )->size() );
346 lineSymbol->
setWidth( sizeScale * static_cast<QgsLineSymbolV2*>( symbol )->width() );
355 if ( mAttrNum < 0 || mAttrNum >= attrs.
count() )
391 it->symbol()->startRender( context, &fields );
412 it->symbol()->stopRender( context );
419 it2.
value()->stopRender( context );
451 return attributes.
toList();
456 if ( rangeIndex < 0 || rangeIndex >=
mRanges.
size() )
458 mRanges[rangeIndex].setSymbol( symbol );
464 if ( rangeIndex < 0 || rangeIndex >=
mRanges.
size() )
466 mRanges[rangeIndex].setLabel( label );
472 if ( rangeIndex < 0 || rangeIndex >=
mRanges.
size() )
483 if ( rangeIndex < 0 || rangeIndex >=
mRanges.
size() )
494 if ( rangeIndex < 0 || rangeIndex >=
mRanges.
size() )
496 mRanges[rangeIndex].setRenderState( value );
535 props[
"angle" ] =
mRotation->expression();
543 it->toSld( doc, element, catProps );
563 double step = ( maximum - minimum ) / classes;
566 double value = minimum;
567 for (
int i = 0; i < classes; i++ )
575 breaks[classes-1] = maximum;
596 if ( !values.
count() )
599 int n = values.
count();
600 double Xq = n > 0 ? values[0] : 0.0;
602 for (
int i = 1; i < classes; i++ )
606 double q = i / ( double ) classes;
607 double a = q * ( n - 1 );
608 int aa = ( int )( a );
611 Xq = ( 1 - r ) * values[aa] + r * values[aa+1];
616 breaks.
append( values[ n-1 ] );
632 if ( !values.
count() )
637 int n = values.
count();
638 double minimum = values[0];
639 double maximum = values[0];
641 for (
int i = 0; i < n; i++ )
644 minimum = qMin( values[i], minimum );
645 maximum = qMax( values[i], maximum );
647 mean = mean / ( double ) n;
650 for (
int i = 0; i < n; i++ )
652 sd = values[i] - mean;
655 stdDev = sqrt( stdDev / n );
658 for (
int i = 0; i < breaks.
count(); i++ )
660 labels.
append( breaks[i] );
661 breaks[i] = ( breaks[i] * stdDev ) + mean;
668 double minimum,
double maximum,
669 int maximumSize = 1000 )
681 if ( !values.
count() )
689 if ( classes >= values.
size() )
697 if ( values.
size() > maximumSize )
703 sample.
resize( qMax( maximumSize, values.
size() / 10 ) );
708 sample[ 0 ] = minimum;
709 sample[ 1 ] = maximum;;
710 for (
int i = 2; i < sample.
size(); i++ )
714 int j = floor( r / RAND_MAX * ( values.
size() - 1 ) );
715 sample[ i ] = values[ j ];
723 int n = sample.
size();
731 for (
int i = 0; i <= n; i++ )
733 matrixOne[i].
resize( classes + 1 );
734 matrixTwo[i].
resize( classes + 1 );
737 for (
int i = 1; i <= classes; i++ )
741 matrixTwo[0][i] = 0.0;
742 for (
int j = 2; j <= n; j++ )
748 for (
int l = 2; l <= n; l++ )
756 for (
int m = 1; m <= l; m++ )
760 double val = sample[ i3 - 1 ];
766 v = s2 - ( s1 * s1 ) / (
double ) w;
770 for (
int j = 2; j <= classes; j++ )
772 if ( matrixTwo[l][j] >= v + matrixTwo[i4][j - 1] )
774 matrixOne[l][j] = i4;
775 matrixTwo[l][j] = v + matrixTwo[i4][j - 1];
785 breaks[classes-1] = sample[n-1];
787 for (
int j = classes, k = n; j >= 2; j-- )
789 int id = matrixOne[k][j] - 1;
790 breaks[j - 2] = sample[id];
791 k = matrixOne[k][j] - 1;
840 bool valuesLoaded =
false;
854 minimum = values.
first();
855 maximum = values.
last();
871 else if ( mode ==
Pretty )
888 else if ( mode ==
Jenks )
892 else if ( mode ==
StdDev )
902 double lower, upper = minimum;
921 else if ( i == labels.
count() - 1 )
943 if ( symbolsElem.
isNull() )
947 if ( rangesElem.
isNull() )
954 while ( !rangeElem.
isNull() )
956 if ( rangeElem.
tagName() ==
"range" )
962 bool render = rangeElem.
attribute(
"render",
"true" ) !=
"false";
963 if ( symbolMap.
contains( symbolName ) )
977 if ( attrMethod.
length() )
991 if ( !sourceSymbolElem.
isNull() )
994 if ( sourceSymbolMap.
contains(
"0" ) )
1003 if ( !sourceColorRampElem.
isNull() && sourceColorRampElem.
attribute(
"name" ) ==
"[source]" )
1007 if ( !invertedColorRampElem.
isNull() )
1013 if ( !modeElem.
isNull() )
1016 if ( modeString ==
"equal" )
1018 else if ( modeString ==
"quantile" )
1020 else if ( modeString ==
"jenks" )
1022 else if ( modeString ==
"stddev" )
1024 else if ( modeString ==
"pretty" )
1059 if ( ! labelFormatElem.
isNull() )
1072 rendererElem.
setAttribute(
"type",
"graduatedSymbol" );
1126 modeString =
"equal";
1128 modeString =
"quantile";
1130 modeString =
"jenks";
1132 modeString =
"stddev";
1134 modeString =
"pretty";
1160 return rendererElem;
1167 for (
int i = 0; i < count; i++ )
1171 lst << qMakePair( range.
label(), pix );
1212 s->setSize( exp.size( v ) );
1228 Q_UNUSED( scaleDenominator );
1235 lst << qMakePair( range.
label(), range.
symbol() );
1262 double min = DBL_MAX;
1267 sz = static_cast< QgsMarkerSymbolV2 * >(
mRanges[i].symbol() )->size();
1269 sz = static_cast< QgsLineSymbolV2 * >(
mRanges[i].symbol() )->width();
1270 min = qMin( sz, min );
1277 double max = DBL_MIN;
1282 sz = static_cast< QgsMarkerSymbolV2 * >(
mRanges[i].symbol() )->size();
1284 sz = static_cast< QgsLineSymbolV2 * >(
mRanges[i].symbol() )->width();
1285 max = qMax( sz, max );
1296 ? minSize + i * ( maxSize - minSize ) / (
mRanges.
count() - 1 )
1297 : .5 * ( maxSize + minSize );
1299 static_cast< QgsMarkerSymbolV2 * >( symbol.
data() )->setSize( size );
1301 static_cast< QgsLineSymbolV2 * >( symbol.
data() )->setWidth( size );
1352 static_cast<QgsMarkerSymbolV2 *>( symbol.data() )->setSize(
1353 static_cast<QgsMarkerSymbolV2 *>( range.
symbol() )->size() );
1355 static_cast<QgsLineSymbolV2 *>( symbol.data() )->setWidth(
1356 static_cast<QgsLineSymbolV2 *>( range.
symbol() )->width() );
1404 return mRanges[ index ].renderState();
1457 if ( updateSymbols )
1502 double minClassRange = 0.0;
1505 double range = it->upperValue() - it->lowerValue();
1508 if ( minClassRange == 0.0 || range < minClassRange )
1509 minClassRange = range;
1511 if ( minClassRange <= 0.0 )
1518 double nextDpMinRange = 0.0000000099;
1519 while ( ndp > 0 && nextDpMinRange < minClassRange )
1522 nextDpMinRange *= 10.0;
1548 if ( order == Qt::AscendingOrder )
1564 if ( it == sortedRanges.
constEnd() )
1567 if (( *it ).upperValue() < ( *it ).lowerValue() )
1570 double prevMax = ( *it ).upperValue();
1573 for ( ; it != sortedRanges.
constEnd(); ++it )
1575 if (( *it ).upperValue() < ( *it ).lowerValue() )
1578 if (( *it ).lowerValue() < prevMax )
1581 prevMax = ( *it ).upperValue();
1592 if ( it == sortedRanges.
constEnd() )
1595 double prevMax = ( *it ).upperValue();
1598 for ( ; it != sortedRanges.
constEnd(); ++it )
1603 prevMax = ( *it ).upperValue();
1620 if ( order == Qt::AscendingOrder )
1632 if ( renderer->
type() ==
"graduatedSymbol" )
1636 if ( renderer->
type() ==
"pointDisplacement" )
1639 if ( pointDisplacementRenderer )
1642 if ( renderer->
type() ==
"invertedPolygonRenderer" )
1645 if ( invertedPolygonRenderer )
1654 if ( symbols.
size() > 0 )
Class for parsing and evaluation of expressions (formerly called "search strings").
QList< QgsRendererRangeV2 > QgsRangeList
static QgsSymbolV2Map loadSymbols(QDomElement &element)
static QList< double > _calcJenksBreaks(QList< double > values, int classes, double minimum, double maximum, int maximumSize=1000)
#define RENDERER_TAG_NAME
virtual void toSld(QDomDocument &doc, QDomElement &element) const override
used from subclasses to create SLD Rule elements following SLD v1.1 specs
QString & append(QChar ch)
void setLowerValue(double lowerValue)
void setSymbolSizes(double minSize, double maxSize)
set varying symbol size for classes
bool hasParserError() const
Returns true if an error occurred when parsing the input expression.
void setInvertedColorRamp(bool inverted)
QStringList referencedColumns() const
Get list of columns referenced by the expression.
void setRotationField(QString fieldOrExpression) override
sets rotation field of renderer (if supported by the renderer)
void addBreak(double breakValue, bool updateSymbols=true)
Add a breakpoint by splitting existing classes so that the specified value becomes a break between tw...
A container class for data source field mapping or expression.
void setLabelFormat(const QgsRendererRangeV2LabelFormat &labelFormat, bool updateRanges=false)
Set the label format used to generate default classification labels.
static QList< double > prettyBreaks(double minimum, double maximum, int classes)
Computes a sequence of about 'classes' equally spaced round values which cover the range of values fr...
bool labelLessThan(const QgsRendererRangeV2 &r1, const QgsRendererRangeV2 &r2)
bool contains(const Key &key) const
static QgsGraduatedSymbolRendererV2 * convertFromRenderer(const QgsFeatureRendererV2 *renderer)
creates a QgsGraduatedSymbolRendererV2 from an existing renderer.
static QgsVectorColorRampV2 * loadColorRamp(QDomElement &element)
int localeAwareCompare(const QString &other) const
void updateClasses(QgsVectorLayer *vlayer, Mode mode, int nclasses)
Recalculate classes for a layer.
bool updateRangeLabel(int rangeIndex, QString label)
void setLabel(QString label)
static QList< double > _calcStdDevBreaks(QList< double > values, int classes, QList< double > &labels)
virtual QString dump() const override
for debugging
QDomNode appendChild(const QDomNode &newChild)
QScopedPointer< QgsVectorColorRampV2 > mSourceColorRamp
QVariant maximumValue(int index)
Returns maximum value for an attribute column or invalid variant in case of error.
QSet< QString > usedAttributes() const
QString attribute(const QString &name, const QString &defValue) const
void updateSymbols(QgsSymbolV2 *sym)
Update all the symbols but leave breaks and colors.
void setDataDefinedSize(const QgsDataDefined &dd)
Set data defined size for whole symbol (including all symbol layers).
int fieldNameIndex(const QString &fieldName) const
Look up field's index from name - case insensitive TODO: sort out case sensitive (indexFromName()) vs...
double rendererScale() const
virtual QgsSymbolV2 * clone() const =0
Class storing parameters of a scale expression, which is a subclass of QgsExpression for expressions ...
virtual QgsFeatureRendererV2 * clone() const override
QgsDataDefined dataDefinedSize() const
Returns data defined size for whole symbol (including all symbol layers).
bool updateRangeRenderState(int rangeIndex, bool render)
const T & at(int i) const
void setSizeScaleField(QString fieldOrExpression)
QDomElement nextSiblingElement(const QString &tagName) const
double minSymbolSize() const
return the min symbol size when graduated by size
Container of fields for a vector layer.
virtual QgsSymbolV2 * originalSymbolForFeature(QgsFeature &feature) override
Return symbol for feature.
QString expressionString() const
void move(int from, int to)
QVector< T > toVector() const
virtual ~QgsGraduatedSymbolRendererV2()
QHash< QgsSymbolV2 *, QgsSymbolV2 * > mTempSymbols
temporary symbols, used for data-defined rotation and scaling
void calculateLabelPrecision(bool updateRanges=true)
Reset the label decimal places to a numberbased on the minimum class interval.
virtual QgsLegendSymbolList legendSymbolItems(double scaleDenominator=-1, QString rule=QString()) override
return a list of item text / symbol
The feature class encapsulates a single feature including its id, geometry and a list of field/values...
void setScaleMethod(QgsSymbolV2::ScaleMethod scaleMethod)
virtual QgsSymbolV2 * symbolForFeature(QgsFeature &feature) override
to be overridden
double toDouble(bool *ok) const
QVariant minimumValue(int index)
Returns minimum value for an attribute column or invalid variant in case of error.
void setValue(const T &value) const
virtual bool legendSymbolItemChecked(QString key) override
item in symbology was checked
bool qgsDoubleNear(double a, double b, double epsilon=4 *DBL_EPSILON)
static const char * graduatedMethodStr(GraduatedMethod method)
QgsVectorColorRampV2 * sourceColorRamp()
QgsPaintEffect * mPaintEffect
void setWidth(double width)
void setRenderState(bool render)
Q_DECL_DEPRECATED QList< double > getDataValues(QgsVectorLayer *vlayer)
Evaluates the data expression and returns the list of values from the layer.
QScopedPointer< QgsSymbolV2 > mSymbol
virtual void stopRender(QgsRenderContext &context) override
GraduatedMethod mGraduatedMethod
double upperValue() const
virtual QgsSymbolV2List symbols() override
for symbol levels
QScopedPointer< QgsExpression > mExpression
void setColor(const QColor &color)
bool rangesHaveGaps() const
Tests whether classes assigned to the renderer have gaps between the ranges.
virtual QgsFeatureRendererV2 * clone() const =0
QString number(int n, int base)
int count(const T &value) const
void setGraduatedMethod(GraduatedMethod method)
set the method used for graduation (either size or color)
void append(const T &value)
static QDomElement saveColorRamp(QString name, QgsVectorColorRampV2 *ramp, QDomDocument &doc)
QgsSymbolV2::ScaleMethod scaleMethod() const
void sortByLabel(Qt::SortOrder order=Qt::AscendingOrder)
static QList< double > _calcQuantileBreaks(QList< double > values, int classes)
QgsInvertedPolygonRenderer is a polygon-only feature renderer used to display features inverted...
void startRender(QgsRenderContext &context, const QgsFields *fields=0)
QgsAttributes attributes() const
Returns the feature's attributes.
void setAttribute(const QString &name, const QString &value)
#define DEFAULT_SCALE_METHOD
virtual QgsVectorColorRampV2 * clone() const =0
void swap(QgsRendererRangeV2 &other)
static bool createFunctionElement(QDomDocument &doc, QDomElement &element, QString function)
int toInt(bool *ok, int base) const
static QDomElement saveSymbols(QgsSymbolV2Map &symbols, QString tagName, QDomDocument &doc)
QgsSymbolV2 * sourceSymbol()
QString rotationField() const override
return rotation field name (or empty string if not set or not supported by renderer) ...
QgsSymbolV2 * symbol() const
GraduatedMethod graduatedMethod() const
return the method used for graduation (either size or color)
void setAngle(double angle)
void setSourceSymbol(QgsSymbolV2 *sym)
bool updateRangeLowerValue(int rangeIndex, double value)
void setSize(double size)
void toSld(QDomDocument &doc, QDomElement &element, QgsStringMap props) const
QgsRendererRangeV2LabelFormat mLabelFormat
QGis::GeometryType geometryType() const
Returns point, line or polygon.
QgsGraduatedSymbolRendererV2(QString attrName=QString(), QgsRangeList ranges=QgsRangeList())
void setUpperValue(double upperValue)
virtual QDomElement save(QDomDocument &doc) override
store renderer info to XML element
bool operator<(const QgsRendererRangeV2 &other) const
QgsSymbolV2 * symbolForValue(double value)
static void convertSymbolSizeScale(QgsSymbolV2 *symbol, QgsSymbolV2::ScaleMethod method, const QString &field)
bool labelGreaterThan(const QgsRendererRangeV2 &r1, const QgsRendererRangeV2 &r2)
QgsFeatureRendererV2 * embeddedRenderer() const
bool useExpression() const
QDomText createTextNode(const QString &value)
bool valueLessThan(const QgsRendererRangeV2 &r1, const QgsRendererRangeV2 &r2)
const T value(const Key &key) const
QList< double > getDoubleValues(const QString &fieldOrExpression, bool &ok, bool selectedOnly=false, int *nullCount=0)
Fetches all double values from a specified field name or expression.
static QgsGraduatedSymbolRendererV2 * createRenderer(QgsVectorLayer *vlayer, QString attrName, int classes, Mode mode, QgsSymbolV2 *symbol, QgsVectorColorRampV2 *ramp, bool inverted=false, QgsRendererRangeV2LabelFormat legendFormat=QgsRendererRangeV2LabelFormat())
const QgsRendererRangeV2LabelFormat & labelFormat() const
Return the label format used to generate default classification labels.
void sortByValue(Qt::SortOrder order=Qt::AscendingOrder)
A renderer that automatically displaces points with the same position.
virtual bool legendSymbolItemsCheckable() const override
items of symbology items in legend should be checkable
void setUsingSymbolLevels(bool usingSymbolLevels)
QString & replace(int position, int n, QChar after)
bool rangesOverlap() const
Tests whether classes assigned to the renderer have ranges which overlap.
static QList< double > _calcEqualIntervalBreaks(double minimum, double maximum, int classes)
virtual bool saveProperties(QDomDocument &doc, QDomElement &element) const
Saves the current state of the effect to a DOM element.
int ANALYSIS_EXPORT lower(int n, int i)
lower function
void moveClass(int from, int to)
Moves the category at index position from to index position to.
Contains information about the context of a rendering operation.
const QgsFeatureRendererV2 * embeddedRenderer() const
int mAttrNum
attribute index (derived from attribute name in startRender)
QList< T > toList() const
QString mid(int position, int n) const
void copyPaintEffect(QgsFeatureRendererV2 *destRenderer) const
Copies paint effect of this renderer to another renderer.
QSet< T > & unite(const QSet< T > &other)
static QgsSymbolV2 * defaultSymbol(QGis::GeometryType geomType)
return new default symbol for specified geometry type
static QgsExpression * fieldOrExpressionToExpression(const QString &fieldOrExpression)
Return a new valid expression instance for given field or expression string.
void insert(int i, const T &value)
double lowerValue() const
double maxSymbolSize() const
return the max symbol size when graduated by size
const QgsRangeList & ranges() const
virtual QgsLegendSymbolListV2 legendSymbolItemsV2() const
Return a list of symbology items for the legend.
QString sizeScaleField() const
static QString encodeScaleMethod(QgsSymbolV2::ScaleMethod scaleMethod)
QDomElement firstChildElement(const QString &tagName) const
static QString fieldOrExpressionFromExpression(QgsExpression *expression)
Return a field name if the whole expression is just a name of the field .
bool usingSymbolLevels() const
void setScaleMethodToSymbol(QgsSymbolV2 *symbol, int scaleMethod)
void setSymbol(QgsSymbolV2 *s)
int count(const T &value) const
bool updateRangeSymbol(int rangeIndex, QgsSymbolV2 *symbol)
void setSourceColorRamp(QgsVectorColorRampV2 *ramp)
QScopedPointer< QgsSymbolV2 > mSourceSymbol
QList< T > toList() const
void setRenderHints(int hints)
static void clearSymbolMap(QgsSymbolV2Map &symbols)
bool updateRangeUpperValue(int rangeIndex, double value)
static QgsSymbolV2::ScaleMethod decodeScaleMethod(QString str)
QScopedPointer< QgsExpression > mRotation
double toDouble(bool *ok) const
iterator insert(const Key &key, const T &value)
QgsSymbolV2::ScaleMethod mScaleMethod
static QgsFeatureRendererV2 * create(QDomElement &element)
create renderer from XML element
virtual QgsLegendSymbologyList legendSymbologyItems(QSize iconSize) override
return a list of symbology items for the legend
bool hasDefaultValues() const
Returns whether the data defined container is set to all the default values, ie, disabled, with empty expression and no assigned field.
virtual QList< QString > usedAttributes() override
const_iterator constEnd() const
QScopedPointer< QgsExpression > mSizeScale
QDomElement createElement(const QString &tagName)
const_iterator constBegin() const
QgsRendererRangeV2 & operator=(QgsRendererRangeV2 range)
static QPixmap symbolPreviewPixmap(QgsSymbolV2 *symbol, QSize size, QgsRenderContext *customContext=0)
void insert(const T &value)
Represents a vector layer which manages a vector based data sets.
int fieldNameIndex(const QString &fieldName) const
Returns the index of a field name or -1 if the field does not exist.
void deleteClass(int idx)
bool exactMatch(const QString &str) const
The class stores information about one class/rule of a vector layer renderer in a unified way that ca...
QString arg(qlonglong a, int fieldWidth, int base, const QChar &fillChar) const
virtual void checkLegendSymbolItem(QString key, bool state=true) override
item in symbology was checked
void setScaleMethod(QgsSymbolV2::ScaleMethod scaleMethod)
QgsLegendSymbolListV2 legendSymbolItemsV2() const override
void updateColorRamp(QgsVectorColorRampV2 *ramp=0, bool inverted=false)
Update the color ramp used.
void addClass(QgsSymbolV2 *symbol)
bool valueGreaterThan(const QgsRendererRangeV2 &r1, const QgsRendererRangeV2 &r2)
const T value(const Key &key) const
virtual void startRender(QgsRenderContext &context, const QgsFields &fields) override
static void convertSymbolRotation(QgsSymbolV2 *symbol, const QString &field)