no-heatmap.js 2.0.8
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +19 -0
- package/README.md +55 -0
- package/build/heatmap.js +729 -0
- package/build/heatmap.min.js +9 -0
- package/docs/assets/css/commons.css +41 -0
- package/docs/assets/css/docs.css +136 -0
- package/docs/assets/css/prism.css +126 -0
- package/docs/assets/js/prism.js +7 -0
- package/docs/faq.html +0 -0
- package/docs/getting-started.html +0 -0
- package/docs/how-to-migrate.md +97 -0
- package/docs/index.html +276 -0
- package/examples/angular-heatmap/index.html +64 -0
- package/examples/googlemaps-heatmap/index.html +65 -0
- package/examples/heatmap-legend/index.html +126 -0
- package/examples/leaflet-heatmap/index.html +80 -0
- package/examples/mousemove-heatmap/index.html +64 -0
- package/examples/raindrops/index.html +66 -0
- package/examples/svg-area-heatmap/austria.svg +1540 -0
- package/examples/svg-area-heatmap/index.html +62 -0
- package/examples/unblurred-datapoints/index.html +87 -0
- package/package.json +46 -0
- package/plugins/angular-heatmap/angular-heatmap.js +62 -0
- package/plugins/boilerplate.js +45 -0
- package/plugins/gmaps-heatmap/README.md +7 -0
- package/plugins/gmaps-heatmap/gmaps-heatmap.js +278 -0
- package/plugins/gmaps-heatmap/package.json +23 -0
- package/plugins/leaflet-heatmap/README.md +4 -0
- package/plugins/leaflet-heatmap/leaflet-heatmap.js +246 -0
- package/plugins/leaflet-heatmap/package.json +21 -0
- package/plugins/segment-heatmap.js +71 -0
- package/plugins/svg-area-heatmap.js +195 -0
|
@@ -0,0 +1,246 @@
|
|
|
1
|
+
/*
|
|
2
|
+
* Leaflet Heatmap Overlay
|
|
3
|
+
*
|
|
4
|
+
* Copyright (c) 2008-2016, Patrick Wied (https://www.patrick-wied.at)
|
|
5
|
+
* Dual-licensed under the MIT (http://www.opensource.org/licenses/mit-license.php)
|
|
6
|
+
* and the Beerware (http://en.wikipedia.org/wiki/Beerware) license.
|
|
7
|
+
*/
|
|
8
|
+
;(function (name, context, factory) {
|
|
9
|
+
// Supports UMD. AMD, CommonJS/Node.js and browser context
|
|
10
|
+
if (typeof module !== "undefined" && module.exports) {
|
|
11
|
+
module.exports = factory(
|
|
12
|
+
require('heatmap.js'),
|
|
13
|
+
require('leaflet')
|
|
14
|
+
);
|
|
15
|
+
} else if (typeof define === "function" && define.amd) {
|
|
16
|
+
define(['heatmap.js', 'leaflet'], factory);
|
|
17
|
+
} else {
|
|
18
|
+
// browser globals
|
|
19
|
+
if (typeof window.h337 === 'undefined') {
|
|
20
|
+
throw new Error('heatmap.js must be loaded before the leaflet heatmap plugin');
|
|
21
|
+
}
|
|
22
|
+
if (typeof window.L === 'undefined') {
|
|
23
|
+
throw new Error('Leaflet must be loaded before the leaflet heatmap plugin');
|
|
24
|
+
}
|
|
25
|
+
context[name] = factory(window.h337, window.L);
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
})("HeatmapOverlay", this, function (h337, L) {
|
|
29
|
+
'use strict';
|
|
30
|
+
|
|
31
|
+
// Leaflet < 0.8 compatibility
|
|
32
|
+
if (typeof L.Layer === 'undefined') {
|
|
33
|
+
L.Layer = L.Class;
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
var HeatmapOverlay = L.Layer.extend({
|
|
37
|
+
|
|
38
|
+
initialize: function (config) {
|
|
39
|
+
this.cfg = config;
|
|
40
|
+
this._el = L.DomUtil.create('div', 'leaflet-zoom-hide');
|
|
41
|
+
this._data = [];
|
|
42
|
+
this._max = 1;
|
|
43
|
+
this._min = 0;
|
|
44
|
+
this.cfg.container = this._el;
|
|
45
|
+
},
|
|
46
|
+
|
|
47
|
+
onAdd: function (map) {
|
|
48
|
+
var size = map.getSize();
|
|
49
|
+
|
|
50
|
+
this._map = map;
|
|
51
|
+
|
|
52
|
+
this._width = size.x;
|
|
53
|
+
this._height = size.y;
|
|
54
|
+
|
|
55
|
+
this._el.style.width = size.x + 'px';
|
|
56
|
+
this._el.style.height = size.y + 'px';
|
|
57
|
+
this._el.style.position = 'absolute';
|
|
58
|
+
|
|
59
|
+
this._origin = this._map.layerPointToLatLng(new L.Point(0, 0));
|
|
60
|
+
|
|
61
|
+
map.getPanes().overlayPane.appendChild(this._el);
|
|
62
|
+
|
|
63
|
+
if (!this._heatmap) {
|
|
64
|
+
this._heatmap = h337.create(this.cfg);
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
// this resets the origin and redraws whenever
|
|
68
|
+
// the zoom changed or the map has been moved
|
|
69
|
+
map.on('moveend', this._reset, this);
|
|
70
|
+
this._draw();
|
|
71
|
+
},
|
|
72
|
+
|
|
73
|
+
addTo: function (map) {
|
|
74
|
+
map.addLayer(this);
|
|
75
|
+
return this;
|
|
76
|
+
},
|
|
77
|
+
|
|
78
|
+
onRemove: function (map) {
|
|
79
|
+
// remove layer's DOM elements and listeners
|
|
80
|
+
map.getPanes().overlayPane.removeChild(this._el);
|
|
81
|
+
|
|
82
|
+
map.off('moveend', this._reset, this);
|
|
83
|
+
},
|
|
84
|
+
_draw: function() {
|
|
85
|
+
if (!this._map) { return; }
|
|
86
|
+
|
|
87
|
+
var mapPane = this._map.getPanes().mapPane;
|
|
88
|
+
var point = mapPane._leaflet_pos;
|
|
89
|
+
|
|
90
|
+
// reposition the layer
|
|
91
|
+
this._el.style[HeatmapOverlay.CSS_TRANSFORM] = 'translate(' +
|
|
92
|
+
-Math.round(point.x) + 'px,' +
|
|
93
|
+
-Math.round(point.y) + 'px)';
|
|
94
|
+
|
|
95
|
+
this._update();
|
|
96
|
+
},
|
|
97
|
+
_update: function() {
|
|
98
|
+
var bounds, zoom, scale;
|
|
99
|
+
var generatedData = { max: this._max, min: this._min, data: [] };
|
|
100
|
+
|
|
101
|
+
bounds = this._map.getBounds();
|
|
102
|
+
zoom = this._map.getZoom();
|
|
103
|
+
scale = Math.pow(2, zoom);
|
|
104
|
+
|
|
105
|
+
if (this._data.length == 0) {
|
|
106
|
+
if (this._heatmap) {
|
|
107
|
+
this._heatmap.setData(generatedData);
|
|
108
|
+
}
|
|
109
|
+
return;
|
|
110
|
+
}
|
|
111
|
+
|
|
112
|
+
|
|
113
|
+
var latLngPoints = [];
|
|
114
|
+
var radiusMultiplier = this.cfg.scaleRadius ? scale : 1;
|
|
115
|
+
var localMax = 0;
|
|
116
|
+
var localMin = 0;
|
|
117
|
+
var valueField = this.cfg.valueField;
|
|
118
|
+
var len = this._data.length;
|
|
119
|
+
|
|
120
|
+
while (len--) {
|
|
121
|
+
var entry = this._data[len];
|
|
122
|
+
var value = entry[valueField];
|
|
123
|
+
var latlng = entry.latlng;
|
|
124
|
+
|
|
125
|
+
|
|
126
|
+
// we don't wanna render points that are not even on the map ;-)
|
|
127
|
+
if (!bounds.contains(latlng)) {
|
|
128
|
+
continue;
|
|
129
|
+
}
|
|
130
|
+
// local max is the maximum within current bounds
|
|
131
|
+
localMax = Math.max(value, localMax);
|
|
132
|
+
localMin = Math.min(value, localMin);
|
|
133
|
+
|
|
134
|
+
var point = this._map.latLngToContainerPoint(latlng);
|
|
135
|
+
var latlngPoint = { x: Math.round(point.x), y: Math.round(point.y) };
|
|
136
|
+
latlngPoint[valueField] = value;
|
|
137
|
+
|
|
138
|
+
var radius;
|
|
139
|
+
|
|
140
|
+
if (entry.radius) {
|
|
141
|
+
radius = entry.radius * radiusMultiplier;
|
|
142
|
+
} else {
|
|
143
|
+
radius = (this.cfg.radius || 2) * radiusMultiplier;
|
|
144
|
+
}
|
|
145
|
+
latlngPoint.radius = radius;
|
|
146
|
+
latLngPoints.push(latlngPoint);
|
|
147
|
+
}
|
|
148
|
+
if (this.cfg.useLocalExtrema) {
|
|
149
|
+
generatedData.max = localMax;
|
|
150
|
+
generatedData.min = localMin;
|
|
151
|
+
}
|
|
152
|
+
|
|
153
|
+
generatedData.data = latLngPoints;
|
|
154
|
+
|
|
155
|
+
this._heatmap.setData(generatedData);
|
|
156
|
+
},
|
|
157
|
+
setData: function(data) {
|
|
158
|
+
this._max = data.max || this._max;
|
|
159
|
+
this._min = data.min || this._min;
|
|
160
|
+
var latField = this.cfg.latField || 'lat';
|
|
161
|
+
var lngField = this.cfg.lngField || 'lng';
|
|
162
|
+
var valueField = this.cfg.valueField || 'value';
|
|
163
|
+
|
|
164
|
+
// transform data to latlngs
|
|
165
|
+
var data = data.data;
|
|
166
|
+
var len = data.length;
|
|
167
|
+
var d = [];
|
|
168
|
+
|
|
169
|
+
while (len--) {
|
|
170
|
+
var entry = data[len];
|
|
171
|
+
var latlng = new L.LatLng(entry[latField], entry[lngField]);
|
|
172
|
+
var dataObj = { latlng: latlng };
|
|
173
|
+
dataObj[valueField] = entry[valueField];
|
|
174
|
+
if (entry.radius) {
|
|
175
|
+
dataObj.radius = entry.radius;
|
|
176
|
+
}
|
|
177
|
+
d.push(dataObj);
|
|
178
|
+
}
|
|
179
|
+
this._data = d;
|
|
180
|
+
|
|
181
|
+
this._draw();
|
|
182
|
+
},
|
|
183
|
+
// experimential... not ready.
|
|
184
|
+
addData: function(pointOrArray) {
|
|
185
|
+
if (pointOrArray.length > 0) {
|
|
186
|
+
var len = pointOrArray.length;
|
|
187
|
+
while(len--) {
|
|
188
|
+
this.addData(pointOrArray[len]);
|
|
189
|
+
}
|
|
190
|
+
} else {
|
|
191
|
+
var latField = this.cfg.latField || 'lat';
|
|
192
|
+
var lngField = this.cfg.lngField || 'lng';
|
|
193
|
+
var valueField = this.cfg.valueField || 'value';
|
|
194
|
+
var entry = pointOrArray;
|
|
195
|
+
var latlng = new L.LatLng(entry[latField], entry[lngField]);
|
|
196
|
+
var dataObj = { latlng: latlng };
|
|
197
|
+
|
|
198
|
+
dataObj[valueField] = entry[valueField];
|
|
199
|
+
this._max = Math.max(this._max, dataObj[valueField]);
|
|
200
|
+
this._min = Math.min(this._min, dataObj[valueField]);
|
|
201
|
+
|
|
202
|
+
if (entry.radius) {
|
|
203
|
+
dataObj.radius = entry.radius;
|
|
204
|
+
}
|
|
205
|
+
this._data.push(dataObj);
|
|
206
|
+
this._draw();
|
|
207
|
+
}
|
|
208
|
+
},
|
|
209
|
+
_reset: function () {
|
|
210
|
+
this._origin = this._map.layerPointToLatLng(new L.Point(0, 0));
|
|
211
|
+
|
|
212
|
+
var size = this._map.getSize();
|
|
213
|
+
if (this._width !== size.x || this._height !== size.y) {
|
|
214
|
+
this._width = size.x;
|
|
215
|
+
this._height = size.y;
|
|
216
|
+
|
|
217
|
+
this._el.style.width = this._width + 'px';
|
|
218
|
+
this._el.style.height = this._height + 'px';
|
|
219
|
+
|
|
220
|
+
this._heatmap._renderer.setDimensions(this._width, this._height);
|
|
221
|
+
}
|
|
222
|
+
this._draw();
|
|
223
|
+
}
|
|
224
|
+
});
|
|
225
|
+
|
|
226
|
+
HeatmapOverlay.CSS_TRANSFORM = (function() {
|
|
227
|
+
var div = document.createElement('div');
|
|
228
|
+
var props = [
|
|
229
|
+
'transform',
|
|
230
|
+
'WebkitTransform',
|
|
231
|
+
'MozTransform',
|
|
232
|
+
'OTransform',
|
|
233
|
+
'msTransform'
|
|
234
|
+
];
|
|
235
|
+
|
|
236
|
+
for (var i = 0; i < props.length; i++) {
|
|
237
|
+
var prop = props[i];
|
|
238
|
+
if (div.style[prop] !== undefined) {
|
|
239
|
+
return prop;
|
|
240
|
+
}
|
|
241
|
+
}
|
|
242
|
+
return props[0];
|
|
243
|
+
})();
|
|
244
|
+
|
|
245
|
+
return HeatmapOverlay;
|
|
246
|
+
});
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "leaflet-heatmap",
|
|
3
|
+
"version": "1.0.0",
|
|
4
|
+
"description": "heatmap.js Leaflet Overlay",
|
|
5
|
+
"homepage": "https://www.patrick-wied.at/static/heatmapjs/",
|
|
6
|
+
"main": "leaflet-heatmap.js",
|
|
7
|
+
"dependencies": {
|
|
8
|
+
"heatmap.js": "*",
|
|
9
|
+
"leaflet": "*"
|
|
10
|
+
},
|
|
11
|
+
"keywords": [
|
|
12
|
+
"heatmap",
|
|
13
|
+
"leaflet",
|
|
14
|
+
"heat",
|
|
15
|
+
"heat map",
|
|
16
|
+
"heatmaps",
|
|
17
|
+
"heat maps",
|
|
18
|
+
"map",
|
|
19
|
+
"maps"
|
|
20
|
+
]
|
|
21
|
+
}
|
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
(function() {
|
|
2
|
+
'use strict';
|
|
3
|
+
|
|
4
|
+
var segmentHeatmapPlugin = (function SegmentHeatmapPluginClosure() {
|
|
5
|
+
|
|
6
|
+
var defaultSegmentsX = 10;
|
|
7
|
+
var defaultSegmentsY = 5;
|
|
8
|
+
|
|
9
|
+
function SegmentStore(config) {
|
|
10
|
+
this._coordinator = {};
|
|
11
|
+
this._data = [];
|
|
12
|
+
this._max = 1;
|
|
13
|
+
this._min = 0;
|
|
14
|
+
this._initSegments();
|
|
15
|
+
};
|
|
16
|
+
|
|
17
|
+
SegmentStore.prototype = {
|
|
18
|
+
_initSegments: function() {
|
|
19
|
+
|
|
20
|
+
},
|
|
21
|
+
setCoordinator: function(coordinator) {
|
|
22
|
+
|
|
23
|
+
},
|
|
24
|
+
setData: function(data) {
|
|
25
|
+
var max = data.max;
|
|
26
|
+
var min = data.min;
|
|
27
|
+
var data = data.data;
|
|
28
|
+
|
|
29
|
+
this._coordinator.emit('renderall', {
|
|
30
|
+
min: min,
|
|
31
|
+
max: max,
|
|
32
|
+
data: data
|
|
33
|
+
});
|
|
34
|
+
},
|
|
35
|
+
addData: function(data) {
|
|
36
|
+
|
|
37
|
+
},
|
|
38
|
+
removeData: function(data) {
|
|
39
|
+
|
|
40
|
+
},
|
|
41
|
+
getData: function() {
|
|
42
|
+
return this._data;
|
|
43
|
+
}
|
|
44
|
+
};
|
|
45
|
+
|
|
46
|
+
|
|
47
|
+
|
|
48
|
+
function SegmentRenderer(config) {
|
|
49
|
+
|
|
50
|
+
};
|
|
51
|
+
SegmentRenderer.prototype = {
|
|
52
|
+
renderAll: function(data) {
|
|
53
|
+
|
|
54
|
+
},
|
|
55
|
+
renderPartial: function(data) {
|
|
56
|
+
|
|
57
|
+
},
|
|
58
|
+
getDataURL: function() {
|
|
59
|
+
|
|
60
|
+
}
|
|
61
|
+
};
|
|
62
|
+
|
|
63
|
+
return {
|
|
64
|
+
store: SegmentStore,
|
|
65
|
+
renderer: SegmentRenderer
|
|
66
|
+
}
|
|
67
|
+
}());
|
|
68
|
+
|
|
69
|
+
h337.register('segment-heatmap', segmentHeatmapPlugin);
|
|
70
|
+
|
|
71
|
+
}());
|
|
@@ -0,0 +1,195 @@
|
|
|
1
|
+
/*
|
|
2
|
+
* SVG Area Heatmap Plugin
|
|
3
|
+
*
|
|
4
|
+
* Copyright (c) 2014, Patrick Wied (http://www.patrick-wied.at)
|
|
5
|
+
* Dual-licensed under the MIT (http://www.opensource.org/licenses/mit-license.php)
|
|
6
|
+
* and the Beerware (http://en.wikipedia.org/wiki/Beerware) license.
|
|
7
|
+
*/
|
|
8
|
+
(function() {
|
|
9
|
+
'use strict';
|
|
10
|
+
|
|
11
|
+
var SvgAreaHeatmap = (function SvgAreaHeatmapClosure() {
|
|
12
|
+
|
|
13
|
+
var _getColorPalette = function(config) {
|
|
14
|
+
var gradientConfig = config.gradient || config.defaultGradient;
|
|
15
|
+
var paletteCanvas = document.createElement('canvas');
|
|
16
|
+
var paletteCtx = paletteCanvas.getContext('2d');
|
|
17
|
+
|
|
18
|
+
paletteCanvas.width = 256;
|
|
19
|
+
paletteCanvas.height = 1;
|
|
20
|
+
|
|
21
|
+
var gradient = paletteCtx.createLinearGradient(0, 0, 256, 1);
|
|
22
|
+
for (var key in gradientConfig) {
|
|
23
|
+
gradient.addColorStop(key, gradientConfig[key]);
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
paletteCtx.fillStyle = gradient;
|
|
27
|
+
paletteCtx.fillRect(0, 0, 256, 1);
|
|
28
|
+
|
|
29
|
+
return paletteCtx.getImageData(0, 0, 256, 1).data;
|
|
30
|
+
};
|
|
31
|
+
|
|
32
|
+
|
|
33
|
+
function SvgAreaHeatmapStore(config) {
|
|
34
|
+
this._coordinator = {};
|
|
35
|
+
this._data = {};
|
|
36
|
+
this._max = 1;
|
|
37
|
+
this._min = 0;
|
|
38
|
+
};
|
|
39
|
+
|
|
40
|
+
SvgAreaHeatmapStore.prototype = {
|
|
41
|
+
setCoordinator: function(coordinator) {
|
|
42
|
+
this._coordinator = coordinator;
|
|
43
|
+
},
|
|
44
|
+
setData: function(data) {
|
|
45
|
+
this._max = data.max || this._max;
|
|
46
|
+
this._min = data.min || this._min;
|
|
47
|
+
this._data = {};
|
|
48
|
+
|
|
49
|
+
var d = data.data;
|
|
50
|
+
var dataLen = d.length;
|
|
51
|
+
|
|
52
|
+
while (dataLen--) {
|
|
53
|
+
this._organiseData(d[dataLen]);
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
this._coordinator.emit('renderall', this._getInternalData());
|
|
57
|
+
},
|
|
58
|
+
addData: function(data) {
|
|
59
|
+
var organisedEntry = this._organiseData(data);
|
|
60
|
+
if (organisedEntry) {
|
|
61
|
+
this._coordinator.emit('renderpartial', {
|
|
62
|
+
min: this._min,
|
|
63
|
+
max: this._max,
|
|
64
|
+
data: [organisedEntry]
|
|
65
|
+
});
|
|
66
|
+
}
|
|
67
|
+
},
|
|
68
|
+
updateData: function(data) {
|
|
69
|
+
|
|
70
|
+
},
|
|
71
|
+
removeData: function(data) {
|
|
72
|
+
|
|
73
|
+
},
|
|
74
|
+
getData: function() {
|
|
75
|
+
|
|
76
|
+
},
|
|
77
|
+
setDataMax: function(max) {
|
|
78
|
+
this._max = max;
|
|
79
|
+
//this._onExtremaChange();
|
|
80
|
+
this._coordinator.emit('renderall', this._getInternalData());
|
|
81
|
+
return this;
|
|
82
|
+
},
|
|
83
|
+
setDataMin: function(min) {
|
|
84
|
+
this._min = min;
|
|
85
|
+
//this._onExtremaChange();
|
|
86
|
+
this._coordinator.emit('renderall', this._getInternalData());
|
|
87
|
+
return this;
|
|
88
|
+
},
|
|
89
|
+
_organiseData: function(point) {
|
|
90
|
+
if (this._data[point.id]) {
|
|
91
|
+
this._data[point.id] += point.value;
|
|
92
|
+
|
|
93
|
+
} else {
|
|
94
|
+
this._data[point.id] = point.value;
|
|
95
|
+
}
|
|
96
|
+
|
|
97
|
+
if (this._data[point.id] > this._max) {
|
|
98
|
+
this.setDataMax(this._data[point.id]);
|
|
99
|
+
}
|
|
100
|
+
if (this._data[point.id] < this._min) {
|
|
101
|
+
this.setDataMin(this._data[point.id]);
|
|
102
|
+
}
|
|
103
|
+
return point;
|
|
104
|
+
},
|
|
105
|
+
_getInternalData: function() {
|
|
106
|
+
return {
|
|
107
|
+
max: this._max,
|
|
108
|
+
min: this._min,
|
|
109
|
+
data: this._data,
|
|
110
|
+
};
|
|
111
|
+
}
|
|
112
|
+
};
|
|
113
|
+
|
|
114
|
+
|
|
115
|
+
function SvgAreaHeatmapRenderer(config) {
|
|
116
|
+
// initialization
|
|
117
|
+
var container = config.container;
|
|
118
|
+
var svgUrl = config.svgUrl;
|
|
119
|
+
this.renderQueue = [];
|
|
120
|
+
|
|
121
|
+
|
|
122
|
+
var svgObj = document.createElement('object');
|
|
123
|
+
svgObj.type = 'image/svg+xml';
|
|
124
|
+
svgObj.id = 'svgHeatmap';
|
|
125
|
+
svgObj.data = svgUrl;
|
|
126
|
+
|
|
127
|
+
var that = this;
|
|
128
|
+
|
|
129
|
+
svgObj.onload = function() {
|
|
130
|
+
that.svgDoc = this.getSVGDocument();
|
|
131
|
+
that.$ = function(selector) {
|
|
132
|
+
return that.svgDoc.querySelector(selector);
|
|
133
|
+
};
|
|
134
|
+
|
|
135
|
+
that._processQueue();
|
|
136
|
+
}
|
|
137
|
+
|
|
138
|
+
container.appendChild(svgObj);
|
|
139
|
+
|
|
140
|
+
this._palette = _getColorPalette(config);
|
|
141
|
+
|
|
142
|
+
};
|
|
143
|
+
|
|
144
|
+
SvgAreaHeatmapRenderer.prototype = {
|
|
145
|
+
renderPartial: function(data) {
|
|
146
|
+
var point = data.data[0];
|
|
147
|
+
this.max = data.max;
|
|
148
|
+
this.min = data.min;
|
|
149
|
+
this._colorize(point.id, point.value);
|
|
150
|
+
},
|
|
151
|
+
renderAll: function(data) {
|
|
152
|
+
var points = data.data;
|
|
153
|
+
this.max = data.max;
|
|
154
|
+
this.min = data.min;
|
|
155
|
+
for (var key in points) {
|
|
156
|
+
this._colorize(key, points[key]);
|
|
157
|
+
}
|
|
158
|
+
},
|
|
159
|
+
_colorize: function(key, value) {
|
|
160
|
+
|
|
161
|
+
if (!this.svgDoc) {
|
|
162
|
+
this.renderQueue.push([key, value]);
|
|
163
|
+
} else {
|
|
164
|
+
var node = this.$('#' + key);
|
|
165
|
+
var color;
|
|
166
|
+
var max = this.max;
|
|
167
|
+
var min = this.min;
|
|
168
|
+
var colorIndex = (((value/(Math.abs(max-min)) * 255) >> 0) * 4);
|
|
169
|
+
|
|
170
|
+
var r = this._palette[colorIndex];
|
|
171
|
+
var g = this._palette[colorIndex + 1];
|
|
172
|
+
var b = this._palette[colorIndex + 2];
|
|
173
|
+
|
|
174
|
+
node.style.fill = ['rgb(', r, ',', g, ',', b,')'].join('');
|
|
175
|
+
}
|
|
176
|
+
},
|
|
177
|
+
_processQueue: function() {
|
|
178
|
+
var renderElement = this.renderQueue.pop();
|
|
179
|
+
if (!renderElement) {
|
|
180
|
+
return;
|
|
181
|
+
}
|
|
182
|
+
this._colorize.apply(this, renderElement);
|
|
183
|
+
this._processQueue();
|
|
184
|
+
}
|
|
185
|
+
};
|
|
186
|
+
|
|
187
|
+
return {
|
|
188
|
+
store: SvgAreaHeatmapStore,
|
|
189
|
+
renderer: SvgAreaHeatmapRenderer
|
|
190
|
+
}
|
|
191
|
+
}());
|
|
192
|
+
|
|
193
|
+
h337.register('SvgAreaHeatmap', SvgAreaHeatmap);
|
|
194
|
+
|
|
195
|
+
}());
|