00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018 #ifndef QGSPOINTDISPLACEMENTRENDERER_H
00019 #define QGSPOINTDISPLACEMENTRENDERER_H
00020
00021 #include "qgsfeature.h"
00022 #include "qgssymbolv2.h"
00023 #include "qgspoint.h"
00024 #include "qgsrendererv2.h"
00025 #include <QFont>
00026 #include <QSet>
00027
00028 class QgsVectorLayer;
00029
00031 class CORE_EXPORT QgsPointDisplacementRenderer: public QgsFeatureRendererV2
00032 {
00033 public:
00034 QgsPointDisplacementRenderer( const QString& labelAttributeName = "" );
00035 ~QgsPointDisplacementRenderer();
00036
00037 QgsFeatureRendererV2* clone();
00038
00039 virtual void toSld( QDomDocument& doc, QDomElement &element ) const;
00040
00042 bool renderFeature( QgsFeature& feature, QgsRenderContext& context, int layer = -1, bool selected = false, bool drawVertexMarker = false );
00043
00044 QgsSymbolV2* symbolForFeature( QgsFeature& feature );
00045
00046 void startRender( QgsRenderContext& context, const QgsVectorLayer *vlayer );
00047
00048 void stopRender( QgsRenderContext& context );
00049
00050 QList<QString> usedAttributes();
00051 QgsSymbolV2List symbols();
00052
00054 static QgsFeatureRendererV2* create( QDomElement& symbologyElem );
00055 QDomElement save( QDomDocument& doc );
00056
00057 QgsLegendSymbologyList legendSymbologyItems( QSize iconSize );
00058
00059 QgsLegendSymbolList legendSymbolItems();
00060
00061 void setLabelAttributeName( const QString& name ) { mLabelAttributeName = name; }
00062 QString labelAttributeName() const { return mLabelAttributeName; }
00063
00065 void setEmbeddedRenderer( QgsFeatureRendererV2* r );
00066 QgsFeatureRendererV2* embeddedRenderer() { return mRenderer;}
00067
00068 void setDisplacementGroups( const QList<QMap<QgsFeatureId, QgsFeature> >& list );
00069
00070 void setLabelFont( const QFont& f ) { mLabelFont = f; }
00071 QFont labelFont() const { return mLabelFont;}
00072
00073 void setCircleWidth( double w ) { mCircleWidth = w; }
00074 double circleWidth() const { return mCircleWidth; }
00075
00076 void setCircleColor( const QColor& c ) { mCircleColor = c; }
00077 QColor circleColor() const { return mCircleColor; }
00078
00079 void setLabelColor( const QColor& c ) { mLabelColor = c;}
00080 QColor labelColor() const { return mLabelColor; }
00081
00082 void setCircleRadiusAddition( double d ) { mCircleRadiusAddition = d; }
00083 double circleRadiusAddition() const { return mCircleRadiusAddition; }
00084
00085 void setMaxLabelScaleDenominator( double d ) { mMaxLabelScaleDenominator = d; }
00086 double maxLabelScaleDenominator() const { return mMaxLabelScaleDenominator; }
00087
00089 QgsMarkerSymbolV2* centerSymbol() { return mCenterSymbol;}
00091 void setCenterSymbol( QgsMarkerSymbolV2* symbol );
00092
00093 void setTolerance( double t ) { mTolerance = t; }
00094 double tolerance() const { return mTolerance; }
00095
00096 private:
00097
00099 QgsFeatureRendererV2* mRenderer;
00100
00102 QString mLabelAttributeName;
00104 int mLabelIndex;
00105
00107 QgsMarkerSymbolV2* mCenterSymbol;
00108
00110 double mTolerance;
00111
00113 QFont mLabelFont;
00114 QColor mLabelColor;
00116 double mCircleWidth;
00118 QColor mCircleColor;
00120 double mCircleRadiusAddition;
00122 bool mDrawLabels;
00124 double mMaxLabelScaleDenominator;
00125
00127 QList<QMap<QgsFeatureId, QgsFeature> > mDisplacementGroups;
00129 QSet<QgsFeatureId> mDisplacementIds;
00130
00132 void createDisplacementGroups( QgsVectorLayer *vlayer, const QgsRectangle& viewExtent );
00134 QgsRectangle searchRect( const QgsPoint& p ) const;
00136 void printInfoDisplacementGroups();
00137
00139 QString getLabel( const QgsFeature& f );
00140
00141
00142 void renderPoint( const QPointF& point, QgsSymbolV2RenderContext& context, const QList<QgsMarkerSymbolV2*>& symbols,
00143 const QStringList& labels );
00144
00145
00146 void calculateSymbolAndLabelPositions( const QPointF& centerPoint, int nPosition, double radius, double symbolDiagonal, QList<QPointF>& symbolPositions, QList<QPointF>& labelShifts ) const;
00147 void drawCircle( double radiusPainterUnits, QgsSymbolV2RenderContext& context, const QPointF& centerPoint, int nSymbols );
00148 void drawSymbols( QgsFeature& f, QgsRenderContext& context, const QList<QgsMarkerSymbolV2*>& symbolList, const QList<QPointF>& symbolPositions, bool selected = false );
00149 void drawLabels( const QPointF& centerPoint, QgsSymbolV2RenderContext& context, const QList<QPointF>& labelShifts, const QStringList& labelList );
00151 QgsSymbolV2* firstSymbolForFeature( QgsFeatureRendererV2* r, QgsFeature& f );
00152 };
00153
00154 #endif // QGSPOINTDISPLACEMENTRENDERER_H