Skip to content

Commit 7277476

Browse files
committed
[FEATURE] Live heatmap renderer
Allows for live, dynamic heatmaps for point layers. Options include specifying heatmap radius in pixels, mm or map units, choice of color ramp, and a slider for selecting a tradeoff between render speed and quality.
1 parent c924401 commit 7277476

16 files changed

+1141
-1
lines changed

python/core/core.sip

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -237,6 +237,7 @@
237237
%Include symbology-ng/qgspointdisplacementrenderer.sip
238238
%Include symbology-ng/qgsrulebasedrendererv2.sip
239239
%Include symbology-ng/qgsinvertedpolygonrenderer.sip
240+
%Include symbology-ng/qgsheatmaprenderer.sip
240241
%Include symbology-ng/qgsrendererv2.sip
241242
%Include symbology-ng/qgsrendererv2registry.sip
242243

Lines changed: 112 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,112 @@
1+
class QgsHeatmapRenderer : QgsFeatureRendererV2
2+
{
3+
%TypeHeaderCode
4+
#include <qgsheatmaprenderer.h>
5+
%End
6+
public:
7+
8+
QgsHeatmapRenderer();
9+
virtual ~QgsHeatmapRenderer();
10+
11+
//reimplemented methods
12+
virtual QgsFeatureRendererV2* clone() const /Factory/;
13+
virtual void startRender( QgsRenderContext& context, const QgsFields& fields );
14+
virtual bool renderFeature( QgsFeature& feature, QgsRenderContext& context, int layer = -1, bool selected = false, bool drawVertexMarker = false );
15+
virtual void stopRender( QgsRenderContext& context );
16+
virtual QgsSymbolV2* symbolForFeature( QgsFeature& feature );
17+
virtual QgsSymbolV2List symbols();
18+
virtual QString dump() const;
19+
virtual QList<QString> usedAttributes();
20+
static QgsFeatureRendererV2* create( QDomElement& element ) /Factory/;
21+
virtual QDomElement save( QDomDocument& doc );
22+
static QgsHeatmapRenderer* convertFromRenderer( const QgsFeatureRendererV2* renderer ) /Factory/;
23+
24+
//reimplemented to extent the request so that points up to heatmap's radius distance outside
25+
//visible area are included
26+
virtual void modifyRequestExtent( QgsRectangle& extent, QgsRenderContext& context );
27+
28+
//heatmap specific methods
29+
30+
/**Returns the color ramp used for shading the heatmap.
31+
* @returns color ramp for heatmap
32+
* @see setColorRamp
33+
*/
34+
QgsVectorColorRampV2* colorRamp() const;
35+
/**Sets the color ramp to use for shading the heatmap.
36+
* @param ramp color ramp for heatmap. Ownership of ramp is transferred to the renderer.
37+
* @see colorRamp
38+
*/
39+
void setColorRamp( QgsVectorColorRampV2* ramp /Transfer/ );
40+
41+
/**Returns the radius for the heatmap
42+
* @returns heatmap radius
43+
* @see setRadius
44+
* @see radiusUnit
45+
* @see radiusMapUnitScale
46+
*/
47+
double radius() const;
48+
/**Sets the radius for the heatmap
49+
* @param radius heatmap radius
50+
* @see radius
51+
* @see setRadiusUnit
52+
* @see setRadiusMapUnitScale
53+
*/
54+
void setRadius( const double radius );
55+
56+
/**Returns the units used for the heatmap's radius
57+
* @returns units for heatmap radius
58+
* @see radius
59+
* @see setRadiusUnit
60+
* @see radiusMapUnitScale
61+
*/
62+
QgsSymbolV2::OutputUnit radiusUnit() const;
63+
/**Sets the units used for the heatmap's radius
64+
* @param unit units for heatmap radius
65+
* @see radiusUnit
66+
* @see setRadius
67+
* @see radiusMapUnitScale
68+
*/
69+
void setRadiusUnit( const QgsSymbolV2::OutputUnit unit );
70+
71+
/**Returns the map unit scale used for the heatmap's radius
72+
* @returns map unit scale for heatmap's radius
73+
* @see radius
74+
* @see radiusUnit
75+
* @see setRadiusMapUnitScale
76+
*/
77+
const QgsMapUnitScale& radiusMapUnitScale() const;
78+
/**Sets the map unit scale used for the heatmap's radius
79+
* @param scale map unit scale for heatmap's radius
80+
* @see setRadius
81+
* @see setRadiusUnit
82+
* @see radiusMapUnitScale
83+
*/
84+
void setRadiusMapUnitScale( const QgsMapUnitScale& scale );
85+
86+
/**Returns the maximum value used for shading the heatmap.
87+
* @returns maximum value for heatmap shading. If 0, then maximum value will be automatically
88+
* calculated.
89+
* @see setMaximumValue
90+
*/
91+
double maximumValue() const;
92+
/**Sets the maximum value used for shading the heatmap.
93+
* @param value maximum value for heatmap shading. Set to 0 for automatic calculation of
94+
* maximum value.
95+
* @see maximumValue
96+
*/
97+
void setMaximumValue( const double value );
98+
99+
/**Returns the render quality used for drawing the heatmap.
100+
* @returns render quality. A value of 1 indicates maximum quality, and increasing the
101+
* value will result in faster drawing but lower quality rendering.
102+
* @see setRenderQuality
103+
*/
104+
double renderQuality() const;
105+
/**Sets the render quality used for drawing the heatmap.
106+
* @param quality render quality. A value of 1 indicates maximum quality, and increasing the
107+
* value will result in faster drawing but lower quality rendering.
108+
* @see renderQuality
109+
*/
110+
void setRenderQuality( const int quality );
111+
112+
};

python/core/symbology-ng/qgsrendererv2.sip

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -179,6 +179,14 @@ class QgsFeatureRendererV2
179179
//! @note added in 2.6
180180
virtual QgsSymbolV2List originalSymbolsForFeature( QgsFeature& feat );
181181

182+
/**Allows for a renderer to modify the extent of a feature request prior to rendering
183+
* @param extent reference to request's filter extent. Modify extent to change the
184+
* extent of feature request
185+
* @param context render context
186+
* @note added in QGIS 2.7
187+
*/
188+
virtual void modifyRequestExtent( QgsRectangle& extent, QgsRenderContext& context );
189+
182190
protected:
183191
QgsFeatureRendererV2( QString type );
184192

python/gui/gui.sip

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -148,6 +148,7 @@
148148
%Include symbology-ng/qgsellipsesymbollayerv2widget.sip
149149
%Include symbology-ng/qgsgraduatedsymbolrendererv2widget.sip
150150
%Include symbology-ng/qgsinvertedpolygonrendererwidget.sip
151+
%Include symbology-ng/qgsheatmaprendererwidget.sip
151152
%Include symbology-ng/qgslayerpropertieswidget.sip
152153
%Include symbology-ng/qgspenstylecombobox.sip
153154
%Include symbology-ng/qgspointdisplacementrendererwidget.sip
Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
class QgsHeatmapRendererWidget : QgsRendererV2Widget
2+
{
3+
%TypeHeaderCode
4+
#include <qgsheatmaprendererwidget.h>
5+
%End
6+
public:
7+
/** static creation method
8+
* @param layer the layer where this renderer is applied
9+
* @param style
10+
* @param renderer the mask renderer (will take ownership)
11+
*/
12+
static QgsRendererV2Widget* create( QgsVectorLayer* layer, QgsStyleV2* style, QgsFeatureRendererV2* renderer ) /Factory/;
13+
14+
/** Constructor
15+
* @param layer the layer where this renderer is applied
16+
* @param style
17+
* @param renderer the mask renderer (will take ownership)
18+
*/
19+
QgsHeatmapRendererWidget( QgsVectorLayer* layer, QgsStyleV2* style, QgsFeatureRendererV2* renderer );
20+
21+
/** @returns the current feature renderer */
22+
virtual QgsFeatureRendererV2* renderer();
23+
};

src/core/CMakeLists.txt

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,7 @@ SET(QGIS_CORE_SRCS
3030
symbology-ng/qgscategorizedsymbolrendererv2.cpp
3131
symbology-ng/qgsgraduatedsymbolrendererv2.cpp
3232
symbology-ng/qgsrulebasedrendererv2.cpp
33+
symbology-ng/qgsheatmaprenderer.cpp
3334
symbology-ng/qgsinvertedpolygonrenderer.cpp
3435
symbology-ng/qgsvectorcolorrampv2.cpp
3536
symbology-ng/qgscptcityarchive.cpp
@@ -650,6 +651,7 @@ SET(QGIS_CORE_HDRS
650651
symbology-ng/qgsrendererv2registry.h
651652
symbology-ng/qgsrulebasedrendererv2.h
652653
symbology-ng/qgssinglesymbolrendererv2.h
654+
symbology-ng/qgsheatmaprenderer.h
653655
symbology-ng/qgsinvertedpolygonrenderer.h
654656
symbology-ng/qgsstylev2.h
655657
symbology-ng/qgssvgcache.h

src/core/qgsvectorlayerrenderer.cpp

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -127,8 +127,11 @@ bool QgsVectorLayerRenderer::render()
127127

128128
mRendererV2->startRender( mContext, mFields );
129129

130+
QgsRectangle requestExtent = mContext.extent();
131+
mRendererV2->modifyRequestExtent( requestExtent, mContext );
132+
130133
QgsFeatureRequest featureRequest = QgsFeatureRequest()
131-
.setFilterRect( mContext.extent() )
134+
.setFilterRect( requestExtent )
132135
.setSubsetOfAttributes( mAttrNames, mFields );
133136

134137
// enable the simplification of the geometries (Using the current map2pixel context) before send it to renderer engine.

0 commit comments

Comments
 (0)