Branch data Line data Source code
1 : : /*************************************************************************** 2 : : qgsheatmaprenderer.h 3 : : --------------------- 4 : : begin : November 2014 5 : : copyright : (C) 2014 Nyall Dawson 6 : : email : nyall dot dawson at gmail dot com 7 : : *************************************************************************** 8 : : * * 9 : : * This program is free software; you can redistribute it and/or modify * 10 : : * it under the terms of the GNU General Public License as published by * 11 : : * the Free Software Foundation; either version 2 of the License, or * 12 : : * (at your option) any later version. * 13 : : * * 14 : : ***************************************************************************/ 15 : : #ifndef QGSHEATMAPRENDERER_H 16 : : #define QGSHEATMAPRENDERER_H 17 : : 18 : : #include "qgis_core.h" 19 : : #include "qgis_sip.h" 20 : : #include "qgsrenderer.h" 21 : : #include "qgssymbol.h" 22 : : #include "qgsexpression.h" 23 : : #include "qgsgeometry.h" 24 : : 25 : : class QgsColorRamp; 26 : : 27 : : /** 28 : : * \ingroup core 29 : : * \class QgsHeatmapRenderer 30 : : * \brief A renderer which draws points as a live heatmap 31 : : * \since QGIS 2.7 32 : : */ 33 : : class CORE_EXPORT QgsHeatmapRenderer : public QgsFeatureRenderer 34 : : { 35 : : public: 36 : : 37 : : QgsHeatmapRenderer(); 38 : : ~QgsHeatmapRenderer() override; 39 : : 40 : : //! Direct copies are forbidden. Use clone() instead. 41 : : QgsHeatmapRenderer( const QgsHeatmapRenderer & ) = delete; 42 : : //! Direct copies are forbidden. Use clone() instead. 43 : : QgsHeatmapRenderer &operator=( const QgsHeatmapRenderer & ) = delete; 44 : : 45 : : //reimplemented methods 46 : : QgsHeatmapRenderer *clone() const override SIP_FACTORY; 47 : : void startRender( QgsRenderContext &context, const QgsFields &fields ) override; 48 : : bool renderFeature( const QgsFeature &feature, QgsRenderContext &context, int layer = -1, bool selected = false, bool drawVertexMarker = false ) override SIP_THROW( QgsCsException ); 49 : : void stopRender( QgsRenderContext &context ) override; 50 : : //! \note symbolForFeature2 in Python bindings 51 : : QgsSymbol *symbolForFeature( const QgsFeature &feature, QgsRenderContext &context ) const override; 52 : : //! \note symbol2 in Python bindings 53 : : QgsSymbolList symbols( QgsRenderContext &context ) const override; 54 : : QString dump() const override; 55 : : QSet<QString> usedAttributes( const QgsRenderContext &context ) const override; 56 : : //! Creates a new heatmap renderer instance from XML 57 : : static QgsFeatureRenderer *create( QDomElement &element, const QgsReadWriteContext &context ) SIP_FACTORY; 58 : : QDomElement save( QDomDocument &doc, const QgsReadWriteContext &context ) override; 59 : : static QgsHeatmapRenderer *convertFromRenderer( const QgsFeatureRenderer *renderer ) SIP_FACTORY; 60 : : bool accept( QgsStyleEntityVisitorInterface *visitor ) const override; 61 : : 62 : : //reimplemented to extent the request so that points up to heatmap's radius distance outside 63 : : //visible area are included 64 : : void modifyRequestExtent( QgsRectangle &extent, QgsRenderContext &context ) override; 65 : : 66 : : //heatmap specific methods 67 : : 68 : : /** 69 : : * Returns the color ramp used for shading the heatmap. 70 : : * \returns color ramp for heatmap 71 : : * \see setColorRamp 72 : : */ 73 : : QgsColorRamp *colorRamp() const { return mGradientRamp; } 74 : : 75 : : /** 76 : : * Sets the color ramp to use for shading the heatmap. 77 : : * \param ramp color ramp for heatmap. Ownership of ramp is transferred to the renderer. 78 : : * \see colorRamp 79 : : */ 80 : : void setColorRamp( QgsColorRamp *ramp SIP_TRANSFER ); 81 : : 82 : : /** 83 : : * Returns the radius for the heatmap 84 : : * \returns heatmap radius 85 : : * \see setRadius 86 : : * \see radiusUnit 87 : : * \see radiusMapUnitScale 88 : : */ 89 : : double radius() const { return mRadius; } 90 : : 91 : : /** 92 : : * Sets the radius for the heatmap 93 : : * \param radius heatmap radius 94 : : * \see radius 95 : : * \see setRadiusUnit 96 : : * \see setRadiusMapUnitScale 97 : : */ 98 : 0 : void setRadius( const double radius ) { mRadius = radius; } 99 : : 100 : : /** 101 : : * Returns the units used for the heatmap's radius 102 : : * \returns units for heatmap radius 103 : : * \see radius 104 : : * \see setRadiusUnit 105 : : * \see radiusMapUnitScale 106 : : */ 107 : : QgsUnitTypes::RenderUnit radiusUnit() const { return mRadiusUnit; } 108 : : 109 : : /** 110 : : * Sets the units used for the heatmap's radius 111 : : * \param unit units for heatmap radius 112 : : * \see radiusUnit 113 : : * \see setRadius 114 : : * \see radiusMapUnitScale 115 : : */ 116 : 0 : void setRadiusUnit( const QgsUnitTypes::RenderUnit unit ) { mRadiusUnit = unit; } 117 : : 118 : : /** 119 : : * Returns the map unit scale used for the heatmap's radius 120 : : * \returns map unit scale for heatmap's radius 121 : : * \see radius 122 : : * \see radiusUnit 123 : : * \see setRadiusMapUnitScale 124 : : */ 125 : : const QgsMapUnitScale &radiusMapUnitScale() const { return mRadiusMapUnitScale; } 126 : : 127 : : /** 128 : : * Sets the map unit scale used for the heatmap's radius 129 : : * \param scale map unit scale for heatmap's radius 130 : : * \see setRadius 131 : : * \see setRadiusUnit 132 : : * \see radiusMapUnitScale 133 : : */ 134 : 0 : void setRadiusMapUnitScale( const QgsMapUnitScale &scale ) { mRadiusMapUnitScale = scale; } 135 : : 136 : : /** 137 : : * Returns the maximum value used for shading the heatmap. 138 : : * \returns maximum value for heatmap shading. If 0, then maximum value will be automatically 139 : : * calculated. 140 : : * \see setMaximumValue 141 : : */ 142 : : double maximumValue() const { return mExplicitMax; } 143 : : 144 : : /** 145 : : * Sets the maximum value used for shading the heatmap. 146 : : * \param value maximum value for heatmap shading. Set to 0 for automatic calculation of 147 : : * maximum value. 148 : : * \see maximumValue 149 : : */ 150 : 0 : void setMaximumValue( const double value ) { mExplicitMax = value; } 151 : : 152 : : /** 153 : : * Returns the render quality used for drawing the heatmap. 154 : : * \returns render quality. A value of 1 indicates maximum quality, and increasing the 155 : : * value will result in faster drawing but lower quality rendering. 156 : : * \see setRenderQuality 157 : : */ 158 : : double renderQuality() const { return mRenderQuality; } 159 : : 160 : : /** 161 : : * Sets the render quality used for drawing the heatmap. 162 : : * \param quality render quality. A value of 1 indicates maximum quality, and increasing the 163 : : * value will result in faster drawing but lower quality rendering. 164 : : * \see renderQuality 165 : : */ 166 : 0 : void setRenderQuality( const int quality ) { mRenderQuality = quality; } 167 : : 168 : : /** 169 : : * Returns the expression used for weighting points when generating the heatmap. 170 : : * \returns point weight expression. If empty, all points are equally weighted. 171 : : * \see setWeightExpression 172 : : */ 173 : : QString weightExpression() const { return mWeightExpressionString; } 174 : : 175 : : /** 176 : : * Sets the expression used for weighting points when generating the heatmap. 177 : : * \param expression point weight expression. If set to empty, all points are equally weighted. 178 : : * \see weightExpression 179 : : */ 180 : 0 : void setWeightExpression( const QString &expression ) { mWeightExpressionString = expression; } 181 : : 182 : : private: 183 : : 184 : : QVector<double> mValues; 185 : : 186 : : double mCalculatedMaxValue = 0; 187 : : 188 : : double mRadius = 10; 189 : : int mRadiusPixels = 0; 190 : : double mRadiusSquared = 0; 191 : : QgsUnitTypes::RenderUnit mRadiusUnit = QgsUnitTypes::RenderMillimeters; 192 : : QgsMapUnitScale mRadiusMapUnitScale; 193 : : 194 : : QString mWeightExpressionString; 195 : : int mWeightAttrNum = -1; 196 : : std::unique_ptr<QgsExpression> mWeightExpression; 197 : : 198 : : QgsColorRamp *mGradientRamp = nullptr; 199 : : 200 : : double mExplicitMax = 0.0; 201 : : int mRenderQuality = 3; 202 : : 203 : : int mFeaturesRendered = 0; 204 : : 205 : : double uniformKernel( double distance, int bandwidth ) const; 206 : : double quarticKernel( double distance, int bandwidth ) const; 207 : : double triweightKernel( double distance, int bandwidth ) const; 208 : : double epanechnikovKernel( double distance, int bandwidth ) const; 209 : : double triangularKernel( double distance, int bandwidth ) const; 210 : : 211 : : QgsMultiPointXY convertToMultipoint( const QgsGeometry *geom ); 212 : : void initializeValues( QgsRenderContext &context ); 213 : : void renderImage( QgsRenderContext &context ); 214 : : }; 215 : : 216 : : 217 : : #endif // QGSHEATMAPRENDERER_H